딥러닝 아담 최적화 알고리즘 이론적 지식과 학습률 변화

최근 학습에서는 Adam을 옵티마이저로 사용하여 훈련 중에 학습률을 출력했는데, 학습률이 변하지 않는 것으로 나타났습니다. 이것은 이전에 이해된 적응 학습 속도와 모순되는 것 같습니다.

아담의 이론적 지식

Adam 논문: https://arxiv.org/pdf/1412.6980.pdf
여기에 이미지 설명을 삽입하세요. 위 그림은 Adam 최적화 알고리즘을 딥러닝의 경사 하강법에 적용하는 세부 과정입니다. 설명해야 할 몇 가지 매개 변수가 있습니다
여기에 이미지 설명을 삽입하세요.. 아담의 원리를 이해하려면 https://blog.csdn.net/sinat_36618660/article/details/100026261을 통해 확인할 수 있습니다 .

질문 1 지수 이동 평균이란 무엇입니까?

지수이동평균(EMA) 지수이동평균이란 각 값의 가중치 계수가 시간에 따라 기하급수적으로 감소하는 것을 의미하며, 해당 값이 현재 순간에 가까울수록 가중치 계수가 커집니다. mt m_t를
여기에 이미지 설명을 삽입하세요.
타고예를 들어, 위의 도출을 통해 시간 t에서 멀어질수록 기울기의 비율이 작아지는 것을 알 수 있으며, 기울기를 지속적으로 업데이트하는 과정에서 과거 기울기를 사용하더라도 서로 다른 순간의 기울기가 발생합니다. 현재 그래디언트에는 영향을 미치지 않습니다 .기여도가 다릅니다. 시간 t에 가까울수록 mt m_t 에 대한 기여도가 커집니다.영향력이 클수록, 시간 t에서 멀어질수록 mt m_t 에 미치는 영향도 커집니다.영향은 더 작을 것입니다.

질문 2 왜 수정해야 합니까?

(1) 대중적인 설명:

mt_t 일 때수정하지 않은 경우( β 1 = 0.9 \beta_1=0.91=0 . 9 ):
m 0 m_00=0m
1m_11= β 1 * m 0 + ( 1 − β 1 ) * g 1 \beta _1* m_0+(1-\beta_1)*g_11*0+( 1-1)*g1= 0.1g 1 0.1g_10 . 1g _1
m 2m_22= 0.9 * 0.1 * g 1 + 0.1 * g 2 0.9*0.1*g_1+0.1*g_20 . 9*0 . 1*g1+0 . 1*g2= 0.09g 1 + 0.1g 2 0.09g_1+0.1g_20 . 0 9g _1+0 . 1g _2
m 3m_33= 0.081g 1 + 0.09g 2 + 0.1g 3 0.081g_1+0.09g_2+0.1g30 . 0 8 1g _1+0 . 0 9g _2+0 . 1 g 3
등등, 우리는m 0 m_00=0, 결과적으로 mt m_t0쪽으로 편향되어 있으며 gt g_t 에서도 멀어집니다.g점점 더.

(2) 이론식의 설명:

위에서 mt m_tmt m_t 라는 업데이트 공식을 보면 알 수 있습니다.그래디언트 gt g_t 와 동일g1차 거리 추정이므로 mt m_t를 계산합니다.예상:
여기에 이미지 설명을 삽입하세요.
위 공식에서 볼 수 있듯이 mt m_t는 다음과 같아야 합니다.mt / ( 1 − β 1 t ) m_t/(1-\beta_1^t) 로 수정되었습니다 ./ ( 1-1) ,mt m_t만이그래디언트 gt g_tg편견 없는 추정치는 . 같은 생각으로 vt v_t를 설명할 수 있습니다.V보정.

질문 3 학습률은 어떻게 변하나요?

Adam의 논문에서는 다음 세 줄의 수식을 다음과 같이 대체할 수 있음을 지적합니다
여기에 이미지 설명을 삽입하세요.
. 동등하게 대체:
여기에 이미지 설명을 삽입하세요.
pytorch 소스 코드에서도 위와 같은 방식으로 작성됩니다(마지막에 첨부).

이렇게 쓴다는 것은 학습률의 변화가 α 1 − β 2 t / ( 1 − β 1 t ) \alpha \sqrt{1-\beta_2^t}/(1-\beta_1^t)에 의해 결정된다는 것을 의미합니까?1-2 / ( 1-1) 결정하기 위해 이것을 여전히 적응형 학습률이라고 부를 수 있습니까?

우리는 경사하강법의 정의 공식을 알고 있습니다.
여기에 이미지 설명을 삽입하세요.
경사하강법의 정의 공식에 따르면 매개변수 업데이트 공식을 다음과 같이 작성할 수 있습니다.

θ t = θ t − 1 − α vt ^ + ε ✽ mt ^ \theta_t=\theta_{t-1}- {\frac{\alpha}{\sqrt{\hat{v_t}}+\varepsilon}}* \hat{m_t}=t 1-V^ +이자형*^
그 중 m_t산그래디언트 gt g_t 로 간주됩니다.g의 1차 거리 추정값, α vt ^ + ε {\frac{\alpha}{\sqrt{\hat{v_t}}+\varepsilon}}V^ + 전자시간 t에서 매개변수 θ t \theta_t학습률. 위 공식에서도 알 수 있듯이 매개변수가 다르면 매 순간 학습률이 다르기 때문에 시각화하기가 어렵습니다.

마지막으로 Adam 소스코드를 첨부합니다.

pytorch1.2/lib/python3.7/site-packages/torch/optim/을 통해 adam.py 파일을 찾았습니다. 다음 코드는 다음과 같습니다.

def step(self, closure=None):
  loss = None
  if closure is not None:
      loss = closure()

  for group in self.param_groups:
      for p in group['params']:
          if p.grad is None:
              continue
          grad = p.grad.data
          if grad.is_sparse:
              raise RuntimeError('Adam does not support sparse gradients, please consider SparseAdam instead')
          amsgrad = group['amsgrad']

          state = self.state[p]

          # State initialization
          if len(state) == 0:
              state['step'] = 0
              # Exponential moving average of gradient values
              state['exp_avg'] = torch.zeros_like(p.data)
              # Exponential moving average of squared gradient values
              state['exp_avg_sq'] = torch.zeros_like(p.data)
              if amsgrad:
                  # Maintains max of all exp. moving avg. of sq. grad. values
                  state['max_exp_avg_sq'] = torch.zeros_like(p.data)

          exp_avg, exp_avg_sq = state['exp_avg'], state['exp_avg_sq']
          if amsgrad:
              max_exp_avg_sq = state['max_exp_avg_sq']
          beta1, beta2 = group['betas']

          state['step'] += 1

          if group['weight_decay'] != 0:
              grad.add_(group['weight_decay'], p.data)

          # Decay the first and second moment running average coefficient
          exp_avg.mul_(beta1).add_(1 - beta1, grad)
          exp_avg_sq.mul_(beta2).addcmul_(1 - beta2, grad, grad)
          if amsgrad:
              # Maintains the maximum of all 2nd moment running avg. till now
              torch.max(max_exp_avg_sq, exp_avg_sq, out=max_exp_avg_sq)
              # Use the max. for normalizing running avg. of gradient
              denom = max_exp_avg_sq.sqrt().add_(group['eps'])
          else:
              denom = exp_avg_sq.sqrt().add_(group['eps'])

          bias_correction1 = 1 - beta1 ** state['step']
          bias_correction2 = 1 - beta2 ** state['step']

          step_size = group['lr'] * math.sqrt(bias_correction2) / bias_correction1

          p.data.addcdiv_(-step_size, exp_avg, denom)

  return loss

위 내용은 제 개인적인 이해이므로 더 좋은 아이디어가 있으시면 메시지 남겨주시고 함께 배우고 발전해 가세요!

Supongo que te gusta

Origin blog.csdn.net/qq_44846512/article/details/112466609
Recomendado
Clasificación