美文网首页
神经网络优化2

神经网络优化2

作者: 疯了个魔 | 来源:发表于2018-12-11 16:45 被阅读0次

梯度下降

梯度下降法

批梯度下降法(Batch Gradient Descent,BGD)是最常用的梯度下降形式,前面的Logistic回归及深层神经网络的构建中所用到的梯度下降都是这种形式。其在更新参数时使用所有的样本来进行更新,具体过程为:
{X = [x^{(1)},x^{(2)},…,x^{(m)}]}
z^{[1]} = w^{[1]}X + b^{[1]}
a^{[1]} = g^{[1]}(z^{[1]})
... \ ...
z^{[l]} = w^{[l]}a^{[l-1]} + b^{[l]}
a^{[l]} = g^{[l]}(z^{[l]})
{J(\theta) = \frac{1}{m} \sum_{i=1}^m \mathcal{L}({\hat y}^{(i)}, y^{(i)}) + \frac{\lambda}{2m} \sum\limits_{l=1}^L ||w^{[l]}}||^2_F
{\theta_j:= \theta_j -\alpha\frac{\partial J(\theta)}{\partial \theta_j}}
示例图:

BGD
优点:最小化所有训练样本的损失函数,得到全局最优解;易于并行实现。
缺点:当样本数目很多时,训练过程会很慢。

随机梯度下降

随机梯度下降法(Stochastic Gradient Descent,SGD)与批梯度下降原理类似,区别在于每次通过一个样本来迭代更新。其具体过程为:
{X = [x^{(1)},x^{(2)},…,x^{(m)}]}
for\ \ \ i=1,2,…,m\ \{ \ \ \ \ \ \ \ \ \ \ \ \
z^{[1]} = w^{[1]}x^{(i)} + b^{[1]}
a^{[1]} = g^{[1]}(z^{[1]})
... \ ...
z^{[l]} = w^{[l]}a^{[l-1]} + b^{[l]}
a^{[l]} = g^{[l]}(z^{[l]})
{J(\theta) = \mathcal{L}({\hat y}^{(i)}, y^{(i)}) + \frac{\lambda}{2} \sum\limits_{l=1}^L ||w^{[l]}}||^2_F
\theta_j:= \theta_j -\alpha\frac{\partial J(\theta)}{\partial \theta_j} \}
示例图:

SGD
优点:训练速度快。
缺点:最小化每条样本的损失函数,最终的结果往往是在全局最优解附近,不是全局最优;不易于并行实现。

小批量梯度下降

小批量梯度下降法(Mini-Batch Gradient Descent,MBGD)是批量梯度下降法和随机梯度下降法的折衷,对用m个训练样本,,每次采用t(1 < t < m)个样本进行迭代更新。具体过程为:
{X = [x^{\{1\}},x^{\{2\}},…,x^{\{k = \frac{m}{t}\}}]}
其中:
x^{\{1\}} = x^{(1)},x^{(2)},…,x^{(t)}
x^{\{2\}} = x^{(t+1)},x^{(t+2)},…,x^{(2t)}
之后:
for\ \ \ i=1,2,…,k\ \{ \ \ \ \ \ \ \ \ \ \ \ \
z^{[1]} = w^{[1]}x^{\{i\}} + b^{[1]}
a^{[1]} = g^{[1]}(z^{[1]})
... \ ...
z^{[l]} = w^{[l]}a^{[l-1]} + b^{[l]}
a^{[l]} = g^{[l]}(z^{[l]})
{J(\theta) = \frac{1}{k} \sum_{i=1}^k \mathcal{L}({\hat y}^{(i)}, y^{(i)}) + \frac{\lambda}{2k} \sum\limits_{l=1}^L ||w^{[l]}}||^2_F
\theta_j:= \theta_j -\alpha\frac{\partial J(\theta)}{\partial \theta_j} \}
示例图:

MBGD
样本数t的值根据实际的样本数量来调整,为了和计算机的信息存储方式相适应,可将t的值设置为2的幂次。将所有的训练样本完整过一遍称为一个epoch。
64 到 512 的 mini-batch 比较常见。

梯度下降优化

指数加权平均

指数加权平均(Exponentially Weight Average)是一种常用的序列数据处理方式,其计算公式为:
S_t = \begin{cases} Y_1, & t=1 \\ \beta S_{t-1} + (1-\beta)Y_{t}, & t>1 \end{cases}
其中Y_tt下的实际值,S_tt下加权平均后的值,β为权重值。
给定一个时间序列,例如伦敦一年每天的气温值:

伦敦气温时间图
如果要计算趋势的话,也就是温度的局部平均值,或者说移动平均值,先使:
气温趋势图
上面的计算更一般的形式是:
不同权重对平均温度的影响

实际上\beta {\rm{ = }}0.98时,图中所示的划线并不是绿色的线,而是下图紫色的线条:

初始值为0时的趋势线

当进行指数加权平均计算时,第一个值v_o被初始化为0,这样将在前期的运算用产生一定的偏差。为了矫正偏差,需要在每一次迭代后用以下式子进行偏差修正:
v_t := \frac{v_t}{1-\beta^t}
举个具体例子:
t = 2时:
\frac{{{v_2}}}{{1 - {\beta ^2}}} = \frac{{0.0196{\theta _1} + 0.02{\theta _2}}}{{1 - {{0.98}^2}}} = \frac{{0.0196{\theta _1} + 0.02{\theta _2}}}{{0.0396}}
也就是{\theta _1},{\theta _2}的加权平均数,并去除偏差。
随着t增加,{{\beta ^t}}接近于 0,所以当t很大的时候,偏差修正几乎没有作用,因此当t较大的时候,紫线基本和绿线重合了。不过在开始学习阶段,你才开始预测热身练习,偏差修正可以帮助你更好预测温度,偏差修正可以帮助你使结果从紫线变成绿线。
在机器学习中,在计算指数加权平均数的大部分时候,大家不在乎执行偏差修正,因为大部分人宁愿熬过初始时期,拿到具有偏差的估测,然后继续计算下去。如果你关心初始时期的偏差,在刚开始计算指数加权移动平均数的时候,偏差修正能帮助你在早期获取更好的估测。

Momentum梯度下降

动量梯度下降(Gradient Descent with Momentum)是计算梯度的指数加权平均数,并利用该值来更新参数值。
动量梯度下降法运行速度几乎总是快于标准的梯度下降算法。
具体过程为:
v_{dw} = \beta v_{dw} + (1-\beta)dw
v_{db} = \beta v_{db} + (1-\beta)db
w := w-\alpha v_{dw}
b := b-\alpha v_{db}
其中的动量衰减参数β一般取0.9。

动量梯度下降
进行一般的梯度下降将会得到图中的蓝色曲线,而使用Momentum梯度下降时,通过累加减少了抵达最小值路径上的摆动,加快了收敛,得到图中红色的曲线。
当前后梯度方向一致时,Momentum梯度下降能够加速学习;前后梯度方向不一致时,Momentum梯度下降能够抑制震荡。

RMSProp算法

RMSProp(Root Mean Square Prop,均方根支)算法在对梯度进行指数加权平均的基础上,引入平方和平方根。具体过程为:
s_{dw} = \beta s_{dw} + (1-\beta)dw^2
s_{db} = \beta s_{db} + (1-\beta)db^2
w := w-\alpha \frac{dw}{\sqrt{s_{dw}+\epsilon}}
b := b-\alpha \frac{db}{\sqrt{s_{db}+\epsilon}}
其中的\epsilon=10^{-8},用以提高数值稳定度,防止分母太小。
dwdb较大时,dw^{2}db^{2}会较大,造成s_{dw}s_{db}也会较大,最终使\frac{dw}{\sqrt{s_{dw}}}\frac{db}{\sqrt{s_{db}}}较小,减小了抵达最小值路径上的摆动。

RMSProp
使用RMSprop 的影响就是你的更新最后会变成这样(绿色线),纵轴方向上摆动较小,而横轴方向继续推进。
还有个影响就是,你可以用一个更大学习率a,然后加快学习,而无须在纵轴上垂直方向偏离。

Adam优化算法

Adam(Adaptive Moment Estimation,自适应矩估计)优化算法适用于很多不同的深度学习网络结构,它本质上是将Momentum梯度下降和RMSProp算法结合起来。具体过程为:
v_{dw} = \beta_1 v_{dw} + (1-\beta_1)dw, \ v_{db} = \beta_1 v_{db} + (1-\beta_1)db
s_{dw} = \beta_2 s_{dw} + (1-\beta_2)dw^2,\ s_{db} = \beta_2 s_{db} + (1-\beta_2)db^2
v^{corrected}_{dw} = \frac{v_{dw}}{(1-\beta_1^t)},\ v^{corrected}_{db} = \frac{v_{db}}{(1-\beta_1^t)}
s^{corrected}_{dw} = \frac{s_{dw}}{(1-\beta_2^t)},\ s^{corrected}_{db} = \frac{s_{db}}{(1-\beta_2^t)}
w := w-\alpha \frac{v^{corrected}_{dw}}{\sqrt{s^{corrected}_{dw}}+\epsilon}
b := b-\alpha \frac{v^{corrected}_{db}}{\sqrt{s^{corrected}_{db}}+\epsilon}
其中的学习率α需要进行调参,超参数β1被称为第一阶矩,一般取0.9,β2被称为第二阶矩,一般取0.999,ϵ一般取10^{−8}

学习率衰减

随着时间推移,慢慢减少学习率α的大小。在初期α较大时,迈出的步长较大,能以较快的速度进行梯度下降,而后期逐步减小α的值,减小步长,有助于算法的收敛,更容易接近最优解。
常用到的几种学习率衰减方法有:
\alpha = \frac{1}{1+\text{decay_rate }* \text{epoch_num}} * \alpha_0
\alpha = 0.95^{\text{epoch_num}} * \alpha_0
\alpha = \frac{k}{\sqrt{\text{epoch_num}} }* \alpha_0
其中的decay_rate为衰减率,epoch_num为将所有的训练样本完整过一遍的次数。

批标准化

批标准化(Batch Normalization,BN)和之前的数据集标准化类似,是将分散的数据进行统一的一种做法。具有统一规格的数据,能让机器更容易学习到数据中的规律。
对于含有m个节点的某一层神经网络,对z进行操作的步骤为:
\mu = \frac{1}{m} \sum_{i=1}^m z^{(i)}
\sigma^2 = \frac{1}{m} \sum_{i=1}^m (z^{(i)}-\mu)^2
z_{norm}^{(i)} = \frac{{{z^{(i)}} - \mu }}{{\sqrt {{\delta ^2} + \varepsilon } }}
\tilde{z}^{(i)} = \gamma z_{norm}^{(i)}+\beta
其中的\gamma\beta并不是超参数,而是两个需要学习的参数,神经网络自己去学着使用和修改这两个扩展参数。这样神经网络就能自己慢慢琢磨出前面的标准化操作到底有没有起到优化的作用。如果没有起到作用,就使用 \gamma\beta来抵消一些之前进行过的标准化的操作。例如当\gamma = \sqrt{\sigma^2+\epsilon}, \beta = \mu,就抵消掉了之前的正则化操作。
Batch 归一化的作用是它适用的归一化过程,不只是输入层,甚至同样适用于神经网络中的深度隐藏层。应用 Batch 归一化了一些隐藏单元值中的平均值和方差,不过训练输入和这些隐藏单元值的一个区别是,你也许不想隐藏单元值必须是平均值 0 和方差 1。\gamma\beta参数控制使得均值和方差可以是 0 和 1,也可以是其它值。

Batch Norm

可以认为每个圆圈代表着两步计算,先计算z,再计算a。
如果没有Batch Norm,那么计算步骤就是根据输入X{\omega ^{[1]}}{b^{[1]}}计算出{z^{[1]}},再利用激活函数计算出{a^{[1]}},以此类推计算出{z^{[2]}}{a^{[2]}}
Batch归一化的做法是先将{z^{[1]}}值进行Batch归一化,简称BN,此过程由参数{\beta ^{[1]}}{\gamma ^{[1]}}控制的,这一操作的结果为\tilde{z}^{[1]} ,然后将其输入激活函数中得到{a^{[1]}},即:
{a^{[1]}} = {g^{[1]}}({{\tilde z}^{[1]}})
依次类推:
{a^{[2]}} = {g^{[2]}}({{\tilde z}^{[2]}})
Batch 归一化是发生在计算z和a之间的,除了参数{w^{[l]}}{b^{[l]}}又加入了新的参数{\beta ^{[l]}}{\gamma ^{[l]}}
接下来可以使用任意一种优化算法,例如梯度下降算法:
{\beta ^{[l]}} = {\beta ^{[l]}} - \alpha d{\beta ^{[l]}}
当然也可以使用 Adam 或 RMSprop 或 Momentum来进行参数更新。
实践中, Batch 归一化通常和训练集的 mini-batch 一起使用。

Batch Norm的作用

在猫识别的问题上,假设训练集中只包含黑猫的识别,其训练集以及正负样本分布如下图所示:


黑猫分类问题

现在要将训练的结果使用在带颜色的猫识别问题中,其样本和正负分布可能如下图所示:


彩色猫分类问题

此时在识别黑猫中训练很好的模块可能并不会在在识别带颜色猫的问题上表现的依旧很好。这种数据分布改变的问题称为 “Covariate shift”,具体可以理解为:
已经学习到了x到y的映射,但是如果x的分布改变了,那么可能需要重新训练学习算法。
“Covariate shift”问题在神经网络中的体现,如下的神经网络:

神经网络
我们从第三层开始看起,遮挡住前两层:
遮挡前两层的神经网络
从第三隐藏层的角度来看,它得到一些值,称为 完整的神经网络
可以看到这个网络还有参数 {w^{[1]}}{b^{[1]}}{w^{[2]}}{b^{[2]}} ,如果这些参数改变了,那么 {a^{\left[ 2 \right]}} 的值也会改变。所以从第三层隐藏层的角度来看,这些隐藏单元的值在不断地改变, 所以它就有了“Covariate shift”的问题。
Batch 归一化做的,是它减少了这些隐藏值分布变化的数量。当神经网络在之前层中更新参数,z的值可能发生变化, Batch 归一化可以确保无论其怎样变化z的均值和方差保持不变,这就使得后面的数据及数据分布更加稳定,减少了前面层与后面层的耦合,使得每一层不过多依赖前面的网络层,最终加快整个神经网络的训练。
Batch 归一化还有一个作用,它有轻微的正则化效果, Batch 归一化中非直观的一件事是在 mini-batch 计算中,由均值和方差缩放的,因为在 mini-batch 上计算的均值和方差,而不是在整个数据集上,均值和方差有一些小的噪声。缩放过程从 {z^{[l]}}{{\tilde z}^{[l]}} 的过程中也有一些噪音,因为它是用有些噪音的均值和方差计算得出的。这迫使后部单元不过分依赖任何一个隐藏单元,类似于 dropout,它给隐藏层增加了噪音,因此有轻微的正则化效果。因为添加的噪音很微小,所以并不是巨大的正则化效果,你可以将 Batch 归一化和 dropout 一起使用,如果你想得到 dropout 更强大的正则化效果。
在训练时 \mu{\sigma ^2} 是在整个 mini-batch 上计算出来的,但在测试时,你可能需要逐一处理样本。理论上你可以在最终的网络中运行整个训练集来得到 \mu{\sigma ^2} 但在实际操作中,我们通常运用指数加权平均(也叫做流动平均)来追踪在训练过程中你看到的 \mu{\sigma ^2}
我们选择 l 层,假设我们有mini-batch: {{\rm{X}}^{[1]}}{{\rm{X}}^{[2]}}{{\rm{X}}^{[3]}} ......以及对应的 y 值等等。
第一个mini-batch {{\rm{X}}^{\{ 1\} }} 的第 l 层训练时得到了 {\mu ^{\{ 1\} \{ l\} }}
第二个mini-batch {{\rm{X}}^{\{ 1\} }} 的第 l 层训练时得到了 {\mu ^{\{ 2\} \{ l\} }}
第三个mini-batch {{\rm{X}}^{\{ 1\} }} 的第 l 层训练时得到了 {\mu ^{\{ 3\} \{ l\} }}
这样在计算每个batch的 l\mu{\sigma ^2} 时候,可以采用指数加权平均的方法可以得到这一层 \mu{\sigma ^2} 的实时数值。
最终测试时,使用 \mu{\sigma ^2} 的加权平均以及z值计算:
z_{norm}^{(i)} = \frac{{{z^{(i)}} - u}}{{\sqrt {{\sigma ^2} + \varepsilon } }}
进而计算:
{{\tilde z}^{(i)}} = \gamma z_{norm}^{(i)} + \beta

Softmax 回归

Softmax回归模型是Logistic回归模型在多分类问题上的推广,在多分类问题中,输出y的值不再是一个数,而是一个多维列向量,有多少种分类是就有多少维数。激活函数使用的是softmax函数:
\sigma(z)_{j}=\frac{exp(z_{j})}{\sum_{i=1}^m exp(z_{i})}
损失函数也变为:
\mathcal{L}(a^l, y) = - \sum^m_{i=1}y_i \log a^l

相关文章

  • softmax regression(数字识别)

    一:简单实现神经网络步骤: 1、定义算法公式,神经网络forward时的计算 2、定义loss,选定优化器,并指定...

  • [tensorflow](二)DNN

    20181125 qzd 深度学习与深层神经网络 损失函数定义 神经网络优化 进一步优化

  • 预备知识及优化器

    神经网络预备知识 目标:学会神经网络优化过程,使用正则化减少过拟合,使用优化器更新网络参数 预备知识 神经网络复杂...

  • 神经网络识别手写优化(一)

    手写识别优化 前言 之前实现的神经网络还有很多可以优化的地方。本文主要正对其进行优化。 初始化 在训练神经网络之前...

  • 神经网络优化2

    梯度下降 梯度下降法 批梯度下降法(Batch Gradient Descent,BGD)是最常用的梯度下降形式,...

  • 神经网络中的优化算法

    姓名:张志文 学号:19021210649【嵌牛导读】神经网络中有很多的优化算法【嵌牛鼻子】神经网络;优化算法【...

  • Pytorch 任务六

    PyTorch理解更多神经网络优化方法

  • BP神经网络拟合非线性函数

    本章涉及知识点:1、多层神经网络的数学模型2、前向传播算法3、经典激活函数4、经典损失函数5、神经网络的优化过程6...

  • 优化方法总结

    优化算法框架 神经网络模型中有多种优化算法,优化算法的作用用来优化更新参数。对于优化算法而言,主要的框架如下。参数...

  • 06.神经网络学习-2

    神经网络的优化目标 数学目标 不论损失函数是什么形式,神经网络的优化目标都是使得损失函数最小化。对于均方误差函数和...

网友评论

      本文标题:神经网络优化2

      本文链接:https://www.haomeiwen.com/subject/jrdehqtx.html