스택큐힙리스트

Adam optimizer를 직관적으로 이해해보세요. 본문

카테고리 없음

Adam optimizer를 직관적으로 이해해보세요.

스택큐힙리스트 2023. 3. 28. 14:07
반응형

Adam의 의사 코드에 따르면:

나는 일부 코드를 작성했습니다.

from matplotlib import pyplot as plt

import numpy as np

# np.random.seed(42)

num = 100

x = np.arange(num).tolist()

# The following 3 sets of g_list stand for 3 types of gradient changes:

# g_list = np.random.normal(0,1,num) # gradient direction changes frequently in positive and negtive

# g_list = x # gradient direction always positive and gradient value becomes larger gradually

g_list = [10 for _ in range(num)] # gradient direction always positive and gradient value always the same

m = 0

v = 0

beta_m = 0.9

beta_v = 0.999

m_list = []

v_list = []

for i in range(1,num+1):

g = g_list[i-1]

m = beta_m*m + (1 - beta_m)*g

m = m/(1-beta_m**i)

v = beta_v*v + (1 - beta_v)*(g**2)

v = v/(1-beta_v**i)

m_list.append(m)

v_list.append(np.sqrt(v))

mv = np.array(m_list)/(np.array(v_list) +0.001)

print(==>> mv: , mv)

plt.plot(x, g_list, x, mv)

코드를 실행하니 다음과 같은 플롯이 나왔습니다:

제 생각에는 그것이 직관에 반한다고 생각합니다. 기울기 방향이 항상 양수이고 기울기 값이 일정할 때 학습률 계수 (즉, mv)는 1에 가깝게 설정되어야하지만, 100번째 결과는 3.40488818e-70으로 거의 0에 가까운 값입니다.

코드 일부를 변경한다면:

# m = m/(1-beta_m**i)

if i == 1:

m = m/(1-beta_m**i)

# v = v/(1-beta_v**i)

if i == 1:

v = v/(1-beta_v**i)

저는 받은 결과가 이렇습니다:

이것은 내 직감과 더 일치합니다.

제가 위에 작성한 코드가 정확한지 알려주세요. 그리고 정확하다면 위와 같은 결과를 얻는 것이 직관적이라고 생각하시나요?

답변 1

당신의 코드 구현은 거의 완성되었지만 알고리즘과 당신의 구현 사이에 유의해야 할 하나의 차이점은 올바르지 않게 편향 보정 항 m/(1-beta_m**i) 을 변수 m 와 함께 누적하고 있다는 것입니다. 편향 보정을 위해 별도의 변수 m_hat 를 할당해야 합니다.

v 에도 동일한 원칙이 적용됩니다: 바이어스 보정값을 v_hat 와 같은 다른 변수에 할당합니다.

이를 수행하면 편향 보정이 m 및 v의 누적에 포함되지 않습니다.

당신의 코드는 그대로 유지할 수 있지만, 편향 보정된 값의 계산과 리스트 추가를 변경해야 합니다. 이렇게 하면 원하는 결과를 얻을 수 있습니다.

for i in range(1,num+1):

g = g_list[i-1]

# calculate m and v

m = beta_m*m + (1 - beta_m)*g

v = beta_v*v + (1 - beta_v)*(g**2)

# assign bias corrected values to m_hat and v_hat respectively

m_hat = m/(1-beta_m**i)

v_hat = v/(1-beta_v**i)

# append to lists

m_list.append(m_hat)

v_list.append(np.sqrt(v_hat))

답변 2

애당초 딥러닝 모델을 개선하는 것은 매우 어려운 일입니다. 모델의 수업화와 최적화는 경험과 조종에 의해 안정화되기 때문입니다. 이러한 이유로 다양한 최적화 기술과 알고리즘이 개발되었습니다. 그중에 가장 널리 사용되는 것 중 하나는 Adam optimizer입니다.

Adam optimizer는 경사하강법의 확장 버전입니다. 이 알고리즘은 모멘텀과 RMSProp 알고리즘의 장점을 융합하여 만들었습니다. 기본적으로 Adam optimizer는 기울기 벡터를 사용하여 모델의 매개 변수를 업데이트 합니다. 이 방식에서 이전 경사 하강의 방식보다 비율적으로 더 빠르게 수렴할 수 있습니다.

Adam optimizer는 모델의 매개 변수를 업데이트 하기 전에 동적 학습률을 계산합니다. 이를 통해 모델이 모든 매개 변수에서 동일한 속도로 업데이트 될 수 있습니다. 이러한 방법으로 Adam optimizer는 경사 하강법의 단점 중 하나인 공동 발산 문제를 해결할 수 있습니다.

Adam optimizer의 또 다른 장점은 이 기술을 사용하여 최적화 문제를 더 무관심하게 처리 할 수 있는 성능 업그레이드를 제공한다는 것입니다. 이 알고리즘은 더 좋고 일반적으로 모든 DNN 모델 설정에 적용할 수 있습니다.

Adam optimizer 소개, 이 알고리즘을 사용하는 이유와 그 효과를 이해할 수 있습니다. 따라서 이 기술을 사용하여 다양한 최적화 문제를 번들로 해결할 수있는 모델 개선에 도움이 됩니다.

반응형
Comments