Learning/Deep Leaning

학습관련 기술들

눈떠보니 월요일 2021. 8. 9. 20:05
매개변수 갱신

- 신경망 학습의 목적은 손실 함수의 값을 가능한 한 낮추는 매개변수를 찾는 것이다. 이러한 과정을 최적화라고 한다. 신경망이 deep해질 수록 매개변수의 수가 엄청 많아지는데, 이를 효율적으로 찾는 여러가지 방법을 알아보자.

 

확률적 경사 하강법(SGD)

class SGD:
    def __init__(self, lr=0.01):
        self.lr = lr
    def update(self, params, grads):
        for key in params.keys():
            params[key] -= self.lr * grad[key]

[SGD의 단점]

- 비등방성(anisotropy) 함수 : 방향에 따라 성질, 즉 기울기가 달라지는 함수)

 

모멘텀(Momentum)

- 공이 그릇 바닥을 구르듯 움직인다.

- SGD와 비교하면 '지그재그 정도'가 덜한 것을 알 수 있다.

v - 물체의 속도

class Momentum:

    def __init__(self, lr=0.01, momentum=0.9):
        self.lr = lr
        self.momentum = momentum
        self.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]

 

AdaGrad

- 신경망 학습에서는 학습률 값이 중요하다. 너무 작으면 시간이 오래걸리고, 너무 크면 발산하여 학습이 제대로 이루어지지 않는다. 학습률을 정하는 효과적인 기술로 학습률 감소가 있다. 이는 처음에는 크게 학습하다가 조금씩 작게 학습하는 방법이다. 이 방법을 조금 발전시킨 방법이 AdaGrad이다.

class 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이라는 작은 값을 더해서 0으로 나누는 사태를 방지한다.

 

Adam

- Momentum + AdaGrad 

- 하이퍼파라미터의 편향 보정이 된다.

- Momentum과 비슷한 패턴이지만, 공의 좌우 흔들림이 더 적은것을 알 수 있다. 이는 학습의 갱신 강도를 적응적으로 조정했기 때문이다.

 

어느 최적화 기법을 이용할 것인가?

- 모든 문제에 항상 뛰어난 기법은 없다. 문제의 종류, 하이퍼파라미터 설정 등 어떤 상황이냐에 따라 달라지므로 상황을 고려하여 여러가지로 시도해보는것이 좋다.

 

 

중치의 초깃값

신경망 학습에서 가중치의 초깃값은 매우 중요하다. 권장 초깃값에 대해 알아보자.

가중치 감소 : 오버피팅을 억제해 범용 성능을 높이는 기술 (callback에 매개변수로 설정)

- 가중치 매개변수의 값이 작아지도록 학습하는 방법. 가중치 값을 작게하여 오버피팅이 일어나지 않게 한다.

가중치를 작게 하려면 초깃값도 최대한 작은 값에서 시작하는 것이 정공법이다. 그렇지만 가중치의 초깃값을 0으로 설정하면 학습이 올바르게 이루어지지 않는다. 
-> 가중치를 균일한 값으로 설정하면 오차역전파법에서 모든 가중치의 값이 똑같이 갱신되버린다.
이를 방지하기 위해 초깃값을 무작위로 설정해야한다.

가중치의 초깃값을 적정히 설정하면 각 층의 활성화 값 분포가 적당히 퍼지면서 학습이 원활하게 수행된다.

은닉층의 활성화값 분포

가중치의 초깃값에 따라 은닉층 활성화값들이 어떻게 변화할까?

표준편차가 1인 정규분포를 이용 -> 활성화 값들이 0이나 1에 치우친 분포가 나옴

표준편차를 0.01로 변경 -> 0.5 부근에 집중된 분포

가중치 초깃값을 Xavier 초깃값, He 초깃값을 사용 -> 정규분포

 

배치 정규화

[장점]

- 학습을 빨리 진행할 수 있다.(학습 속도 개선)

- 초깃값에 크게 의존하지 않는다.

- 오버피팅을 억제한다.

Concept : 각 층에서의 활성화값이 적당히 분포되도록 저정하는 것(배치 정규화 계층 삽입)

- 데이터의 분포가 평균 0, 분산 1이 되도록 정규화

- 뉴런을 통과할 때마다 정규화 사용(머신러닝의 전처리에서 정규화 느낌)

 

For correct Learning

Over Fitting

- 매개변수가 많고 표현력이 높은 모델

- 훈련 데이터가 적음

의 경우에서 overfitting이 일어난다.

 

가중치 감소(weight decay)

- overfitting 억제용 

 

Dropout - 배치정규화때문에 잘 안쓰는 경우가 많은듯..?

- 신경망 모델이 복잡해지면 가중치 감소만으로 overfitting을 대응하기 어려움

- dropout : 뉴런을 임의로 삭제하면서 학습하는 것.

- 훈련 때 은닉층의 뉴런을 무장위로 골라 삭제하여 신호를 전달하지 않게 한다.

- dropout(0.2)

 

적절한 하이퍼 파라미터 찾기

검증 데이터 사용

- 하이퍼 파라미터의 적절성을 평가하기 위한 데이터로 활용

 

하이퍼파라미터의 최적화

tip. 신경망의 하이퍼파라미터 최적화에서는 그리드 서치 같은 규칙적인 탐색보다 무작위로 샘플링하여 탐색하는 편이 좋은 결과를 낸다고 알려져있다.

 

0단계. 하이퍼파라미터 값의 범위 설정

1단계. 설정된 범위에서 하이퍼파라미터의 값을 무작위로 추출

2단계. 1단계에서 샘플링한 하이퍼파라미터 값을 사용하여 학습하고, 검증 데이터로 정확도를 평가(에폭은 작게 설정)

3단계 1,2단계를 특정 횟수(100회 등) 반복하여, 그 정확도의 결과를 보고 하이퍼파라미터의 범위를 좁힌다.