목차
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$)을 기준으로 넘지 못하게 하는 방법
'python > 핸즈온 머신러닝' 카테고리의 다른 글
[핸즈온 머신러닝] 12장. 텐서플로우를 사용한 사용자 정의 모델과 훈련 (0) | 2021.03.31 |
---|---|
[핸즈온 머신러닝] 3장. 분류 (0) | 2021.01.31 |
[핸즈온 머신러닝] 2장. 머신러닝 프로젝트 처음부터 끝까지 (0) | 2021.01.21 |
[핸즈온 머신러닝] 1장. 한 눈에 보는 머신러닝 (0) | 2021.01.21 |
댓글