일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 데이터구조
- 프로그래밍
- 데이터베이스
- 컴퓨터공학
- 코딩
- 버전관리
- 클라우드컴퓨팅
- 소프트웨어
- 컴퓨터과학
- 보안
- 빅데이터
- 컴퓨터비전
- 머신러닝
- 데이터과학
- 자료구조
- 자바스크립트
- 딥러닝
- 프로그래밍언어
- Yes
- 데이터분석
- 네트워크보안
- 소프트웨어공학
- 인공지능
- 파이썬
- I'm Sorry
- 네트워크
- 웹개발
- 사이버보안
- 2
- 알고리즘
- Today
- Total
스택큐힙리스트
Adam optimizer를 직관적으로 이해해보세요. 본문
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 소개, 이 알고리즘을 사용하는 이유와 그 효과를 이해할 수 있습니다. 따라서 이 기술을 사용하여 다양한 최적화 문제를 번들로 해결할 수있는 모델 개선에 도움이 됩니다.