网站开发架构分类,网站开发属于什么资产,网页设计图片格式,网站做兼容处理怎么设置写在前面
前期学习深度学习的时候#xff0c;很多概念都是一笔带过#xff0c;只是觉得它在一定程度上解释得通就行#xff0c;但是在强化学习的过程中突然意识到#xff0c;反向传播求梯度其实并不是一件简单的事情#xff0c;这篇博客的目的就是要讲清楚反向传播是如何对…写在前面
前期学习深度学习的时候很多概念都是一笔带过只是觉得它在一定程度上解释得通就行但是在强化学习的过程中突然意识到反向传播求梯度其实并不是一件简单的事情这篇博客的目的就是要讲清楚反向传播是如何对特定的某一层求梯度进而更新其参数的
为什么反向传播不容易实现
首先众所周知深度网络就是一个广义的多元函数
但在通常情况下想要求一个函数的梯度就必须知道这个函数的具体表达式
但是问题就在于深度网络的“传递函数”并不容易获得或者说并不容易显式地获得
进而导致反向传播的过程难以进行
为什么反向传播可以实现
损失函数是关于参数的函数
如果要将一个函数F对一个变量x求偏导那偏导存在的前提条件就是F是关于x的函数否则求导结果就是0
符号定义后续公式均据此展开
x[x1,x2,…xn]x[x_1,x_2,\dots x_n]x[x1,x2,…xn]ypred[y1,y2,…ym]y_{pred}[y_1,y_2, \dots y_m]ypred[y1,y2,…ym]θ[w1,b1,w2,b2,…wn,bn]\theta[w_1,b_1,w_2,b_2,\dots w_n,b_n]θ[w1,b1,w2,b2,…wn,bn]ai第i层网络激活函数的输出最后一层的输出就是ypreda^{i}第 i层网络激活函数的输出最后一层的输出就是y_{pred}ai第i层网络激活函数的输出最后一层的输出就是ypredzi第i层网络隐藏层的输出z^{i}第i层网络隐藏层的输出zi第i层网络隐藏层的输出gi ′(zi)第i层激活函数的导数在输入zi处的值g^i\ (z^i)第i层激活函数的导数在输入z^i处的值gi ′(zi)第i层激活函数的导数在输入zi处的值
关系式
网络的抽象函数式 ypredF(x;θ)y_{pred}F(x;\theta)ypredF(x;θ)
即网络就是一个巨大的多元函数接受两个向量模型输入和参数作为输入经过内部正向传播后输出一个向量损失函数Loss的抽象函数式 LossL(ytrue,ypred)L(ytrue,F(x;θ))LossL(y_{true},y_{pred})L(y_{true},F(x;\theta))LossL(ytrue,ypred)L(ytrue,F(x;θ))
其中 ytruey_{true}ytrue 和 xxx 属于参变量它虽然会变但是和模型本身没什么关系唯一属于模型自己的变量就是 θ\thetaθ所以不难看出损失函数L是关于模型参数 θ\thetaθ 的函数损失值Loss完全由模型参数 θ\thetaθ 决定链式法则这个法则是深层网络得以实现梯度计算的关键
核心公式如下
∂L∂θi∂L∂zi⋅∂zi∂θi
\frac{\partial L}{\partial \theta^i}\frac{\partial L}{\partial z^i}·\frac{\partial z^i}{\partial \theta^i}
∂θi∂L∂zi∂L⋅∂θi∂zi
其中∂L∂zi\frac{\partial L}{\partial z^i}∂zi∂L是损失L对第i层加权输入ziz^izi的梯度∂zi∂θi\frac{\partial z^i}{\partial \theta^i}∂θi∂zi是第i层加权输入ziz^izi对本层参数θi\theta^iθi的梯度进一步深究可以发现∂zi∂θi\frac{\partial z^i}{\partial \theta^i}∂θi∂zi相对容易求因为它只涉及到当前层的当前神经元的求解在面向对象语言中很容易为每个属于同一个类的实例增加一个方法比如像这里的输入对参数求导举例来说;
if θiWi and ZiWi∗ai−1bi,then ∂zi∂θi(ai−1)T
if\ \theta^iW^i\ and\ Z^iW^i*a^{i-1}b^i,\\
then\ \frac{\partial z^i}{\partial \theta^i}(a^{i-1})^T
if θiWi and ZiWi∗ai−1bi,then ∂θi∂zi(ai−1)T
其中
(说实话我非常想把隐藏层称为“传递函数”控制和机器学习实际上有非常多可以相互借鉴的地方而且在事实上二者也确实是不可分割的关系)然后我们要来处理相对麻烦的 ∂L∂zi\frac{\partial L}{\partial z^i}∂zi∂L
多层感知机为例共k层已知网络输出求网络第i层的梯度用数学归纳法在这种递归系统中比较合适归纳奠基
LL(ytrue,ypred)L(ytrue,F(x;θ))LL(y_{true},y_{pred})L(y_{true},F(x;\theta))LL(ytrue,ypred)L(ytrue,F(x;θ))
∂L∂zk∂L∂ak⋅∂ak∂zk∂L∂ak⊗(gk)′(zk)\frac{\partial L}{\partial z^k}\frac{\partial L}{\partial a^k}·\frac{\partial a^k}{\partial z^k}\frac{\partial L}{\partial a^k}\otimes (g^k)(z^k)∂zk∂L∂ak∂L⋅∂zk∂ak∂ak∂L⊗(gk)′(zk)
上面的公式说明损失对隐藏层输出的偏导等价于损失函数对最终输出的偏导再逐元素乘上最后层激活函数 在隐藏层输出处 的导数
其中激活函数在创建网络时就明确已知因此求导取值并没有难度
由于LossL(ytrue,ypred)LossL(y_{true},y_{pred})LossL(ytrue,ypred)直接与网络最终输出ypredy_{pred}ypred相关因此损失对最终输出的偏导并不难求
比如将损失函数定义为均方差MSE:其他网络基本同理
L12∑j1m(yj−ajk)2∂L∂ak−(yj−ajk)L\frac{1}{2}\sum^m_{j1}(y_j-a_j^k)^2\\\frac{\partial L}{\partial a^k}-(y_j-a_j^k)L21j1∑m(yj−ajk)2∂ak∂L−(yj−ajk)归纳递推从第 i 层到第 i-1 层
假设已知 ∂L∂zi\frac{\partial L}{\partial z^i}∂zi∂L反向传播因此我们假设的是后一层已知
由链式法则可得
∂L∂zi−1(∂L∂zi)⋅(∂zi∂ai−1)⋅(∂ai−1∂zi−1)\frac{\partial L}{\partial z^{i-1}}(\frac{\partial L}{\partial z^i})·(\frac{\partial z^i}{\partial a^{i-1}})·(\frac{\partial a^{i-1}}{\partial z^{i-1}})∂zi−1∂L(∂zi∂L)⋅(∂ai−1∂zi)⋅(∂zi−1∂ai−1)
其中第一个因子已知
第二个因子∂zi∂ai−1\frac{\partial z^i}{\partial a^{i-1}}∂ai−1∂zi分子为第 i 层隐藏层的输出分母为第 i 层隐藏层的输入即第 i-1 层激活层的输出因此其值就是第 i 层隐藏层的权重矩阵WiW^iWi本身
第三个因子∂ai−1∂zi−1\frac{\partial a^{i-1}}{\partial z^{i-1}}∂zi−1∂ai−1分子为第 i-1 层激活层的输出分母为第 i-1 层激活层的输入因此其值就是 第 i-1 层激活函数 在隐藏层输出处 的导数
综上在已知第 i 层损失对输出的梯度的情况下可以推出第 i-1 层损失对输出的梯度递推成立归纳总结
综上所述反向传播求梯度完全可行按照上面的过程撰写程序就可以很方便地反向逐层 根据损失梯度 更新参数