Regularization
overfitting, high variance problem -> regularization
logistic regression 에 regularization 적용하기
$$\min_{w,b}J(w,b)$$
$$w \in R^{n_{x}},\ b \in R$$
$$J(w, b) = \frac{1}{m}\sum_{i=1}^{m} L({\hat{y}}^{(i)},y^{(i)})$$
가장 흔히 쓰이는 $L_{2}$ regularization :
$$J(w, b) = \frac{1}{m}\sum_{i=1}^{m} L({\hat{y}}^{(i)},y^{(i)}) + \frac{\lambda}{2m} {\| w \|}_{2}^{2}$$
$${\| w \|}_{2}^{2} = \sum_{j=1}^{n_{x}}{w_{j}}^{2} = w^{T}w$$
"it's just a square Euclidean norm of the prime to vector $w$"
위 식에 $\frac{\lambda}{2m} b^{2}$ 도 추가할 수 있는데, 앤드류 센세는 주로 생략한다고 함. 어차피 큰 차이가 없음.
Maybe $w$ just has a lot of parameters, so you aren't fitting all the parameters well, whereas $b$ is just a single number
한편 $L_{1}$ regularization 일 때는 이것을 더함
$$\frac{\lambda}{m} \sum_{j=1}^{n_{x}} | w_{j} | = \frac{\lambda}{m} {\| w \|}_{1}$$
* $\frac{\lambda}{m}$ 이든 $\frac{\lambda}{2m}$이든 .. 어차피 scaling constant 임
If you use $L_{1}$ regularization, then w will end up being sparse - the $w$ vector will have a lot of zeros in it
- 어떤 사람들은 모델을 compress 하는 데 도움이 된다고 하는데, 메모리가 덜 요구되기 때문 -> 그다지 도움되지도 않는다고 함
여기서 $\lambda$는 regularization parameter 이며, 보통 dev set 을 활용해서 세팅함 --> 튜닝이 필요한 또다른 하이퍼파라미터
파이썬의 람다함수와 표현이 겹치므로 코딩상에서는 a 빼고 lambd
라고 표시함
neural network 에 regularization 적용하기
$$J(w^{[1]}, b^{[1]}, w^{[1]}, b^{[1]}, \ldots, w^{[L]}, b^{[L]} ) = \frac{1}{m} \sum_{i=1}^{m}L({\hat{y}}^{(i)}, y^{(i)})+\frac{\lambda}{2m} \sum_{l=1}^{L} {\| w^{[l]} \|}^{2}$$
$${\| w^{[l]} \|}_{F}^{2} = \sum_{i=1}^{n^{[l]}} \sum_{j=1}^{n^{[l-1]}}(w_{ij}^{l})^{2}$$
*$L$은 레이어의 개수
*$w$의 shape는 $(n^{[l]}, n^{[l-1]})$
*F는 "Frobenius norm"를 나타냄 ($L_{2}$이라고 부르는 게 더 익숙하지만, conventionally Frobenius norm 이라고 부른다
(= the sum of square of elements of a matrix)
여기서 gradient descent 를 어떻게 하면 될까?
regularization 하기 전에는 먼저 back-propagation 을 이용해서 $dw^{[l]}$를 계산했다
$$\frac{\partial J}{\partial w^{[l]}}$$
$$w^{[l]} = w^{[l]} - \alpha dw^{[l]}$$
regularization 했을 때에는
$$dw^{[l]} = (backprop으로\ 구한\ 값) + \frac{\lambda}{m}w^{[l]}$$
그 다음 업데이트는 동일한 방식으로 $w^{[l]} = w^{[l]} - \alpha dw^{[l]}$
이러한 이유로 $L_{2}$ regularization은 weight decay
라고 불리기도 하는데
업데이트 할 때 $\alpha \frac{\lambda}{m}w^{[l]}$ 만큼을 더 빼게 되기 때문임
기존 $w^{[l]}$에 $(1-\frac{\alpha \lambda}{m})$(1보다 작은 값) 만큼 곱하게 되는 것과 마찬가지
$$dw^{[l]} = (backprop으로\ 구한\ 값) + \frac{\lambda}{m}w^{[l]}$$
$$w^{[l]} = w^{[l]} - \alpha dw^{[l]}$$
$$w^{[l]} = w^{[l]} - \alpha [(backprop으로\ 구한\ 값) + \frac{\lambda}{m}w^{[l]}]$$
$$w^{[l]} = w^{[l]} - \frac{ \alpha \lambda}{m}w^{[l]} - \alpha (backprop으로\ 구한\ 값) = (1-\frac{\alpha \lambda}{m})w^{[l]} - \alpha (backprop으로\ 구한\ 값)$$
Why Regularization Reduces Overfitting?
intuition 1.
현재 overfitting 상태라고 해보자
$$J(w^{[1]}, b^{[1]}, w^{[1]}, b^{[1]}, \ldots, w^{[L]}, b^{[L]} ) = \frac{1}{m} \sum_{i=1}^{m}L({\hat{y}}^{(i)}, y^{(i)})+\frac{\lambda}{2m} \sum_{l=1}^{L} {\| w^{[l]} \|}^{2}$$
"penalizes the weight matrices from being too large"
$\lambda$의 값을 매우 크게 해본다고 치자
그러면 $w^{[l]}$은 $0$에 가까워질 것이다 ($w^{[l]} \approx 0$)
이는 신경망에서 많은 hidden unit들을 zeroing out 하는 효과가 있음
즉 logistic regression 만큼이나 모델이 작아지는(간소화) 효과가 있음
따라서 high variance case 를 high bias case 쪽으로 끌어오게 됨 (logistic regression 은 high bias case 쪽이라고 했음)
$\lambda$의 값을 적절하게 세팅하면 중간의 적절한 지점에 닿을 것임
물론 실제로 hidden unit들이 0으로 가득차는 것은 아님
여전히 hidden unit들을 모두 통과할 것임 대신 영향력이 확 줄어들게 되는 것
intuition 2.
활성화 함수로 $tanh(z)$를 쓴다고 치면, $z$의 값이 작을 때 (회색 구간) 활성화 함수의 linear한 부분이 해당됨
만약 $\lambda$ 가 커지면 $w^{[l]}$이 작아지고, $w^{[l]}$가 작아지면 $z^{[l]}$가 작아진다
활성화 함수가 비교적 linear한 구간에서 와리가리함
--> 즉 모든 레이어들이 linear 해지는 효과가 있음 -> 전체 네트워크가 linear 해짐
iteration 마다 cost function이 monotonically(단조롭게) 감소하는지 plot을 그려보는데,
regularization을 적용했을 때 cost function 에 추가되는 term 을 꼭 고려하기
(기존 쌩 cost function만을 보면 단조롭게 감소하지 않는 것으로 보일 수도 있음)
Dropout Regularization
위 모델이 과적합되고 있다고 쳐보자
특정 확률로 node 를 제거하는 것
sample 마다 제거하는 node를 선택한다
각 sample마다 훨씬 작은 네트워크를 훈련하게 됨
Implementing dropout ('Inverted dropout')
layer $l=3$ (하나의 레이어에서 발생하는 일을 묘사할 것임)
$$d^{3} = np.random.rand(a^{3}.shape[0],\ a^{3}.shape[1]) < Keep.prob$$
- random matrix
- $Keep.prob$ 보다는 작은 숫자로 이루어짐
- 만약 $Keep.prob$ 가 $0.8$이라면, 노드가 제외될 확률은 $0.2$가 됨
- $80%$는 $1$, $20%$는 $0$
- $d^{3}$ : dropout vector for layer $3$
$$a^{3} = np.multiply(a^{3},\ d^{3})$$
- 세번째 레이어의 활성화값
- $a^{3} \times d^{3}$로 나타내도 됨
- $d^{3}$에 해당하는 요소들을 zeroing out
- 파이썬 코드에서 $d^{3}$는 boolean array로 나타내짐
$$a^{3} /= keep.prob$$
- inverted dropout technique
- 세번째 레이어에 50개의 hidden unit이 있다고 해보자. 그러면 $a^{3}$은 $(50, m)$ 차원일 것이다. 이때 $keep.dim$이 $0.8$이라면 $50$개 노드 중에서 제거되는 것은 평균적으로 $10$개.
- 그 다음에 계산될 $z$를 살펴본다면, $z^{[4]} = w^{[4]} \cdot a^{[3]} + b^{[4]}$. 이때 $a^{[3]}$의 사이즈는 $20%$가 감소한 상태. $a^{[3]}$의 expected value에 맞추기 위해 $0.8$로 나눠준다.
- 위 과정을 통해 $keep.prob$의 크기가 어떻든 $a^{[3]}$의 expected value가 유지됨.
- "When you're trying to evaluate a neural network, this inverted dropout technique makes the test time easier because you have less of a scaling problem"
- 샘플 안에서 돌 때마다 다른 hidden unit을 제외한다
여기서는 forward prop만 보고 있지만 "both in forward prop & back prop"에 해당 됨
[Making predcitions at test time]
예측하고자 하는 test example $x=a^{[0]}$가 주어졌을 때, no drop-out!
$keep.dim$은 test time 할 시에 expected value of activations 가 바뀌지 않도록 하는 요소
Understanding Dropout
Intuition: Can't relay on any one feature, so have to spread out weights
하나의 unit 의 관점에서 생각해보자.
unit은 input을 받아 유의미한 output을 출력해야 함.
이때 dropout 을 사용하면 특정 확률로 어떤 input 들이 제거됨. 게다가 sample마다, iteration 마다 어떤 입력이 제외될지 알 수가 없음. 따라서 하나의 feature에 의존할 수 없게 됨. 대신에 모든 input unit에 대해 조금씩 가중치를 나누어줌.
--> shrinking a squared norm of weights
$L_{2}$ regularization과 비슷한 효과가 있음.
한편, 레이어마다 $keep.prob$을 다르게 하는 방법도 있음.
이만한 신경망이 있을 때, 가장 큰 weight 는 $(7, 7)$인 $w^{2}$이다 -> (더 많은 파라미터에 의존하여) 과적합의 위험이 더 크므로 $keep.prob$을 낮게 설정하고, 나머지 레이어에 대해서는 상대적으로 높게 설정할 수 있다
- $keep.prob$이 $1$이다 = 모든 노드를 이용한다 = dropout 적용하지 않는다
- input feature에도 dropout 적용할 수 있으나 실제적으로 사용하는 방식은 아님
- feature가 매우 고차원인 CV에서 dropout 기법이 거의 디폴트로 쓰임 - overfitting이 거의 항상 발생..
- overfitting 하는 경우가 아니라면 굳이 dropout 쓰지 않아도 됨
- 단점 : cost function $J$ is no longer well defined on every iteration
--> dropout 적용하지 않은 채로 cost function $J$가 제대로 감소하는지(gradient descent가 제대로 이루어지고 있는지) 먼저 확인해보는 것이 팁
Other Regularization Methods
[Data augmentation]
좌우반전, 왜곡, 크롭 ...
완전히 새로운 데이터 구하는 것만큼은 아니지만 효과 있음
regularzation과 비슷한 효과
[Early stopping]
training error와 dev set error를 그래프에 그려봄
dev set error가 가장 낮을 때 학습 중단
처음 $w$는 0에 가까운 숫자로 시작해서 학습을 거칠수록 점점 더 커질 것이다
학습을 중간에 중단하면 중간 크기 정도의 $w$ 를 얻는다
이는 $L_{2}$ regularzation과 비슷한 효과를 가진다 - 파라미터 $w$의 더 작은 norm을 선택하게 되므로.
람다와 같은 하이퍼파라미터를 열심히 찾아보지 않아도 됨.
그런데 단점도 있다.
신경망을 학습시킨다는 것 ..
1) optimize cost function $J$
- gradient descent, momentum, ADAM, ...
2) not overfit
- regularzation, ...
이미 너무 많은 하이퍼파라미터가 존재하므로 (1)번에 우선 집중, 이후에 별도로 (2)를 생각한다
"orthogonalzation"
그런데 early stopping 은 위 두 가지 과제를 두 배로 늘린다 두 과제를 별개로 수행할 수 없다
중단하는 것이 cost function $J$가 제대로 감소하고 있지 않아서 이기도 하고 overfit하고 있어서기도 하고 ...
$L_{2}$ regularzation 적용한 상태서 최대한 오래 학습시켜봐라.
'인공지능 > DLS' 카테고리의 다른 글
[2.1.] Setting Up your Optimization Problem(2) (0) | 2022.07.06 |
---|---|
[2.1.] Setting Up your Optimization Problem(1) (0) | 2022.07.04 |
[2.1.] Setting up your Machine Learning Application (0) | 2022.07.03 |
강좌1 정리 노트 (0) | 2022.07.03 |
[1.4.] Deep Neural Networks (0) | 2022.07.02 |