《深度学习入门》第六章:与学习相关的技巧

复习知识:

  1. 最优化:寻找最优参数,解决这个问题的过程的方法即最优化。
  2. 随机梯度下降法(stochastic gradient descent ,SGD):为找到最优参数,将参数的梯度作为线索,沿梯度的方向更新参数,并重复步骤多次,从而逐渐靠近最优参数的过程。
    在这里插入图片描述
    即:用右边的值更新左边的值,SGD是朝着梯度方向只前进一定距离的简单方法。
    缺点:如果函数的形状非均向(anisotropic),比如呈延伸状,搜索的路径就会非常低效。根本原因是:梯度的方向并没有指向最小值的方向。如下图:

在这里插入图片描述
改进方法:Momentum、AdaGrad、Adam,其学习进行得要比SGD稍微快一些。下面将具体介绍。

新内容来啦~~~~~

1. Momentum(“动量”,与物理相关)

在这里插入图片描述
与SGD相比,多了变量v,式(1)表示物体在梯度方向上受力,在力的作用下,物体速度增加这一物理法则。
如下图:
在这里插入图片描述
与SGD相比,“之”字形的“程度”减轻了。这是因为随意x轴方向的受到的力非常小,但是一直在同一方向上受力,所以朝同一方向会有一定的加速。反过来,y轴方向受到的力很大,但是因为正反方向受力相互抵消了。所以y轴方向的速度不稳定。

2. AdaGrad(Adaptive,适当的):

该方法会为参数的每个元素适当的调整学习率,与此同时进行学习。
注:学习率过小,会导致学习花费过多时间,学习率过大,会导致学习发散而不能正常进行。
在这里插入图片描述
如下图:
在这里插入图片描述
如图,函数的取值高效地向着最小值移动。由于y轴方向上的梯度较大,因此刚开始变动较大,但是后面会根据这个较大的变动按比例进行调整,减小更新步伐,所以y轴上的更新程度被减弱,“之”字的变动程度有所减弱。

3. Adam:

Momentum(参照小球在碗中滚动的物理规则进行移动) 和AdaGrad(参数的每个元素适当的调整更新步伐)融合的方法,以实现参数空间的高校搜索。
在这里插入图片描述
如上图所示,更新过程就像小球在碗中滚动一样,类似Momentum,但相比之下,Adam的小球左右摇晃的程度有所减轻,这得益于学习的更新程度被适当的调整了。

4. 权值衰减(weight decay):

权值衰减就是一种以减小权重参数的值为目的的进行学习的方法,通过减小权重参数的值来抑制过拟合的发生。
注:不能将权重初始值设为0,否则学习将无法继续;也不能设为相同的值,因为在误差反向传播的时候,所有的权重都会进行相同的更新。所以为了防止“权重均一化(即为了瓦解权重的对称结构)”,必须随机生成初始值。

5. 隐藏层的激活值的分布:

各层的激活值的分布要有一定的广度,因为通过各个层之间传递多样性的数据,神经网络可以进行高效的学习,反之,如果传递的是有所偏向的数据,就会出现梯度消失或者“表现力受限”的问题。
(1)
在这里插入图片描述
在这里插入图片描述
整体代码:

import numpy as np
import matplotlib.pyplot as plt


def sigmoid(x):
    return 1 / (1 + np.exp(-x))


x = np.random.randn(1000, 100)  # 1000个数据
node_num = 100  # 各隐藏层的节点数(神经元)
hidden_layer_size = 5  # 隐藏层有5层
activations = {}  # 激活值的结果保存在这里

for i in range(hidden_layer_size):
    if i != 0:
        x = activations[i - 1]

    w = np.random.randn(node_num, node_num) / np.sqrt(node_num)

    z = np.dot(x, w)
    a = sigmoid(z)  # sigmoid函数
    activations[i] = a

#  绘制直方图
for i, a in activations.items():
    plt.subplot(1, len(activations), i + 1)
    plt.title(str(i + 1) + "-layer")
    plt.hist(a.flatten(), 30, range=(0, 1))
plt.show()

结果如下:
在这里插入图片描述
相比之下,是更有广度的分布。不过后面层的分布呈现歪斜的形状,如果用tanh(双曲函数)则会改善很多,呈现漂亮的钟形,因为tanh函数是关于原点分布,而sigmoid函数是关于(0,0.5)分布,众所周知(现在你知道了嘛),用作激活函数的函数最好具有关于原点对称的性质。
(2)
在这里插入图片描述
在这里插入图片描述
如图,权重为 0.01时,各层的激活值非常小,逆向传播时权重的梯度也同样很小,实际上学习基本没有进展;初始值Xavier时,层越深,偏向越大,学习时会出现梯度消失的问题;初始值是He时,各层中分布的广度相同,逆向传播时,也会传递合适的值。
所以目前,激活函数是ReLU时,权重初始值使用He,激活函数是sigmoid或tanh等S型曲线函数时,初始值使用Xavier是最佳的。

7. Batch Normalization(简称 Batch Norm):

即为了使各层拥有适当的广度,从而可以顺利地进行学习。向神经网络中插入对数据分布进行正规化的层,即Batch Norm层。
算法思想:
以进行学习时的mini-batch为单位,按mini-batch进行正规化,即:使mini-batch的输入数据{x1,x2,….xm}变换为均值为0,方差为1的数据,插入到激活函数的前面或后面,以减小数据分布的偏性。
在这里插入图片描述
在这里插入图片描述
优点:
增大学习效率;不那么依赖初始值;抑制过拟合。
如下图:
在这里插入图片描述
在这里插入图片描述
(3)
在这里插入图片描述
(4)Dropout:
网络的模型变得复杂时,抑制过拟合的方法。训练时,随机选出隐藏层的神经元,然后将其删除,被删除的神经元不再进行信号的传递。测试时,虽然会传递所有的神经信号,但是对于各个神经元的输出,要乘上训练时的删除比例后再输出。
在这里插入图片描述
如下图,右边图像表明:即使是表现力强的网络,也可以抑制过拟合。
在这里插入图片描述

9. 集成学习

机器学习中经常使用,即让多个模型单独学习,最后取多个模型输出的平均值,以提高神经网络识别的精度。Dropout与其有密切关系,通过学习中随机删除神经元,从而每一次让不同的模型进行学习。

10. 超参数

比如各层的神经元数量、batch的大小、参数更新时的学习率、权值衰减等。所以超参数取值很重要,常伴随许多试错。
所以需要高效寻找超参数的值。注意,不能使用测试数据评估超参数的性能,否则会对测试数据发生过拟合。调整超参数值时,必须使用准用的确认数据,即验证数据,以此评估超参数的好坏。
训练数据:用于参数(权重、偏置)的学习;
验证数据:用于超参数的性能评估;
测试数据:确认泛化能力(理想是只用1次)
超参数的最优化:

  1. 设定超参数范围
  2. 从设定的超参数范围中随机采样;
  3. 使用随机采样的值进行学习,通过验证数据评估精度(要将epoch的值设置很小)
    4.重复步骤2、3(100次),根据精度结果,缩小超参数范围。
    当然,如果想要更精炼的方法,可以考虑 贝叶斯最优化。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鬼才的凝视

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值