K 개발자
심층 신경망 훈련 본문
그레이디언트 소실과 폭주 문제
그레이디언트 소실vanishing gradient : 알고리즘이 하위층으로 진행될수록 그레이디언트가 점점 작아지는 경우 (경사 하강법이 하위층의 연결 가중치를 변경되지 않은 채로 둔다면 훈련이 좋은 솔루션으로 수렴되지 않을 것이다.)
그레이디언트 폭주exploding gradient : 그레이디언트가 점점 커져서 여러 층이 비정상적으로 큰 가중치로 갱신되면 알고리즘은 발산diverse
글로럿Glorot과 He 초기화initialization
각 층의 연결 가중치를 밑에 기술한 방식대로 무작위로 초기화
- 평균이 0이고 분산이 $\sigma^{2}$인 정규분포
- 또는 $-r$과 $+r$ 사이의 균등분포 $(r=\sqrt{3\sigma^{2}})$
초기화 전략 | 활성화 함수 | $\sigma^{2}$(정규분포) |
---|---|---|
글로럿(세이비어Xavier) | 활성화 함수 없음, 하이퍼볼릭 탄젠트, 로지스틱, 소프트맥스 | $1/fan_ {\text{avg}}$ |
He | ReLU 함수와 그 변종들 | $2/fan_ {\text{in}}$ |
르쿤LuCun | SELU | $1/fan_ {\text{in}}$ |
$fan_ {\text{in}}$ : 층의 입력 연결 개수
$fan_ {\text{out}}$ : 층의 출력 연결 개수
$fan_ {\text{avg}}$ : $(fan_ {\text{in}}+fan_ {\text{out}})/2$
수렴하지 않는 활성화 함수
ReLU
$\text{ReLU}(z)=\text{max}(0,z)$
특정 양숫값에 수렴하지 않고 계산이 빠르다.
LeakyReLU
$\text{LeakyReLU}_ {\alpha}(z)=\text{max(}\alpha z,z)$
하이퍼파라미터 $\alpha$가 '새는leaky' 정도를 결정 (일반적으로 0.01로 설정, 좋은 성능은 0.2)
새는 정도란 $z<0$일 때 기울기이며 LeakyReLU를 죽지 않게 만든다.
RReLUrandomized leaky ReLU
훈련하는 동안 주어진 범위에서 $\alpha$를 무작위로 선택하고 테스트시에는 평균을 사용 (훈련 세트의 과대적합 위험을 줄이는 규제의 역할을 하는 것처럼 보인다.)
PReLUparametic leaky ReLU
$\alpha$가 훈련하는 동안 학습 (역전파에 의해 변경)
소규모 데이터셋에서는 훈련 세트에 과대적합될 위험이 있다.
ELUexponential linear unit
$\text{ELU}_ {\alpha}(z)=\begin{cases} \alpha\text{(exp}(z)-1) & z<0\text{일 때} \\ z & z\geq 0\text{일 때}\end{cases}$
- $z<0$일 때 음숫값이 들어오므로 활성화 함수의 평균 출력이 0에 더 가까워져 그레이디언트 소실 문제를 완화 (하이퍼파라미터 $\alpha$는 $z$가 큰 음숫값일 때 ELU가 수렴할 값을 정의, 보통 1로 설정)
- $z<0$이어도 그레이디언트가 0이 아니므로 죽은 뉴런을 만들지 않는다.
- $\alpha =1$이면 $z=0$에서 급격히 변동하지 않으므로 모든 구간에서 매끄러워 경사 하강법의 속도를 높인다.
SELUScaled ELU
완전 연결 층만 쌓아서 신경망을 만들고 모든 은닉층이 SELU 활성화 함수를 사용한다면 네트워크가 자기 정규화self-normalize된다. (훈련하는 동안 각 층의 출력이 평균 0과 표준편차 1을 유지)
조건
- 입력 특성이 반드시 표준화(평균 0, 표준편차 1)되어야 한다.
- 모든 은닉층의 가중치는 르쿤 정규분포 초기화로 초기화
- 네트워크는 일렬로 쌓은 층으로 구성 (순환 신경망이나 스킵 연결skip connection과 같은 순차적이지 않은 구조에 SELU를 사용하면 자기 정규화되는 것이 보장되지 않는다.)
일부 연구자들은 합성곱 신경망에서도 SELU 활성화 함수가 성능을 향상시킬 수 있다고 말한다.
배치 정규화batch normalization(BN)
- $\mu _ {\beta }=\frac{1}{m_ {\beta}}\sum_{i=1}^{m_ {\beta}}x^{(i)}$
- ${\sigma _ {\beta }}^{2}=\frac{1}{m_ {\beta}}\sum_ {i=1}^{m_ {\beta}}(x^{(i)}-\mu _ {\beta })^{2}$
- $\hat{x}^{(i)}=\frac{x^{(i)}-\mu _ {\beta }}{\sqrt{{\sigma _{\beta }}^{2}+\varepsilon }}$
- $z^{(i)}=\gamma \otimes \hat{x}^{(i)}+\beta$
- $\mu _ {\beta }$는 미니배치 B에 대해 평가한 입력의 평균 벡터 (입력마다 하나의 평균)
- $\sigma _ {\beta }$도 미니배치에 대해 평가한 입력의 표준편차 벡터
- $m_ {\beta}$는 미니배치에 있는 샘플 수
- $\hat{x}^{(i)}$는 평균이 0이고 정규화된 샘플 $i$의 입력
- $\gamma$는 층의 출력 스케일 파라미터 벡터 (입력마다 하나의 스케일 파라미터)
- $\otimes$는 원소별 곱셈element-wise multiplication (각 입력은 해당되는 출력 스케일 파라미터와 곱셈)
- $\beta$는 층의 출력 이동 (오프셋) 파라미터 벡터 (입력마다 하나의 스케일 파라미터) 각 입력은 해당 파라미터만큼 이동
- $\varepsilon$은 분모고 0이 되는 것을 막기 위한 숫자 (전형적으로 $10^{-5}$) 이를 안전을 위한 향smoothing term이라고 한다.
- $z^{(i)}$는 배치 정규화 연산의 출력 (i.e. 입력의 스케일을 조정하고 이동시킨 것)
입력을 원점에 맞추고 정규화한 다음, 각 층에서 두 개의 새로운 파라미터로 결괏값의 스케일을 조정하고 이동
많은 경우 신경망의 첫 번째 층으로 배치 정규화를 추가하면 훈련 세트를 표준화할 필요가 없다. (한 번에 하나의 배치만 처리하기 때문에 근사적, 입력 특성마다 스케일을 조정하고 이동)
규제와 같은 역할을 하여 (드롭아웃 같은) 다른 규제 기법의 필요성을 줄인다.
$\gamma$(출력 스케일 벡터)와 $\beta$(출력 이동 벡터)는 일반적인 역전파를 통해 학습되고 $\mu$(최종 입력 평균 벡터)와 $\sigma$(최종 입력 표준편차 벡터)는 지수 이동 평균을 사용하여 추정
$\mu$와 $\sigma$는 훈련하는 동안 추정되지만 훈련이 끝난 후에 사용 (테스트 시)
$\hat{v}\leftarrow \hat{v}\times \text{momentum}+v\times(1-\text{momentum})$을 사용해 지수 이동 평균을 업데이트
모멘텀 값은 데이터셋이 크고 미니배치가 작으면 소수점 뒤에 9를 더 넣어 1에 가깝게 한다. (e.g. 0.9, 0.99, 0.999)
그레이디언트 클리핑gradient clipping
역전파될 때 일정 임곗값을 넘어서지 못하게 그레이디언트를 잘라내는 것
순환 신경망은 배치 정규화를 적용하기 어려워서 이 방법을 많이 사용
사전훈련된 층 재사용하기
전이 학습transfer learning : 해결하려는 것과 비슷한 유형의 문제를 처리한 신경망이 있는지 찾아본 다음, 그 신경망의 하위층을 재사용하는 것 (재사용할 층 개수를 잘 선정하는 것이 필요, 심층 합성곱 신경망에서 잘 동작)
비지도 사전훈련unsupervised pretraining
비지도 훈련에서는 비지도 학습 기법으로 레이블이 없는 데이터(또는 전체 데이터)로 모델을 훈련
그다음 지도 학습 기법을 사용하여 레이블된 데이터에서 최종 학습을 위해 세밀하게 튜닝
비지도 학습 부분은 한 번에 하나의 층씩 훈련하거나 바로 전체 모델을 훈련
보조 작업에서 사전훈련
레이블된 훈련 데이터를 쉽게 얻거나 생성할 수 있는 보조 작업에서 첫 번째 신경망을 훈련하고 이 신경망의 하위층을 실제 작업을 위해 재사용 (첫 번째 신경망의 하위층은 두 번째 신경망에 재사용될 수 있는 특성 추출기를 학습)
고속 옵티마이저
모멘텀 최적화momentum optimization
- $m\leftarrow \beta m-\eta \nabla_ {\theta}J(\theta)$
- $\theta\leftarrow \theta+m$
매 반복에서 현재 그레이디언트를 (학습률 $\eta$를 곱한 후) 모멘텀 벡터momentum vector $m$에 더하고 이 값을 빼는 방식으로 가중치를 갱신 (그레이디언트를 속도가 아니라 가속도로 사용)
일종의 마찰저항을 표현하고 모멘텀이 너무 커지는 것을 막기 위해 모멘텀momentum이라는 새로운 하이퍼파라미터 $\beta$가 등장
이 값은 0(높은 마찰저항)과 1(마찰저항 없음) 사이로 설정 (일반적으로 0.9)
평평한 지역을 빠르게 탈출하거나 좁고 긴 골짜기를 빠르게 내려가거나 지역 최적점local optima을 건너뛰도록 하는 데 도움이 된다.
네스테로프 가속 경사Nesterov accelerated gradient(NAG)
또는 네스테로프 모멘텀 최적화Nesterov momentum optimization
- $m\leftarrow \beta m-\eta \nabla_ {\theta}J(\theta+\beta m)$
- $\theta\leftarrow \theta+m$
현재 위치가 $\theta$가 아니라 모멘텀의 방향으로 조금 앞선 $\theta+\beta m$에서 비용 함수의 그레이디언트를 계산
모멘텀 최적화보다 최적값에 조금 더 가까워 진동을 감소시키고 수렴을 빠르게 만든다.
AdaGrad
- $s\leftarrow s+\nabla_ {\theta}J(\theta)\otimes \nabla_ {\theta}J(\theta)$
- $\theta\leftarrow \theta-\eta \nabla_ {\theta}J(\theta)\oslash \sqrt{s+\varepsilon }$
첫 번째 단계는 그레이디언트의 제곱을 벡터 $s$에 누적 ($\otimes$ 기호는 원소별 곱셈)
비용 함수가 $i$번째 차원을 따라 가파르다면 $s_ {i}$는 반복이 진행됨에 따라 점점 커질 것
두 번째 단계는 그레이디언트 벡터를 $\sqrt{s+\varepsilon}$으로 나누어 스테일을 조정 ($\oslash$ 기호는 원소별 나눗셈을 나타내고 $\varepsilon$은 0으로 나누는 것을 막기 위한 값, 일반적으로 $10^{-10}$)
학습률을 감소시키지만 경사가 완만한 차원보다 가파른 차원에 대해 더 빠르게 감소되어 전역 최적점 방향으로 가도록 갱신되는 데 도움이 된다. (적응적 학습률adaptive learning rate)
RMSProp
- $s\leftarrow \beta s+(1-\beta )\nabla_ {\theta}J(\theta)\otimes \nabla_ {\theta}J(\theta)$
- $\theta\leftarrow \theta-\eta \nabla_ {\theta}J(\theta)\oslash \sqrt{s+\varepsilon }$
첫 번째 단계에서 지수 감소를 사용해 가장 최근 반복에서 비롯된 그레이디언트만 누적 (보통 감쇠율 $\beta$는 0.9로 설정)
너무 빨리 느려져서 전역 최적점에 수렴하지 못하는 AdaGrad의 문제를 해결
Adam과 Nadam 최적화
적응적 모멘트 추정adaptive moment estimation(Adam)
모멘텀 최적화와 RMSProp의 아이디어를 합친 것
- $m\leftarrow \beta_ {1} m-(1-\beta_ {1}) \nabla_ {\theta}J(\theta)$
- $s\leftarrow \beta_ {2} s+(1-\beta_ {2})\nabla_ {\theta}J(\theta)\otimes \nabla_ {\theta}J(\theta)$
- $\hat{m}\leftarrow \frac{m}{1-{\beta_{1}}^{t}}$
- $\hat{s}\leftarrow \frac{s}{1-{\beta_{2}}^{t}}$
- $\theta\leftarrow \theta+\eta\hat{m}\oslash\sqrt{\hat{s}+\varepsilon }$
$t$는 (1부터 시작하는) 반복 횟수
단계 1, 2, 5는 모멘텀 최적화, RMSProp과 비슷
단계 1에서 지수 감소 합 대신 지수 감수 평균을 계산 (지수 감소 평균exponential decaying average은 지수 감소 합의 $1-\beta_ {1}$배)
단계 3과 4는 $m$과 $s$가 0으로 초기화되기 때문에 훈련 초기에 $m$과 $s$의 값을 증폭
모멘텀 감쇠 하이퍼파라미터 $\beta_ {1}$은 보통 0.9로 초기화하고 스케일 감쇠 하이퍼파라미터 $\beta_ {2}$는 0.999로 초기화 (앞에서처럼 안정된 계산을 위해 $\varepsilon$은 보통 $10^{-7}$같은 아주 작은 수로 초기화)
AdaMax
위의 식 단계 2를 $s\leftarrow \text{max}(\beta_ {2}s,\nabla_ {\theta}J(\theta))$로 바꾸고 단계 4를 삭제
단계 5에서 $s$에 비례하여 그레이디언트 업데이트의 스케일을 낮춘다. (시간에 따라 감쇠된 그레이디언트의 최댓값)
Nadam
Adam 옵티마이저에 네스테로프 기법을 더한 것
클래스 | 수렴 속도 | 수렴 품질 |
---|---|---|
SGD | * | *** |
SGD(momentum=...) | ** | *** |
SGD(momentum=..., nesterov=True) | ** | *** |
Adagrad | *** | *(너무 일찍 멈춤) |
RMSprop | *** | ** 또는 *** |
Adam | *** | ** 또는 *** |
Nadam | *** | ** 또는 *** |
AdaMax | *** | ** 또는 *** |
*=나쁨, **=보통, ***=좋음
학습률 스케줄링
큰 학습률로 시작하고 학습 속도가 느려질 때 학습률을 낮추면 최적의 고정 학습률보다 좋은 솔루션을 빨리 발견
거듭제곱 기반 스케줄링power scheduling
학습률을 반복 횟수 $t$에 대한 함수 $\eta(t)=\eta_ {0}/(1+t/s)^{c}$로 지정
$\eta_ {0}$은 초기 학습률, $c$는 거듭제곱 수 (일반적으로 1로 지정), $s$는 스텝 횟수로 하이퍼파라미터
학습률은 각 스텝마다 감소 ($s$번 스텝마다 학습률은 $\eta _{0}/2, \eta _{0}/3, \eta _{0}/4, \eta _{0}/5,\dots$이 되는 식이라 처음에는 빠르게 감소하다가 점점 느리게 감소)
지수 기반 스케줄링exponential scheduling
학습률을 $\eta(t)=\eta_ {0}0.1^{t/s}$로 설정
학습률이 $s$ 스텝마다 10배씩 점차 줄어든다.
구간별 고정 스케줄링piecewise constant scheduling
일정 횟수의 에포크 동안 일정한 학습률을 사용하고 (e.g. 5에포크 동안 $\eta_ {0}=0.1$) 그다음 또 다른 횟수의 에포크 동안 작은 학습률을 사용 (e.g. 50에포크 동안 $\eta_ {1}=0.001$)
성능 기반 스케줄링performance scheduling
매 $N$ 스텝마다 (조기 종료처럼) 검증 오차를 측정하고 오차가 줄어들지 않으면 $\lambda$배만큼 학습률을 감소
1사이클 스케줄링1cycle scheduling
훈련 절반 동안 초기 학습률 $\eta_ {0}$을 선형적으로 $\eta_ {1}$까지 증가시키고 그다음 나머지 절반 동안 선형적으로 학습률을 $\eta_ {0}$까지 다시 줄인다.
마지막 몇 번의 에포크는 학습률을 소수점 몇 째 자리까지 줄인다. (여전히 선형적으로)
최대 학습률 $\eta_ {1}$은 최적의 학습률을 찾을 때와 같은 방식을 사용해 선택하고 초기 학습률 $\eta_ {0}$은 대략 10배 정도 낮은 값을 선택
모멘텀을 사용할 때는 처음에 높은 모멘텀으로 시작해서 (e.g. 0.95) 훈련의 처음 절반 동안 낮은 모멘텀으로 줄어든다. (e.g. 선형적으로 0.85까지)
그다음 다시 나머지 훈련 절반 동안 최댓값 (e.g. 0.95)으로 되돌리고 마지막 몇 번의 에포크는 최댓값으로 진행
규제를 사용해 과대적합 피하기
$l_ {1}$과 $l_ {2}$ 규제
신경망의 연결 가중치를 제한하기 위해 $l_ {2}$ 규제를 사용하거나 (많은 가중치가 0인) 희소 모델을 만들기 위해 $l_ {1}$ 규제를 사용
드롭아웃dropout
매 훈련 스텝에서 각 뉴런(입력 뉴런은 포함하고 출력 뉴런은 제외)은 드롭아웃될 확률 $p$를 가진다. (i.e. 이번 훈련 스텝에는 완전히 무시되지만 다음 스텝에는 활성화될 수 있다.)
하이퍼파라미터 $p$를 드롭아웃 비율dropout rate이라고 하고 보통 10%와 50% 사이를 지정 (순환 신경망에서는 20~30%, 합성곱 신경망에서는 40~50%에 가깝다.)
훈련이 끝난 후에는 뉴런에 드롭아웃을 적용하지 않는다.
테스트하는 동안에는 하나의 뉴런이 훈련 때보다 많은 입력 뉴런과 연결되기에 훈련이 끝난 뒤 각 입력의 연결 가중치에 보존 확률keep probability$(1-p)$을 곱해야 한다. (또는 훈련하는 동안 각 뉴런의 출력을 보존 확률로 나눌 수도 있다.)
모델이 과대적합되었거나 층이 클 때는 드롭아웃 비율을 늘리고 모델이 훈련 세트에 과소적합되거나 작은 층에는 드롭아웃 비율을 낮춘다. (많은 최신의 신경망 구조는 마지막 은닉층 뒤에만 드롭아웃을 사용)
알파alpha 드롭아웃
SELU 활성화 함수를 기반으로 자기 정규화하는 네트워크를 규제하고 싶다면 알파 드롭아웃을 사용 (입력의 평균과 표준편차를 유지하는 드롭아웃의 한 변종)
일반 드롭아웃이 자기 정규화하는 기능을 망가뜨릴 수 있기 때문
몬테 카를로 드롭아웃Monte Carlo dropout(MC 드롭아웃)
Dropout 층을 활성화하고 테스트 세트에서 예측을 만들어 쌓는다. (예측이 모두 달라진다.)
드롭아웃으로 만든 예측을 평균하면 일반적으로 드롭아웃이 없이 예측한 하나의 결과보다 더 안정적 (더 정확한 불확실성 추정을 제공)
맥스-노름 규제max-norm regularization
각각의 뉴런에 대해 입력의 연결 가중치 $w$가 $\parallel w \parallel_ {2}\leq r$이 되도록 제한 ($r$은 맥스-노름 하이퍼파라미터, $\parallel \cdot \parallel_ {2}$는 $l_ {2}$ 노름)
매 훈련 스텝이 끝나고 $\parallel w \parallel_ {2}$를 계산하고 필요하면 $w$의 스케일을 조정 ($w\leftarrow w\frac{r}{\parallel w \parallel_ {2}}$)
$r$을 줄이면 규제의 양이 증가하여 과대적합을 감소
요약 및 실용적인 가이드라인
기본 DNN 설정
하이퍼파라미터 | 기본값 |
---|---|
커널 초기화 | He 초기화 |
활성화 함수 | ELU |
정규화 | 얕은 신경일 경우 없음. 깊은 신경망이라면 배치 정규화 |
규제 | 조기 종료 (필요하면 $l_ {2}$ 규제 추가) |
옵티마이저 | 모멘텀 최적화 (또는 RMSProp이나 Nadam) |
학습률 스케줄 | 1사이클 |
자기 정규화를 위한 DNN 설정
하이퍼파라미터 | 기본값 |
---|---|
커널 초기화 | 르쿤 초기화 |
활성화 함수 | SELU |
정규화 | 없음 (자기 정규화) |
규제 | 필요하다면 알파 드롭아웃 |
옵티마이저 | 모멘텀 최적화 (또는 RMSProp이나 Nadam) |
학습률 스케줄 | 1사이클 |
비슷한 문제를 해결한 모델을 찾을 수 있다면 사전훈련된 신경망의 일부를 재사용
레이블이 없는 데이터가 많다면 비지도 사전훈련을 사용하고 비슷한 작업을 위한 레이블된 데이터가 많다면 보조 작업에서 사전훈련을 수행
- 희소 모델이 필요하다면 $l_ {1}$ 규제를 사용 (자기 정규화를 깨뜨리므로 이 경우 기본 DNN 설정을 사용)
- 빠른 응답을 하는 모델이 필요하면 층 개수를 줄이고 배치 정규화 층을 이전 층에 합치고 LeakyReLU나 ReLU와 같이 빠른 활성화 함수를 사용 (희소 모델을 만드는 것도 도움이 된다.)
- 위험에 민감하고 예측 속도가 매우 중요하지 않은 애플리케이션이라면 성능을 올리고 불확실성 추정과 신뢰할 수 있는 확률 추정을 얻기 위해 MC 드롭아웃을 사용
실습코드링크 : 대규모 신경망