模型优化-RMSprop

RMSprop 全称 root mean square prop 算法,和动量方法一样都可以加快梯度下降速度。关于动量方法的内容可以参考这篇博文模型优化-动量方法

动量方法借助前一时刻的动量,从而能够有效地缓解山谷震荡以及鞍部停滞问题。而 RMSprop 对比动量方法的思想有所不同,以 y = wx + b 为例,因为只有两个参数,因此可以通过可视化的方式进行说明。

RMSprop示例图

假设纵轴代表参数 b,横轴代表参数 w,由于 w 的取值大于 b,因此整个梯度的等高线呈椭圆形。可以看到越接近最低点(谷底),椭圆的横轴与纵轴的差值也越大,正好对应我们先前所说的山谷地形。

上图中可以看到每个点的位置,以及这些点的梯度方向,也就是说,每个位置的梯度方向垂直于等高线。那么在山谷附近,虽然横轴正在推进,但纵轴方向的摆动幅度也越来越大,这就是山谷震荡现象。如果使用的随机梯度下降,则很有可能不断地上下震荡而无法收敛到最优值附近。所以,我们向减缓参数 b 方向(纵轴)的速度,同时加快参数 w 方向(横轴)的速度。

【计算过程】:

  • 单独计算每个参数在当前位置的梯度。
    d w i = ∂ L ( w ) ∂ w i dw_{i} = \frac{\partial L(w)}{\partial w_i} dwi=wiL(w)

  • 计算更新量。
    S d w i = β S d w i + ( 1 − β ) d w i 2 Sdw_{i} = \beta Sdw{i} + (1 - \beta)dw_{i}^2 Sdwi=βSdwi+(1β)dwi2
    需要注意的是 d w 2 dw^2 dw2 是指对 dw 做平方处理。

  • 更新参数。
    w i = w i − η d w i S d w i w_i = w_i - \eta \frac{dw_i}{\sqrt{Sdw_i}} wi=wiηSdwi dwi

需要注意 S d w i Sdw_i Sdwi 有可能为 0,因此可以添加一个极小的常数来防止分母为零的情况出现。
w i = w i − η d w i σ + S d w i w_i = w_i - \eta \frac{dw_i}{\sigma + \sqrt{Sdw_i}} wi=wiησ+Sdwi dwi
也可以把这个极小的值放到根号里面。
w i = w i − η d w i σ + S d w i w_i = w_i - \eta \frac{dw_i}{\sqrt{\sigma + Sdw_i}} wi=wiησ+Sdwi dwi

根据参数更新公式, S d w i Sdw_i Sdwi 越大,则 w 更新得越慢。在先前所讲的山谷地形中,纵轴方向的梯度要大于横轴方向的梯度,也就是说 db 远大于 dw, d b / S d b db/\sqrt{Sdb} db/Sdb 值要小于 d w / S d w dw/\sqrt{Sdw} dw/Sdw ,最终在纵轴方向上更新得较慢,而在横轴上更新得更快。

RMSprop 实际上是将椭圆形的等高线转换为圆形的等高线。怎么理解呢?当采用特征归一化将 w 和 b 都转化为 [0, 1] 区间后,此时的图等同于右图。

特征归一化.png

因为是圆形,无论是纵轴还是横轴的梯度大小都相等,那么计算得到的更新量 Sdw = Sdb。若等高线呈椭圆形,则椭圆形长轴方向更新量要大于椭圆形短轴方向,就好比长轴长度为 10,短轴长度为 5,长轴方向每次更新 1,短轴方向每次更新 0.5。虽然速度上不想等,但两者最终从一端抵达另一端所需的时间是一致的。这也是为什么我将 RMSprop 理解成将椭圆形等高线转换为圆形。

【代码实现】:

def RMSprop(x, y, step=0.01, iter_count=500, batch_size=4, beta=0.9):
    length, features = x.shape
    data = np.column_stack((x, np.ones((length, 1))))
    w = np.zeros((features + 1, 1))
    Sdw, eta = 0, 10e-7
    start, end = 0, batch_size
    for i in range(iter_count):
        # 计算梯度
        dw = np.sum((np.dot(data[start:end], w) - y[start:end]) * data[start:end], axis=0) / length        
        # 计算更新量
        Sdw = beta * Sdw + (1 - beta) * np.dot(dw, dw)                     
        # 更新参数
        w = w - (step / np.sqrt(eta + Sdw)) * dw.reshape((features + 1, 1))
        start = (start + batch_size) % length
        if start > length:
            start -= length
        end = (end + batch_size) % length
        if end > length:
            end -= length
    return w

对比 AdaGrad 的实现代码,我们可以发现 RMSprop 实际上在 AdaGrad 的梯度累积平方计算公式上新增了一个衰减系数 β 来控制历史信息的获取。

  • AdaGrad:
    r = r + d w 2 r = r + dw^2 r=r+dw2
  • RMSprop:
    S d w = β S d w + ( 1 − β ) d w 2 Sdw = \beta Sdw + (1 - \beta)dw^2 Sdw=βSdw+(1β)dw2

从这个角度来说,RMSprop 改变了学习率。

RMSprop 算法可以结合牛顿动量,RMSprop 改变了学习率,而牛顿动量改变了梯度,从两方面改变更新方式。

【代码实现】:

def RMSprop(x, y, step=0.01, iter_count=500, batch_size=4, alpha=0.9, beta=0.9):
    length, features = x.shape
    data = np.column_stack((x, np.ones((length, 1))))
    w = np.zeros((features + 1, 1))
    Sdw, v, eta = 0, 0, 10e-7
    start, end = 0, batch_size
    
    # 开始迭代
    for i in range(iter_count):
        # 计算临时更新参数
        w_temp = w - step * v
        
        # 计算梯度
        dw = np.sum((np.dot(data[start:end], w_temp) - y[start:end]) * data[start:end], axis=0).reshape((features + 1, 1)) / length        
        
        # 计算累积梯度平方
        Sdw = beta * Sdw + (1 - beta) * np.dot(dw.T, dw)
        
        # 计算速度更新量、
        v = alpha * v + (1 - alpha) * dw
        
        # 更新参数
        w = w - (step / np.sqrt(eta + Sdw)) * v
        start = (start + batch_size) % length
        if start > length:
            start -= length
        end = (end + batch_size) % length
        if end > length:
            end -= length
    return w

关于 RMSProp 相关的代码都可从 传送门 中获得。

参考

已标记关键词 清除标记
<p>                《人工智能:深度学习入门到精通实战》课程主要就人工智能领域相关的深度学习基础、深度学习计算、卷积神经网络+经典网络、循环神经网络+RNN进阶、优化算法、计算机视觉和自然语言处理等,配套实战案例与项目全部基于真实数据集与实际任务展开,结合深度学习框架进行建模实战。</p> <p>                由浅入深,每一个理论搭配一个实验,引领学员浸泡式逐步掌握各项技能和实战项目,且侧重技能不同,学员的知识体系会更加全面</p> <p>课程大纲:</p> <p>第一章:深度学习基础-深度学习简介</p> <p>01.1-前置知识</p> <p>01.2-传统编程与数据编程</p> <p>01.3-深度学习起源</p> <p>01.4-深度学习崛起与发展</p> <p>01.5-深度学习成功案例</p> <p>01.6-深度学习特点</p> <p> </p> <p>第二章:深度学习基础-Python基础</p> <p>02.1-PyTorch介绍与环境配置</p> <p>02.2-数据操作与创建Tensor</p> <p>02.3-算术操作、索引与改变形状</p> <p>02.4-线性代数、广播机制与内存开销</p> <p>02.5-Tensor和NumPy相互转换与Tensor on GPU</p> <p>02.6-实验01-创建和使用Tensor-1</p> <p>02.7-实验01-创建和使用Tensor-2</p> <p>02.8-梯度下降</p> <p>02.9-实验02-梯度下降-1</p> <p>02.10-实验02-梯度下降-2</p> <p>02.11-自动求梯度概念</p> <p>02.12-自动求梯度实例</p> <p>02.13-实验03-自动求梯度-1</p> <p>02.14-实验03-自动求梯度-2</p> <p> </p> <p>第三章:深度学习基础-线性回归</p> <p>03.1-线性回归讲解</p> <p>03.2-线性回归实例</p> <p>03.3-实验04-从零实现线性回归-1</p> <p>03.4-实验04-从零实现线性回归-2</p> <p>03.5-实验05-线性回归的简洁实现-1</p> <p>03.6-实验05-线性回归的简洁实现-2</p> <p> </p> <p>第四章:深度学习基础-softmax回归</p> <p>04.1-softmax回归</p> <p>04.2-实验06-FashionMNIST</p> <p>04.3-实验07-从零实现Softmax回归-1</p> <p>04.4-实验07-从零实现Softmax回归-2</p> <p>04.5-实验08-softmax回归的简洁实现</p> <p> </p> <p>第五章:深度学习基础-多层感知机</p> <p>05.1-感知机</p> <p>05.2-多层感知机</p> <p>05.3-多层感知机与神经网络</p> <p>05.4-激活函数</p> <p>05.5-正向传播</p> <p>05.6-反向传播</p> <p>05.7-正向传播和反向传播</p> <p>05.8-批大小</p> <p>05.9-实验09-从零实现MLP</p> <p>05.10-实验10-MLP的简洁实现</p> <p> </p> <p>第六章:深度学习基础-模型选择、欠拟合和过拟合</p> <p>06.1-训练误差和泛化误差</p> <p>06.2-模型选择</p> <p>06.3-欠拟合和过拟合</p> <p>06.4-权重衰减</p> <p>06.5-丢弃法</p> <p>06.6-实验11-多项式函数拟合实验</p> <p>06.7-实验12-高维线性回归实验-1</p> <p>06.8-实验12-高维线性回归实验-2</p> <p>06.9-实验13-Dropout</p> <p> </p> <p>第七章:深度学习基础-数值稳定性和模型初始化</p> <p>07.1-数值稳定性和模型初始化-1</p> <p>07.2-数值稳定性和模型初始化-2</p> <p>07.3-实验14-房价预测案例-1</p> <p>07.4-实验14-房价预测案例-2</p> <p>07.5-实验14-房价预测案例-3</p> <p> </p> <p>第八章:深度学习计算-模型构造</p> <p>08.1-模型构造-1</p> <p>08.2-模型构造-2</p> <p>08.3-模型构造-3</p> <p>08.4-实验15-模型构造-1</p> <p>08.5-实验15-模型构造-2</p> <p> </p> <p>第九章:深度学习计算-模型参数的访问、初始化和共享</p> <p>09.1-模型参数的访问</p> <p>09.2-模型参数初始化和共享</p> <p>09.3-实验16-模型参数-1</p> <p>09.4-实验16-模型参数-2</p> <p> </p> <p>第十章:深度学习计算-自定义层与读取和储存</p> <p>10.1-不含模型参数的自定义层</p> <p>10.2-含模型参数的自定义层</p> <p>10.3-实验17-自定义层</p> <p>10.4-读取和储存</p> <p>10.5-GPU计算</p> <p>10.6-实验18-读取和储存</p> <p> </p> <p> </p> <p>第十一章:卷积神经网络</p> <p>11.01-卷积神经网络</p> <p>11.02-卷积神经网络的组成层</p> <p>11.03-图像分类的局限性</p> <p>11.04-二维卷积层与卷积层</p> <p>11.05-卷积在图像中的直观作用</p> <p>11.06-实验19-二维卷积层</p> <p>11.07-填充与步幅</p> <p>11.08-卷积过程</p> <p>11.09-卷积层参数-1</p> <p>11.10-卷积层参数-2</p> <p>11.11-实验20-Pad和Stride</p> <p>11.12-多输入和输出通道</p> <p>11.13-实验21-多通道</p> <p>11.14-池化层</p> <p>11.15-实验22-池化层</p> <p> </p> <p>第十二章:经典网络</p> <p>12.01-卷积神经网络</p> <p>12.02-实验23-LeNet模型</p> <p>12.03-深度卷积神经网络</p> <p>12.04-实验24-AlexNet模型</p> <p>12.05-使用重复元素的网络</p> <p>12.06-实验25-VGG模型</p> <p>12.07-网络中的网络</p> <p>12.08-实验26-NiN模型</p> <p>12.09-含并行连接的网络</p> <p>12.10-实验27-GoogLeNet模型</p> <p>12.11-批量归一化-1</p> <p>12.12-批量归一化-2</p> <p>12.13-实验28-批量归一化</p> <p>12.14-残差网络</p> <p>12.15-实验29-残差网络</p> <p>12.16-稠密连接网络</p> <p>12.17-实验30-稠密连接网络</p> <p> </p> <p>第十三章:循环神经网络</p> <p>13.01-语言模型和计算</p> <p>13.02-n元语法</p> <p>13.03-RNN和RNNs</p> <p>13.04-标准RNN向前输出流程和语言模型应用</p> <p>13.05-vector-to-sequence结构</p> <p>13.06-实验31-语言模型数据集-1</p> <p>13.07-实验31-语言模型数据集-2</p> <p>13.08-实验32-从零实现循环神经网络-1</p> <p>13.09-实验32-从零实现循环神经网络-2</p> <p>13.10-实验32-从零实现循环神经网络-3</p> <p>13.11-实验32-从零实现循环神经网络-4</p> <p>13.12-实验33-简洁实现循环神经网络-1</p> <p>13.13-实验33-简洁实现循环神经网络-2</p> <p> </p> <p>第十四章:RNN进阶</p> <p>14.01-通过时间反向传播-1</p> <p>14.02-通过时间反向传播-2</p> <p>14.03-长短期记忆-1</p> <p>14.04-长短期记忆-2</p> <p>14.05-实验34-长短期记忆网络-1</p> <p>14.06-实验34-长短期记忆网络-2</p> <p>14.07-门控循环单元</p> <p>14.08-RNN扩展模型</p> <p>14.09-实验35-门控循环单元</p> <p> </p> <p>第十五章:优化算法</p> <p>15.01-优化与深度学习</p> <p>15.02-局部最小值和鞍点</p> <p>15.03-提高深度学习的泛化能力</p> <p>15.04-实验36-小批量梯度下降-1</p> <p>15.05-实验36-小批量梯度下降-2</p> <p>15.06-动量法-1</p> <p>15.07-动量法-2</p> <p>15.08-实验37-动量法</p> <p>15.09-AdaGrad算法与特点</p> <p>15.10-实验38-AdaGrad算法</p> <p>15.11-RMSrop算法</p> <p>15.12-实验39-RMSProp算法</p> <p>15.13-AdaDelta算法</p> <p>15.14-实验40-AdaDelta算法</p> <p>15.15-Adam算法</p> <p>15.16-实验41-Adam算法</p> <p>15.17-不用二阶优化讲解与超参数</p> <p> </p> <p>第十六章:计算机视觉</p> <p>16.01-图像增广与挑战</p> <p>16.02-翻转、裁剪、变化颜色与叠加</p> <p>16.03-实验42-图像增广-1</p> <p>16.04-实验42-图像增广-2</p> <p>16.05-微调</p> <p>16.06-迁移学习</p> <p>16.07-实验43-微调-1</p> <p>16.08-实验43-微调-2</p> <p>16.09-目标检测</p> <p>16.10-边界框</p> <p>16.11-实验44-边界框</p> <p>16.12-锚框与生成多个锚框</p> <p>16.13-交并比</p> <p>16.14-实验45-生成锚框-1</p> <p>16.15-实验45-生成锚框-2</p> <p>16.17-标注训练集的锚框-1</p> <p>16.18-标注训练集的锚框-2</p> <p>16.19-实验46-标注训练集的锚框-1</p> <p>16.20-实验46-标注训练集的锚框-2</p> <p>16.21-实验46-标注训练集的锚框-3</p> <p>16.22-输出预测边界框</p> <p>16.23-实验47-输出预测边界框-1</p> <p>16.24-实验47-输出预测边界框-2</p> <p>16.25-多尺度目标检测</p> <p>16.26-实验48-多尺度目标检测</p> <p>16.27-目标检测算法分类</p> <p>16.28-SSD与模型设计</p> <p>16.29-预测层</p> <p>16.30-损失函数</p> <p>16.31-SSD预测</p> <p>16.32-实验49-目标检测数据集</p> <p>16.33-实验50-SSD目标检测-1</p> <p>16.34-实验50-SSD目标检测-2</p> <p>16.35-实验50-SSD目标检测-3</p> <p>16.36-实验50-SSD目标检测-4</p> <p>16.37-实验50-SSD目标检测-5</p> <p>16.38-实验50-SSD目标检测-6</p> <p> </p> <p>第十七章:自然语言处理</p> <p>17.01-词嵌入和词向量</p> <p>17.02-神经网络模型</p> <p>17.03-跳字模型</p> <p>17.04-训练跳字模型</p> <p>17.05-连续词袋模型</p> <p>17.06-负采样</p> <p>17.07-层序softmax</p> <p>17.08-子词嵌入</p> <p>17.09-Fasttext模型</p> <p>17.10-全局向量的词嵌入</p> <p>17.11-实验51-word2vec之数据预处理-1</p> <p>17.12-实验51-word2vec之数据预处理-2</p> <p>17.13-实验52-word2vec之负采样-1</p> <p>17.14-实验52-word2vec之负采样-2</p> <p>17.15-实验53-word2vec之模型构建-1</p> <p>17.16-实验53-word2vec之模型构建-2</p> <p>17.17-实验54-求近义词和类比词-1</p> <p>17.18-实验54-求近义词和类比词-2</p> <p>17.19-实验55-文本情感分类RNN-1</p> <p>17.20-实验55-文本情感分类RNN-2</p> <p>17.21-实验55-文本情感分类RNN-3</p> <p>17.22-实验55-文本情感分类RNN-4</p> <p>17.23-TextCNN</p> <p>17.24-TextCNN流程</p> <p>17.25-实验56-文本情感分类textCNN-1</p> <p>17.26-实验56-文本情感分类textCNN-2</p> <p>17.27-Seq2Seq的历史与网络架构</p> <p>17.28-Seq2Seq的应用与存在的问题</p> <p>17.29-Attention机制与Bucket机制</p> <p>17.30-实验57-机器翻译之模型构建-1</p> <p>17.31-实验57-机器翻译之模型构建-2</p> <p>17.32-实验57-机器翻译之模型构建-3</p> <p>17.33-实验58-机器翻译之训练评估-1</p> <p>17.34-实验58-机器翻译之训练评估-2</p> <p>17.35-实验58-机器翻译之训练评估-3</p>
相关推荐
©️2020 CSDN 皮肤主题: 成长之路 设计师:Amelia_0503 返回首页