더보기
CS231n 강의 홈페이지: https://cs231n.stanford.edu/
CS231n Spring 2017 유튜브 강의 영상: https://www.youtube.com/watch?v=vT1JzLTH4G4&list=PLC1qU-LWwrF64f4QKQT-Vg5Wr4qEE1Zxk
강의 슬라이드 & 한글 자막: https://github.com/visionNoob/CS231N_17_KOR_SUB
Recap
- Activation Functions
- Weight Initilization
- 가중치가 너무 작으면 activation 0, 너무 크면 saturation
- Data Preprocessing
- 좌측 그림과 같이 zero-mean이 아닌 경우라면 결정 경계(가중치)가 조금만 변하더라도 loss는 이에 민감하게 반응
- Batch Normalization
- 미니 배치 단위로 평균과 표준편차 계산 (채널 별)
- learnable parameter \( \gamma, \beta \)로 스케일링 및 시프팅
- Babysitting Learning
- 그림의 경우 train acc은 높아지는데 val acc은 침체 → 오버피팅
- regularization 필요
- Hyperparameter Search
- 성능을 좌우하는 특정 파라미터 축을 더 넓게 탐색할 수 있는 임의 탐색이 더 유리
- coarse stage (넓은 범위, 저반복) → fine stage (좁은 범위, 고반복)
Optimization
SGD
- Basics
- 손실 함수의 gradient를 계산하고 이에 대한 반대 방향으로 파라미터를 반복적으로 업데이트하는 최적화 방법
- 한계
- 비대칭적인 손실 함수
- taco shell과 같은 형태의 손실 함수를 상상해보면 특정 방향에 대해서만 loss가 민감하게 반응
- 이런 환경에서 SGD를 수행하면 지그재그 형태로 가중치가 업데이트 됨
- 즉, loss에 영향을 거의 미치지 않는 수평 방향으로는 적게 업데이트 되고 loss에 큰 영향을 미치는 수직 방향으로는 많이 업데이트 되기 때문에 SGD가 잘 작동하지 않음
- 또한 실제로는 그림과 같은 2차원이 아닌 훨씬 고차원의 공간이기 때문에 이러한 문제가 더 빈번하게 발생
- Local minima와 Saddle points
- SGD는 gradient가 0이 되는 지점에서 멈출 수 있는데, 이 경우 손실 함수의 optimal minima가 아니라 local minima일 수 있음
- 또한 saddle point는 특정 방향으로의 gradient가 평평한 것을 말하는데 이는 앞선 경우와 마찬가지로 고차원 공간에서 매우 빈번하게 발생할 수 있음
- Noise의 영향
- SGD는 미니배치를 사용하기 때문에 noise가 섞여서 최적화가 이루어지고, 이로 인해 수렴 속도가 느려질 수 있음
- 비대칭적인 손실 함수
SGD with Momentum
- Basics
- 현재 gradient뿐 아니라 이전 업데이트의 방향(velocity)을 고려하여 학습을 진행
- 하이퍼파라미터 \( \rho \)를 통해 velocity의 영향을 조절하고 보통 0.9와 같은 높은 값으로 설정
- 빨간 점이 현재 위치라고 가정했을 때 최종 업데이트는 gradient 벡터와 velocity 벡터의 가중평균으로 계산됨
- 특징
- velocity를 유지하기 때문에 gradient가 0인 지점에서도 움직임을 지속할 수 있어 local minima와 saddle points를 넘어설 수 있음
- loss에 민감한 방향으로의 변동은 줄여주고 둔감한 방향으로의 움직임은 증가시키기 때문에 지그재그로 수렴하는 Poor Conditioning 문제를 해결할 수 있음
Nesterov Momentum
- Basics
- velocity 방향으로 이동한 후 그 지점에서 gradient를 계산하고, 이를 다시 원래 위치에서의 velocity와 결합
- 특징
- Convex 문제에서는 Nesterov가 뛰어난 성능을 보이지만 Neural Network와 같은 Non-convex 문제에서는 항상 성능이 보장되지 않을 수 있음
- gradient를 나중에 계산함으로써 noise를 줄임
- momentum 방식에서는 minima를 지나쳐버리는 overshooting이 발생할 수 있는데, Nesterov는 이를 줄이는 데 더 효과적
AdaGrad
- Basics
- 일반적인 momentum 방식에서 사용하는 velocity term 대신에, gradient의 제곱 값을 누적해서 사용
- 학습 과정에서 각 step마다 gradient의 제곱 값을 계산하고 이를 누적하여 업데이트 시에 그래디언트를 나눠줌 (각 차원 별로 element-wise 하게)
- 특징
- 작은 gradient를 가진 차원에서는 제곱 값이 작으므로 속도가 상대적으로 빨라지고 큰 gradient를 가진 차원에서는 제곱 값이 크므로 속도가 점점 느려짐
- 차원 별로 학습률이 조정되어 학습의 안정성이 향상됨
- 한계
- 학습이 계속 진행되면 gradient의 제곱 합이 누적되면서 step size가 점점 작아짐
- 이로 인해 최적점에 가까워질수록 수렴 속도를 줄이며 안정적으로 도달하기 때문에 Convex 환경에서는 좋을 수 있음
- 그러나 Non-convex 환경에서는 문제가 될 수 있는데, 특히 saddle point에 도달하면 학습이 멈춰버릴 수 있음
RMSProp
- Basics
- AdaGrad의 개선된 버전으로, 학습 도중 계산된 gradient 제곱 값을 누적하는 대신 decay rate를 적용하여 가중치를 부여하고 최신 gradient에 더 높은 비중을 두는 방식
- 쉽게 말해 decay rate을 통해 누적된 gradient 제곱 값과 최신 값을 가중합
- 일반적으로 decay rate는 0.9 또는 0.99 값을 사용
- 특징
- AdaGrad처럼 학습률을 조정하지만 학습이 진행될수록 step size가 줄어드는 문제를 방지할 수 있음
- overshooting 없이 각 차원의 상황에 맞게 학습 궤적을 수정
Adam
- Basics
- velocity와 gradient의 제곱을 둘 다 사용 (momentum + RMSProp)
- first moment와 second moment라는 두 가지 요소를 이용하여 학습을 진행
- First moment: momentum과 비슷하게 gradient의 가중 합을 담당
- Second moment: RMSProp처럼 gradient의 제곱을 이용해 step을 조절
- 두 요소가 초기 단계에서 0으로 초기화되어 step size가 너무 커지게 되는 문제를 해결하기 위해 bias correction term을 도입
- 특징
- momentum과 RMSProp의 장점을 결합하여 보완
- 다양한 상황에서 잘 동작. 대부분의 문제에 대한 기본 optimizer로 사용
- beta_1 = 0.9, beta_2 = 0.999, learning rate = 1e-3 또는 5e-4 등의 하이퍼파라미터 설정으로 대부분의 신경망 구조에서 준수한 성능
Learning Rate Decay
- 중요성
- 학습률은는 모든 최적화 알고리즘의 중요한 하이퍼파라미터
- 학습률이 너무 높으면 모델이 불안정하게 학습되고(그래프에서 노란색 선처럼), 너무 낮으면 수렴 속도가 느려짐(파란색 선처럼).
- 적용 방식
- 학습 과정에서 학습률을 점차 줄임으로써 처음에는 큰 step으로 빠르게 학습하고, 이후에는 작은 step으로 더 세밀하게 학습하는 전략을 사용할 수 있음
- Step Decay: 일정한 학습 단계(예: 100,000번의 반복 후)마다 learning rate를 갑작스럽게 낮추는 방법
- Exponential Decay: 학습이 진행됨에 따라 learning rate를 점진적으로 줄여나가는 방법
- ResNet 논문에서도 learning rate decay가 사용된 것을 알 수 있는데 loss가 일정하게 줄어들다가 어느 순간 급격히 감소하는 것을 확인할 수 있음
- 학습을 시작할 때는 decay 없이 학습을 진행하고, loss 곡선을 관찰하여 학습률을 줄여야 할 시점을 파악하는 것이 좋음
Model Ensembles
- 중요성
- 앞선 최적화 방법들은 모두 training error를 줄이기 위한 것
- 그러나 , 실제로 중요한 것은 training error가 아니라 한 번도 보지 못한 데이터에 대한 성능인 test error
- 우리가 추구하는 것은 training error와 test error 사이의 격차를 줄이는 것
- 적용 방식
- 모델 앙상블 기법은 여러 개의 모델을 독립적으로 학습시키고 그 결과를 평균하여 최종 예측을 만듦
- 앙상블을 구성할 때 각 모델의 하이퍼파라미터는 동일할 필요가 없고 모델의 크기, 학습률, 규제 기법 등을 다양하게 적용할 수 있음
- 이로 인해 오버피팅을 줄이고, 성능을 약 2% 정도 향상시키는 효과가 있음
- 독립적인 여러 모델을 학습시키는 대신, 하나의 모델을 학습하는 과정에서 중간에 여러 번의 스냅샷을 저장하고 이들로부터 나온 예측값들의 평균을 사용하는 기법도 존재
- 또한, 학습 중인 네트워크의 파라미터를 지속적으로 평균화하여 smooth ensemble 효과를 얻는 Polyak averaging 기법도 존재하나 실제로 자주 사용하지는 않음
Regularization
Recap
- 앙상블의 경우 test time 여러 모델을 실행해야 하므로 시간이 오래 걸림
- 정규화(regularization)을 통해 앙상블이 아닌 단일 모델의 성능을 높일 수 있음. 정규화는 오버피팅을 방지하고 모델의 일반화 성능을 높임
- 앞선 강의에서 L1, L2 정규화 등을 다루었고, 이는 손실 함수에 추가적인 항을 더하는 방식
- 그러나, L2 정규화는 신경망 구조에는 잘 어울리지 않음
Dropout
- Basics
- 드롭아웃은 신경망에서 가장 많이 사용하는 정규화 기법 중 하나로, 훈련 과정 중 임의로 일부 뉴런을 0으로 설정하여 비활성화(activation이 0이 되게)하는 방식
- 모델이 특정 뉴런이나 특징에 과도하게 의존하는 것을 막음으로써 오버피팅을 방지
- FC layer에서 흔히 사용하지만 CNN에서 일부 채널 자체를 드롭하는 방식으로도 사용 가능
- 효과
- 특징들 간의 상호작용(co-adaptation)을 방지하여, 특정 특징에 대한 의존도를 줄이고 다양한 특징을 골고루 활용할 수 있도록 함
- 예를 들어 고양이라는 이미지 클래스로 분류할 때 고양이의 다양한 특징을 골고루 이용할 수 있도록 함
- 드롭아웃을 적용한 모델은 결과적으로 다양한 서브네트워크의 앙상블 효과를 얻을 수 있음. 단일 모델 학습만으로도 여러 모델을 사용하는 것과 유사한 효과
- 훈련 시간은 증가할 수 있지만 결과적으로 더 나은 일반화 성능을 얻게 됨
- Test Time에서의 처리
- 드롭아웃을 적용하면 함수(=모델) \( f \)에 입력 \( x \)외에도 랜덤 변수 \( z \)가 추가되어 출력도 랜덤성을 가지게 됨
- 그러나 test time에서 이러한 랜덤성을 평균화하기 위해 적분을 사용하는 것은 매우 어려움
- 따라서 단순히 드롭아웃 확률 \( p \)를 곱해주어 모델 출력을 조정하는 식으로 이를 근사함
- 그런데 test time에서 곱하기 연산이 추가되는 것도 거슬리니까 역으로 train time에서 p로 나눠주는 Inverted Dropout을 흔히 사용
- 최종적으로 드롭아웃은 이와 같이 적용됨
- Train time: 매 반복마다 레이어의 출력을 계산한 후 드롭아웃 확률 p에 따라 임의로 일부 노드를 0으로 만듦. 이후 다시 p로 나눠줌
- Test time: 기존과 동일하게 predict 진행
- Batch Normalization과의 유사성
- 배치 정규화 또한 학습 시 미니배치 단위로 매번 서로 다른 데이터들이 만나 정규화가 이루어지면서 랜덤성을 얻고, 테스트 시에는 미치배치가 아닌 global 단위로 진행되면서 이러한 랜덤성을 평균화 함
- 이러한 점에서 드롭아웃과 유사하며 배치 정규화 또한 규제 효과를 제공
- 일반적으로 배치 정규화로도 충분한 규제 효과를 얻을 수 있기 때문에 드롭아웃과 병행하여 사용하지는 않지만 드롭아웃은 조정 가능한 파라미터 p가 존재한다는 점에서 여전히 유용
Data Augmentation
- Basics
- 다양한 변환을 통해 학습 데이터를 인위적으로 늘림으로써 모델이 다양한 데이터 분포에 대응할 수 있도록 하는 방법
- horizontal flip, random crop, color jittering 등
- Randomness in Train Time
- 데이터 증강 또한 train time에서 한 이미지를 여러 번 변환하여 학습함으로써 랜덤성을 얻고 test time에는 각 변환된 이미지로 예측한 결과를 평균내는 방법을 사용
- ResNet을 예로 들면 test time에서 하나의 이미지를 50개의 cropped image로 증강하여 이를 평균
Extra Methods
- DropConnect
- 드롭아웃과 유사한 방식으로, 활성화 함수가 아닌 weight matrix에 적용
- Fractional Max Pooling
- 고정된 2x2 영역에서 max pooling 연산이 이루어지는 기존 방법과 달리 임의 지역에 max pooling
- Stochastic Depth
- 학습 과정에서 일부 레이어를 건너 뛰어 학습하고, 테스트 시에는 전체 네트워크를 사용하는 방법. 드롭아웃과 유사한 정규화 효과를 가짐
Transfer Learning
- Basics
- 기존에 학습된 모델을 새로운 문제에 맞게 재사용하는 방법
- 데이터가 부족할 때 유용하며 새로운 모델을 처음부터 학습시키는 대신 사전 학습된 모델을 활용
- 전이 학습 역시 오버피팅 문제를 해결할 수 있는 효과적인 방법 중 하나
- 적용 방식
- 전이 학습은 사용하려는 데이터의 크기와 기존 데이터와의 유사성을 고려하여 전략을 달리 활용
- 기존 데이터와 유사한 경우
- 데이터셋이 작다면 사전 학습된 모델의 최종 FC Layer만 새로운 task에 맞게 재학습시키고, 나머지 네트워크는 동결(Freeze)
- 데이터가 더 많다면 동결된 일부 레이어를 점차 해제하여 재학습시킴으로써 네트워크 전체를 Fine-tuning 해볼 수 있음 (이때 학습률은 작게 설정)
- 기존 데이터와 다른 경우 (의료 영상 같은 경우)
- 데이터셋이 작다면 효과가 잘 안 나올 수 있음
- 데이터셋이 크다면 사전 학습된 모델의 더 많은 부분을 파인튜닝
- 전이 학습의 일반화
- 현재 대부분의 컴퓨터 비전 관련 작업들은 모델을 처음부터 학습시키지 않고 ImageNet과 같은 대규모 데이터셋으로 사전 학습된 모델을 사용
- 이러한 이유로 Caffe, TensorFlow, PyTorch와 같은 대부분의 딥러닝 프레임워크에서 사전 학습된 모델을 제공
'CS231n' 카테고리의 다른 글
[CS231n] Lecture 9 | CNN Architectures (0) | 2024.08.26 |
---|---|
[CS231n] Lecture 8 | Deep Learning Software (0) | 2024.08.19 |
[CS231n] Lecture 6 | Training Neural Networks I (0) | 2024.08.08 |
[CS231n] Lecture 5 | Convolutional Neural Networks (0) | 2024.07.30 |
[CS231n] Lecture 4 | Introduction to Neural Networks (0) | 2024.07.29 |