일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- Regularization
- Transformer
- Multi-Head Attention
- do it! 알고리즘 코딩테스트: c++편
- dropout
- marchine learning
- CPP
- Optimization
- computer vision
- CNN
- 딥러닝
- assignment2
- SQLD
- BFS
- Generative Models
- Machine Learning
- DFS
- 밑바닥부터 시작하는 딥러닝
- Python
- C++
- 밑바닥부터 시작하는 딥러닝2
- assignment1
- deep learning
- mask r-cnn
- cs231n
- Baekjoon
- RNN
- Adam
- Algorithm
- Alexnet
- Today
- Total
newhaneul
[Stanford Univ: CS231n] Lecture 7. Training Neural Networks Part 2 본문
[Stanford Univ: CS231n] Lecture 7. Training Neural Networks Part 2
뉴하늘 2025. 4. 23. 18:02본 포스팅은 Stanford University School of Engineering의 CS231n: Convolutional Neural Networks for Visual Recognition을 수강하고 공부한 내용을 정리하기 위한 포스팅입니다.
https://youtu.be/_JB0AO7QxSA?si=pcEV42NFuWF9os6U
https://github.com/cs231n/cs231n.github.io
GitHub - cs231n/cs231n.github.io: Public facing notes page
Public facing notes page. Contribute to cs231n/cs231n.github.io development by creating an account on GitHub.
github.com
1. Optimization
딥러닝에서 모델을 학습할 때 손실 함수의 값을 최소화하기 위해 사용하는 방법이 Optimization Algorithm(최적화 알고리즘)이다.
대표적으로 SGD, Momentum, RMSProp, Adam이 있으며, 각각의 구조와 목적이 다르다.
Stochastic Gradient Descent(SGD)
전체 데이터가 아니라 mini-batch 단위로 손실 함수의 gradient를 계산하고 가중치를 업데이트하는 방법이다.
SGD는 gradient가 0인 local minima와 saddle point에서 멈추는 문제가 있다. 고차원이 될수록 Saddle point가 많아지기 때문에 이 심각한 문제이다. 또한 SGD는 gradient의 방향이 고르지 못한 함수의 경우 수직 차원을 가로지르면서 진동하며 움직이게 된다. 이러한 경우 Loss에 영향을 덜 주는 수평방향 차원의 가중치는 업데이트가 아주 느리게 진행되면서 학습 속도가 비효율적이게 된다.
Momentum
Momentum은 SGD의 한계인 진동을 줄이기 위해 이전 gradient의 방향성을 고려한다. 이를 통해서 loss에 만감한 수직 방향의 변동은 줄여주고 수평방향의 움직임은 점차 가속화된다. 또한 local minima와 Saddle point에 도달해도 여전히 velocity를 가지고 있기 때문에 현재 gradient = 0 이라도 움직일 수 있다.
Nesterov Momentum
Nesterov Momentum은 기존 Momemtum 기법을 개선한 형태로, "이동한 후의 위치에서 gradient를 먼저 미리 계산한다."는 아이디어를 사용한다. 일반 Momentum은 이전 속도대로 이동하고 나서 gradient를 보는데 Nesterov는 속도 방향으로 한 번 미리 가서, 그 앞에서 gradient를 보는 것이다. 따라서 gradient 계산이 더 정확하게 방향을 예측할 수 있다.
AdaGrad
AdaGrad는 학습률을 각 파라미터마다 다르게 조정하여, 자주 업데이트되는 가중치는 학습률을 줄이고, 적게 업데이트되는 가중치는 학습률을 늘리는 방식이다.
하지만 AdaGrad는 step을 진행할수록 값이 점점 작아지는 문제가 있다. update 동안 gradient의 제곱이 계속해서 더해지기 때문에 이 값(estimate)은 서서히(monotonically) 증가하게 된다. 이는 Step size를 점점 더 작은 값이 되게 하고 손실함수가 convec한 경우에는 좋은 특징이 될 수 있지만 non-convex한 경우에는 saddle point에 걸려버렸을 때 AdaGrad는 멈춰버릴 수도 있게 된다.
SGD는 saddle point에서 천천히라도 벗어나며 움직이지만, AdaGrad는 이미 누적된 grad_squared 때문에 step size가 너무 작아져서 사실상 정지된 것처럼 느려지는 것이다.
RMSProp
RMSProp(Root Mean Square Propagation)은 AdaGrad의 한계를 보완한 최적화 알고리즘으로, 각 파라미터마다 학습률을 적응적으로 조절하지만, 최근 gradient만을 반영하여 학습률이 너무 빨리 작아지는 현상을 막아주는 기법이다.
Adam
Adam (Adaptive Moment Estimation)은 딥러닝에서 가장 널리 쓰이는 최적화 알고리즘 중 하나로, Momentum + RMSProp의 장점을 결합한 방식이다. 각 파라미터에 대해 학습률을 자동으로 조정하면서, 동시에 gradient의 방향성과 크기 정보까지 반영하여 빠르고 안정적인 수렴을 가능하게 한다.
Adam의 초기 step에서 second moment를 0으로 초기화한다. 그렇다면 second moment를 1회 update하고 난 후에 대해 생각해볼 수 있는데, beta2는 decay_rate로 0.9 or 0.99이기 때문에 여전히 1회 updata 이후에도 second moment는 0에 가깝게 된다. 이렇게되면 update step에서 second moment로 나누게 되는데 나눠주는 값이 아주 작기 때문에 초기 step이 엄청나게 커지게 된다. 이러한 문제는 second moment을 0으로 초기화 시켰기 때문에 발생하는 인공적인 문제이므로 추가적인 제한이 필요하다.
Adam을 이를 해결하기 위해 보정하는 항인 bias correction term을 추가한다. first/second moments를 Update하고 난 후 현재 Step에 맞는 적절한 unbiased term 을 계산해준다.
deep learning 학습 과정에서 시간이 지남에 따라 learning rate를 점차 줄여가는 전략을 Learning Rate Decay라 한다. 초기에는 빠르게 수렴하도록 큰 learning rate를 사용하고, 후반에는 세밀하게 최적점에 수렴하도록 작은 learning rate를 사용한다.
learning rate를 낮추는 시점은 수렴을 잘 하고 있는 상황에서 gradient가 점점 작아지고 있을 때이다. 이 상황은 learning rate가 너무 높아서 더 깊게 들어가지 못하는 것이기 때문에 learning rate를 낮춰주게 되면 속도를 줄일 수 있게 된다. 따라서 지속해서 Loss를 감소시킬 수 있게 된다.
First vs. Second-order Optimization
First-Order Optimization은 손실 함수의 1차 미분만을 이용하여 최적화하는 방식이다. 일반적으로 사용되는 SGD, Momentum, Adam, RMSProp 등이 1차 최적화에 해당한다.
Second-Order Optimization은 손실 함수의 2차 미분(Hessian Matrix, Hessian) 정보를 이용하여 최적화하는 방식이다. 2차 미분을 활용하면 최적의 방향을 더 정확하게 찾을 수 있지만, Hessian 행렬을 계산하고 이 역행렬을 구하는 비용이 너무 크기 때문에 deep learning처럼 매개변수가 많은 모델에서는 사용하지 않는다.
L-BFGS는 Hessian 전체를 직접 계산하지 않고 근사하는 방식을 사용한다. 고차원 convex 문제에서 빠르고 안정적인 수렴을 제공하지만, 딥러닝처럼 데이터가 크고 mini-batch 학습이 필요한 상황에는 부적합하다. 그럼에도 불구하고 작은 모델이나 특수한 상황에서는 매우 강력한 최적화 도구로 쓰인다.
Model Ensemble
Model Ensemble은 여러 개의 model을 결합하여, 개별 model보다 더 나은 성능과 일반화 능력을 얻는 기법이다. 이는 여러 모델의 예측을 조합함으로써, 각 모델이 가진 편향이나 분산을 상쇄하고 보다 정확하고 안정적인 예측을 만들기 위한 전략이 된다. 일반적으로 2% 정도의 성능이 향상되고, Image 대회에서 약간의 성능을 올려야 할 때 필수적으로 사용된다.
2. Regularization
Penalty Term
L2 regression과 L1 regularization으로 Loss 자체에 Regularization을 하는 방법이 있다. 하지만 Neural Networks에는 잘 어울리지 않는 방법이다.
Dropout
Dropout은 훈련 과정에서 뉴런을 임의로 제거함으로써, 특정 뉴런이나 경로에 과하게 의존하는 현상을 방지하고, 결과적으로 모델이 더 견고하고 다양한 feature에 의존하게 만든다.
Dropout은 fc layer에서 흔히 사용하지만 conv layers에서도 종종 볼 수 있다. Conv net의 경우에서는 전체 feature map에서
dropout을 시행한다. 또한 여러 channels이 있기 때문에 일부 channel 자체를 dropout 시킬 수도 있다.
Dropout은 특징들 간의 상호작용(co-adaptation)을 방지한다고 볼 수 있다. 예를 들어 고양이를 분류하는 어떤 네트워크가 있다고 가정하면 어떤 뉴런은 눈에대해, 어떤 뉴런은 꼬리에대해, 또 어떤 뉴런은 고양이의 털에 대해 학습하는 것을 상상해 볼 수 있다. 이때 Dropout을 적용하게 되면 네트워크가 어떤 일부 features에만 의존하지 못하게 해준다. 대신에 모델이 다양한 features를 골구로 이용할 수 있도록 한다. 따라서 Overfitting을 어느정도 막아준다고 할 수 있다.
또한 Dropout에 대한 새로운 해석이 있는데 단일 모델로 앙상블 효과를 가질 수 있다는 것이다. 왼쪽의 Dropout을 적용한 네트워크를 살펴보면 뉴런의 일부만 사용하는 서브네트워크라는 것을 알 수 있다. 그리고 Dropout으로 만들 수 있는 서브네트워크의 경우의 수가 정말 다양하다는 것을 알 수 있다. 따라서 Dropout은 서로 파라미터를 공유하는 서브네트워크 앙상블을 동시에 학습시키는 것이라고 생각할 수 있다.
하지만 뉴런의 수에 따라서 앙상블 가능한 서브네트워크의 수가 기하급수적으로 증가하기 때문에 가능한 모든 서브네트워크를 사용하는것은 사실상 불가능하다.
training을 마치고 test를 진행할 때는 모든 뉴런이 작동되어야 하므로 test_step을 별도로 구현해야 한다. 이때 training에서는 dropout rate에 맞게 학습하였으므로 test 과정에서 모든 뉴런을 작동하게 되면 scale이 동일하지 않게 된다. 예를 들어 p를 0.5라고 했을 때 training을 할 때는 원래의 뉴런 중 절반은 작동이 안되게 된다. 그러면 절반의 뉴런들이 남은 절반 만큼을 더 학습하므로 2배의 학습을 하게 된다. 그래서 test를 할 때는 다시 dropout rate 만큼 곱해 주어야 scale을 1로 맞출 수 있다.
Test time에서는 계산 효율이 중요하기 때문에 곱하기 연산이 하나 추가되는 것은 상당히 신경쓰이는 일이다. 따라서 Test time에는 기존의 연산을 그대로 사용하고 대신 Train time에서 p를 나눠준다.
Batch Normalization
Batch Normalization 또한 Dropout과 비슷한 동작을 할 수 있다. Train time의 BN를 상기해보면 mini batch로 하나의 데이터가
샘플링 될 때 매번 서로 다른 데이터들과 만나게 된다. Train time에서는 각 데이터에 대해서 이 데이터를 얼마나 어떻게 정규화시킬 것인지에 대한 stochasticity이 존재했다.
하지만 test time에서는 정규화를 mini batch 단위가 아닌 global 단위로 수행함으로써 stochasticity를 평균화시킨다. 이런 특성 때문에 BN 은 Dropout과 유사한 Regularization 효과를 얻을 수 있다. 실제로 BN에 충분히 regularization 효과가 있기 때문에 BN을 사용할 때는 Dropout을 사용하지 않는다.
Data Augmentation
3. Transfer Learning
Transfer Learning은 한 문제(domain)에서 학습된 모델의 지식을, 다른 문제에 재사용하는 기법이다. 특히 딥러닝에서는 대규모 데이터셋에서 학습된 모델의 가중치를, 데이터가 적은 새로운 문제에 그대로 가져와서 사용하는 전략으로 많이 쓰인다.
1. Pretrained model 불러오기
ImageNet, COCO 등 대규모 데이터로 학습된 모델 사용
2. Feature Extractor로 사용
보통 ConvNet의 하위 계층은 고정된 feature 추출기 역할을 한다. 따라서 위 계층(Fully Connected Layer 등)만 새 데이터에 맞게 fine-tuning한다.
Transfer Learning을 적용하면 기존에 ImageNet을 학습시킬 때 FC는 4,096 x 1,000 차원의 행렬이었지만 새로운 문제를 풀기 위해서 이를 4,096 x 10(C)으로 바꿔주게 된다. 그리고 방금 정의한 가중치 행렬은 초기화시킨다. 그다음 나머지 이전의 모든 레이어들의 가중치는 freeze시킨다. 그렇게 되면 linear classifier를 학습시키는 것과 같다. 오로지 마지막 Layer만 가지고 데이터를 학습시키는 것이다.
만약 데이터가 더 많이 있다면 네트워크의 더 많은 부분을 업데이트 시킬 수도 있다. 이 부분에서는 보통 기존의 Learning rate보다는 낮춰서 학습시킨다. 왜냐하면 기존의 가중치들이 이미 ImageNet으로 잘 학습되어 있고 이 가중치들이 대게는 아주 잘 동작하기 때문이다. 정리해보면 가지고 있는 데이터셋에서의 성능을 높히기 위해서라면 그 가중치들을 아주 조금씩만 수정하는것으로도 충분할 것이다.
전이 학습이 잘 작동하는 이유로는 일반적으로 딥러닝의 하위 계층은 엣지, 패턴, 질감 등 보편적인 feature를 학습하기 때문이다. 따라서 다양한 이미지 문제에서 재사용 할 수 있다.