목차
1. Stochastic Gradient Descent
1.1 SGD의 문제점
2. SGD + Momentum
3. Nesterov Momentum
4. AdaGrad
5. RMSProp
6. Adam
7. Learning rate
8. Second-order Optimization
9. Regularization
9.1 Model Ensembles
9.2 Dropout
9.3 Data Augmentation
9.4 Others
10. Tranfer Learning
1. Stochastic Gradient Descent
SGD는 데이터를 미니 배치로 나눈 후, 데이터 전체를 한꺼번에 사용하여 모델의 가중치를 업데이트 하는것이 아닌 미니 배치마다 가중치를 업데이트하여 속도면에서 개선시킨 최적화(Optimization) 방법이다.
하지만 SGD에는 여러 문제점들이 있다.
1.1 SGD의 문제점
만약 위와같이 Loss function이 한 방향으로의 변화가 크고 다른 방향으로의 변화가 작다면 SGD는 어떻게 학습을 할까?
바로 위와 같이 지그재그 형태로 학습을 하게 된다. 그 이유로는 간격이 짧은 수직 방향이 가중치 변화에 훨씬 민감하고 간격이 넓은 수평 방향이 가중치 변화에 둔감하여 상대적으로 Loss에 영향을 덜 주는 수평방향의 가중치는 업데이트가 느리게 된다. 이러한 상황을 'High condition number을 가진다.' 라고 하는데 여기서 conditiion number은 Hessian matrix의 최대값/최소값의 비 이다. Hessian matrix는 이계도함수 행렬이다.
이러한 현상은 고차원에서 더 빈번하게 발생하게 되고 학습 속도를 느리게 하는 원인이 된다.
두 번째 문제는 Local Minima문제와 Saddle point문제이다.
Local Minima는 특정 점 기준으로 양쪽 다 양의 기울기를 가지고 Saddle point는 특정 점 기준으로 한쪽은 양, 다른 한쪽은 음의 기울기를 가지는 점이다. 위에 해당하는 점은 실제 최소값이 아님을 한 눈에 알 수 있다. 하지만 SGD같은 경우는 Gradient가 0이 되어버리면 step_size에 0이 곱해지게 되면서 학습을 멈추게 된다. 따라서 더 좋은 최솟값을 찾기 전에 학습을 멈추는 것이다.
이러한 문제는 차원이 커질수록 심각해지는데, 가령 1억 개의 파라미터를 가지는 모델이 있다고 가정하면 Loss function의 거의 모든 지점이 Saddle point(한 쪽은 증가하고 한 쪽은 감소) 하는 형태를 가지게 되므로 SGD는 최적화를 거의 하지 못하게 된다. 또한, Saddle point 주변의 Gradient값은 작기 때문에 학습 속도도 느리다는 문제점이 있다.
세 번째 문제점은 노이즈(noise)이다.
우리는 전체 데이터를 사용하여 업데이트 하는 것이 아니기 때문에 Gradient의 실제 값이 아닌 추정값을 구하여 가중치 W를 업데이트 하게 된다. 따라서 최소점을 향해 일직선으로 가는 것이 아닌 구불구불하게 가기 때문에 시간이 오래 걸린다.
다음으로는 SGD의 문제점을 보완하는 여러가지 최적화 방법을 알아보자.
2. SGD + Momentum
먼저 알아볼 방식은 SGD + Momentum이다.
이는 이전 상태의 Velocity(속도)를 식에 포함하여 학습에 관성을 주는 방식이다.
즉, 방향만 고려하는 것이 아닌 속도를 같이 고려하는 방식이다.
우측 식에서 rho라는 하이퍼파라미터가 있는데 이는 momentum의 비율을 설정하는 파라미터이고 일반적으로 (0.9 or 0.99)로 설정한다.
이전 step의 속도를 고려해주게 되므로 위와 같은 local minima나 saddle point를 만나더라도 관성을 이용해 더욱 최저점을 탐색할 수 있게 된다. 또한 condition number가 높다고 하더라도 지그재그로 학습하는 것이 아닌 최소값을 향해 빠르게 다가감으로써 학습 속도를 단축시킬 수 있다.
3. Nesterov Momentum
좌측은 SGD + Momentum의 그림이고 우측은 Nesterov Momentum의 그림이다.
SGD + Momentum 같은 경우는 먼저 현재 지점에서의 Gradient를 계산한 후 Velocity를 섞어준다면
Nesterov Momentum 같은 경우는 우선 Velocity 방향으로 움직인 후, 그 지점에서의 Gradient를 구한다. 그 후, 원점으로 돌아가서 둘을 합치게 된다.
수식을 살펴보자.
위의 수식을 살펴보게 되면 기존의 SGD + Momentum에서는 $x_t$ 에서의 Gradient를 구하는 거였지만 이제는
속력을 포함한 값의 gradient 구해야 함을 알 수 있다. 이러한 연산은 굉장히 복잡하기 때문에 우리는 변형공식을 주로 사용하게 된다.
위의 변형공식을 사용하게 되면 이전 step의 x로 Gradient를 구한 후 식을 업데이트 할 수 있다.
SGD + Momentum은 위와 같이 오버슈팅이 일어날 수 있다. 즉, 최적값을 찾아갈 때 쓸데없이 크게 반대방향으로 넘어가는 일이 발생하여 원하는 값을 찾지 못할 수 있다. 하지만 Nesterov Momentum 같은 경우에는 먼저 Velocity방향으로 이동 후에 그 지점에서의 Gradient를 구하기 때문에 반대방향으로 크게 넘어가는 것을 방지하는 역할을 하게 된다.
Nesterov momentum은 Convex(볼록한) optimization에서는 성능이 아주 좋지만 Neural Network 같은 non-convex problem에서는 성능이 보장되지 않는다.
4. AdaGrad
AdaGrad 같은 경우에는 Gradient 제곱을 누적한 값을 분모로 하여 learning_rate에 곱해준다.
따라서 Gradient가 크면 step이 작게, 작으면 step을 상대적으로 크게 하여 모델이 수렴하는 방향을 조정해준다.
그래서 condition number가 큰 경우에도 학습 방향을 잘 잡을 수 있게된다.
하지만 step이 늘어남에 따라 learning_rate가 점차 작아지게 되므로 convex한 loss function에서는 성능이 좋지만, Non Convex한 경우 최적값을 찾기 전에 학습이 수렴할수도 있다는 단점이 있다.
이러한 단점을 해결하기 위해 나온 방식이 RMSProp이다.
5. RMSProp
RMSProp는 step이 커지게 되면 step이 작아지는 AdaGrad의 단점을 보완하기 위해 decay_rate라는 요소를 추가해준다.
이 decay_rate(보통 0.9 or 0.99 사용)는 gradient의 누적합이 너무 커지는것을 방지하여 모델이 최적값을 찾기전에 수렴하는 현상을 방지한다.
보통 AdaGrad는 잘 쓰이지 않고 RMSProp를 쓰게 된다.
정리하자면 Momentum 계열은 이전 상태의 속도값을 넘겨주면서 모델에 관성을 부여한다면 RMSProp는 모델이 최적화 되는 방향을 잡아주는 것이다.
그럼 두 방식을 합치면 성능이 더 좋지 않을까?
6. Adam
Adam은 두 방식을 합친 최적화 모델이다.
Adam을 이해하기 위해 먼저 아래와 같은 코드를 보자.
위 식에서 first_moment는 Momentum의 방식이고 second_moment는 AdaGrad/RMSProp의 방식을 따온것을 알 수있다.
이렇게 보면 최종식은 두 가지 방식을 합친걸로 볼 수 있다.
하지만 한 가지 문제점이 있는데, 초기에 second_moment의 값이 0으로 초기화 되고 처음 step에서 beta2가 0.9와 같이 굉장히 큰 수 이므로 second_moment값이 초기에는 엄청 작은수가 된다.
따라서 마지막 식에서 엄청 작은 수를 나누어 주므로 learning_rate, 즉 step의 크기가 굉장히 커질 수 있다.이런경우, 운이 나쁘다면 모델이 수렴하지 않고 발산할 수 있다.
따라서 이러한 문제점을 해결하기 위해 bias correction을 사용한다.
위와 같은 bias correction 과정을 거치면 초기에는 (t가 작은수일 때) first_moment나 second_moment가 커지는 효과를 얻고 step이 지날수록 bias correction의 영향은 적어지게 되므로 위의 문제를 해결할 수 있게 된다.
Adam은 거의 모든 상황에서 좋은 성능을 내는 최적화 알고리즘이다.
본 강의에서는 그림의 우측 하단의 하이퍼파라미터를 기본적인 스타팅 파리미터로 추천하고 있다.
7. Learning rate
앞서 살펴본 여러가지 최적화 방식에는 모두 learning rate라는 하이퍼파라미터가 포함되어 있다.
그만큼 모델을 조정할 때 핵심이 되는 파라미터라고 볼 수 있다.
이제부터는 Learning rate를 설정하는 방식에 대해 알아보려고 한다.
첫 번째 방식으로는 점진적으로 learning rate를 줄이는 방식이 있다.
고정적인 learning rate를 쓰기 보다는 step이 지날수록 learning rate를 줄이거나 특정 iteration에서 줄이는 등의 방식을 통해 Bounding되는 구간을 줄여 보다 최적화된 w를 얻는데에 목적이 있다.
위의 그림은 resnet논문의 loss graph인데 gradient가 0에 수렴하는 지점에서 learning_rate를 낮춰 loss를 더욱 낮춘 케이스 이다.
8. Second-order Optimization
지금까지 살펴본 Optimization 알고리즘들은 1차 미분을 사용한 방식이었다.
하지만 2차 근사의 정보를 추가적으로 이용하면 loss의 minima에 더 빠르게 접근할 수 있다.
손실함수의 2차 미분값들로 이루어진 Hessian matrix를 계산하고, 역행렬을 이용하여 구한다.
매 step마다 항상 minima를 향해 이동하기 때문에 learning rate가 필요 없다.
하지만 이 방식도 완벽하지 않고 minima의 방향으로 이동하기 때문에 실제로는 learnging rate가 필요하다.
이 방식은 Deep Learning에서는 사용할 수가 없는데 이뉴는
Hessian matrix는 $N\times N$ 행렬이다.(N은 파라미터 수)
파라미터가 많아지면 연산이 많아져 메모리에 저장하지 못하고 역행렬 계산도 불가능하다.
그래서 실제로는 Full Hessian을 그대로 사용하지 않고 근사시키는 Qusai Newton Method와 L-BGFS를 사용하지만, 이들도 Stochastic case, Non-convex Problem에는 적합하지 않아 Deep Learning에서는 잘 사용하지 않는다고 한다.
9. Regularization
Optimization 알고리즘은 Training Error를 줄이고 손실 함수를 최소화 시키기 위한 역할을 수행하는데,
하지만 우리는 Training Error보다는 한 번도 보지 못한 데이터에 대한 성능이 더 중요하다.
9.1 Model Ensenbles
그래서 모델이 Training Dataset에 너무 Overfitting하지 않도록 해야 하는데, 이를 위한 방법 중 가장 빠르고 쉬운 방법은 앙상블이다.
앙상블은 모델 하나만 학습 시키는 것이 아닌 여러 개의 모델을 독립적으로 학습시켜 모델들 결과의 평균을 이용하는 것이다.
모델이 늘어날수록 Overfitting이 줄어들고 성능이 보통 2%정도 증가한다.
대회에서 성능을 최대화 시키기 위해서 자주 사용하기도 한다.
앙상블 기법으로는 여러 모델을 독립시키는 것이 아닌 학습 도중 중간 모델들을 저장(Snapshot)하고
Test 시에 여러 Snapshot에서 나온 예측 값들을 평균을 내 사용하는 방법도 있다.
또한, Learning Rate를 엄청 낮췄다 다시 엄청 높혔다를 반복해 손실함수의 다양한 Local Minima에 수렴할 수 있도록 만들어주는 방법도 존재한다.
하지만 Test 시에는 여러 개의 모델을 돌려야 할 수도 있다는 점 때문에 우리는 단일 모델의 성능을 향상시키기위 위해 Regularization을 사용한다.
이전 강의에서 배운 L1, L2 Regularization은 기존의 Loss Function에 Regularization Term을 추가해 기존의 항은 Loss를 줄이려 하고 추가된 항은 가중치를 너무 크게 만들지 않도록 한다.
9.2 Dropout
Dropout은 Deep Learning에서 가장 많이 사용하는 Regularization 방법 중 하나이다.
Dropout은 Forward Pass 과정에서 임의로 일부 뉴런의 출력(Activation)을 0으로 만든다.
0이 되는 뉴런은 Layer를 진행할 때마다 계속 바뀐다.
Dropout은 보통 Fully Connection Layer에서 흔히 사용하지만 Convolutionial Layer의
Feature Map에서 Dropout을 시행하거나 일부 채널 자체를 Dropout 시키는 방법으로도 사용한다.
Dropout은 특징들 간의 상호 적응을 방지한다.
예를 들어 고양이를 분류하는 네트워크가 있다고 가정해보면 어떤 뉴런은 귀, 어떤 뉴런은 꼬리, 어떤 뉴런은 털에 대해 학습을 진행한다고 생각할 수 있는데 Dropout을 하면 특정 Feature에만 의존하지 않고 다양한 Feature를 골고루 이용할 수 있도록 해 Overfitting을 어느 정도 막아준다.
또한, Dropout을 하면 뉴런의 일부만 사용한 서브 네트워크를 여러 학습시키는 것과 같기 때문에 단일 모델로 앙상블의 효과를 가질 수 있다.
Dropout을 사용하면 z라는 입력이 추가되는데, z는 random을 의미한다.
하지만 Test 시 임의의 값을 부여하는 것은 좋지 않다.
그래서 임의성을 평균화 시키는 방법이 있는데, 이는 적분을 통해 임의성을 Marginalize Out 시키는 것이지만 실제로 이 적분을 다루기는 상당히 까다롭다.
다른 방법으로는 샘플링을 통해 적분을 근사시키는 방법이 있다.
z를 여러 번 샘플링해서 Test에 이를 평균화 시키는 방법이다.
하지만 이 방법도 Test에서의 임의성을 만들어 내기 때문에 좋은 방법은 아니다.
쉽고 효과적인 방법이 있다.
입력이 x, y이고 가중치가 $w_1$, $w_2$, 출력이 a인 뉴런 하나가 있을 때
Dropout(p = 0.5)을 이용해 학습시키면 Test에서의 기대값과 Train에서의 기대값이 다르다.
그래서 Test 시에 Dropout Probability인 0.5를 네트워크의 출력에 곱하여 기대값을 똑같이 만들어 준다.
하지만 Test 시 곱하기 연산이 추가되면 계산 시간이 증가하므로 Train을 할 때 출력에 p를 나눠주는 Inverted Dropout을 사용할 수 있다.
앞선 강의에서 배운 Batch Normalization과 Dropout 모두 Train 시에는 확률적으로 임의성을 부여하고 Test 시에는 랜덤성을 평균화 시켜 일반화 효과를 준다.
Batch Normalization에도 Regularization 효과가 있기 때문에 BN을 사용할 때는 Dropout을 잘 사용하지 않지만
Dropout에는 자유롭게 조절할 수 있는 파라미터 p가 있는 것이 장점이다.
9.3 Data Augmentation
Train 시 입력 데이터에 임의의 변환을 시켜주고 학습하게 되면 일종의 Regularization 효과를 얻을 수 있다.
이러한 방법으로 Data Augmentation 방벙이 있고 데이터 증강 기법이라고 한다.
- Horizontal Flip
Label은 그대로 두고 이미지를 좌우로 반전시켜 학습에 사용한다.
- Image Crop
이미지를 임의의 다양한 사이즈로 잘라서 사용한다.
Resnet에서는 1개의 이미지를 10개로 Crop하여 사용
-> (코너 4개 + 중앙) $\times $ (원본 + Flip Image)
- Color Jitter
학습 시 이미지의 밝기, 색상, 채도를 바꾸어 학습에 사용한한다.
PCA를 통해 RGB를 조절하는 방법도 있지만 잘 사용하지 않는다.
9.4 Others
- DropConnect
Activation이 아닌 Weight Matrix를 임의적으로 0을 만든다.
- Fractional Max Pooling
보통 Max Pooling 연산은 고정된 지역에서 수행하는데 Fractional Max Pooling에서는 Pooling 연산을 수행할 지역이 임의로 선정된다.
그리고 Test 시에 Pooling Region을 고정시켜 버리거나 여러 개의 Pooling Region을 만들고 Average Over 시킨다.
- Stochastic Depth
Train 시 Layer 중 일부를 제거해 버리고 일부만 사용해서 학습하고
Test 시 전체 네트워크를 사용한다.
Batch Normalization은 대부분의 네트워크에서 보통 잘 작동하고 아주 깊은 네트워크에서도 잘 수렴하기 때문에 보통 Regularization 방법으로 많이 사용하지만
Overfitting이 발생한다 싶으면 Dropout과 같은 방법을 하나씩 추가할 수 있다.
10. Transfer Learning
또 과적합이 발생할 수 있는 상황은 충분한 데이터가 없을 때이다.
이럴 때 아주 큰 데이터셋으로 학습된 모델을 사용하여 작은 데이터셋에 적용하여 사용할 수 있는 Tranfer Learing을 사용할 수 있다.
위와 같은 CNN 모델을 ImageNet과 같이 아주 큰 데이터셋으로 한 번 학습을 시키고
학습된 Feature를 우리가 가진 작은 데이터셋에 적용한다.
1000개의 카테고리를 분류하는 것이 아닌 C개의 적은 클래스를 분류하는 것이다.
일반적인 절차는 Feature와 Class Score간의 연결인 가장 마지막의 FC Layer를 초기화 시킨다.
이전의 Layer들의 가중치는 Freeze 시키고 마지막 레이머만 가지고 데이터를 학습시키면 된다.
이는 Linear Classifier를 학습시키는 것과 같다.
만약 데이터가 조금 더 있다면 전체 네트워크를 Fine Tunning 할 수도 있다.
Tranfer Learing을 적용하기 위해서는 현재 가지고 있는 데이터의 크기를 알아야 하고
사용하려고 하는 모델에 사용된 데이터셋과 가지고 있는 데이터셋이 얼마나 비슷한지 알아야 한다.
Tranfer Learing을 수행 함에 있어 이러한 시나리오를 예상해 볼 수 있다.
- 기존의 데이터셋과 비슷하지만 데이터가 소량
- 모델의 마지막 Layer만 학습
- 기존의 데이터셋과 비슷하고 데이터가 많음
- Fine Tunning
- 기존의 데이터셋과 매우 다르고 데이터가 소량
- Transfer Learning 적용하기 어려움
- 기존의 데이터셋과 매우 다르지만 데이터가 많음
- 더 많은 Layer를 Fine Tunning
Kovi는 SSDC(Samsung Software Developer Community)를 기반으로 만들어진 커뮤니티입니다. ML, DL, Computer Vision, Robotics에 관심 있고 열정 있는 사람들이 모여 함께 활동 중입니다.
Kovi Instagram : https://www.instagram.com/kovi.or.kr/
Kovi SSDC : https://software.devcommunities.net/community/communityDetail/98
이 포스팅은 Kovi 커뮤니티 스터디의 일환으로 작성되었습니다.
posted by. heeh & Panda99
'CS231n' 카테고리의 다른 글
[CS231n] Lecture 8. Deep Learning Software (0) | 2023.03.13 |
---|---|
[CS231n] Lecture 6. Training Neural Networks 1 (수정 중) (0) | 2023.03.02 |
[CS231n] Lecture 5. CNN: Convolution to Neural Networks (2) | 2023.03.02 |
[CS231n] Lecture 4. Backpropagation and Neural Networks (0) | 2023.02.14 |
[CS231n] Lecture 3. Loss Functions and Optimization (0) | 2023.02.04 |