Class: Daimond::Optim::Adam
Instance Method Summary collapse
-
#initialize(parameters, lr: 0.001, betas: [0.9, 0.999], eps: 1e-8) ⇒ Adam
constructor
A new instance of Adam.
- #step ⇒ Object
- #zero_grad ⇒ Object
Constructor Details
#initialize(parameters, lr: 0.001, betas: [0.9, 0.999], eps: 1e-8) ⇒ Adam
Returns a new instance of Adam.
4 5 6 7 8 9 10 11 12 13 |
# File 'lib/daimond/optim/adam.rb', line 4 def initialize(parameters, lr: 0.001, betas: [0.9, 0.999], eps: 1e-8) super(parameters, lr: lr) @betas = betas @eps = eps # Первые и вторые моменты @m = @parameters.map { |p| Numo::DFloat.zeros(*p.shape) } # первый момент (среднее) @v = @parameters.map { |p| Numo::DFloat.zeros(*p.shape) } # второй момент (квадраты) @t = 0 # шаг обновления end |
Instance Method Details
#step ⇒ Object
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# File 'lib/daimond/optim/adam.rb', line 15 def step @t += 1 beta1, beta2 = @betas @parameters.each_with_index do |param, i| # Градиент g = param.grad # Обновляем моменты @m[i] = beta1 * @m[i] + (1 - beta1) * g @v[i] = beta2 * @v[i] + (1 - beta2) * (g * g) # Коррекция смещения (bias correction) m_hat = @m[i] / (1 - beta1**@t) v_hat = @v[i] / (1 - beta2**@t) # Обновление параметров param.data -= @lr * m_hat / (Numo::NMath.sqrt(v_hat) + @eps) end end |
#zero_grad ⇒ Object
36 37 38 |
# File 'lib/daimond/optim/adam.rb', line 36 def zero_grad @parameters.each { |p| p.grad = Numo::DFloat.zeros(*p.shape) } end |