【深度学习】吴恩达-学习笔记 优化算法(动量梯度,RMSprop,Adam)、参数初始化、Batch Norm

目录

 动量梯度下降法:让梯度下降的过程中纵向波动减小

RMSprop :消除梯度下降中的摆动

 Adam 优化算法: 

 神经网络参数初始化

学习率衰减

 Batch Norm

关于Batch_norm:

Batch_norm 在测试时:


 

 动量梯度下降法:让梯度下降的过程中纵向波动减小

动量梯度下降法采用累积梯度来代替当前时刻的梯度。直观来讲,动量方法类似把球推下山,球在下坡时积累动力,在途中速度越来越快,如果某些参数在连续时间内梯度方向不同,动量就会变小,反之,在连续时间内梯度方向一致,动量会增大。动量梯度下降法可以更快速的收敛并减少目标函数的震荡。

  • 通过mini_batch进行神经网络的前向反馈、反向传播计算梯度dw 、db 
  • V_{dw} = \beta V_{dw} + (1 - \beta )dw       
  • V_{db} = \beta V_{db} + (1 - \beta )db
  • w = w-\alpha Vdw  ,  b = b - \alpha Vdb ,

\beta 是动量参数,通常取0.9, \alpha为超参数,V_{dw}是x轴方向的动量,V_{db}是纵向y轴方向的动量。1-\beta是梯度更新的步长。

 【深度学习】吴恩达-学习笔记 优化算法(动量梯度,RMSprop,Adam)、参数初始化、Batch Norm_第1张图片

RMSprop :消除梯度下降中的摆动

RMSprop可以自适应调整每个参数的学习率,此外,RMSprop可以客服学习率过早衰减的问题。

相较于动量梯度下降法,(1 - \beta_{2})后相乘的微分变为微分的平方,\beta _{2}是衰减系数 ,通常取0.9。

通过mini_batch计算dw db 

S_{dw} = \beta_{2} S_{dw} + (1 - \beta_{2} )dw^{2}   ,S_{dw} 较小

S_{db} = \beta_{2} S_{db} + (1 - \beta_{2} )db^{2}     S_{db} 较大

w = w- \alpha\frac{dw}{\sqrt{S_{dw }+\varepsilon }}   , w逐渐变大,加快收敛速度

b = b- \alpha\frac{db}{\sqrt{S_{db}+\varepsilon }} ,   b逐渐变小,消除梯度下降中的摆动

 \varepsilon = 10^{-8}

 Adam 优化算法: 

动量梯度下降法和RMSprop的缝合怪,可以自适应调整每个参数的学习率

通过mini_batch计算dw db 

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}

 S_{dw} = \frac{S_{dw}}{ (1 - \beta_{2}^{t})}               S_{db} = \frac{S_{db}}{ (1 - \beta_{2}^{t})}

V_{db} = \frac{V_{db}}{ (1 - \beta_{1}^{t})}                 V_{dw} = \frac{V_{dw}}{ (1 - \beta_{1}^{t})}

w = w- \alpha\frac{Vdw}{\sqrt{S_{dw }+\varepsilon }}

b = b- \alpha\frac{Vdb}{\sqrt{S_{db } +\varepsilon}}

参数选择:\alpha需要调节,\beta _{1} = 0.9\beta _{2} = 0.999\varepsilon = 10^{-8}

 \beta _{2}用来计算平方数的指数加权平均数,\beta _{1}计算指数加权平均数

 神经网络参数初始化

【深度学习】吴恩达-学习笔记 优化算法(动量梯度,RMSprop,Adam)、参数初始化、Batch Norm_第2张图片

  • 初始化为0:在输入参数中全部初始化为0,参数名为initialization = “zeros”,核心代码:

 parameters['W' + str(l)] = np.zeros((layers_dims[l], layers_dims[l - 1]))

  • 初始化为随机数:把输入参数设置为随机值,权重初始化为大的随机值。参数名为initialization = “random”,核心代码:

  parameters['W' + str(l)] = np.random.randn(layers_dims[l], layers_dims[l - 1]) * 10

  • 抑梯度异常初始化:参见梯度消失和梯度爆炸的那一个视频,参数名为initialization = “he”,核心代码:

  parameters['W' + str(l)] = np.random.randn(layers_dims[l], layers_dims[l - 1]) * np.sqrt(2 / layers_dims[l - 1])

学习率衰减

学习率衰减可以减小梯度下降到达最优点的震荡。选择合适的学习率也很重要。学习率太小导致收敛缓慢,学习率太大会阻碍收敛并导致损失函数在最小值附近波动或发散。深度网络通常采取模拟退火的方法在训练期间动态调整学习率。 模拟退火算法的学习率有包括反向衰减学习率指数衰减学习率。

  • 反衰减学习率

假设初始化学习率为  \eta 0\gamma是衰减系数,t是迭代次数,反向衰减可以定义为:

 \theta(t) = \frac{\eta 0}{1+t\gamma }

  • 指数衰减学习率

\theta(t) = \frac{\eta 0}{exp(t\gamma )}

固定衰减的模拟退火方法不能直接泛化到多个数据集上,我们也不希望采用相同的频率和步长来更新所有的网络参数,所以自适应调整学习率被提出,给每个参数设置不同的自适应学习率。

 Batch Norm

实践中,为了加快学习速率,通常进行归一化

Batch Norm可以使你构造含其他平均值和方差的隐藏单元值(不止均值0 方差1),而且Batch归一化的作用是它适用的归一化过程不只是输入层

  •  在网络中获得一些值Z^{(1)},.......Z^{(m)}Z^{[L](i)}即网络中任意某一层的参数
  • \mu = \frac{1}{m} \sum_i{}^{}(Z_{i} - \mu )^{2}
  • Z_{norm}^{(i)} = \frac{Z^{(i)} - \mu }{\sqrt{\sigma ^{2} +\varepsilon }}
  • Z^{(i)} = \gamma Z _{norm}^{(i)} + \beta     由\gamma\beta两个参数控制
  • ,\beta = \mu  

 用在动量梯度下降法,RMSprop, Adam 中的\beta不同

在神经网络中加入Batch归一化,在神经网络的正向传播过程对隐藏层的Z值进行归一,将每个隐藏层的均值和方差缩放

【深度学习】吴恩达-学习笔记 优化算法(动量梯度,RMSprop,Adam)、参数初始化、Batch Norm_第3张图片 【深度学习】吴恩达-学习笔记 优化算法(动量梯度,RMSprop,Adam)、参数初始化、Batch Norm_第4张图片

在每一个隐藏层L, 用反向传播得到d\beta ^{[L]}d\gamma ^{[L]}dw ^{[L]},通过Batch_norm 将Z^{[L]}转换为Z_{norm}^{N(i)}

  •  Z^{[L]} = W^{[L]}A^{[L-1]}   ,Z_{norm}^{N(i)} = A^{^{[L]}} Z _{norm}^{(i)} + \beta^{[L]}

        \beta\gamma的维度:(n^{[L]},1)

  • 并通过梯度下降来来更新由Batch归一化添加到算法中的\beta\gamma参数

W^{[L]} = W^{[L]} - \alpha dW^{[L]},   \beta ^{[L]} = \beta ^{[L]} - \alpha d\beta ^{[L]}   ,\gamma ^{[L]} = \gamma ^{[L]} - \alpha \gamma ^{[L]}

关于Batch_norm:

  •  Batch Norm减少了输入值改变的问题,减少了隐藏值分布变化的数量,输入层输入的数据改变,均值和方差不变,加快收敛和学习速率.
  • 每个mini_batch进行归一化只在这个mini_batch进行
  • Batch Norm 在mini_batch里的Z^{[L]}里添加了一些噪音,像Dropout一样,在每个隐藏层的激活项添加了噪音
  • Batch_norm有正则化效果

在dropout部分, 之所以dropout可以抑制overfitting, 是因为在训练阶段, 我们引入了 随机性(随机cancel一些Neuron),减少网络的匹配度, 在测试阶段, 我们去除掉随机性, 并通过期望的方式marginalize随机影响。
在BatchNormalization中, 训练阶段, 我们随机选取了Batch进行Normalization, 并计算running mean等, 在测试阶段, 应用running_mean这些训练参数来进行整体Normalization, 本质上是 在Marginalize训练阶段的随机性。 因此, BatchNormalization也提供了 Regularization的作用, 实际应用中证明, NB在防止过拟合方面确实也有相当好的表现。

Batch_norm 在测试时:

【深度学习】吴恩达-学习笔记 优化算法(动量梯度,RMSprop,Adam)、参数初始化、Batch Norm_第5张图片

  •  m为mini_batch中的样本数量
  • 用均值和方差来调整,加上\varepsilon是为了数值稳定性,\mu\sigma ^{2}是在整个mini_batch上计算出来的,再用 \beta\gamma 更新Z_{norm}^{(i)}得到隐藏层的数值归一

你可能感兴趣的:(深度学习,深度学习,python,人工智能,batch,机器学习)