최근 학습에서는 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.9비1=0 . 9 ):
m 0 m_0중0=0m
1m_1중1= β 1 * m 0 + ( 1 − β 1 ) * g 1 \beta _1* m_0+(1-\beta_1)*g_1비1*중0+( 1-비1)*g1= 0.1g 1 0.1g_10 . 1g _1
m 2m_2중2= 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_3중3= 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_0중0=0, 결과적으로 mt m_t중티0쪽으로 편향되어 있으며 gt g_t 에서도 멀어집니다.g티점점 더.
(2) 이론식의 설명:
위에서 mt m_t중티mt m_t 라는 업데이트 공식을 보면 알 수 있습니다.중티그래디언트 gt g_t 와 동일g티1차 거리 추정이므로 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
위 내용은 제 개인적인 이해이므로 더 좋은 아이디어가 있으시면 메시지 남겨주시고 함께 배우고 발전해 가세요!