4.1 卷積神經網絡調參-adagrad_adam

4.3.1 adagrad_adam

咱們以前將了隨機梯度降低和動量梯度降低,不過,還有不少其餘的優化算法可使得模型穩定。算法

先來回顧隨機梯度降低和動量梯度降低bash

隨機梯度降低有兩個問題:局部極值問題和saddle point 問題,動量梯度降低能夠必定程度上解決這兩個問題學習

由於他可使用以前積累的梯度方向。優化

不過這兩個方法還有其餘的兩個問題:spa

  • 受初始學習率影響太大code

    初始化的學習率比較大,無論用哪一種梯度降低,都會致使梯度爆炸,模型不收斂cdn

  • 每個梯度的學習率都是同樣的blog

    α是針對全局的,而不是每個維度定製的。圖片

    這個在圖像上應用還不是特別明顯,若是是針對稀疏的問題來講,就比較明顯了,會使得咱們丟失不少稀疏數據上的信息。it

    由於對w求導數的時候,根據鏈式求導法則,最終都會到w對x的偏導,這時候若是x=0,那麼他的參數更新也是0,對於稀疏數據來講,由於他很稀疏,因此不少值都是0,不少時候是得不到梯度的更新的。

    可是

    可是其餘維度的數據是不少的,這時候若是統一把學習率調小,會使得稀疏數據學習不到足夠的信息

    最好的解決方法是給每個維度都設置不一樣的學習率

針對這兩個問題,還有哪些其餘的算法呢?

  1. AdaGrad

    學習率是逐漸衰減的,用以往梯度的平方和做爲學習率的分母,從而使得整個學習率隨着訓練次數的增長而愈來愈小,這樣也擺脫了學習率對初始值的依賴

    image

grad_squared = 0 
while True:
    dx = compute_gradient(x)
    grad_squared += dx ** 2
    # + 1e-7 加一個比較小的值以防止初始值爲0
    x -= learning_rate * dx / (np.sqrt(grad_squared) + 1e-7)
複製代碼
*   優勢

    *   前期, regularizer較小,放大梯度

    *   後期, regularizer較大,縮小梯度

    *   梯度隨訓練次數下降(能夠防止一直跳過極值區域)

    *   每一個份量有不一樣的學習率

*   缺點

    *   學習率設置太大,致使regularizer影響過於敏感

    *   後期,regularizer累積值太大,提早結束訓練
複製代碼
  1. RMSProp

    • AdaGrad 的變種

    • 由累積平方梯度變爲平均平方梯度

    • 解決了後期提早結束訓練的問題

grad_squared = 0 
while True:
  dx = compute_gradient(x)
  # 平方和變成了平均值
  grad_squared += decay_rate * grad_squared + (1 - decay_rate) * (dx ** 2)
  x -= learning_rate * dx / (np.sqrt(grad_squared) + 1e-7)
複製代碼
  1. Adam

    • 全部的上述算法都會用learning_ rate來作參數,可是Adam和上面講的幾種算法會在後期給每一個維度一個定製的學習率

    • Adam在如下場景比較有效

      • Beta1 = 0.9

      • Beta2 = 0.999

      • Learning_rate = 1e-3 or 5e-4(初始值比較小,能夠經過沖量和累積梯度去放大他)

    Adam結合了Momentum(動量梯度降低)(學習穩定)和Adagrad(能夠隨着訓練次數和維度的變化而變化)的優勢

    image

    [圖片上傳失敗...(image-9a19d6-1538918434302)]

    校準的意義在於經過這種方式使得開始的時候first_moment和second_moent變的相對大一些來加速訓練

相關文章
相關標籤/搜索