이번 강의에서는 우리가 뉴럴넷을 학습할 때 실제로 마주할 수 있는 문제에 대한 practical 한 해결책에 대해 설명해 준다.
1. Train / Dev / Test set 나누기
최적의 Hyperparameters (# layers, # hidden unit, learning rate, activation function, ...)를 한 번에 찾는 것은 불가능하다.
우리는 Iterative process를 통해 NN이 잘 동작하기 위한 hyperparameters를 찾아야한다.
*Iterative process (Idea -> Code -> Experiment -> Idea -> Code -> ... )
우리는 우리의 task에 적합한 NN (or hyperparameter)를 좀 더 efficient하게 찾기 위해, 데이터셋을 Train / Dev / Test set으로 나눈다. (dev set = hold-out cross validation set = development set)

- 우리는 train set을 이용해서 모델을 학습하고
- dev set을 이용해서, 다양한 모델 중 어떤 것이 제일 적합한지 확인한다.
- 마지막으로, test set으로 final 모델을 test한다. 이때, test set의 결과는 unbiased estimation을 제공해 준다.
(*Ng 교수님은 unbiased estimation이 필요한 것이 아니라면, test set이 없어도 괜찮다고 이야기 하신다.)
만약
- training set이 web pages로부터 수집된 고양이 사진
- dev/test set은 사용자가 개인 앱을 이용해서 찍은 고양이 사진
이라고 한다면, 둘 사이에는 distribution mismatch가 일어나게 된다.
(train set은 고화질, 고양이의 전체가 담긴 영상들이고, dev/test set은 저화질 혹은 다양한 각도에서 찍힌 이미지인 경우를 생각하면, 둘의 distribution이 다르다는 것이 무엇인지 좀 더 이해가 쉬울 듯하다.)
*여기서 반드시 dev와 test set은 same distribution으로부터 와야 함을 잊으면 안 된다!
2. Bias/Variance
- High bias ("Underfit"): 모델이 train set 조차도 제대로 학습을 하지 못함. 그래서 train set error가 매우 크다. -> training data problem
- High variance ("Overfit"): 모델이 train set에 너무 fit 하게 학습되어 일반화 성능 (dev set에서의 성능)이 train set에서의 성능 대비 크게 떨어진다. -> dev set problem

이렇게 train set과 dev set의 error 양상을 보고, 현재 내 모델이 어떤 문제에 처했는지 알 수 있다.
만약 High bias 문제가 발생했다면
- Bigger network를 사용하거나
- 좀 더 오래 학습을 하거나
- (NN architecture search: task에 더 적절한 NN를 찾는다. -> 효과 있을 수도 있고 없을 수도 있음)
위 세 가지 방법을 써서 high bias 문제가 없어질 때까지 training set에 모델을 fit 하거나 overfit 시킨다.
그다음 너무 training set에 overfit 되면 high variance 문제가 생길 텐데, 이를 해결하기 위해서는
- More data 사용해서 학습
- Regularization
- (NN architecture search -> 효과 있을 수도 있고 없을 수도 있음)
위 세 가지 방법을 써서 high variance 문제를 없앨 수 있다.
3. Regularization
: Data를 더 수집할 수 없을 때, overfitting (high variance)를 방지하기 위해 사용할 수 있는 방법
(1) L1, L2 regularization
: Regularization term ( $\frac{\lambda}{2m} ||w||^{2}_{2}$ or $\frac{\lambda}{2m} ||w||_{1}$)를 추가해서 weight가 커지는 것을 방지한다. (*$\lambda$ = regularization parameter)
대표적으로 L2 regularization (weight decay)과 L1 regularization이 있다. 각각의 정의는 아래 사진과 같다.

좀 더 깊은 이해를 위해 L1, L2 norm에 대해 좀 더 찾아봤다. (참고1, 참고2, 참고3)

- L1의 경우, weight를 좀 더 sparse하게 만들고 --> w가 zero값을 많이 갖게 된다. (--> model을 compressing하는 것에 도움 됨)
- L2의 경우, weight를 좀 더 균등하게 spread out 한다.
*참고: L2-norm은 1/2 제곱을 취하지만, L2 regularization은 L2-norm에 제곱을 취해주어 (1/2)*2=1 이 된다. --> $w \cdot w^{T}$
- L2 regularization이 weight decay인 이유?
$w^{[l]}$앞에 곱해지는 상수가 1보다 작으므로, 학습할수록 weight가 작아지게 된다.

- Regularization이 overffiting을 줄여주는 것에 대한 직관


(2) Dropout
: 임의의 확률로 neurons (hidden units)을 shut off 해서 (=출력을 0으로 만들어서) overfitting을 방지한다.

- 구현 측면

*내가 헷갈렸던 부분: dropout은 weight를 0으로 만드는 것이 아니라 neuron의 output을 0으로 만드는 것이다!
- Dropout의 효과 (동작하는 이유)

여기서 keep_prob을 낮추는 것은 (neuron을 더 많이 shut off) L2 regularization에서 $\lambda$를 높이는 것과 유사한 효과를 보인다. 즉, overffing을 줄인다 (variance를 낮춘다)
단점: layer마다 다르게 keep_prob을 설정할 경우, 최적의 keep prob을 찾기 위해 dev set에서 확인해봐야 할 것이 많아진다.
(3) Other regularization method
- Data augmentation
: random flip, random crop 등등등 새로운 데이터셋을 모으는 것보다 overfitting을 줄이는데 효과가 적을 수 있지만, dataset을 모으는 추가적인 cost 없이 regularization이 가능하다.
- Early stopping
: 이름 그대로, 학습 중간에 학습을 멈추는 것.

우리는 보통
Cost function $J$를 optimizae 하는 task와 overfit을 방지하기 위한 task 두 개 각각을 해결한다.
하지만 early stopping은 이 두 task를 묶어서 해결한다.
이 점이 early stopping의 장점이자 단점이 된다. Ng 교수님은 두 문제를 묶어버리기 때문에 각각의 문제를 독립적으로 해결할 수 없어서 그다지 선호하지 않는다고 하셨다.
4. Optimization problem
(1) Normalizing inputs -> NN 학습할 때 속도 Up!

- Input을 normalize 하는 이유는?
input을 normalize 하지 않은 경우, 아래 그림처럼 cost function의 모양이 찌그러(?) 진다. 따라서 cost function $J(w,b)$를 optimize 하는데 더 오랜 시간이 걸린다.

(2) Vanishing / exploding gradients
우리가 NN를 학습할 때 마주칠 수 있는 문제 중 하나는 gradients가 vanishing/exploding 되는 문제이다
해당 문제는 아래 사진에 설명된 것과 같은 이유로 발생할 수 있다.

따라서 weight를 잘 초기화하는 것이, 해당 문제를 해결하는 부분적인 해결책이 될 수 있다.

single neuron example을 보았을 때,
우리가 input feature의 수 ($n$, 일반화한다면 $n^{[l-1]}$)이 클 수록, $z$가 exploding 되지 않게 하기 위해 small weight $w_i$를 갖기를 원한다.
따라서, 우리는 weight를 초기화할 때, np.sqrt($\frac{2}{n^{[l-1]}}$)을 곱해줄 수 있다.
*Activation function으로 ReLU를 사용할 경우 분모를 2로 하고, tanh를 사용할 경우 1로 설정한다. (Xavier initialization)
(3) Gradient checking
: 우리는 back propagation 구현이 잘 되었는지 check 하기위해 gradient checking을 수행할 수 있다.
Gradient check를 위해서, 우리는 approximated gradient를 계산해야한다.

두 가지 방법이 있는데, 2번째 (양방향 approximation)이 좀 더 정확한 근사치를 계산해주므로 2번째를 사용해서 구한다.
- Gradient checking for NN
: Gradient를 check하기 위해서는 approximated gradients ($d\theta_{approx}$)를 구해서 실제 gradients ($d\theta$) (back prop을 통해 얻은 값) 와 비교해본다.

'ML || DL > 이론' 카테고리의 다른 글
| [Coursera] DLS_C2W3: Hyperparameter Tuning (0) | 2023.09.17 |
|---|---|
| [Coursera] DLS_C2W2: Optimization Algorithms (0) | 2023.09.15 |
| [Coursera] Neural Networks and Deep Learning 수료증 (0) | 2023.09.08 |
| [Coursera] DLS_C1W4: Deep Neural Network (DNN) (0) | 2023.09.08 |
| [Coursera] DLS_C1W3: Shallow Neural Networks (0) | 2023.09.06 |