일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 코딩
- 오차역전파법
- C언어
- Python
- 파이썬
- Python Challenge
- 리뷰
- Apache2
- 역전파
- 순전파
- 소프트맥스 함수
- 백준
- PostgreSQL
- FastAPI
- 신경망 학습
- 기울기
- 신경망
- AdaGrad
- picoCTF
- 우분투
- HTML
- sgd
- PICO CTF
- 책
- CTF
- 딥러닝
- flag
- 아파치
- 설치
- PHP
Archives
- Today
- Total
Story of CowHacker
딥러닝 5.2 학습 관련 기술들 본문
728x90
이번에는 저번에 알아본 모멘텀 보다 더 발전한
AdaGrad에 대해 알아보겠다.
AdaGrad란?
개별 매개변수에 적응적으로 학습률을 조정하면서 학습을 진행한다.
그림 1은 AdaGrad를 수식으로 표현한 것이다.
W는 갱신할 가중치 매개변수다.
∂L/∂W은 W에 대한 손실 함수의 기울기다.
η는 학습률을 뜻한다.
h는 기존 기울기 값을 제곱하여 계속 더해준다.
매개변수를 갱신할 때 1/루트 h을 곱해 학습률을 조정한다.
이제 이것을 파이썬 코드로 구현해보겠다.
AdaGrad 코드
import numpy as np
class AdaGrad:
"""AdaGrad"""
def __init__(self, lr=0.01):
self.lr = lr
self.h = None
def update(self, params, grads):
if self.h is None:
self.h = {}
for key, val in params.items():
self.h[key] = np.zeros_like(val)
for key in params.keys():
self.h[key] += grads[key] * grads[key]
params[key] -= self.lr * grads[key] / (np.sqrt(self.h[key]) + 1e-7)
저기서 1e-7이라는 것은 self.h [key]에 0이 담겨 있다 해도 0으로 나누는 사태를 막아주는 역할을 한다.
이제 그래프로 표현해 보겠다.
최솟값을 향해 효율적으로 움직이는 것을 볼 수 있다.
y축 방향은 기울기가 커서 처음에는 크게 움직이지만, 그 큰 움직임에 비례해서 갱신 정도도 큰 폭으로 작아지도록 조정된 걸 볼 수 있다.
728x90
'공부 > 딥러닝' 카테고리의 다른 글
딥러닝 5.3 학습 관련 기술들 (0) | 2020.08.20 |
---|---|
딥러닝 5.1 학습 관련 기술들 (0) | 2020.08.19 |
딥러닝 5.0 학습 관련 기술들 (0) | 2020.08.19 |
딥러닝 4.5 오차역전파법 (0) | 2020.08.19 |
딥러닝 4.4 오차역전파법 (0) | 2020.08.19 |
Comments