在TensorFlow或Theano中,您仅告诉库您的神经网络如何以及前馈应如何运行。

例如,在TensorFlow中,您将编写:

with graph.as_default():
    _X = tf.constant(X)
    _y = tf.constant(y)

    hidden = 20
    w0 = tf.Variable(tf.truncated_normal([X.shape[1], hidden]))
    b0 = tf.Variable(tf.truncated_normal([hidden]))

    h = tf.nn.softmax(tf.matmul(_X, w0) + b0)

    w1 = tf.Variable(tf.truncated_normal([hidden, 1]))
    b1 = tf.Variable(tf.truncated_normal([1]))

    yp = tf.nn.softmax(tf.matmul(h, w1) + b1)

    loss = tf.reduce_mean(0.5*tf.square(yp - _y))
    optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)


我正在使用L2-范数损失函数C = 0.5 * sum((y-yp)^ 2),在反向传播步骤中,大概必须计算导数dC = sum(y-yp)。请参见(30) in this book

我的问题是:TensorFlow(或Theano)如何知道反向传播的解析导数?还是他们做一个近似?还是不使用衍生工具?

我已经在TensorFlow上完成了deep learning udacity course,但是在如何理解这些库的工作方式方面我仍然存在分歧。

最佳答案

区别发生在最后一行:

    optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)


当您执行minimize()方法时,TensorFlow会识别loss所依赖的变量集,并为每个变量计算梯度。区分是在ops/gradients.py中实现的,并且使用"reverse accumulation"。本质上,它从loss张量向后搜索变量,并在数据流图中的每个运算符上应用链规则。 TensorFlow为大多数(可微分)运算符包括“梯度函数”,您可以在ops/math_grad.py中看到有关如何实现这些函数的示例。梯度函数可以使用原始op(包括其输入,输出和属性)和为其每个输出计算的梯度来为其每个输入产生梯度。

Ilya Sutskever's PhD thesis的第7页很好地说明了此过程的总体工作方式。

关于neural-network - TensorFlow或Theano:他们如何基于神经网络图知道损失函数导数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35343002/

10-12 17:12