一、网络参数初始化
1.常见初始化方法
均匀分布初始化,权重参数初始化从区间均匀随机取值。即在(-1/,1/)均匀分布中生成当前神经元的权重,其中d为每个神经元的输入数量。
正态分布初始化,随机初始化从均值为0,标准差时1的高斯分布中取样,使用一些很小的值对参数W进行初始化。
全0初始化,将神经网络中的所有权重参数初始化为0.
全1初始化,将神经网络中的所有权重参数初始化为1.
固定值初始化,将神经网络中的所有权重参数初始化为某个固定值。
kaiming初始化,也叫做HE初始化,HE初始化分为正态分布的HE初始化、均分分布的HE初始化。
xavier初始化,也叫所Glorot初始化,该方法的基本思想是各层的激活值和梯度的方差在传播过程中保持一致。它有两种,一种是正态分布的xavier初始化,一种是均匀分布的xavier初始化。
二、反向传播
1.正向传播 2.反向传播
Epoch:使用全部数据对模型进行一次完整训练。
Batch:使用训练集中的小部分样本对模型权重进行一次反向传播的参数更新。
Iteration:使用一个Batch数据模型进行一次参数更新的过程。
1.前向和反向传播
利用反向传播算法对神经网络进行训练,该方法与梯度下降算法相结合,对网络中所有权重计算损失函数的梯度。并利用梯度值来更新权值以最小化损失函数。
在网络的训练过程中经过前向传播后得到的最终结果跟训练样本的真实值总是存在一定误差,这个误差就是损失函数。想要减小这个误差,就用损失函数ERROR,从后往前,依次求各个参数的偏导,这就是反向传播。
三、 反向传播算法
BP算法也叫误差反向传播算法,它用于求解模型的参数梯度,从而使用梯度下降法来更新网络参数。基本工作流程如下:
1.通过正向传播得到误差,所谓正向传播指的是数据从输入到输出层,经过层层计算得到预测值,并利用损失函数得到预测值和真实值之间的误差。
2.通过反向传播把误差传递给模型的参数,从而对网络参数进行适当的调整,缩小预测值和真实值之间的误差。
3.反向传播算法是利用链式法则进行梯度求解,然后进行参数更新。对于复杂的复合函数,我们将其拆分为一系列的加减乘除或指数,对数,三角函数等初等函数,通过链式法则完成复合函数的求导。
四、优化方法
传统的梯度下降优化算法中,可能会碰到一下情况
碰到平缓区域,梯度值较小,参数优化变慢 碰到“鞍点”,梯度为0,参数无法优化 碰到局部最小值 对于这些问题,出现一些对梯度下降算法的优化方法,例如:momentum、AdaGrad、RMSprop、Adam等
1.指数加权平均
加权平均是指给每个数赋予不同的权重求得平均数。移动平均数,指的是计算最近邻的N个数来获得平均数。
指数移动加权平均则是参考个数值,并且个数值的权重都不同,距离越远的数字对平均数计算的贡献就越小(权重越小),距离越近则对平均数的计算贡献越大(权重越大)。
2.Momentum
3.AdaGrad
AdaGrad通过对不同的参数分量使用不同的学习率,AdaGrad的学习率总体会逐渐减小,这是因为AdaGrad认为:在起初时,我们距离最优目标仍较远,可以使用较大的学习率,加速训练速度,随着迭代次数的增加,学习率逐渐下降。
4.RMSProp
RMSProp优化算法是对AdaGrad的优化,最主要的不同是,其使用指数移动加权平均梯度替换历史梯度的平方和。其计算过程如下:
5.Adam
Momentum使用指数加权平均计算当前的梯度值、AdaGrad、RMSProp使用自适应的学习率,Adam结合了Momentum、RMSProp的优点,使用:指数加权平均的梯度和指数加权平均的学习率。使得能够自适应学习率的同时,也能够使用Momentum的优点。
五、正则化
在训练深层神经网络时,由于模型参数较多,在数据量不足的情况下,很容易过拟合。Dropout就是在神经网络中一种缓解过拟合的方法。
1.Dropout层的原理和使用
缓解过拟合的方式就是降低模型的复杂度,而Dropout就是通过减少神经元之间的连接,把稠密的神经网络神经元连接变成稀疏的 神经元连接,从而达到降低网络复杂度的目的。
# 1,创建以及使用dropout
def test01():
# 初始化Dropout对象
dropout = nn.Dropout(p=0.8)
# 初始化数据
input = torch.randint(0,10,size = [5, 8]).float()
print(input)
print('-'*50)
#将input输入经过 dropout
output = dropout(input)
# 每个输入的数据会有 p 概率设置为0
print(output)
tensor([[7., 9., 7., 5., 1., 8., 8., 5.],
[4., 9., 2., 6., 6., 4., 8., 3.],
[3., 4., 3., 2., 8., 7., 5., 9.],
[4., 1., 1., 5., 3., 4., 8., 6.],
[3., 0., 0., 7., 2., 2., 8., 5.]])
--------------------------------------------------
tensor([[ 0., 0., 35., 25., 0., 0., 0., 25.],
[ 0., 0., 0., 0., 30., 0., 40., 15.],
[ 0., 0., 0., 10., 0., 0., 0., 45.],
[ 0., 5., 0., 0., 0., 20., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.]])
我们将Dropout层的概率p设置为0.8,此时经过Dropout层计算的张量中就出现了很多0,概率p设置值越大,则张量中出现的0就越多。上面结果的计算过程如下:
1.先按照p设置的概率,随机将部分的张量元素设置为0
2.为了校正张量元素被设置为0带来的影响,需要对非0的元素进行缩放,其缩放因子为:1/(1-p),上面代码中p的值为0.8,根据公式缩放因子为:1/(1-0.8)=5
3.比如:第3个元素,原来是7,乘以缩放因子之后变成35.
结果: 经过Dropout层之后有一些提速为0,这使得参数无法得到更新,从而达到了降低网络复杂度的目的。
六、批量归一化
在神经网络的搭建过程中,Batch Normalization(批量归一化)是经常使用一个网络层,其主要的作用是控制数据的分布,加快网络的收敛。
神经网络的学习其实在学习数据的分布,随着网络的深度增加、网络复杂度增加,一般流经网络的数据都是一个mini batch,每个 mini batch 之间的数据分布变化非常剧烈,这就是的网络参数频繁的进行大的调整以适应流经网络的不同分布的数据,给模型训练带来非常大的不稳定性,使得模型难以收敛。