介绍神经网络
官网
slides
1 反向传播
上节课介绍了两种方法去计算梯度,一种是数值法计算梯度,也就是根据导数的定义计算;另一种是分析法计算梯度,根据微积分,使用公式计算。
这节课介绍一种计算梯度的新方法,使用计算图的方式计算梯度。
下图是svm多分类损失函数的一个计算图模型,计算图模型把公式中每个元素和符号都作为节点,连接起来。这个图模型有点类似于我们学编译原理的语法树,或者有限状态机,因为都是图模型嘛,差不了多少…
在图模型中,我们使用反向传播的方法计算梯度。下面是一个小例子:
已知
f(x,y,z)=(x+y)z,求
∂x∂f,
∂y∂f,
∂z∂f的值。
如下图,为更好地说明,我们给
x,y,z赋上实值,然后沿着计算图正向传播先计算出中间值
q=x+y的值,再计算出最终值
f=qz的值。
之后,我们从最终值
f开始,反向计算梯度。
∂f∂f的值为1,所以乘法符号的上游梯度为1。
然后由于
f=qz,
∂q∂f=z,
∂z∂f=q,可以容易的计算出乘法节点下面
z分支的梯度为
q的值,即
3。乘法节点上面
q分支的梯度为
z的值,即
−4。
继续反向传播到
x,
y节点时,依据链式法则,节点最终的梯度值等于上游梯度值 upstream gradient与本地梯度值 local gradient相乘。
考虑另外一个更复杂的例子。首先正向传播算出所有中间值和最终值后,反向传播计算梯度。注意到
x1的导数是
−x21,应用链式法则,可以计算出倒数第二个节点的梯度。
同一个公式的计算图并不是唯一的。上面的两个例子是把公式拆分到最细粒度,我们也可以将节点合并,如下图:蓝框框圈的地方可以合并为sigmoid函数。然后直接利用sigmoid的梯度公式求梯度值。
反向传播有三种很重要的模式:
- add gate: gradient distributor. 梯度分配器。也就是说加法门(节点)分支的梯度和上游梯度相等。
- max gate: gradient router.梯度路由。也就是说最大门(节点)某个分支(至值最大的那个分支)的梯度和上游节点相等,其它分支为0.
- mul gate: gradient switcher,梯度交换器。也就是说乘法门(节点)分支的梯度是另一个分支的值。
在深度学习中,变量一般是向量或矩阵的形式。那么,如何用反向传播法求向量变量的梯度呢?
首先介绍一下雅各比矩阵(Jacobian Matrix):
以图中的
∂x∂z为例,假设
z是
m维向量,
z={z1,z2,...,zm};
x是
n维向量,
x={x1,x2,...xn},那么求
z对
x的偏导,可以使用雅各比矩阵:
J=[∂x1∂z,∂x2∂z,∂x3∂z,...,∂xn∂z]=∣∣∣∣∣∣∣∣∂x1∂z1∂x1∂z2...∂x1∂zm∂x2∂z1∂x2∂z2...∂x2∂zm∂x3∂z1∂x3∂z2...∂x3∂zm............∂xn∂z1∂xn∂z2...∂xn∂zm∣∣∣∣∣∣∣∣)
可以看到该雅各比矩阵有
m行
n列。
2 神经网络