이전 내용이 궁금하신 분들은 밑에 링크를 참고해주시길 바랍니다.
2023.06.19 - [Deep Learning] - [밑바닥부터 시작하는 딥러닝] Chapter 5. 오차 역전파법
해당 포스팅은 "밑바닥부터 시작하는 딥러닝"을 공부하고 정리, 요약한 글입니다.
모든 내용은 해당 도서 내용 기준입니다.
가중치 매개변수의 최적값을 탐색하는 최적화 방법, 가중치 매개변수 초깃값, 하이퍼파라미터 설정 방법 등에 대해서 이번 챕터에서 다룰 것이다.
6. 1 매개변수 갱신
신경망 학습의 목적은 손실 함수의 값을 가능한 한 낮추는 매개변수를 찾는 것이다. 이는 곧 매개변수의 최적값을 찾는 문제이다. 이런 문제를 푸는 것을 최적화 optimization이라 한다.
앞에서 계속 매개변수의 기울기를 구해, 기울어진 방향으로 매개변수 값을 갱신하는 일을 몇 번이고 반복해서 점점 최적의 값에 다가갔다. 이것을 확률적 경사 하강법(SGD)라는 단순한 방법이다. 매개변수 공간을 무작정 찾는 것보다 '똑똑한' 방법이다.
6.1.2 확률적 경사 하강법(SGD)
지금 현재 위치해 있는 곳에서 가장 크게 기울어진 방향으로 가자는 것이 SGD의 전략이다. 이것을 반복하다 보면 언젠간 '깊은 곳'을 찾을 수 있을지 모르기 때문이다.
W는 갱신할 가중치 매개변수이며 뒤에 편미분 값은 W에 대한 손실 함수의 기울기이다. η 는 학습률을 의미한다.
SGD는 기울어진 방향으로 일정 거리만 가겠다는 단순한 방법이다. 파이썬 클래스로 한 번 보겠다.
class SGD:
def __init__(self, lr=0.01):
self.lr = lr # learning rate(학습률)
def update(self, params, grads):
for key in params.keys():
params[key] -= self.lr * grads[key]
이제 SGD를 신경망에 적용하게 되면 optimizer('최적화를 행하는 자')의 역할을 수행할 것이다. 그래서 우리는 optimizer에 매개변수와 기울기 정보만 넘겨줘서 최적화를 진행하게 될 것이다.
6.1.3 SGD의 단점
SGD는 단순하고 구현도 쉽지만 비효율적일 때가 있다.
위 그림처럼 SGD는 심하게 지그재그로 움직인다. 상당히 비효율적으로 움직인다. 즉, SGD는 바등방성 함수(방향에 따라 성질(기울기)이 달라지는 함수)에서는 탐색 경로가 비효율적이라는 것이다. 이럴 때는 SGD보다는 무작전 기울어진 방향으로 진행하는 단순한 방식보다는 다른 방법이 좋다.
이제 이런 단점을 개선해주는 다양한 방법을 소개하겠다.
6.1.4 모멘텀 Momentum
모멘텀은 '운동량'을 뜻하는 단어로 물리와 관계가 있다.
W는 갱신할 가중치 매개변수, v라는 변수가 새로 나오는데, 이는 물리에서 말하는 속도에 해당한다. v에 관한 식은 기울기 방향으로 힘을 받아 물체가 가속된다는 물리 법칙을 나타낸다.
또한 av 항은 물체가 아무런 힘을 받지 않을 때 서서히 하강시키는 역할을 한다.
파이썬으로 구현해보겠다.
class Momentum:
def __init(self, lr = 0.01, momentum = 0.9):
self.lr =lr
self.momentum = momentum
slef.v = None
def update(self, params, grads):
if self.v is None:
self.v = {}
for key, val in params.items():
self.v[key] = np.zeros_like(val)
for key in params.keys():
self.v[key] = self.momentum*self.v[key] - self.lr*grads[key]
params[key] += self.v[key]
모멘텀을 활용해서 갱신하면 위 그림처럼 갱신하는 모습을 볼 수 있다. SGD와 비교하면 '지그재그 정도'가 덜한 것을 확인할 수 있다. 이는 x축 힘은 아주 작지만 방향은 변하지 않고 한 방향으로 일정하고 가속하기 때문이다. 거꾸로 y축의 힘은 크지만 위아래로 번갈아 받아 상층하여 y축 방향의 속도는 안정적이지 않다.
6.1.5 AdaGrad
신경망 학습에서는 학습률 값이 중요하다. 이 값이 너무 작으면 학습시간이 너무 길어지고, 반대로 너무 크면 발산하여 학습이 제대로 이뤄지지 않는다.
학습률을 정하는 효과적 기술로는 학습률 감수 learning rate decay가 있다. 이는 학습을 진행하면서 학습률을 점차 줄여가는 방법이다.
학습률을 서서히 낮추는 가장 간단한 방법은 매개변수 '전체'의 학습률 값을 일괄적으로 낮추는 것이다. 이를 발전 시킨 것이 AdaGrad이다. AdaGrad는 '각각의' 매개 변수에 맞춤형 값을 만들어 준다.
AdaGrad는 개별 매개변수에 적응적으로 학습률을 조정하면서 학습을 진행한다.
여기서 h라는 새로운 변수가 등장하는데 h는 기존 기울기값을 제곱하여 계속 더해준다. 그리고 매개변수를 갱신할 때는 1/sqrt(h)를 곱해 학습률을 조정한다. 매개변수의 원소 중에서 많이 움직인 원소는 학습률이 낮아진다는 뜻인데 결국 학습률 감소가 매개변수의 원소마다 다르게 적용된다는 것을 뜻한다.
* AdaGrad는 과거의 기울기를 제곱하겨 계속 더해가기 때문에 학습을 진행할 수록 갱신 강도가 약해진다. -> 이를 보완 PMSProp
파이썬으로 구현해보겠다.
class AdaGrad:
def __init(self, lr = 0.01):
self.lr =lr
slef.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] += self.grads[key] * self.grads[key]
params[key] -= self.lr * grads[key] / np.sqrt(self.h[key]+1e-7)
마지막 줄에 1e-7을 꼭 더해줘야한다. 만액 self.h[key]에 0이 담겨 있다해도 0으로 나누는 것을 막아준다.
그림을 보면 최솟값을 행헤 효율적으로 움직이는 것을 알 수 있다. y축 방향은 기울기가 커서 처음에는 크게 움직이지만, 큰 움직임에 비례해 갱신 정도도 큰 폭으로 작아지도록 조정된다.
6.1.6 Adam
모멘텀과 AdaGrad를 융합하면 좋지 않을까라는 생각에서 출발한 기법이 바로 Adam이다.
Adam은 하이퍼파라미터의 '변향 보정'이 진행된다.
그림을 보면 모멘텀과 비슷한 패턴이지만, 모멘텀 때보다 좌우의 흔들임이 적은 것을 확인할 수 있다. 이는 학습 갱신 강도를 적응적으로 조정해서 이러한 결과를 얻는 것이다.
6.2 가중치의 초깃값
신경망 학습에서 특히 중요한 것이 가중치의 초깃값이다. 가중치의 초깃값을 무엇으로 설정하느냐가 신경망 학습의 성패를 가르는 일이 자주 있다.
6.2.1 초깃값을 0으로 하면?
가중치 감소 weight decay 는 가중치 매개변수의 값이 작아지도록 학습한다. 가중치 값을 작게 하여 오버피팅이 일어나지 않게 한다.
그렇다고 가중치 초깃값을 모두 0으로 하면 어떻게 될까? 가중치 초깃값을 0으로 하면 학습이 올바로 이뤄지지 않는다. 그 이유는 바로 오차역전파법 backpropagation에서 모든 가중치의 값이 똑같이 갱신되기 때문이다.
6.3 배치 정규화 Batch Nomalization
6.3.1 배치 정규화 알고리즘
배치 정규화가 주목받는 이유
- 학습을 빨리 진행할 수 있다.(학습 속도 개선).
- 초깃값에 크게 의존하지 않는다.
- 오버피팅을 억제한다.(드롭아웃 등의 필요성 감소)
배치 정규화는 그 이름과 같이 학습 시 미니 배치를 단위로 정규화 한다. 구체적으로는 데이터 분표가 평균이 0, 분산이 1이 되도록 정규화 한다.
6.3.2 배치 정규화의 효과
배치 정규화를 사용했을 떄 학습 속도가 빠른 것을 그래프를 통해서 확인할 수 있다.
6.4 바른 학습을 위해
6.4.1 오버피팅
오버피팅은 주로 두 경우에 발생한다.
- 매개변수가 많고 표현력이 높은 모델
- 훈련 데이터가 적음
6.4.2 가중치 감소
학습 과정에서 큰 가중치에 대해서 그에 상응하는 큰 패널티를 부과하여 오버피팅을 억제하는 방법이다.
6.4.3 드롭아웃
드롭아웃은 뉴런을 임의로 삭제하면서 학습하는 방법이다.
6.5 적절한 하이퍼파라미터 값 찾기
6.5.2 하이퍼파라미터 최적화
하이퍼파라미터를 최적화할 때의 핵심은 하이처차라미터와 '최적 값'이 존재하는 범위를 조금씩 줄여간다는 것입니다.
- 0단계
하이퍼파라미터 값의 범위를 설정한다. - 1단계
설정된 범위에서 하이퍼파라미터의 값을 무작위로 추출한다/ - 2단계
1단계에서 샘플링한 하이퍼파라미터 값을 사용하여 학습하고, 검증 데이터로 정확도를 평가합니다.(단, epoch는 작게 설정한다.) - 3단계
1단계와 2단계를 특정 횟수 반복하며, 그 정확도의 결과를 보고 하이퍼파라미터의 범위를 좁힙니다.
6.6 정리
- 매개변수 갱신 방법에는 확률적 경사 하강법(SGD) 외에도 모멘텀, AdaGrad, Adam 등이 있다.
- 가중치 초깃값을 정하는 방법은 올바른 학습을 하는 데 매우 중요하다.
- 가중치의, 초깃값으로는 'Xavier 초깃값'과 'He 초깃값'이 효과적이다.
- 배치 정규화를 이용하면 학습을 빠르게 진행할 수 있으며, 초깃값에 영향을 덜 받게 된다.
- 오버피팅을 억제하는 정규화 기술로는 가중치 감소와 드롭아웃이 있다.
- 하이퍼파라미터 값 탐색은 최적 값이 존재할 법한 범위를 점차 좁히면서 하는 것이 효과적이다.
'Deep Learning' 카테고리의 다른 글
[밑바닥부터 시작하는 딥러닝] Chapter 5. 오차 역전파법 (0) | 2023.06.19 |
---|---|
[밑바닥부터 시작하는 딥러닝] Chapter 4. 신경망 학습 (0) | 2023.06.12 |
x[밑바닥부터 시작하는 딥러닝] Chapter 3. 신경망 (0) | 2023.06.12 |
[밑바닥부터 시작하는 딥러닝] Chapter 2. 퍼셉트론 Perceptron (0) | 2023.06.05 |
[밑바닥부터 시작하는 딥러닝] Chapter 1. 헬로 파이썬 (0) | 2023.06.03 |