Regularizer
L1, L2정규화는 손실함수에 정규화 항을 추가해서 모델의 문제를 푸는 능력을 높이는 과정속에서 모델 파라미터의 폭주를 막고 기왕이면 적은 절대값으로 문제를 풀도록 압박하는 기법이다.
정규화는 층의 모델 파라미터와 연관되어 있어서 따로 층을 두어 수행하지않고, 한층에서 경사 하강법을 수행할 때 손실함수 계산과 역전파를 수행에 영향을 끼친다.
L1 Regularizer
계산식
$ P_{L1} = \alpha \sum_{i=1}^{n} | w_i | $
$ L' = L + \alpha \sum_{i=1}^{n} |w_i| $
편미분식
$$ \frac{\partial L'}{\partial w_i} = \frac{\partial L}{\partial w_i} + \frac{\partial P_{L1}}{\partial w_i} = \frac{\partial L}{\partial w_i} + \alpha \frac{\partial \sum_{i=1}^{n} |w_i|}{\partial w_i} = \frac{\partial L}{\partial w_i} + \alpha \begin{cases}
1 & \text{ if } w_i > 0 \\
0 & \text{ if } w_i = 0 \\
-1 & \text{ if } w_i < 0
\end{cases} $$
식을 살펴보면 $ P_{L1} $ 값은 $ w $ 크기에 영향을 받지 않는다. 즉 일정한 상수값를 손실함수에 더해줘, 파라미터에 일정량의 패널티를부여한다.
코드 구현
def l1(weight, alpha=0.01):
return alpha * np.sum(np.abs(weight))
def l1_diff(weight, alpha=0.01):
return alpha
L2 Regularizer
계산식
$ P_{L2} = \frac{1}{2}\lambda \sum_{i=1}^{n} w_i^2 $
$ L' = L + \frac{1}{2} \lambda \sum_{i=1}^{n} w_i^2 $
편미분식
$$ \frac{\partial L'}{\partial w_i} = \frac{\partial L}{\partial w_i} + \frac{\partial P_{L2}}{\partial w_i} = \frac{\partial L}{\partial w_i} + \frac{1}{2} \lambda \frac{\partial \sum_{i=1}^{n} w_i^2}{\partial w_i} = \frac{\partial L}{\partial w_i} + \lambda w_i $$
식을 살펴보면 $ P_{L2} $ 는 $ P_{L1} $ 과 다르게 $ w $ 값에 따라 변동적으로 패널티를 부여한다.
코드 구현
def l2(weight, alpha=0.01):
return alpha * np.sum(np.square(weight))
def l2_diff(weight, alpha=0.01):
return alpha * weight
'머신러닝 > CustomFramework' 카테고리의 다른 글
Residual Connection (0) | 2022.04.04 |
---|---|
Batch Normalization (0) | 2022.04.03 |
Dropout (0) | 2022.04.03 |
Convolution 2D Layer (0) | 2022.03.26 |
Dense (Fully Connect) Layer (0) | 2022.03.21 |