六、正向传播、反向传播、衰减与爆炸(3月3日学习笔记)

对于深度学习框架而言,有直接计算张量函数梯度的跟踪变量,自动求梯度方法,可以较快速度完成反向的梯度计算,而且基于张量运算的前向传播也会更快。

前向传播

如图所示其中含有一个隐藏层且不考虑偏置情况下(其中W1,W2开始时都是以一定标准差随机生成的较小的权重张量),x经过Z = W1 * X,Z经过激活函数得到h,Z和h合在一起可以看成是某个激活函数的全连接层。然后在W2权值下经过正向传播o = W1 * X。其中o就是输出层。

然后根据真实的目标向量y和输出向量o可以计算出当前数据样本的损失根据L2范数定义,基于W1和W2得到正则化项。正则化项为

六、正向传播、反向传播、衰减与爆炸(3月3日学习笔记)_第1张图片

目标函数是什么

然后 J = L + s ,就是所谓的给定样本数据到目标函数,之后的反向传播都是基于这个目标函数的。

六、正向传播、反向传播、衰减与爆炸(3月3日学习笔记)_第2张图片

反向传播

反向传播的目标

反向传播的目标是基于目标函数 J(l,s) 函数(该函数中l、s是两个关于W1和W2的函数)计算求得J对W1和W2的梯度(即分别求偏导数,梯度就是偏导数向量)

反向传播计算和方法

反向传播计算就是微积分的链式法则对函数 J 的两个隐变量求偏导数。

而基于pytorch,我们可以对生成的变量W1和W2使用(requires_grad=True)方法来跟踪梯度,然后通过链式法则backward()方法对其自动求梯度,即可直接计算出两个偏导数的梯度向量。

正向传播和反向传播关系及总结

  1. 在前向传播期间计算正则项取决于模型参数1和 2的当前值。它们是由优化算法根据最近迭代的反向传播给出的。

  1. 反向传播期间参数的梯度计算, 取决于由前向传播给出的隐藏变量的当前值。

  1. 初始化模型参数后, 交替使用前向传播和反向传播,利用反向传播给出的梯度来更新模型参数。

  1. 但是反向传播重复利用前向传播中存储的中间值,以避免重复计算。导致需要保留中间值,直到反向传播完成。 这也是训练比单纯的预测需要更多的内存的原因之一。

  1. 这些中间值的大小与网络层的数量和批量的大小大致成正比。 因此,使用更大的批量来训练更深层次的网络更容易导致内存不足(out of memory)错误。

数值稳定性

当神经网络层数太多时,如果开始w权重较小或较大,会导致衰减和爆炸

衰减

当w权重参数过小,如0.2,若隐藏层选择恒等映射(直接传递相乘结果,就是仿射变换)x正向传播30次,经历了X*W1* ……*W30,后导致反向传播求梯度是出现梯度消失(即衰减)。

爆炸

同理,当w权重参数过大,如5,若隐藏层选择恒等映射(直接传递相乘结果,就是仿射变换)x正向传播30次,经历了X*W1* ……*W30,后导致反向传播求梯度是出现梯度相当大,内存单元难以存储计算(即爆炸),会导致内存使用迅速增加。

模型初始化

一般原则

使用默认随机初始化方法,pytorch随机采样-0.07到+0.07之间的均匀分布,偏差参数可以清零。

对“打破对称性”的理解

当所有初始值都相同时,然后在进行反向传播时,所有隐藏单元权重将获得相同的梯度,基于梯度优化算法进行相同更新,每个隐藏层相当于只有一个隐藏单元在发挥作用。这就是所谓的对称性。

这意味着所有节点都将学习相同的东西,而希望网络学习不同种类的特征。这是通过随机初始化来实现的,因为这样梯度会不同,每个节点将变得与其他节点更加不同,从而实现多样化的特征提取。

这就是所谓的打破对称性。

你可能感兴趣的:(动手学pytorch,人工智能,python,深度学习)