神经网络炼丹术:神经网络调参

自:
《TensorFlow深度学习》
《深度学习入门》
《深度学习实战》

一丶梯度优化算法

  1. WW 表示需要更新的参数

  2. LW\frac{\partial L}{\partial W} 表示损失函数关于W的梯度

  3. η\eta 表示学习率

SDG

SDG的缺点会陷入局部最小和鞍点
WWηLWW \leftarrow W -\eta\frac{\partial L}{\partial W}
在这里插入图片描述

momentum

momentum因为下降的时候有速度,然后不会停止,很有可能走出困境
vαvηLWWW+vv \leftarrow \alpha v -\eta\frac{\partial L}{\partial W} \\W \leftarrow W+v
在这里插入图片描述
受学习率影响很大,每个维度学习率一样,是全局设置,如果针对稀疏数据,很难学习,所以急需个性化设置每个维度的学习率,也就有了下面的AdaGrad

AdaGrad

调整学习率

hh+LW2WWη1hLWh \leftarrow h +\frac{\partial L}{\partial W} ^2 \\ \\ W \leftarrow W-\eta \frac{1}{\sqrt{h}}\frac{\partial L}{\partial W}

  1. 以往梯度的平方和做分母,所以前期分母小,前期学习率就大,加速训练,后期分母大小,学习率就会变小;
  2. 且每个有不同的学习率

但是假如前期学习率比较大,初始梯度爆炸,那么往后的学习率很小,训练提前结束,需要很多次很多迭代才行,就像下面
在这里插入图片描述
需要加上小的值 防止初始值为0
解决:变种RMSProp , 分母由平方和变成加权平均,解决提前结束

Adam

Mommentum + Adagrad + 校验

学习率自适应

直接设置学习率
在这里插入图片描述

使用方式

1. 稀疏数据:使用学习率自适应,比如广告预估业务, 特征维度几十亿维,到几百维有值
2. SGD慢,但最终要比较好,需要自我调整learning rate ,其他的自适应比较懒不需要自己手动调整
3. 较深较复杂且需要快速收敛,推荐adam

二丶激活函数

在这里插入图片描述

sigmod

1. 输入太小或太大无梯度,因为接近0了
2. exp复杂计算

3. 梯度容易消失y(1-y),多层梯度很小
4. 输出均值为0.5

tanh

1. 快,计算量小
2. 输入太小或太大无梯度
3. 输出均值为0

ReLu

1. 快,计算量小,
2. 梯度不会太小

3. 输出均值非0
4 . 非常大的梯度流过神经元就不会有激活现象

leaky ReLu : ReLu改善
x小于0时乘以系数,就会更小,不会一直为0

ELU

1. 均值接近0
2. 小于0时exp难算

使用方式

1. 小心设置ReLu学习率
2. 不要使用sigmod
3. 推荐使用 leaky ReLu,ELU
4. 试试 tanh

三丶网络初始化

权重初始值

权值衰减:通过减小权重参数的值来抑制过拟合的发生
是像0.01 * np.random.randn(10, 100)这样,使用由高斯分布生成的值乘以0.01后得到的值(标准差为0.01的高斯分布)

那全部为0呢?
比如,在2层神经网络中,假设第1层和第2层的权重为0。这样一来,正向传播时,因为输入层的权重为0,所以第2层的神经元全部会被传递相同的值。第2层的神经元中全部输入相同的值,这意味着反向传播时第2层的权重全部都会进行相同的更新(回忆一下“乘法节点的反向传播好的参数:激活值分布分散就好一些,集中就不好的内容)。因此,权重被更新为相同的值,并拥有了对称的值(重复的值)。这使得神经网络拥有许多不同的权重的意义丧失了。为了防止“权重均一化”(严格地讲,是为了瓦解权重的对称结构),必须随机生成初始值

隐藏层激活值的分布

在这里插入图片描述
这里假设神经网络有5层,每层有100个神经元。然后,用高斯分布随机生成1000个数据作为输入数据,并把它们传给5层神经网络。激活函数使用sigmoid函数

  1. 第一幅图:各层的激活值呈偏向0和1的分布。这里使用的sigmoid函数是S型函数,随着输出不断地靠近0(或者靠近1),它的导数的值逐渐接近0。因此,偏向0和1的数据分布会造成反向传播中梯度的值不断变小,最后消失。这个问题称为梯度消失(gradient vanishing)。层次加深的深度学习中,梯度消失的问题可能会更加严重。
  2. 第二幅图:使用标准差为0.01的高斯分布时,各层的激活值的分布。这次呈集中在0.5附近的分布。因为不像刚才的例子那样偏向0和1,所以不会发生梯度消失的问题。但是,激活值的分布有所偏向,说明在表现力上会有很大问题。为什么这么说呢?因为如果有多个神经元都输出几乎相同的值,那它们就没有存在的意义了。比如,如果100个神经元都输出几乎相同的值,那么也可以由1个神经元来表达基本相同的事情。因此,激活值在分布上有所偏向会出现“表现力受限”的问题
  3. 第三幅图:试使用Xavier Glorot等人的论文[9]中推荐的权重初始值(俗称“Xavier初始值”)Xavier的论文中,为了使各层的激活值呈现出具有相同广度的分布,推导了合适的权重尺度。推导出的结论是,如果前一层的节点数为nn,则初始值使用标准差为 1n\frac {1}{\sqrt n}的分布A
    在这里插入图片描述

Xavier初始值是以激活函数是线性函数为前提而推导出来的。因为sigmoid函数和tanh函数左右对称,且中央附近可以视作线性函数,所以适合使用Xavier初始值
在这里插入图片描述
但当激活函数使用ReLU时,一般推荐使用ReLU专用的初始值,也就是Kaiming He等人推荐的初始值,也称为“He初始值”,当前一层的节点数为n时,He初始值使用标准差为 2n\frac {2}{\sqrt n}的高斯分布。当Xavier初始值是 1n\frac {1}{\sqrt n}时,(直观上)可以解释为,因为ReLU的负值区域的值为0,为了使它更有广度,所以需要2倍的系数。

在这里插入图片描述

四丶批归一化 Batch Normalization

每层更改了激活函数,怎么办?那么适合于某一种的就不适用了,于是我们“强制性”地调整激活值的分布会怎样呢

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上图得出使用Batch Norm后,学习进行得更快了
下面是是权重初始值的标准差为各种不同的值时的学习过程图。我们发现,几乎所有的情况下都是使用Batch Norm时学习进行得更快。
在这里插入图片描述

五丶拟合问题

在这里插入图片描述
如图 (a)所示,这种现象叫做欠拟合。但如果用较复杂的函数模型去学习时,有可能学习到的函数会过度地“拟合”训练集样本,从而导致在测试集上表现不佳,如图 ©所示,这种现象叫做过拟合。只有学习的模型和真实模型容量大致匹配时,模型才能具有较好地泛化能力,如图 (b)所示。

欠拟合

当我们发现当前的模型在训练集上误差一直维持较高的状态,很难优化减少,同时在测试集上也表现不佳时,我们可以考虑是否出现了欠拟合的现象。这个时候可以通过增加神经网络的层数、增大中间维度的大小等手段,比较好的解决欠拟合的问题。但是由于现代深度神经网络模型可以很轻易达到较深的层数,用来学习的模型的容量一般来说是足够的,在实际使用过程中,更多的是出现过拟合现象。

过拟合:正则化技术

发生过拟合的原因,主要有以下两个。
• 模型拥有大量参数、表现力强。
• 训练数据少

权重衰弱

前面所说的网络初始化的权重衰弱是防止过拟合的一种方法

调节层数与参数规模

网络的层数和参数量是网络容量很重要的参考指标,通过减少网络的层数,并减少每层中网络参数量的规模,可以有效降低网络的容量。

在这里插入图片描述
其中红色矩形块和蓝色圆形块分别代表了训练集上的 2 类样本,保持其它超参数一致,仅调整网络的层数,训练获得样本上的分类效果,如图中所示,可以看到,随着网络层数的加深,学习到的模型决策边界越来越逼近训练样本,出现了过拟合现象。对于此任务,2 层的神经网络即可获得不错的泛化能力,更深层数的网络并没有提升性能,反而出现过拟合现象,泛化能力变差,同时计算代价也更高

Dropout

权值衰减是一直以来经常被使用的一种抑制过拟合的方法。该方法可以简单地实现,在某种程度上能够抑制过拟合。但是,如果网络的模型变得很复杂,只用权值衰减就难以应对了。在这种情况下,我们经常会使用Dropout 方法

Dropout是一种在学习的过程中随机删除神经元的方法

训练时,每传递一次数据,随机选出隐藏层的神经元,然后将其删除。被删除的神经元不再进行信号的传递
测试时,虽然会传递所有的神经元信号,但是对于各个神经元的输出,要乘上训练时的删除比例后再输出
在这里插入图片描述

在这里插入图片描述

六丶数据增强·

  1. 归一化
  2. 图像翻转:翻转,拉伸,裁剪,变形
  3. 色彩变换:对比度,亮度
  4. 多尺度

七丶可视化检查中间状态

在这里插入图片描述

  1. . 说明没有学习到,有可能学习率比价大
  2. 过拟合
  3. 严重过拟合
  4. 平缓,速度不够快,调整学习率
  5. 初始化没有好
  6. 梯度加反了,找最大的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章