赞
踩
人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)
(1)定义:
如下图所示:C表示的是代价函数,前一层的输出和后一层的输入关系
1)使用sigmoid函数的导数,导数最大值为1/4,而我们一般会使用标准方法来初始化网络权重,即使用一个均值为0标准差为1的高斯分布。因此,初始化的网络权值通常都小于1。但是由于上面的图中或者更深的网络导致层数越多,求导结果越小,最终导致梯度消失的情况出现。
2)但是当sigma(z)*w>1的时候,也就是w比较大的情况。前面的网络层比后面的网络层梯度变化更快,引起了梯度爆炸的问题。
但是梯度爆炸问题在使用sigmoid激活函数时,出现的情况较少,不容易发生。因为需要|w|>4才会造成这样的效果。(sigmoid导数的最大值0.25)
解决办法:
(2)、梯度消失问题解决
1)用ReLU、Leaky ReLU、(PRelu、RRelu)等替代sigmoid函数。
2)使用BN层,减少网络的训练难度,同时减少输入数据大小
3)输入数据x的标准化策略,参数初始化策略使用一个均值为0标准差为1的高斯分布
4)使用现有预训练模型进行微调,减缓网络训练难度
(3)梯度爆炸问题:梯度剪切(超过指定的范围,梯度值进行剪切)、权重正则化手段
(1)L1与L2正则化
(2)Dropout正则化
1、训练过程
神经元随机失效,概率为P。并且在神经元存在且工作的状态下,权重才会更新,权重更新的越多理论上会变得更大
2、测试过程
神经元随机失效,概率为0。所有的神经元都会参与计算,大于训练时候的任意一个模型的计算量
实现
- def dropout(x, level):
- if level < 0. or level >= 1:
- raise Exception('dropout保持概率在0到1之间')
- sample = np.random.binomial(n=1, p=level, size=x.shape)
- print(sample)
- x *= sample
- x /= level
- return x
- x = np.asarray([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype=np.float32)
- dropout(x, 0.8)
3.为什么需要去做rescale
(3)BN结构
1、Batch Normalization的作用就是减小Internal Covariate Shift 所带来的影响,让模型变得更加健壮,鲁棒性(Robustness)更强。
2 、Batch Normalization 的作用,使得均值和方差保持固定(由每一层γ和β决定),不同层学习到不同的分布状态
3、因此后层的学习变得更容易一些。Batch Normalization 减少了各层 W 和 b 之间的耦合性,让各层更加独立,实现自我训练学习的效果
(4)早停止法
通常不断训练之后,损失越来越小。但是到了一定之后,模型学到的过于复杂(过于拟合训练集上的数据的特征)造成测试集开始损失较小,后来又变大。模型的w参数会越来越大,那么可以在测试集损失减小一定程度之后停止训练。
(5)数据增强
剪切、旋转/反射/翻转变换、缩放变换、平移变换、尺度变换、对比度变换、噪声扰动、颜色变换等一种或多种组合数据增强变换的方式来增加数据集的大小
(1)卷积网络计算公式
输入大小:H1,W1,C1
输出大小:H2,W2,C2
卷积核参数:FxF(核大小),S(步长),P(零填充大小), N(卷积核个数)
H2 = (H1-F+2P)/S +1
W2 = (W1-F+2P)/S + 1
C2 = N
(2)感受野计算
计算案例(初始的感受野大小为1),我们的结构顺序为(卷积、池化、卷积、卷积):
3x3的卷积(stride=1):r=1 + (3 -1)=3,感受野大小为3x3
2x2的池化(stride=2):r = 3 + (2 - 1)*1 = 4,感受野为4x4
3x3的卷积(stride=3):r = 4 + (3-1)*2*1=8,感受野为8x8
3x3的卷积(stride=2):r = 8 + (3-1)*3*2*1=20,感受野为20x20
1.Sigmoid函数饱和使梯度消失。sigmoid神经元有一个不好的特性,就是当神经元的激活在接近0或1处时会饱和:在这些区域,梯度几乎为0。
2.指数函数的计算是比较消耗计算资源的
Tanh:和sigmoid神经元一样,它也存在饱和问题,依然指数运算。但是和sigmoid神经元不同的是,它的输出是零中心的。
优点:
1相较于sigmoid和tanh函数,ReLU对于随机梯度下降的收敛有巨大的加速作用,这是由它的线性,非饱和的公式导致的。
2sigmoid和tanh神经元含有指数运算等耗费计算资源的操作,而ReLU可以简单地通过对一个矩阵进行阈值计算得到。
缺点:在训练的时候,ReLU单元比较脆弱并且可能“死掉”。
Leaky ReLU是为解决“ReLU死亡”问题的尝试。ReLU中当x<0时,函数值为0。而Leaky ReLU则是给出一个很小的负数梯度值,比如0.01。
(1)SGD
相对于批量梯度和mini-batch梯度下降,随机梯度下降在每次更新时用1个样本,随机也就是说我们用样本中的一个例子来近似我所有的样本,来调整参数。
问题:
虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近。但是相比于批量梯度,这样的方法更快,更快收敛,虽然不是全局最优,但很多时候是我们可以接受的。当然理论上来讲SGD会很难去解决鞍点等优化问题,需要后面的算法去进行求解。
- BATCH_SIZE大小设置对训练耗时的影响:
- 1.如果当设置BATCH_SIZE等于训练样本时,比如训练样本有512个,设置BATCH_SIZE=512,那么一次BATCH_SIZE=512的批量数据进行训练时,
- 会计算BATCH_SIZE=512个样本的反向传播,求出512个样本的梯度累计和,然后使用该梯度累计和进行一次权重参数更新。
- 2.如果当设置BATCH_SIZE等于1时,,比如训练样本有512个,设置BATCH_SIZE=1,那么一次BATCH_SIZE=1的批量数据进行训练时,
- 会计算BATCH_SIZE=1个样本的反向传播,求出1个样本的梯度,然后使用该梯度进行一次权重参数更新,
- 那么当所有512个样本都完成训练时,一共进行了512次反向传播(梯度计算),512次参数更新。
- 3.结论:
- 1.显然BATCH_SIZE设置越大,那么所有训练样本数据完成一次训练(完成一个epoch)要进行的参数更新次数会更少,
- 那么训练耗时更短,BATCH_SIZE设置越小,一个epoch训练完所有样本数据要进行的参数更新次数会更多,
- 因此训练耗时更长。
- 2.当然训练耗时也和你所选取的优化算法是全批量梯度下降BGD、随机梯度下降SGD、小批量梯度下降Mini-batch GD(MBGD)有关。
- 4.每个批量数据训练都要执行的代码流程
- # 设置优化器初始梯度为0
- optimizer.zero_grad()
- # 模型输入一个批次数据, 获得输出
- output = model(text)
- # 根据真实标签与模型输出计算损失
- loss = criterion(output, label)
- # 将该批次的损失加到总损失中
- train_loss += loss.item()
- # 误差反向传播
- loss.backward()
- # 参数进行更新
- optimizer.step()
(2)momentum
动量梯度下降(Gradient Descent with Momentum)是计算梯度的指数加权平均数,并利用该值来更新参数值。动量梯度下降法的整个过程为,其中β通常设置为0.9:
下面两种都是能够适应性地对学习率调参的方法,甚至是逐个参数适应学习率调参。
(3)RMSProp
不同于AdaGrad算法里状态变量st是截至时间步t所有小批量随机梯度gt按元素平方和。
RMSProp(Root Mean Square Prop)算法将这些梯度按元素平方做指数加权移动平均
(4)Adam算法
Adam 优化算法(Adaptive Moment Estimation,自适应矩估计)将 Momentum 和 RMSProp 算法结合在一起。Adam算法在RMSProp算法基础上对小批量随机梯度也做了指数加权移动平均。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。