在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,但我仍然对如何理解这些库的工作方式存在分歧。
答案 0 :(得分:10)
分化发生在最后一行:
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页很好地解释了这个过程的工作原理。