인지야공

인지야공/인공 지능 공부 치트 시트 정리/9번째 글

CS229 딥러닝 치트시트를 다시 쓴다 — 0.25 를 스무 번 곱하면

퍼셉트론부터 역전파까지의 흐름은 딥러닝 수학 글에, CNN 과 시퀀스 모델은 패턴인식 글에 적어 두었다. 여기서는 그 위에서 실제로 손이 걸리는 숫자들 — 왜 ReLU 인지, 패딩을 얼마로 줄지, 드롭아웃이 추론 때 무엇을 하는지 — 를 확인한 대로 적는다.

한 유닛이 하는 일

zj[i]=wj[i]Tx+bj[i]z_j^{[i]} = w_j^{[i]T} x + b_j^{[i]}

ii 는 층, jj 는 그 층의 유닛이다. 선형결합 하나에 활성화 함수를 씌운 것이 전부이고, 층을 쌓는 것만으로는 여전히 선형이다. 비선형은 오직 활성화 함수에서 나온다.

활성화 함수 — 0.25 의 무게

이름식미분의 최댓값
시그모이드11+e−z\dfrac{1}{1+e^{-z}}0.25
tanhez−e−zez+e−z\dfrac{e^z - e^{-z}}{e^z + e^{-z}}1.0
ReLUmax⁡(0,z)\max(0, z)1 (z>0z>0)
Leaky ReLUmax⁡(ϵz, z)\max(\epsilon z,\, z), ϵ≪1\epsilon \ll 11 (z>0z>0)

역전파는 연쇄법칙이라 층마다 미분이 곱해진다. 시그모이드의 미분은 아무리 커도 0.25 다.

 1개 층 → 0.25
 5개 층 → 0.000977
10개 층 → 0.00000095
20개 층 → 0.00000000000091

스무 층이면 앞쪽 층에 도달하는 기울기가 10−1310^{-13} 이다. 학습이 안 되는 게 아니라 갱신할 신호 자체가 사라진다. 이것이 그래디언트 소실이고, ReLU 로 갈아탄 이유다. ReLU 는 양수 구간의 미분이 1 이라 몇 층을 지나도 1 이다.

tanh 은 시그모이드와 모양은 같지만 출력이 0 을 중심으로 하고 g′(0)=1g'(0)=1 로 네 배 크다. 시그모이드보다 나은 자리가 있는 이유가 이것이다. 다만 양 끝에서 포화되는 것은 마찬가지다.

출력층만은 목적에 따라 고정이다 — 이진분류는 시그모이드, 다중분류는 소프트맥스, 회귀는 활성화 없음.

손실과 학습 네 단계

L(z,y)=−[ylog⁡z+(1−y)log⁡(1−z)]L(z,y) = -\big[y\log z + (1-y)\log(1-z)\big]

  1. 학습 데이터에서 배치 하나를 꺼낸다
  2. 순전파로 손실을 구한다
  3. 역전파로 기울기를 구한다
  4. 기울기로 가중치를 갱신한다

∂L∂w=∂L∂a⋅∂a∂z⋅∂z∂w,w←w−α∂L∂w\frac{\partial L}{\partial w} = \frac{\partial L}{\partial a}\cdot\frac{\partial a}{\partial z}\cdot\frac{\partial z}{\partial w}, \qquad w \leftarrow w - \alpha\frac{\partial L}{\partial w}

학습률 α\alpha 는 한 걸음의 크기다. 요즘은 고정값 대신 Adam 처럼 파라미터마다 보폭을 조절하는 방법을 기본으로 쓴다.

과적합을 막는 두 가지

드롭아웃은 학습할 때 유닛을 확률 pp 로 꺼 버린다. 매번 다른 부분망을 학습시키는 셈이라 특정 유닛에 기대는 것을 막는다. 그런데 그냥 끄면 다음 층이 받는 값의 합이 줄어든다.

그냥 끄면          → 평균 0.504   (절반으로 준다)
1/(1-p) 로 나누면  → 평균 1.008   (추론 때와 같아진다)

그래서 학습 때 살아남은 값을 1/(1−p)1/(1-p) 로 키워 둔다(inverted dropout). 추론할 때는 드롭아웃을 끈다 — 프레임워크의 model.eval(), training=False 가 하는 일이 이것이다. 이걸 안 끄면 예측이 매번 달라진다.

배치정규화는 배치의 평균과 분산으로 정규화한 뒤, 학습되는 γ,β\gamma,\beta 로 다시 조절한다.

xi←γ xi−μBσB2+ϵ+βx_i \leftarrow \gamma\,\frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} + \beta

전: 평균 5.015, 분산 9.433  →  후: 평균 ~0, 분산 1.0000

보통 완전연결/합성곱 층 다음, 비선형 앞에 넣는다. 큰 학습률을 쓸 수 있게 해 주고 초기값에 덜 민감해진다.

CNN — 크기 공식 하나면 된다

N=W−F+2PS+1N = \frac{W - F + 2P}{S} + 1

WW 입력 크기, FF 필터 크기, PP 패딩, SS 스트라이드다. 실제 합성곱을 돌려 맞춰 봤다.

WWFFPPSS출력확인
3230130실제 (30, 30)
3231132실제 (32, 32) — 크기 유지
3252132크기 유지
3231216.5정수가 아니다

크기를 그대로 유지하려면 P=(F−1)/2P=(F-1)/2 다(스트라이드 1 기준). F=3F=3 이면 P=1P=1, F=5F=5 면 P=2P=2 — 실무에서 쓰는 padding="same" 이 이 계산이다.

값이 정수로 떨어지지 않으면 프레임워크가 내림해서 가장자리를 버린다. 에러가 아니라 조용히 잘리는 쪽이라, 층을 쌓다 크기가 안 맞으면 이 공식을 손으로 한 번 계산해 보는 것이 가장 빠르다.

RNN — 게이트 세 개

게이트결정하는 것
입력(input)지금 값을 셀에 쓸 것인가
망각(forget)셀의 기존 값을 지울 것인가
출력(output)셀 값을 밖으로 내보낼 것인가

기본 RNN 은 같은 가중치를 시점마다 곱하므로 위에서 본 0.25 문제가 시간 방향으로 그대로 일어난다. LSTM 이 망각 게이트를 두는 이유가 이것이다. 셀 상태가 곱셈이 아니라 덧셈으로 흘러가서 기울기가 살아남는다.

강화학습 — 다섯 쌍과 벨만

MDP 는 (S,A,{Psa},γ,R)(S, A, \{P_{sa}\}, \gamma, R) 다. 상태, 행동, 전이확률, 할인율, 보상.

Vπ(s)=E[R(s0)+γR(s1)+γ2R(s2)+⋯∣s0=s,π]V^\pi(s) = E\big[R(s_0) + \gamma R(s_1) + \gamma^2 R(s_2) + \cdots \mid s_0=s, \pi\big]

V∗(s)=R(s)+max⁡a∈Aγ∑s′Psa(s′) V∗(s′)V^*(s) = R(s) + \max_{a \in A} \gamma \sum_{s'} P_{sa}(s')\,V^*(s')

벨만 방정식은 “지금 보상 + 다음 상태의 가치” 라는 한 문장을 식으로 옮긴 것이다. 가치 반복은 V0=0V_0=0 에서 시작해 이 식을 되풀이한다. 전이확률을 모르면 Q 러닝으로 간다.

Q(s,a)←Q(s,a)+α[R(s,a,s′)+γmax⁡a′Q(s′,a′)−Q(s,a)]Q(s,a) \leftarrow Q(s,a) + \alpha\Big[R(s,a,s') + \gamma\max_{a'}Q(s',a') - Q(s,a)\Big]

모델(전이확률)을 몰라도 된다는 것이 Q 러닝의 요점이다. 자세한 것은 강화학습 글에 적어 두었다.

출처

Afshine Amidi · Shervine Amidi 의 CS 229 VIP Cheatsheet: Deep Learning(Stanford, 2018)을 보고 다시 쓴 것이다. 원본은 stanford.edu/~shervine에 있고, 같은 저자들의 CS230 딥러닝 치트시트도 같은 곳에 있다. 숫자와 확인 결과는 내가 돌려 본 것이다.

표시는 이 브라우저에만 남는다. 서버로 가는 것은 없다.