본문 바로가기
python/핸즈온 머신러닝

[핸즈온 머신러닝] 11장. 심층 신경망 훈련하기

by _avocado_ 2021. 3. 28.

목차

 

1. 그레디언트 소실 및 그레디언트 폭주 문제

2. 전이 학습

3. 옵티마이저

4. 규제


● 그레디언트 소실 및 그레디언트 폭주

- 깊은 신경망 학습 시 그레디언트가 점점 작아지거나 발산하는 현상

 

- 하위층에 대한 훈련이 매우 어려워진다. 시간 또는 비용이 많이 발생하게 된다.

 

- 과대 적합에 빠질 위험이 많다.

 

- 초반에 많이 사용하던 로지스틱 활성화 함수와 표준 정규분포 초기화로 인해 발생

 

▶ 글로럿 초기화

 

출력층의 분산과 입력층의 분산이 같아야 적절한 신호가 흐를 수 있다.

 

글로럿 초기화를 사용하면 훈련 속도를 매우 높일 수 있다. 현재 딥러닝의 성공을 견인한 기술이다.

 

입력층의 개수를 $fan_{in}$, 출력층의 개수를 $fan_{out}$으로 표현하고 $fan_{avg}$는 둘의 평균입니다.

 

글로럿 초기화 식

$$\sigma^{2}=\frac{1}{fan_{avg}} \text{인 정규분포}$$

$$\text{또는 } r = \sqrt{\frac{3}{fan_{avg}}} \text{일 때 } -r \text{과} +r \text{사이 균등분포}$$

 

위 식에서 $fan_{avg}$을 $fan_{in}$으로 바꾸면 르쿤 초기화가 되며 뒤에 설명할 SELU 활성화 함수에서 사용한다.

 

▶ He 초기화

 

ReLU함수와 그 변종들을 활성화 함수로 사용할 때 글로럿 초기화를 사용하면 그레디언트 소실 문제가 발생한다.

He 초기화는 ReLU함수들을 활성화 함수로 사용할 때 사용해야 한다.

 

He 초기화 식

$$\sigma^{2} = \frac{1}{\sqrt{fan_{in}}} \text{인 정규분포}$$

 

▶ 활성화 함수 별 초기화 방법의 선택

초기화 방법 활성화 함수
글로럿 활성화 함수 없음, 하이퍼볼릭 탄젠트, 소프트 맥스, 로지스틱
He ReLU 함수와 그 변종들(뒤에 나옴)
르쿤 SELU

▶ ReLU 함수와 변종들

 

ReLU

$$max(0, x)$$

- 장점 : 수렵하지 않는다.

- 단점 : 음수 값을 0으로 반환하기 때문에 죽은 뉴런(신호가 0인)이 많다.

 

reakyReLU

-특징 : 음수의 값을 나타 낸다. $\alpha$를 이용하여 각도 조절, 죽은 뉴런을 없게 한다. ($\alpha = 0.2$ 가 적당하다.)

RReLU

- 특징 : 훈련하는 도중 $\alpha$ 값을 무작위로 선택하여 학습한다. 규제의 역할을 하는 것처럼 과대 적합을 방지하였다.

 

PReLU

- 특징 : 훈련하는 동안 $\alpha$의 값도 학습한다. 대규모 데이터셋에서는 더 좋은 결과

- 단점 : 소규모 데이터에서 과대 적합에 빠지는 경향이 있다.

 

ELU

- 특징 : 모든 ReLU 함수보다 좋은 성능을 내었다. 훈련시간도 줄었다.

- 단점 : 계산이 느리다. 훈련시간은 줄여주지만 테스트 시 시간이 더 걸릴 수 있다.

$$ELU_{\alpha}(z) = \left\{\begin{matrix}
\alpha(exp(z)-1) & z<0\text{일 때}\\ 
z & z\geq0 \text{일 때} 
\end{matrix}\right.$$

 

SELU

- 자기 정규화 ELU

- 특징 : 각 층의 출력이 평균 0, 표준편차 1을 유지한다. (조건이 있다.)

    - 조건 : 1. 입력 특성이 평균 0 분산 1을 만족해야 한다.

                2. 르쿤 가중치 초기화 방법을 이용하여야 한다.

                3. 네트워크는 일렬로 쌓은 층으로 구성되어야 한다. 순환 신경망이나 스킵 연결 같은 구조에서는 안된다.


▶ 배치 정규화

 

- 각 층에서 활성화 함수를 통과하기 전 또는 후에 정규화 작업을 한다.

 

- 테스트할 때는 훈련 때 구해진 전체 평균과 표준편차를 이용해 정규화한다.

 

- 입력 특성마다 따로 적용되며 배치마다 처리하기 때문에 근사적일 수 있다.

 

- 훈련 속도와 성능을 큰 폭으로 상승시켰다. 규제로서 작용을 한다.

 

- 활성화 함수 이전에 하는 것이 좋다고는 하지만 모두 실험해보고 좋은 것을 선별한다.

 

▶ 그레디언트 클리핑

 

- 그레디언트의 최대 값의 범위를 지정한다.

 

- clipvalue : 값을 지정 [0.9, 100.0] -> [0.9, 1.0]
    

    - 일반적으로 잘 작동하는 방식이다.

 

- clipnorm : 벡터의 방향을 유지하면서 크기를 조정한다. [0.9, 100.0] -> [0.0089, 0.9999]

 

    - 방향은 유지되지만 위 예시처럼 다른 값이 거의 사라질 수 있다.


● 전이 학습

새로운 네트워크를 새로 훈련하는 방식은 좋은 방법이 아니다. 비슷한 문제를 다루는 모델이 있다면 이미 훈련된 모형을 이용하자.

 

적은 데이터로 훌륭한 모델을 얻을 수 있는 방법이다.

 

데이터를 파악하는 부분인 하위층을 재사용하는 것이 좋은 방법이다. -> 재사용할 층의 개수를 잘 선정하는 것이 중요하다.

 

보통 원본의 출력층을 새로 바꿔 새로운 작업에 맞춘다.

 

- 가중치 훈련 방법

 

1. 재사용하는 모든 층을 동결한다. (훈련에 참여시키지 않는다.)

 

2. 출력층(혹은 새로운 층)에 대한 훈련을 진행한다.

 

3. 동결된 층 중에서 상위 1~2 개 정도를 훈련에 참여시킨 뒤 성능이 증가하는지 확인한다.

 

▶ 비지도 전이 학습

 

오토 인코더를 통해 자동으로 레이블을 매기거나 GAN을 이용해 데이터를 만든다.(17장에서 자세하게)


● 옵티마이저

훈련 속도를 높이고 더 나은 모델을 만들기 위해 옵티마이저를 잘 선택해야 한다.

 

SGD의 보다 빠르고 발전된 옵티마이저를 소개한다.

 

모멘텀 최적화

 

- 현재 기울기뿐만 아니라 이전 기울기에 대한 값으로 계수를 조정한다.  


    - 일반적인 SGD 식
$$\theta \leftarrow \theta - \eta \bigtriangledown_{\theta}J(\theta) $$
    - 모멘텀 최적화 식
$$ m \leftarrow \beta m - \eta \bigtriangledown_{\theta}J(\theta)$$
$$\theta \leftarrow \theta + m$$

$$\beta = \text{모멘텀 값 0이면 강한마찰, 1이면 마찰 없음}, J(\theta) = \text{비용 함수}  $$ 

 

네스테로프 가속 경사

 

- 현재 위치가 아닌 모멘텀 방향으로 이동한 위치의 경사를 이용한다.

$$ m \leftarrow \beta m - \eta \bigtriangledown_{\theta}J(\theta+\beta m)$$
$$\theta \leftarrow \theta + m$$

 

AdaGrad

 

- 가파른 차원의 학습률을 더 빠르게 감소시켜 기울기 감소 방향을 최적점 방향으로 잡아준다.

 

- 가파를수록 빠르게 최적점으로 다가갔기 때문에 가파른 차원의 학습률을 감소시켜준다.

 

- 딥러닝에서 별로다 사용하지 마라


$$s \leftarrow s + \bigtriangledown_{\theta}J(\theta) \otimes \bigtriangledown_{\theta}J(\theta)$$
$$\theta \leftarrow \theta - \eta \bigtriangledown_{\theta}J(\theta) \oslash \sqrt{s+\varepsilon}$$
$$ \otimes = \text{원소별 곱셈}, \oslash = \text{원소별 나눗셈}, \varepsilon = \text{0 나누기 방지 1e-10}  $$

 

RMSProp
- AdaGrad가 너무 빨리 멈추는 경향이 있기 때문에 s값을 보정
$$s \leftarrow \beta s + (1-\beta)\bigtriangledown_{\theta}J(\theta) \otimes \bigtriangledown_{\theta}J(\theta)$$

 

Adam & Nadam

- Adam : 모멘텀 최적화 + RMSProp

- Adamax : s값의 노름을 변경(자세한 건 책에, Adam 보다 별로지만 Adam이 잘 안된다면 시도해보자)

- Nadam : 네스테로프 + RMSProp


● 학습률 스케줄링

 

좋은 학습률을 선택하여 최적점에 수렴하는 속도를 높이고 지역 최솟값에 빠지지 않게 해야 한다.

- 거듭제곱 기반 스케줄링 : 매 스텝마다 특정 비율로(책을 보자) 감소

- 지수 기반 스케줄링 : s 스탭마다 10배씩 줄어들게 한다.  

- 구간별 고정 스케줄링 : 일정 횟수 동안 같은 학습률 사용, 구간 변경 시 학습률 감소, 적절한 구간, 값을 찾기 위해 시도해야 한다.  

- 성능 기반 스케줄링 : 매 N스탭마다 검증 오차를 기반으로 오차가 줄지 않으면 학습률을 감소   

- 1사이클 스케줄링 : 훈련 절반 동안 학습률을 선형적으로 증가시킨다.(약 10배) 나머지 절반 동안 다시 학습률을 낮추면서 진행 마지막 몇 번의 에폭 동안은 매우 작은 학습률로 진행, 모멘텀을 이용 시에는 모멘텀을 낮추다가 높이고 다시 낮추고(0.95 -> 0.85 -> 0.95 -> 0.999)

 

- 1사이클링 스케쥴링이 가장 좋다.


● 규제를 이용한 과대 적합 피하기

L1, L2 규제

 

- 딥러닝에서도 릿지 라쏘를 규제를 이용한다.

 

드롭아웃

- 훈련 시 일부 뉴런들을 비활성화시킨 후 진행하고 테스트시에는 모든 뉴런을 이용한다.

 

- 순환 신경망에서는 20 ~ 30, 다른 신경망에서는 40 ~ 50% 의 드롭아웃을 주로 사용한다.

 

몬테 카를로 드롭아웃

 

- 드롭아웃된 모델들이 만들 결과를 평균 내어 결과를 만들어내는 과정

 

- 재훈련하지 않고 선능을 높이는 방법이다.

 

맥스 노름 규제

 

- 가중치 행렬의 노름의 길이를 계산하여 스케일을 조정하는 방법

 

- 특정 값($r$)을 기준으로 넘지 못하게 하는 방법

댓글