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 적용한 상태서 최대한 오래 학습시켜봐라.

 

 

복사했습니다!