深度學習之AdaGrad算法


AdaGrad 算法根據自變量在每個維度的梯度值調整各個維度的學習率,從而避免統一的維度難以適應所有維度的問題。

特點:
  1. 小批量隨機梯度按元素累加變量,出現在學習率的分母項中。(若目標函數有關自變量的偏導數一直都較大,那么學習率下降較快;反之亦然。)

  2. 若迭代早期下降過快 + 當前解仍然不佳,可能導致很難找到有效解。

一、算法初解

實現AdaGrad算法,使⽤的學習率為0.4。輸出的⾃變量的迭代軌跡較平滑。但由
於累加效果使學習率不斷衰減,⾃變量在迭代后期的移動幅度較⼩。

%matplotlib inline
import math
import torch
import sys 
sys.path.append("..")
import d2lzh_pytorch as d2l 

def adagrad_2d(x1, x2, s1, s2):
    g1, g2, eps = 0.2 * x1, 4 * x2, 1e-6 
    s1 += g1 ** 2 
    s2 += g2 ** 2 
    x1 -= eta /math.sqrt(s1 + eps) * g1
    x2 -= eta / math.sqrt(s2 + eps) * g2
    return x1, x2, s1, s2

def f_2d(x1, x2):
    return 0.1 * x1 **2 + 2 *x2 ** 2 

eta = 0.4 
d2l.show_trace_2d(f_2d, d2l.train_2d(adagrad_2d))

運行結果:

將學習率增⼤到2。可以看到⾃變量更為迅速地逼近了最優解

eta = 2 
d2l.show_trace_2d(f_2d, d2l.train_2d(adagrad_2d))

運行結果:

二、從零開始實現

同動量法⼀樣,AdaGrad算法需要對每個⾃變量維護同它⼀樣形狀的狀態變量。下面根據AdaGrad算
法中的公式實現該算法。

# 從零開始實現
%matplotlib inline
import math
import torch
import sys 
sys.path.append("..")
import d2lzh_pytorch as d2l 

features, labels = d2l.get_data_ch7()

def init_adagrad_states():
    s_w = torch.zeros((features.shape[1], 1), dtype=torch.float32)
    s_b = torch.zeros(1, dtype=torch.float32)
    return (s_w, s_b)

def adagrad(params, states, hyperparams):
    eps = 1e-6
    for p, s in zip(params, states):
        s.data += (p.grad.data**2)
        p.data -= hyperparams['lr'] * p.grad.data / torch.sqrt(s + eps)
        
d2l.train_ch7(adagrad, init_adagrad_states(), {'lr' : 0.1},features,labels)

運行結果:

三、出現的運行錯誤

錯誤代碼OSError: ../../data/airfoil_self_noise.dat not found.找不到文件:

這個網站下載"airfoil_self_noise.dat",將其放入這個路徑中“ ../../data/airfoil_self_noise.dat”。即可運行成功。

參考鏈接:https://zh.d2l.ai/chapter_optimization/adagrad.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM