zoukankan      html  css  js  c++  java
  • Coursera Deep Learning笔记 改善深层神经网络:优化算法

    笔记:Andrew Ng's Deeping Learning视频

    摘抄:https://xienaoban.github.io/posts/58457.html

    本章介绍了优化算法,让神经网络运行的更快

    1. 梯度优化算法

    1.1 Mini-batch 梯度下降

    (X = [x^{(1)}, x^{(2)}, x^{(3)}, ..., x^{(m)}]) 矩阵所有 (m) 个样本划分为 (t)子训练集,每个子训练集,也叫做mini-batch
    每个子训练集称为 (x^{{i}}), 每个子训练集内样本个数均相同(若每个子训练集有1000个样本, 则 (x^{{1}} = [x^{(1)}, x^{(2)}, ..., x^{(1000)}]),维度为 ((n_x,1000)).

    例:把(x^{(1)})(x^{(1000)}) 称为 (X^{{1}}), 把(x^{(1001)})(x^{(2000)}) 称为 (X^{{2}}),如果你的训练样本一共有500万个,每个mini-batch都有1000个样本,也就是说,你有5000个mini-batch, 因为5000*1000=500万, 最后得到的是 (X^{{5000}})

    若m不能被子训练集样本数整除, 则最后一个子训练集样本可以小于其他子训练集样本数。 (Y) 亦然.

    训练时, 每次迭代仅对一个子训练集(mini-batch)进行梯度下降:

    (On iteration t:)

    [egin{aligned} & ext{Repeat} :\ & qquad ext{For } i = 1, 2, ..., t: \ & qquad qquad ext{Forward Prop On } X^{{i}} \ & qquad qquad ext{Compute Cost } J^{{i}} \ & qquad qquad ext{Back Prop using } X^{{i}}, Y^{{i}}\ & qquad qquad ext{Update } w, b end{aligned} ]

    • 使用 batch 梯度下降法时:

      • 一次遍历训练集只能让你做一个梯度下降;每次迭代都遍历整个训练集

      • 预期每次迭代成本都会下降

    • 但若使用 mini-batch 梯度下降法

      • 一次遍历训练集,能让你做5000个梯度下降;如果想多次遍历训练集,你还需要另外设置一个while循环...

      • 若对成本函数作图, 并不是每次迭代都下降, 噪声较大, 但整体上走势还是朝下的.

    • 样本集较小(小于2000), 无需使用 mini-batch;
    • 否则一般的 mini-batch 大小为 64~512, 通常为 2 的整数次方.

    1.2 指数加权平均数(Exponentially Weighted Averages)

    这个不是优化算法,是下面的优化方法的数学基础.


    (v_t = eta v_{t-1} + (1 - eta) heta_t, qquad eta in[0,1))

    (eta) 越大, 画得曲线越 平滑, 但画得图像会更为偏右.

    为了让加权平均数运算更准确(为了在早期获得更好的评估), 我们还需要偏差修正(Bias Correction).

    由于我们默认(v_0 = 0), 因此当t较小时, (v_t) 会比 (θ_t) 小很多.

    • 为解决这一问题, 得到更准确的估测, 我们不使用 (v_t), 而使用 (frac{v_t}{1-eta^t}).

    1.3 动量梯度下降法(Gradient Descent With Momentum)

    当你的成本函数图像不够圆润, 例如是个很扁的椭圆, 使得梯度下降 在y轴很快而在x轴很慢.

    • 此时增加学习率会偏离函数的范围(摆动过大), 减小就更慢了。

    动量梯度下降法(Momentum) 使用指数加权平均数(计算梯度的指数加权平均数,并用该梯度更新你的权重):

    (On iteration t:)

    [egin{aligned} v_{dW} & = eta v_{dW} + (1 - eta)dW \ v_{db} & = eta v_{db} + (1 - eta)db \ W & = W - alpha v_{dW} \ b & = b - alpha v_{db} end{aligned} ]

    竖轴平均值相互抵消,横轴轴平均值仍然很大,以此减缓梯度下降摆动幅度.

    1.4 RMSprop(Root Mean Square prop)

    全称是均方根,同 Momentum, 能够很好的消除摆动,减缓竖轴方向的学习,加快横轴方向的学习

    (On iteration t:)

    [egin{aligned} S_{dW} & = eta S_{dW} + (1 - eta)(dW)^2 \ S_{db} & = eta S_{db} + (1 - eta)(db)^2 \ W & = W - alpha frac{dW}{sqrt{S_{dW}}} \ b & = b - alpha frac{db}{sqrt{S_{db}}} end{aligned} ]

    例如:

    • 允许你使用一个更大的学习率 (alpha) 加快学习速度

    • db的平方较大,(s_{db}) 也会较大,相比之下 dw会小一些,(s_{dw})会较小;

    • 结果就是纵轴上的数(b)要被一个较大的数相除,就能消除摆动,水平方向被较小的数相除。

    1.5 Adam 优化算法(Adaptive Moment Estimation)

    RMSprop 与 Adam 是少有的经受住人们考验的两种算法.

    Adam 的本质就是将 Momentum 和 RMSprop 结合在一起. 使用该算法首先需要初始化:

    [v_{dW} = 0, S_{dW} = 0, v_{db} = 0, S_{db} = 0. ]

    在第t次迭代中,梯度下降后:

    [egin{aligned} v_{dW} & = eta_1 v_{dW} + (1 - eta_1)dW \ v_{db} & = eta_1 v_{db} + (1 - eta_1)db \ S_{dW} & = eta_2 S_{dW} + (1 - eta_2)(dW)^2 \ S_{db} & = eta_2 S_{db} + (1 - eta_2)(db)^2 \ v_{dW}^{ ext{corrected}} & = frac{v_{dW}}{1-eta_1^t}, quad v_{db}^{ ext{corrected}} = frac{v_{db}}{1-eta_1^t} \ S_{dW}^{ ext{corrected}} & = frac{S_{dW}}{1-eta_2^t}, quad S_{db}^{ ext{corrected}} = frac{S_{db}}{1-eta_2^t} \ W & = W - alphafrac{v_{dW}^{ ext{corrected}}}{sqrt{S_{dW}^{ ext{corrected}}+varepsilon}} \ b & = b - alphafrac{v_{db}^{ ext{corrected}}}{sqrt{S_{db}^{ ext{corrected}}+varepsilon}} end{aligned} ]

    最后两个式子的 (+ varepsilon) 是为了防止分母为0, 上面 RMSprop 的分母实践中一般也加上, (varepsilon) 通常取 (10^{-8}).

    超参数选择:

    超参数
    (alpha) need to be tuned
    (eta_1) 0.9 (dw)
    (eta_2) 0.999 (dw^2)
    (varepsilon) (10^{-8})

    Adam 算法结合了 Momentum 和 RMSprop 梯度下降法, 并且是一种极其常用的学习算法, 被证明能有效适用于不同神经网络. 适用于广泛的结构.

    2. 超参数调整优化

    2.1 学习率衰减(Learning Rate Decay)

    如果使用固定的学习率 (alpha), 在使用 mini-batch 时在最后的迭代过程中会有噪音, 不会精确收敛, 最终一直在附近摆动. 因此我们希望在训练后期 (alpha) 不断减小.

    以下为几个常见的方法:

    法一:

    [alpha = frac{1}{1+decay\_rate* ext{epoch-num}} alpha_0 ]

    其中 (alpha_0) 为初始学习率; (epoch-num) 为当前迭代的代数; (decay\_rate) 是衰减率, 一个需要调整的超参数.

    法二:

    [alpha = 0.95^{ ext{epoch-num}} alpha_0 ]

    其中 0.95 自然也能是一些其他的小于 1 的数字.

    法三:

    [alpha = frac{k}{sqrt{ ext{epoch-num}}} alpha_0 ]

    法四:

    离散下降(discrete stair cease), 过一阵子学习率减半, 过一会又减半.

    法五:

    手动衰减, 感觉慢了就调快点, 感觉快了就调慢点.

    3. 局部最优问题(Local Optima)

    • 人们经常担心算法困在局部最优点, 而事实上算法更经常被困在鞍点, 尤其是在高维空间中

    • 成熟的优化算法如 Adam 算法,能够加快速度,让你尽早往下走出平稳段.

  • 相关阅读:
    通过点击切换文本框内容的脚本示例
    使用脚本改变树控件的行为
    javascript动态创建radio button元素支持IE/Firefox
    轻量级的向导控件MultiView
    客户端脚本简单实现Repeater的无刷新分页
    在非web site项目中引用Membership
    逐步认识C#四种判断相等的方法
    C#获取csv文件内容对逗号和引号分隔的处理
    JavaScript之 值类型 和 引用类型 Better
    JS call apply bind 方法的区别 Better
  • 原文地址:https://www.cnblogs.com/douzujun/p/13084911.html
Copyright © 2011-2022 走看看