모든 게시물은 macOS Monterey 12.0.1 버전 기준으로 작성하였습니다.
부스트캠프 AI Tech 3기를 위한 Pre-Course 를 토대로 작성하였습니다.
Introduction
1. Generalization
Iteration이 반복될 때마다 Training Error는 당연히 줄어들 것이다.
하지만 시간이 지나가고 나면 Test Error에 대해 그 성능이 떨어지게 된다.
즉, Training Error와 Test Error 사이의 차이가 증가한다.
이러한 현상을 오른쪽 이미지와 같이 Overfitting이라 한다.
학습 데이터조차 맞추지 못하고 있는 것이 Underfitting.
2. Cross-Validation
일반적으로 학습과 테스트를 위한 데이터를 나눠서 훈련시키는 경우가 많다.
그 비율을 어느 정도로 하는 것이 좋을까 ?
이러한 문제를 해결하기 위한 방법이 Cross Validation이다.
일정 개수의 partition으로 구획하고, 번갈아 Validation Data를 진행한다.
테스트 데이터는 학습에 절대 사용되면 안된다.
3. Bias and Variance
탄착군 형성을 생각해보면 정확히 가운데 맞지 않아도 모여 있으면 좋다.
이를 Low Variance라 부른다. 클리크만 조정하면 맞을테니까 ~
Bias는 중앙부로부터 얼마나 많이 떨어졌는지를 말한다.
학습데이터에 Noise가 있다면 내가 minimize하고자 하는 것은 결국
세 가지로 구성되고, 이들은 Trade-off 관계에 있다. (Bias, Variance, Noise)
4. Bootstrapping
부츠 신발끈을 들어서 하늘을 날겠다. 학습데이터가 100개가 있다면
한번에 다 사용하는 것이 아니라 일정 개수만 사용하는 모델을 만들겠다.
하나의 입력에 대해 각각의 모델이 서로 다른 값을 예측할 것인데
그 예측값들의 일치 정도를 보고 전체적인 모델의 Uncertainty 예측.
Bagging은 위에서 언급한 것처럼 고정된 데이터를 모두 사용해서
모델 하나가 아닌 모델 역시 여러개를 랜덤 샘플링 통해 훈련시켜
그 결과를 어떻게든 평균을 내겠다 -> Ensemble
Boosting은 조금 다른데 모델 간단히 만들어서 돌려본다. 모델 간단하니
80개는 잘 예측, 20개는 못한다면 이번엔 그 20개를 잘 맞추는 모델 만들어.
그 weak learner들을 sequential 만들어 strong learner 만들기.
Practical Gradient Descent Methods
1. Stochastic Gradient Descent
10만개 데이터가 있다면 한 번에 하나만 보고 기울기 구하고 반복.
2. Mini-batch Gradient Descent
배치 사이즈 정해서 그만큼 보고 기울기 구하고 갱신.
3. Batch Gradient Descent
10만개 다 써서 기울기 다 보고 그 평균 통해서 기울기 갱신
보통 2번 Mini-Batch Gradient Descent Method를 많이 사용하는 편.
2번을 사용하는 건 알겠는데 Batch Size의 중요성은 어느정도일까?
https://arxiv.org/abs/1609.04836
위 논문에 따르면 배치사이즈가 너무 클 때 sharp minimizer에 도달하고
너무 작으면 flat minimizer에 도달한다고 한다. 무슨 말이냐.
sharp << flat 이라는 것인데 아래 그림을 확인해보자.
우리의 목적은 Testing Function의 최소를 찾는 것이다.
Flat Minimum의 특징은 훈련 때 안되면 테스트 때도 잘 안되니까
generalization performance가 높은 것이다. 반면에 sharp minimum은
훈련 때 최적의 점에 도달하였음에도 테스트 에러가 너무 높다.
배치사이즈 작다 = Flat Minimizer = Generalization 잘 돼.
즉, 배치 사이즈를 줄이면 일반적으로 Generalization Performance가 좋구나.
딥러닝 프레임워크를 이용하면 Loss Function 정의하고 손으로 편미분하지 않고
자동으로 미분을 계산해줄텐데 그 방식을 결정해야 한다. Select Optimizer !
각각 왜 제안되었고, 어떤 특징이 있는지 알아두는 것이 좋겠다.
1. Stochastic Gradient Descent
Gradient를 계산한다. 이를 Learning Rate만큼 곱해서 빼준다.
기본적이지만 단점은 Learning Rate 잡는 것이 너무 어렵다.
너무 크면 학습이 안되고, 작아도 너무 오래 걸린다.
2. Momentum
한번 Gradient가 흐르면 다음 업데이트도 그쪽으로 흐르지 않겠어?
이러한 관성을 주자는 것. 베타라는 파라미터를 넣고, 모멘텀과 이전 갱신된
가중치를 함께 이용하여 다음 가중치를 갱신하자는 것이다.
3. Nesterov Accelerate (NAG)
Gradient 계산할 때, 모멘텀은 현재 상황에서 gradient 계산을 하고,
이를 통해 Momentum 계산하는데 NAG는 한번 가본 후 Momentum 계산.
아래로 볼록한 이차함수에서 극소를 찾는 것을 상상해보면 Momentum이
부정적인 영향을 준다. 반면, NAG는 그쪽으로 한 번 더 가본다. 금방 정정.
수렴하는 속도가 훨씬 빠르다.
4. Adagrad
Neural Network Parameter가 많이 변한 애들은 적게 변화시키고,
지금까지 적게 변한 애들은 많이 변화시키겠다. 즉, 얼마나 변화해왔는지
정보가 필요한데 이것이 바로 G_t다. (Sum of Gradient Squares)
G는 계속 커지겠지. 분모가 커지니 이미 많이 변화한 파라미터는 적게 변할 것.
하지만 시간이 지날수록 갱신되는 정도가 줄어들 것 (분모가 쭉 커지니까)
5. Adadelta
Adagrad의 단점을 최대한 막겠다. 현재 time step t가 주어지면
일정 window size를 잡아서 그만큼의 G 정보를 들고 있겠다는 건데
GPT3처럼 천억개 Parameter 가진 모델을 쓰면 G 자체도 천억개 변수고,
그걸 100개 들고 있겠다는 거니까 GPU 터질 것.
이를 막기 위해 지수이동평균을 사용한다. (감마)와 (1-감마)를 활용.
Learning Rate가 없는 것이 특징으로 그래서 오히려 잘 안 씀.
6. RMSprop
논문을 통해 제안된 것이 아니라 딥러닝 강의에서 나온 개념.
해봤더니 잘 되더라고? Gradient Square은 마찬가지로 지수이동평균 써.
대신에 이번엔 Step Size 존재.
7. Adam
"Optimizer로 무엇을 쓸 지 모르겠다면 아담을 사용해라"
지수이동평균 활용한 Gradient Squares + Momentum 개념.
Gradient Squares 바뀌는 거에 따라서 Adaptive Learn하는 것과
이전 Gradient에 대한 Momentum 개념을 적절히 합친 것이다.
- 모멘텀을 얼마나 잘 유지해야 할 것인지 = 베타1
- Gradient Squares의 EMA 정보 = 베타2
- Learning Rage
- 입실론
위 파라미터를 적절히 조정하는 것이 중요하다.
특히, 10^(-7)으로 들어간 입실론을 잘 바꿔주는 것이 실용적으로 도움이 된다.
Regularization
Generalization을 잘 하게 만들기 위한 규제, Regularization을 하겠다 !
학습을 방해할 건데 학습데이터말고 테스트데이터에도 잘 되도록 할 거야.
즉, 일종의 도구다. 학습할 때 시도하고 잘 되면 써먹으면 된다.
학습에 사용하지 않은 데이터를 활용하여 지금까지 학습된 모델로 Loss를 보고,
그 Loss가 늘어나면 일찌감치 멈추자.
파라미터가 너무 커지지 않게 하자. 네트워크 파라미터 전부 제곱하여 더한 것을
줄여나가는 방향으로 가자. 이것의 해석적인 의미는 Function Space 속에서
함수를 최대한 부드러운 함수로 보자는 건데 그럴수록 Generalization 성능이
높을 것이라는 가정이 있는 것.
왼쪽 그래프를 보면 데이터가 많아야 딥러닝 성능이 확 늘어남을 확인할 수 있다.
주어진 데이터를 지지고 볶아서 그 수를 늘리는 것.
입력 데이터와 Weight에 Noise를 넣는다.
그렇게 학습시키면 잘 되더라는 실험적인 데이터가 있다.
학습할 때 데이터 두 개를 뽑아서 섞어.
Decision Boundary Smoothing 효과.
이미지가 하나 있는데 강아지와 고양이 라벨을 섞고, 이미지도 섞는다.
섞는 방식에 따라 우측 이미지처럼 종류가 나뉜다.
결과론적인 성능 향상.. 교수님도 Mix-Up 잘 되더라 ~
각각의 뉴런들이 보다 Robust하게 Feature를 가지고 갈 수 있다.
내가 학습시키는 배치를 정규화 시킨다.
"Internal Feature Shift를 줄여 학습이 잘 된다."라고 논문에 기재되어 있는데
이 역시 결과론적인 성능 향상.. (특히 분류 문제에서)