Activation Functions
Sigmoid
> 0에서 1까지의 범위를 가지며, saturated한 모습을 보이고 있다.
3가지 문제점
Saturated되는 특징으로 인해서 gradient가 사라진다(vanishing gradient). Saturated되는 부분( x = 10, x = -10 )에서 gradient가 0이 되고 0의 값이 backprop으로 넘어가면서 gradient가 사라진다.
Sigmoid의 출력이 zero centered 하지 않다.
> input값이 모두 양수이면 gradient가 전부 양수, 음수가 된다. Gradient의 부호는 위에서 내려온 gradient의 부호 값과 같아지기에 파라미터를 업데이트 할 때 다 같이 증가하거나 감소하게 된다.
> gradient의 움직임은 1,3 사분면으로 나오게 되어서 파란색 선을 따르지 않고 빨간색처럼 지그재그 패턴을 반복한다.
> zero centered한 데이터는 input값을 양수, 음수 값으로 가지게 되어서 gradient가 빠르게 움직일 수 있다.
- Exp( )계산은 다른 연산들에 비해서 expensive한 문제가 있다.
tanh
> -1에서 1의 범위를 가지며 zero centered 형태를 가지고 있다. 그러나 여전히 gradients가 saturated하기 때문에 gradient vanishing 문제가 있다.
ReLU
> 양의 값에서 saturated하지 않는 장점이 있다.
> Exp계산을 하지 않기에 계산속도도 빠르다. zero-centered하지 않는다.
> ReLu가 data cloud에서 떨어져 있는 경우에 dead ReLu가 발생한다. Positive한 부분만 update되고 Negative한 부분은 update가 되지 않는다.
Leaky ReLU / PReLU
> Negative한 부분에서 0이 아니기 때문에 Saturated한 문제가 없다. Dead ReLU 현상도 없다.
> PReLU의 경우에는 Negative한 부분이 backprop으로 학습시키는 alpha이기 때문에 activation Function이 유연하다.
ELU
> zero centerd하고 Negative한 부분에서 Saturated하다.
> Saturated한 부분이 noise에 robust하다고 주장한다 (feature selection과 연관)
Maxout
> 두 개의 선형함수를 사용하였기 때문에 Saturated되지 않으며 gradient가 사라지지 않는다. 그러나 parameters를 두 개를 사용했기 때문에 연산이 두 배 증가한다.
Data Preprocessing
> zero-centered하는 이유는 sub_optimal이 발생하기 때문에 최적화가 어렵다.(gradient가 지그재그로 움직이는 현상)
> normalized 모든 차원이 동일한 범위 안에 있게 해줘서 feature들이 전부 동등한 기여를 하게 한다.
> 이미지의 경우, 전 처리를 zero-centered만 해주면 된다.
> 픽셀 값은 0 ~ 255 사이에 존재, 이미 스케일이 동일한 범주에 속한다 normalize 불필요하다
zero-centered할 때
> train에서 계산한 평균을 test데이터에도 동일하게 적용해준다.
> 미니배치 단위로 학습시킨다고 해도 평균은 학습 데이터 전부를 가지고 계산한다.
Weight Initialization
> Weight를 Initialization하는 것이 중요하다. 만약 w = 0으로 동일하게 Initialization이 된다면 parameter값이 동일하게 update 될 것이고 모든 뉴런 값이 같아진다. (우리는 서로 다른 뉴런들을 통해 특징들을 뽑고 싶다)
Weight Initialization 해결방법
- 임의의 작은 값으로 초기화 ( 초기 w값은 gaussian을 따르게 한다. )
> small network에서는 괜찮지만 network가 깊어질수록 gradient가 점점 더 작아지는 현상이 발생한다.
- 임의의 큰 값으로 초기화
> 가중치가 큰 값을 가지므로 Saturation하게 되고 gradient가 사라지는 현상이 발생하게 된다. (sigmoid, tanh을 사용할 때)
Xavier initialization
w = np.random.randn (fan_in, fan_out) / np.sqrt(fan_in)
> input이 작으면 input보다 더 작은 값으로 나누어 큰 가중치를 얻고 input이 크면 input보다 더 큰 값으로 나누어 작은 가중치를 얻는다.
> 가중치의 크기가 적절하게 조절되고 W(가중치)의 분산이 1로 유지가 된다.
> activation function을 ReLU를 사용하게 된다면 negative 영역의 output이 0이기 때문에 문제가 발생한다.
He initialization
w = np.random.randn (fan_in, fan_out) / np.sqrt(fan_in/2)
> ReLU에서 Output의 절반이 사라지는 사실을 고려하여 Xavier의 방법에서 나누어 주는 값을 input/2로 맞추어 준다.
Batch Normalization
> layer의 입력을 unit gaussian으로 만들어주는 방법, layer의 입력은 linear한 영역에 속하게 되고 Saturated하지 않는다.
> batch별로 평균과 분산을 구한 뒤 Normalization을 한다. 감마와 베타값을 이용해 batch Normalization을 얼마나 scaling하고 shift할지 결정한다. (항상 정확한 Normalization이 좋은 것이 아니다.)
> Test time에 적용되는 평균과 분산은 Training time에서 구한 평균과 분산을 사용하는 것이다.
Babysitting the Learning Process
- 데이터 전처리
- 모델 선택
> loss가 적절한지 확인한다. (regularization term을 없앴다가 추가해본다. 추가 후 loss값이 올라가는 것을 보면서 overfitting되지 않는 것을 확인)
> loss값이 줄어들지 않는 상황(learning rate가 작음) -> learning rate를 올리자
> loss값이 발산하는 상황(learning rate가 크다) -> learning rate를 낮추자
Hyperparameter Optimization
Cross-validation strategy
> Training set으로 학습시키고 Validation set으로 평가하는 방법, 이때 적절한 hyperparameter를 찾아야 한다.
- 넓은 범위에서 값을 조절해 나가면서 어떤 hyperparameter가 좋을지 판단한다.(coarse stage)
- 범위를 좁게 설정한 뒤 학습을 길게 가져가면서 최적의 값을 찾는다. (fine stage)
Random Search vs Grid Search
> Random Search가 Grid Search보다 좋다
> Parameter를 Random하게 Search하기 때문에 다양한 parameter를 sampling 한다(초록색 그래프 비교)
> 민감하고 중요하게 생각하는 것들을 더 잘 sampling 할 수 있다.
스터디 질문 모음
1) ReLU, ELU는 왜 noise에 robust할까?
> 음의 영역에서 saturate되어 gradient vanishing 되는 부분이 있다. 이때 데이터 전체를 학습하는 것이 아니라 0인 부분이 있어 선택적으로 학습하게 된다.(generalized)
2) CONV에서 Batch Normalization할때 주의사항
> 기존에 activation function에 넣기 전에 Wx + b 형태로 weight를 적용시켜준다. 그러나 CONV에서 Batch Normalization을 사용하기 위해서는 b를 없애준다.( Wx ) Batch Normalization의 Beta 값이 b의 역할을 대체할 수 있기 때문이다.