Search
Duplicate

시각적 이해를 위한 머신러닝/ Training Neural Networks II

이전에 들었던 유사한 부분이 많기 때문에 간략히 정리. 상세 내용은 아래 페이지 참조
train data의 noise까지 fitting 된 것을 overfitting이라고 한다.
모델이 학습이 안된거는 underfitting
과적합 문제를 방지하기 위해 Regularization(규제)을 사용함. 이것은 overfitting을 방지한다.
Regularization은 일종의 페널티를 부여한다.
예컨대 회귀 문제는 θ\theta를 최소화하는 것을 찾게 되는데, 여기에 θ\theta의 합을 더해줘서 (절대값을 더할 수도 있고(이게 L1) 제곱해서 더할 수도 있다(이게 L2)) (추가로 λ\lambda를 곱한) 무작정 θ\theta를 최소화하는 것을 못 찾게 한다.
머신러닝에서는 가중치 WW를 구하게 되는데, 이 WW를 강제로 더해줘서 규제를 사용함
기본적으로 복잡한 선을 그리려면 함수가 복잡해져야 한다.
위 overfitting 이미지에서 가장 오른쪽의 복잡한 선을 그리려면 그 식 안에 속한 θ\theta의 값이 커야 함. 만일 θ\theta가 0에 가까운 작은 값이라면 복잡한 선을 그릴 수 없고, underfitting과 같은 단순한 선이 그려짐.
그래서 단순한 모델을 만드는 것과 weight 값을 작게 만드는 것은 강한 상관관계가 있다.
이래서 머신러닝에서 학습을 반복하면 θ\theta가 점점 커지게 되는데, (식은 최소화된 θ\theta를 잡게 되므로 그 안에서 작은 값을 찾게 되지만) 이거를 방지하기 위해 아예 θ\theta를 더해줘서 균형을 잡는다.
L2 Regularization을 Ridge Regression이라고 한다.
제곱의 합이기 때문에 원형으로 나타나고, λ\lambda가 커질수록 원은 작아지고 작아질수록 원은 커짐.
L1 Regularization을 Lasso Regularization이라고 한다.
아까와 마찬가지로 λ\lambda가 커질수록 마름모는 작아지고 작아질수록 커짐.
L2와 달리 절대값의 합이기 때문에 마름모 모양으로 표현된다.
이 경우 많은 경우 최적값이 꼭지점에 모이게 되는데, 마름모 바깥의 많은 점들의 가장 가까운 거리가 꼭지점에 대응되기 때문. 변에 대응되는 영역은 좁은 영역만 가능하다.
많은 점들이 꼭지점에 모인다는 것은 θ\theta가 0이 된다는 것이 되고, 그것은 위의 복잡한 수식에서 많은 선들이 사라져서 결국 식이 단순해 진다는 것이 된다.
따라서 noise에 robust한 decision boundary를 만들게 된다.
Neural Network는 overfitting이 쉽게 되기 때문에 위와 같은 기법을 사용ㅎㅏ.
선형회귀에서 Regularization을 했던게 Weight Decay이다.
L1, L2 처럼 절대값을 더하거나 제곱을 더하거나 할 수 있음
Multi layer에도 마찬가지로 적용 가능
Early Stopping은 Overfitting이 발생하기 전에 멈추는 것
멈추는 시점은 어떤 기준을 가지냐에 따라 달라질 수 있음
Forward pass에서 일부 노드를 랜덤하게 제거한 후에 학습을 수행하는 것이 Dropout
만일 이미지에서 어떤 두드러진 feature가 있다면 컴퓨터가 해당 feature에만 최적화될 수 있음. 그러면 일반화가 안 되기 때문에, 일부러 해당 feature를 가리고 학습시켜서 다른 feature들을 보고도 인식할 수 있게 함.
dropout은 학습할 때만 적용하고 테스트할 때는 사용하지 않는다.
dropout을 구현한 코드 예시
일부 node를 끄면 학습 scale이 달라지기 때문에 그 scale을 맞추기 위해 가려지는 확률만큼 스케일을 키워서 학습해야 한다.
Stochastic Depth는 dropout이랑 비슷함
랜덤하게 layer를 건너 띄고 학습하는 것
데이터의 자체를 아예 가려서 학습
데이터가 작을 때는 많이 썼는데, 데이터가 클 때는 실용적이지는 않다.
dropout은 써라
batch normalization도 써라
data augmentaion도 해라
early stopping도 적절히 활용해라
Stochastic Gradient Descent도 몇 가지 문제가 있음
한쪽 Gradient가 급격히 변할 때 원하는 방향으로 빠르게 못 가고 지그재그 함
Saddle point를 만나면 미분이 0이 나와서 멈춤
데이터가 아주 크면 mini-batch가 데이터 전체에 대해 대표하기 어려움
경사에 깊은 방향으로 크게 움직여서 지그재그를 만듦
dimension이 높아질수록 saddle point가 빈번하게 발생함
데이터가 아주 크면 batch가 전체를 대표한다고 보기 어려움
batch는 물리적인 메모리 크기 한계로 일정 이상 커지기 어려움
batch가 커지면 성능이 좋아짐 —50%까지는 늘어날수록 성능이 좋아짐. 물론 그 이상 올라가면 성능이 크게 좋아지지 않음
물리학에서 Momentum과는 개념이 좀 다르지만 여튼 SGD에 Momentum을 이용해서 SGD를 개선할 수 있음
물리학에서 inertia(관성)는 어떤 물체가 운동을 유지하려는 성질의 정도이고 momentum은 어떤 물체가 얼마나 빠르게 운동하는지를 정량적으로 나타내는 정도. momentum은 mass와 velocity의 곱으로 표현 됨.
여기서 말하는 말하는 Momemtum은 사실 관성(inertia)에 가까움
전 단계의 velocity에 상수(ρ\rho)를 곱해서 현재 gradient에 더해 줌
이 과정이 일종의 history처럼 작용해서 한 방향으로 이동하고 있었으면 그 방향으로 힘을 더 해줌
이러면 지그재그를 덜하고 더 빠르게 움직일 수 있음
이렇게 하면 saddle point를 통과할 수 있음. 미분은 0이지만 관성이 있었기 때문에 움직일 수 있음
Element-wise로 scaling을 해준다.
Gradient의 제곱해서 grad_squared 값을 구하고 그것을 dx를 나눈 값을 사용함
grad_squared을 누적한다는게 중요한데, 이렇게 하면 나눠주는 값이 점점 커짐.
따라서 gradient가 컸던 곳에서는 값을 나눠주므로 작아지게 하고, gradient가 작았던 곳에서는 값을 키워줘서 적절한 방향으로 움직일 수 있게 해줌
축마다 다르게 계산되어서 경사가 급했던 곳은 빠르게, 완만했던 곳은 천천히 가게 해준다.
그런데 AdaGrad는 과거를 양수(제곱했으므로)로 누적하기 때문에 분모가 커지기만 함.
이래서 시간이 지날수록 분모가 커져서 업데이트가 점점 느려짐
이것을 보완하기 위해 과거 데이터를 decay 시켜 주는게 Leaky AdaGrad. RMSprop이라고도 한다.
Adam은 RMSProp과 AdaGrad를 합한 것
가장 발전된 방법이기 때문에 일단 시작할 때는 Adam으로 시작함
지금까지 한 것은 1차식으로 최적화 했던 것
최적화를 2차식으로도 할 수 있다.
2차식은 Talyor 전개를 이용함
2차식을 이용하면 계산 횟수를 줄여서 최적점을 찾을 수 있음
하지만 계산상 계산 시간이 O(N2)O(N^{2}) 의 형태라서 오래 걸리기 때문에 빠르다고 하기 어려움
일단 Adam으로 시작해라
그 다음에 SGD+Momentum을 적용해 봐라
Initial Learning rate는 모델과 데이터셋에 맞게 적용해야 함
Learnig rate를 잘못 잡으면 발산할 수도 있음
일단 처음에는 큰 숫자를 쓰고, 시간에 따라 decay를 시키는게 일반적임
Learing rate decay 사례
첫 번째는 warm up을 한 후에 learning rate를 크게 키웠다가 나중에 급격하게 decay 시킴
일반적으로 decay에 사용되는 방식들
실험해 보고 결정하라
맨 처음에는 warm up으로 작게 시작해서 조금씩 키우는 방법을 사용함.
처음부터 크게 하면 너무 뛰어 다닐 수 있으므로 작게 시작해서 조금씩 키워가며 warm up을 시킴
Data Preprocessing에서 zero-centered 와 nomalized를 적용함
문제는 zero-centered는 처음 layer에는 잘 적용되었지만, 뒤의 layer로 넘어갈 수록 zero-centered가 안 될 수 있음
뒤의 layer들도 zero-centered가 되도록 하는게 batch normalization
input에 대해 평균(기댓값)을 빼고 표준편차로 나눈다. -이건 normalization
데이터를 normalizatoin 할 평균(기댓값)과 표준편차는 미니배치에서 계산한다.
무작정 normalization 하면 값이 깨지기 때문에, 그것을 다시 원복할 수 있는 계산을 해줘야 함.
위 식에서 x^\hat{x}는 normalization한 것이고
이것을 다시 원복 시키기 위해 γ\gammaβ\beta를 구해줘야 하는데 —이때 γ\gamma는 표준편차의 역할을 해줘야하고 β\beta는 평균(기댓값) 역할을 해줘야 함— γ,β\gamma, \beta는 따로 구하지 않고 학습을 통해 배우도록 함.
그러면 적당히 비슷한 값이 나오게 된다.
고로 batch normalization 할 때는 앞에 normalization 하는 것과 함께 뒤에 원복하는 것도 넣어줘야 한다.
테스트할 때는 평균과 표준편차를 구할 수 없기 때문에 학습할 때 값을 저장해 두었다가 사용해야 함.
Batch Normalization은 계산량은 복잡하지 않은데, 그 효과는 크기 때문에 표준처럼 사용 된다.
그런데 Batch normalization은 평균과 표준편차가 유사하다는 가정하에 돌아가는 방법인데, 모델을 학습 시키고 시간이 많이 지나면, 현시점의 테스트 데이터가 학습 시점의 데이터와 평균, 표준편차가 같다는 보장을 할 수가 없음
이를 보완하는게 Batch Renormalization
Batch Normalization 사용 예
레이어를 추가해 주면 나머지는 프레임워크가 알아서 해준다.
내부 모습은 오른쪽 플로우와 같음. 활성화 함수 전에 Batch Normalization Layer가 추가 됨
Batch Normalization을 응용하여 다양한 방식으로 Normalization 하는 방법들이 발표 됨
학습할 때, 데이터 특성이나 기타 상황을 고려하여 적절한 방법을 사용하면 된다.