梯度介绍
深度学习的训练本质是优化损失,优化的方式是计算梯度,然后通过优化算法更新参数 ,常见的优化算法SGD/Momentum/Adagrad/RMSProp/Adam等,本文总结一下梯度的计算。
链式法则
利用微分求梯度的方法计算量太大,而误差反向传播算法的出现提高了计算效率,误差反向传播算法(BP)主要基于链式法则。
链式法则是求复合函数的导数:
例如多元复合函数f=x2y,可以看作f(x,y)=p(x)q(y),其中p(x)=x2,q(y)=y
∂x∂f=∂p∂f∗∂x∂p=q∗2x=2xy
∂y∂f=∂q∂f∗∂y∂q=p∗1=x2
有了偏导数,当y的梯度已知,各变量的梯度=偏导数*y的梯度,因此有几点常用如下
1.如果是由a + b = y,则反向传播时a b 的梯度相等,且等于y的梯度
2.如果是a * b = y,则反向传播时a b 的梯度分别为b a,如果是矩阵运算会涉及到矩阵转换
3.max操作梯度只有传播到取最大值的一路

图片来自 梯度是如何计算的
逻辑回归梯度计算
逻辑回归流程如下
- 全连接 z=wTx+b=w1x1+w2x2+b
- **层 y^=a=σ(z)
- 损失层(二分类交叉熵) L(a,y)=−(ylog(a)+(1−y)log(1−a))
这里**函数为sigmoid y=1+exp(−x)1
dzda=(1+e−x)21∗e−x=1+e−x1∗1+e−xe−x=1+e−x1∗(1−1+e−x1)
dzda=y∗(1−y)
先求L(a,y)关于a的导数dadL(a,y)=−y/a+(1−y)/(1−a)
因为dzdL(a,y)=(dadL)∗(dzda)
所以有dz=dzdL(a,y)=(dadL)∗(dzda)=[−y/a+(1−y)/(1−a)]∗a(1−a)dz=a−y
进一步推导w和b
dw1=m1i∑mx1(i)(a(i)−y(i))dw2=m1i∑mx2(i)(a(i)−y(i))db=m1i∑m(a(i)−y(i))
wx矩阵形式推导
趁热打铁,我们把矩阵形式的梯度推导一下,先放结果。假设D=wx
dW=dD.dot(X.T)dX=W.T.dot(dD)
a*b 表示矩阵对应位置相乘
a.dot(b) 表示矩阵内积
未完待续…