对于深度学习框架而言,有直接计算张量函数梯度的跟踪变量,自动求梯度方法,可以较快速度完成反向的梯度计算,而且基于张量运算的前向传播也会更快。
前向传播
如图所示其中含有一个隐藏层且不考虑偏置情况下(其中W1,W2开始时都是以一定标准差随机生成的较小的权重张量),x经过Z = W1 * X,Z经过激活函数得到h,Z和h合在一起可以看成是某个激活函数的全连接层。然后在W2权值下经过正向传播o = W1 * X。其中o就是输出层。
然后根据真实的目标向量y和输出向量o可以计算出当前数据样本的损失根据L2范数定义,基于W1和W2得到正则化项。正则化项为
![](https://i-blog.csdnimg.cn/blog_migrate/3b1f3126f9ae7e73c8459ab0ff139d3f.png)
目标函数是什么
然后 J = L + s ,就是所谓的给定样本数据到目标函数,之后的反向传播都是基于这个目标函数的。
![](https://i-blog.csdnimg.cn/blog_migrate/57f1379315dbfff5d7edd8d09b3c43ca.png)
反向传播
反向传播的目标
反向传播的目标是基于目标函数 J(l,s) 函数(该函数中l、s是两个关于W1和W2的函数)计算求得J对W1和W2的梯度(即分别求偏导数,梯度就是偏导数向量)
反向传播计算和方法
反向传播计算就是微积分的链式法则对函数 J 的两个隐变量求偏导数。
而基于pytorch,我们可以对生成的变量W1和W2使用(requires_grad=True)方法来跟踪梯度,然后通过链式法则backward()方法对其自动求梯度,即可直接计算出两个偏导数的梯度向量。
正向传播和反向传播关系及总结
在前向传播期间计算正则项取决于模型参数𝐖1和 𝐖2的当前值。它们是由优化算法根据最近迭代的反向传播给出的。
反向传播期间参数的梯度计算, 取决于由前向传播给出的隐藏变量𝐡的当前值。
初始化模型参数后, 交替使用前向传播和反向传播,利用反向传播给出的梯度来更新模型参数。
但是反向传播重复利用前向传播中存储的中间值,以避免重复计算。导致需要保留中间值,直到反向传播完成。 这也是训练比单纯的预测需要更多的内存的原因之一。
这些中间值的大小与网络层的数量和批量的大小大致成正比。 因此,使用更大的批量来训练更深层次的网络更容易导致内存不足(out of memory)错误。
数值稳定性
当神经网络层数太多时,如果开始w权重较小或较大,会导致衰减和爆炸
衰减
当w权重参数过小,如0.2,若隐藏层选择恒等映射(直接传递相乘结果,就是仿射变换)x正向传播30次,经历了X*W1* ……*W30,后导致反向传播求梯度是出现梯度消失(即衰减)。
爆炸
同理,当w权重参数过大,如5,若隐藏层选择恒等映射(直接传递相乘结果,就是仿射变换)x正向传播30次,经历了X*W1* ……*W30,后导致反向传播求梯度是出现梯度相当大,内存单元难以存储计算(即爆炸),会导致内存使用迅速增加。
模型初始化
一般原则
使用默认随机初始化方法,pytorch随机采样-0.07到+0.07之间的均匀分布,偏差参数可以清零。
对“打破对称性”的理解
当所有初始值都相同时,然后在进行反向传播时,所有隐藏单元权重将获得相同的梯度,基于梯度优化算法进行相同更新,每个隐藏层相当于只有一个隐藏单元在发挥作用。这就是所谓的对称性。
这意味着所有节点都将学习相同的东西,而希望网络学习不同种类的特征。这是通过随机初始化来实现的,因为这样梯度会不同,每个节点将变得与其他节点更加不同,从而实现多样化的特征提取。
这就是所谓的打破对称性。