[CS231n] 07.Training Neural Networks II
개요
CS231n의 7강에 대한 내용을 정리 할 것이다.
- 저번 강에서는
Training Neural Networks에 대해 배웠고 이번 강에서는 그것에 추가적인 내용을 배울 것이다.
Fancier Optimization
Stochastic Gradient Descent(SGD)
(SGD 그림)
-
이전까지
Stochastic Gradient Descent(SGD)에 대해서 배웠다. 이는 매우 간단한 Optimization의 기법인데,SGD에는 여러 문제가 있다. 이 문제들에 대해서 살펴볼 예정이다. -
먼저
Taco shell problem이다.위 그림이고W1,W2가 있을 때, 손실 함수가 매우 느리게 작동한다.SGD와 같은 목적함수는 방향이 최소값을 향한 방향으로 정렬되어 있지 않고 지그재그의 형식으로 움직이게 된다.
Loss가 수직 방향으로만sensitive해서덜 민감한 수평 방향으로 진행 속도가 매우 느려지고 수직 방향으로는 빠르게 진행되어 지그재그의 형태로 학습을 하게 된다.- 이것은
고차원에서더 흔해진다.
(graph 그림)
-
다른 문제는
Local minima과Saddle point (안장점)이 있다. -
x축이 하나의 파라미터를 뜻하고 y축이 loss를 뜻할 때
위 그림에서SGD는local minima일 때 멈춘다. -
왜냐하면 SGD는 기울기를 계산하고 반대 기울기 방향으로 진행하기 때문에 빨간색 위치에서 gradient가 0이기 때문에 멈추게 된다.
-
이는 아래 그래프 처럼
Saddle point에서도 똑같이 기울기가 0이기 때문에 멈추게 된다.
-
Saddle point: 어떤 방향에서는 손실이 증가, 어떤 방향에서는 손실이 감소하는 그 중간 지점 High dimension에서는saddle point가local minima보다 더 흔하다.Saddle point의 근처 지점에서도 문제가 된다.Saddle point의 근처에 있을 때 마다 우리는 매우 느린 진행을 하게 될 것이다.
-
다른 문제는
SGD의S이다. 확률적으로 모든dataset의loss를 계산하기엔 계산 비용이 많이 들어서 우리는mini Batch의방법을 사용하여 값을 추정한다. -
하지만 이는 W의 값을 쪼개서 사용하므로
noisy data일 수 있다는 것이다. -
기본적인 전체 배치를 사용하더라고 이런
모든 문제들은해결되지 않는다.
SGD + Momentum
-
앞서 말한 문제들을 해결하기 위한 기본적인 idea가 있다. 그것은 바로
Momentum의 개념이다. -
Momentum이란 시간이 지남에 따라 속도를 유지하고 기울기 추정치를 속도에 추가한다는 것이다. 기울기 방향이 아닌 속도 방향으로gradient update가 일어난다. -
마찰 상수인
rho도 존재. 마찰에 의해 속도를 감소시킨다음 gradient에 추가한다.
vx = 0
while True:
dx = compute_gradient(x) # gradient 계산
vx = rho * vx + dx # 마찰 상수로 속도 감소 그것을 gradient에 추가
x += learning_rate * vx # 내려가기
(그래프)
-
이는 위 문제들을 다 해결하게 된다. 앞선 그래프에서
Local minima이든Saddle point가 속도가 빨라지는 것과 같은 물리적인 해석을 할 수 있게 된다. -
이제 속도가 있으면 기울기가 없더라도 해당 점은 여전히 속도를 가진다. 이러면 극복할 수 있게 된다.
-
따라서 위 그림처럼
지그재그들이서로 상쇄되고민감한 방향 (수직 방향)으로걷는 양을 효과적으로 줄이고 덜 민감한 차원을 가로지르는 하강을 가속할 것이다. -
그래서 시간이 지남에 따라 속도가 증가가 되고 노이즈가 기울기 추정에서 평균화가 된다.
- 그래서
SGD와는 다르게 부드러운 경로를 취하게 된다.
(Momentum 그래프)
18. 위 그림은 Momentum의 종류를 나타낸 것이다.
-
기존
momentum은현재 지점(빨간색)에서 기울기를 추정한 후 속도 벡터와 섞어서 사용하는 반면Nesterov momentum은 기존 속도방향으로 나아간 후 그 시점에서 기울기를 추정한다. 그 후 원래 지점으로 돌아가서 이 두개를 섞는 방법이다. -
Nesterov momentum은 기존보다 정보를 더 혼합하는 것으로 생각할 수 있게 된다. 이는Convex optimization에서는 잘 작동하지만,Neural Network와 같은non-convex의 문제에서는 보장된 방식은 아니다.
(Nesterov momentum 식 사진 )
-
우리는 항상 동일한 지점에서 loss를 평가하고 싶다. 하지만
Nesterov momentum은 그것이 아니기 때문에 따라서 이 식을 조금 더 변형하면아래의 식과같이항상 동일한 지점에서손실과 기울기를 평가할 수 있게 된다. -
하단의 박스를 보면 현재 시점에서 $v_{t+1}$를 더하고 현재의 $v_{t+1}$와 이전 속도 $v_{t}$의 차이를 더해주면 항상 동일한 지점 $\tilde{x_t}$ 에서 평가하게 된다.
-
Sharp minima는 과적합일 수 있게 된다.
Dataset을 2배로 늘리게 되면 전체 최적화 환경이 바뀔 것이고 이sharp minima가 사라질 수 있게 된다.- 매우 평평한 최솟값이 아마 더 robust하기 때문에 이런 곳에 도달하고 싶다는 직관을 얻게 된다.
AdaGrad
grad_squared = 0
while True:
dx = compute_gradient(x)
grad_squared += dx * dx # 제곱 항
x -= learning_rate * dx / (np.sqrt(grad_squared) + 1e-7)
- 속도 항 대신에 gradient 제곱 항이 있다.
- 이 제곱 기울기 추정치를 계속 업데이트 하기 때문에 단계가 실제로 점점 작아질 것이다.
-
Small gradient인 경우에는grad_squared가 작은 값으로 나눠주니 속도가 더 잘붙습니다. -
Large gradient인 경우에는 큰 수로 나누어서wiggling dimension은 slowdown해서 천천히 내려오게 된다. -
Non-convex보다convex상황에서adagrad가 더욱 효과가 좋다.
RMSProp
grad_squared = 0
while True:
dx = compute_gradient(x)
grad_squared += decay_rate * grad_squared + (1 - decay_rate) * dx *dx
x -= learning_rate * dx / (np.sqrt(grad_squared) + 1e-7)
- 제곱 추정치가 계속 증가하는 것이 아니라 실제로 감소하도록 한다.
- 이는 실제 gradient에 대한 momentum이 아니라 제곱 gradient에 대한 momentum이 있다.
Adam
- 가속도를 이용한
momentum과squared gradient를 사용하는 아이디어 2가지를 봤다.Adam은 이 두가지 방법을 모두 섞은 방법이다.
first_momentum, second_momentum = 0, 0
dx = compute_gradient(x)
first_moment = beta1 * first_moment + (1- beta1) * dx
second_moment = beta2 * second_moment + (1-beta2) * dx * dx
x -= learning_rate * first_moment / (np.sqrt(second_moment) + 1e-7)
-
속도를 나타내는
first_moment를 제곱 추정치를 나타내는second_moment의 제곱근으로 나눈다. -
이도 문제가 있다.
첫 번째 단계에서어떤 일이 일어나는가 이다. 첫번째 단계에서second_moment가거의 0에 가깝다. (beta2 -> 0.9 | 0.99) 따라서 아주 작은 수로 나누게 되니까 초반에large step이가능하다. 따라서 매우 크게 이동하여 이상한 공간에서 update를 하게 될 가능성이 있다.
first_momentum, second_momentum = 0, 0
dx = compute_gradient(x)
first_moment = beta1 * first_moment + (1- beta1) * dx
second_moment = beta2 * second_moment + (1-beta2) * dx * dx
## Bias correction
first_unbias = first_moment / (1 - beta**t)
second_unbias = second_moment / (1 - beta2 ** t)
x -= learning_rate * first_moment / (np.sqrt(second_moment) + 1e-7)
- 따라서 위의 문제를 해결하기 위하여 unbias항을 추가하였다.
Adam이 가장 많이 쓰이는 알고리즘이다.
Learning rate
-
위의 경사하강법 알고리즘은
learning rate를 하이퍼 파라미터로 갖는다. -
최선의 방법은 초기의 큰 학습률을 사용해 빠르게 최소 loss로 수렴하도록 하고, 뒤로 갈수록 학습률을 낮춘다.
First & Second Order Optimization
(First, second 사진)
- 이제 이 위에까지는
1차 미분 방식을사용한1차 최적화 알고리즘이다.
-
1차 미분 방식$y = f(x)$에서 $y=0$인 지점을 찾기 위하여 $x_{n+1} = x_n - f(x_n)/f^\prime(x_n)$ 의 수열은 y=0인 특정 $x_{n}$에 수렴하게 되는 것이다.
Gradient들을 통하여선형 근사치를계산
- 1차, 2차 도함수 정보 모두 사용하는
2차 최적화 알고리즘이있다.
-
2차 근사:
위 그림처럼 정지점에서 기존함수에 근사하는 2차함수를 찾는 것을 말한다.- 1차 근사 방법보다 더 빨리 최적점에 도달할 수 있게 된다.
- 하지만 O(N^2)의 시간이 걸려서
L-BFGS방법이 나온다.
- 2차 근사 방법은 확률적인 정보를 훌륭하게 처리하지 않고
non-convex에 잘 작용이 되지 않는다.
Ensemble
-
지금까지
훈련 오류를줄이는 방법이지만 실제로 우리는 test의 결과에 더욱 더 관심이 있다. -
Train error와 ``test error를줄이는 것에 관심이 있다. 그것의 방법에 대해서 좀 더 소개할 것이다. -
그 방법으로
model ensemble이 있다. 여러 모델을 따로 학습을 시켜 그 평균 값을 사용하는 것이다. 이는 과적합이 조금 줄어들고 몇퍼센트 정도 성능이 약간 향상되는 경향을 보인다.
- 때로는 하나의 모델로 check point를 둬서 이를 평균내는 방식이 있다.
Regularization
Ensemble도unseen data에 대해 성능을 향상시키려는 방법 중 하나이지만Regularization의 방법은 모델이 overfitting하는 것을 방지하기 위해 무언가(정규항 등)을 추가하여 모델을 규제하는 것이다.
Dropout
(dropout 그림)
Dropout을 통해 순방향 전달이 이루어지면 모든 계층에서 일부 뉴런을 0으로 설정하게 된다. 하나의 레이어에 한 번만 실행이 된다.
Activation을 0으로 만든다.FC층에서도하지만Convolutional층에서도이루어진다.- Feature map 중 무작위 삭제 할 수도 있다.
-
일부 뉴런을 0으로 만드는
dropout이 좋은 이유가 무엇일까? 에 대한 답변으로는 능력을 저해시키는 것이 아니라 복잡한 feature를 지닌 수를 줄여co-adaptation의 특징을 막는다는 것이다. -
Dropout을 model 내에서의 앙상블이라고 표현한다고합니다. -
Test에서는 output을 random하게 내놓는 다고 하여기존의 항에$z$라는random mask를 추가하였다. 하지만test할 때 random한 결과를 내놓으면 안되므로 다른 방법을 생각한다.
(y=fw(x,z) 이거 나온 그림)
- 바로 이러한
random성을average out하려는 시도이다.위 그림처럼 적분을 통해서 누적 확률값을 이용하고 싶지만, 적분 적용이 쉽지 않다.01x
(drop out 식)
49. 따라서 single neuron이 있을 때 네트워크를 train과정에서 분할해서 생각하면 위 그림처럼 4개의 dropout mask가 나오게 된다. 그것을 간략하게 한 것이 위의 저 식이다.
- 이는
적분을 local cheap 방식으로근사시킨 것이다.
- 따라서
test를할 때 확률(p)를 곱해주면 (output at test time = expected output at training time) 이 된다.
H1 = np.maximum(0, np.dot(W1, X) + b1) * p
H2 = np.maximum(0, np.dot(W2, H1) + b2) * p
- 하지만
test time에는computational적인 부분도 고려를 해야하므로 p를 곱하는 것도 안하고 싶을 수 있다. 그럴 땐 train에 약간의 trick을 사용하여 해결한다.# 기존 U1 = np.random.rand(*H1.shape) < p # Inverted Dropout U2 = np.random.rand(*H2.shape) < p / p
(dropout 식 사진)
52. Dropout은 z를 추가하여 train에 너무 fit하지 않게 네트워크에 random성을 추가하는 것이다. 그리고 이런 randomness들의 average out하여 test에도 적용을 하게 되는 것이다.
- 이는 지난 강에서 배운
Batch Normalization과 비슷하다.Batch normalization도일반화를위해 학습 중에 1개의 data point가 각각 다른 여러 minibatch에서 다른 data들과 배치를 이루게 된다.Test시에는이 미니배치의 확률들(랜덤성)을 global 추정값들을 써서average out.
Data Augmentation
- 다음으로
Data Augmentation방법에 대해 설명이 나온다.Data Augmentation에는 여러 다른 방법들이 있으므로 적절히 찾아서 사용하면 된다.
Label은 보존한 채로 이미지를 변형시켜서 학습을 시키는 방법이다.
Transfer Learning
- 우리가 보통 크고 강력한 모델을 사용하고 싶지만
data의 수가 작을 경우, 작은 데이터에overfitting이 된다.
(1,2,3 나오는 이미지)
55. 이를 해결하려고 Transfer Learning이 나오게 되었다.
-
위 그림을 보면1에서 훈련시킨 모델을 현재의 작은 데이터셋에 적용시키는 것이다. -
따라서 기존 1000개의 카테고리를 C개의 카테고리로 줄인다고 생각을 하면 가장 마지막
FC layer만 가중치 초기화를시키고 다른 layer들은freeze를시킨다. -
3은 data의 양에 따라서 train을 다시 시킬 layer를 조정해주는fine tuning을 생각해볼 수 있다.
- 이때 learning rate를 조금 더 줄이면 효율적이다.
(표 4개)
위 표를 보면Transfer Learning에4가지의 경우가나오게 된다.