Activation Functions
Sigmoid
$f(x) = \frac{1}{1+e^{-x}}$
- S 모형 곡선
- 인간의 뉴런에서 firing 하는 거랑 비슷하다고 여겨짐 (과거, 현재는 relu)
- 모든 입력을 0에서 1사이의(squashing) 양수로 출력 (학습속도에 영향(느리게 함))
- exp계산이 많이 들어가서 속도 느려짐
- saturation → kill the gradients (가장 큰 문제)
- 결과가 0 중심으로 분포하지 않음 (0~1)
- w가 모두 양수거나 모두 음수가 됨
- 우상향 방향으로만 움직여야 하므로 지그재그로 움직이고 따라서 학습이 느려짐
- 배치단위기 때문에 큰 영향은 없음
- exp() → compute expensive (결정적인 문제는 아님)
- 결과가 0 중심으로 분포하지 않음 (0~1)
Tanh
$f(x) = tanh x = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}}$
- 넓은 의미에서 sigmoid 함수
- 0에서 기울기 1
- sigmoid와 달리 zero-centered
- 여전히 saturation 문제 존재
ReLU(Rectified Linear Unit)
$\text{Computes} f(x) = max(0,x)$
- saturation 영역 없음
- 실제 생물학적 뉴런이랑 비슷
- computationally efficient
- 학습도 빠름 (sigmoid, Tanh보다 6배 정도 빠르다고 알려짐)
- 문제점
- zero-centered가 아님
- dead ReLU
- 전부 0이 되어 입력이 안돼서 발생할 경우 학습이 안됨
- 어떤 방법을 써도 본래 경로로 돌아오지 못함
- 아주 심각한 문제 (neural net에서 일부는 충분히 발생 가능)
- random값에 따라 걸릴 수 있음 -> bias 를 키움(실제로는 사용하지 않는 편)
Leaky ReLU, PReLU(Parametric-) (ReLu의 친구들)
$f(x) = max(0.01x,x)$
$f(x) = max(\alpha x,x)$
- dead ReLU 문제 해결 (음수 부분 살림)
- GAN 등에서 Leaky ReLU 많이 사용
- PReLU: alpha라 놓고 로스를 줄이는 방향으로 알파를 학습
ELU(Exponential Linear Units)
$f(x) = \matrix{x & \text{if} \quad x > 0 \cr \alpha (e^x -1) & \text{if} \quad x \leq 0}$
- Leaky ReLU는 아웃라이어에 영향을 많이 받으므로 음수쪽을 saturation 시킴
- 문제점: exp() 계산이 필요
Maxout
- ReLU와 Leaky ReLU의 일반화 형태
- $max(w_1^Tx+b_1, w_2^Tx+b_2) 에서 ReLU는 w_1=0, w_2=1
- 파라미터를 더 추가할 수있으나 학습에 부담
- 성능은 좋다고 알려져 있음
- doubles the number of parameters/neuron
Other
- Sofhplus 시그모이드를 적분
- Swish: ELU같이 생김
- 이것저것 많이 생기나 여전히 relu가 인기 많음
Data Preprocessing
Data Preprocessing 방법
- zero-center로 맞추는 것
- normalizing: variance를 1로 만드는 것
Images
무엇에 대한 평균을 0으로 만들지가 문제 (100x100x3이미지가 있을 경우 이미지 한 장별, 전체, 채널별 중에 어떻게?)
- training set 전체의 평균이 0이 되게 만드는 방법을 많이 씀
- RGB 채널별로 평균을 0으로 만드는 방법이 가장 많이 사용 (VGG)
- 보통은 255로 나누는 방법을 쓰는게 제일 쉽고 많이 쓰이는 방법
- various normalizing은 잘 안하는 편 (어차피 데이터의 range가 일정, 0~255사이 정수값 이미 스케일이 맞춰줘 있으므로 평균정도만 보정)
- training 사용 평균을 저장해놓고 새로 test 적용할 한 장에 대해 다시 사용
Weight Initialization
random 값을 잘 주는 방법
- 일단, random 값을 줘야함
- 중요한 분야는 아니지만 고려대상
- 같은 값을 주는 경우 모든 데이터가 동시 동일하게 업데이트되므로 비효율적이고 학습이 되지 않음
- 보통 small random numbers 사용
- 평균은 0이므로 표준편차의 영향을 받음
- 너무 작거나 크면 안됨
- 레이어에 달린 개수(몇 개의 입력에 대해 sum하는지)에 따라 다름
- 평균은 0이므로 표준편차의 영향을 받음
- 너무 작거나 크면 안됨
- 실제로는 initialization이 그렇게 중요한 문제는 아님
Learning Rate
- Learning rate에 따라 최종 결과가 달라짐
- Learning Rate Decay: 처음에는 크게 움직이다가 일정 조건이 되면 learning rate을 낮춰서 점점 작게 움직이는 방법
- Cyclic Learning Rate: 주기적으로 변경해서 saddle point나 local minimum을 탈출할수 있도록 함
- Linear Warmup: 초반 몇 에폭때 러닝레잇을 키움, 배치 크기를 N씩 늘리면서 초기 학습 속도 N으로 조정
- 딥러닝에선 정답이 없고 해보는 수밖에 없음
Underfitting vs Overfitting
- test error = training error + generalization gap
- 보통 딥러닝 모델은 capacity가 크기 때문에 오버피팅에 취약
- 풀려는 문제를 풀 수 있는 가장 작은 모델을 찾는 것이 best
- 딥러닝의 철학은 네트워크를 일단 크게 만들고 generalization gap을 줄여보자는 것
Overfitting 방지 방법
- Early stopping: 앞의 일을 알 수없으므로 중간에 저장하면서 감
- Regularization Method: 전통적으로 머신러닝에서부터 많이 사용하던 방법
- 로스를 평균내서 패널티를 추가(lambda 조정, L1, L2, elastic) : weight의 크기를 반영
$\text{L2 regularization :} \quad R(W) = \sum_k \sum_l W_{k,l}^2 \text{(weight decay)}$
$\text{L1 regularization :} \quad R(W) = \sum_k \sum_l |W_{k,l}|$
$\text{Elastic net (L1 + L2) :} \quad R(W) = \sum_k \sum_l \beta W_{k,l}^2 + |W_{k,l}|$
- L2 : 다같이 0을 향해 감 dense 형태 유지
- L1 : 하나가 먼저 0이 되고 나머지들이 점차 0이 됨, sparse
- weight의 크기가 커지는 것을 막아줌
- Dropout
- 딥러닝에서만 사용
- 배치별로 weight를 날려버리고 나머지 네트워크로 학습
- 속도가 늦어짐
- Batch Normalization
- batch 단위로 평균, 분산 계산해서 normalization
- regularization 효과가 있음
- test time
- batch size가 동일하지 않을 수 있음
- train에서 나온 평균/분산을 사용해서 강제 normalization
- 최근 데이터일수록 가중치 높음
- Data Augmentation
- overfitting 발생원인은 데이터의 부족
- 데이터의 양을 늘림으로써 해결 가능
- test 시 augmentation 사용
Optimization
Gradient Descent
- Gradient의 수치적인 방법을 통해 최적값을 구하는 알고리즘
$$\theta_t = \theta_{t-1} - \eta \dot \triangledown_\theta \jmath (\theta)$$
- 문제점
- Zero Gradient : local minima나 saddle point에 빠질 확률이 높다.
- Poor Condition : 현재 위치 gradient의 값만 가지고, 판단하기 때문에 최적의 루트로 학습되지 못하는 경우 발생
- Slow : 최적점에 다가 갈수록, gradient가 0에 가까워짐
- 두가지 방법으로 발전
- 스텝방향을 어떻게 설정할 것인가?
- 스텝사이즈를 어떻게 설정할 것인가?
Momentum
$$v_t = \gamma v_{t-1} + \eta \nabla_{\theta}J(\theta)$$
$$\theta = \theta - v_t$$
- 이전에 이동했던 방향으로 영향을 받아 weight update
- 현재 gradient와 이전에 momentum의 합 방향으로 이동
- Gradient의 oscillation 현상 해결 가능 (자주 가는 방향에 관성)
- Local minimum을 빠져 나갈 수 있음
- 관성을 가지기 때문에 중앙에서 멈추는 것이 불가능
- momentum값을 저장해야 되기 때문에, 메모리가 2배로 필요
NAG(Nesterov Accelerated Gradient)
$$v_t = \gamma v_{t-1}+ \eta\nabla_{\theta}J(\theta-\gamma v_{t-1})$$
$$\theta = \theta - v_t$$
Momentum 방향으로 이동 후, 해당 위치에서 gradient을 계산 후 이동
Adagrad (Adaptive Gradient)
$$G_{t} = G_{t-1} + (\nabla_{\theta}J(\theta_t))^2$$
$$\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_t + \epsilon}} \cdot \nabla_{\theta}J(\theta_t)$$
- 서로 다른 weight마다 step size을 다르게 설정
- 기존에 많이 update한 weight은 적게 update, 적게 update한 weight은 많이 update
- G : 지금까지 g가 이동한 거리 (sum of square)로 학습
- weight : G root에 반비례하여 설정
- 시간이 날수록 G의 값이 커져서 학습이 되지 않음
RMSprop
$$G = \gamma G + (1-\gamma)(\nabla_{\theta}J(\theta_t))^2$$
$$\theta = \theta - \frac{\eta}{\sqrt{G + \epsilon}} \cdot \nabla_{\theta}J(\theta_t)$$
G를 sum of square 대신에 Exponential Moving Average을 사용하여, G가 무한정으로 커지는 것을 방지
Adam
$$m_t = \beta_1 m_{t-1} + (1-\beta_1)\nabla_\theta J(\theta)$$
$$v_t = \beta_2 v_{t-1} + (1-\beta_2)(\nabla_\theta J(\theta))^2$$
- RMSProp + Momentum을 합친 알고리즘
- m(momentum)인 모멘텀에 해당되는 부분
- v(RMSProp)인 RMSProp에 해당되는 부분
- 모든 알고리즘에서 잘 동작
'DEEP LEARNING > Fundamental Concept' 카테고리의 다른 글
Object Detection (0) | 2020.03.25 |
---|---|
Modern CNN (0) | 2020.03.10 |
Convolutional Neural Network (0) | 2020.03.03 |
Linear Regression & Logistic Regression (0) | 2020.02.12 |
What is AI? (0) | 2020.02.02 |