TensorFlow或Theano:他们如何知道基于神经网络图的损失函数导数?

Ric*_*ruz 8 neural-network theano tensorflow

在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)
Run Code Online (Sandbox Code Playgroud)

我使用L2范数损失函数,C = 0.5*sum((y-yp)^ 2),并且在反向传播步骤中可能必须计算导数,dC = sum(y-yp).见本书(30).

我的问题是:TensorFlow(或Theano)如何知道反向传播的分析导数?或者他们做了近似?或者不知何故不使用衍生物?

我已经在TensorFlow上完成了深度学习的udacity课程,但我仍然对如何理解这些库的工作方式存在分歧.

mrr*_*rry 10

区别发生在最后一行:

    optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)
Run Code Online (Sandbox Code Playgroud)

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

第7页的Ilya Sutskever的博士论文对这个过程的一般工作方式有一个很好的解释.