0으로 초기화하면 손실함수로부터의 기울기가 있어도 업데이트 불가
(최악의 말도 안되는 방법)
출력의 범위가 너무 넓어짐
가중치의 값이 너무 크거나 너무 작게 초기화되어 학습에 방해
핵심: 각 층의 활성화 함수 이후 출력값이 적당히 넓게 고루 분포되어야함. 그래야 학습 시 편향되지 않고 효율적으로 이뤄짐(Xavier, He)
sigmoid나 hypublic tanh 같은 선형 활성화 함수 or 이들의 근사를 사용할 때 효과적. (초기에 너무 큰 가중치 값을 설정하면 기울기가 너무 커지거나 작아져서 학습이 어렵게 될 수 있는 문제 해결가능 + 이전 레이어의 노드 수에 비례하여 가중치를 초기화 -> 이를 통해 이전 레이어의 노드 수가 많을수록 각 가중치의 크기는 작아지게됨)
시그모이드와 같은 활성화 함수에선 효과가 좋았지만, 특정한 활성화 함수에선 여전히 문제를 해결할 수 없었다. 예를 들면, ReLU 활성화 함수의 미분값은 음수일 때 출력이 0이므로, 여전히 레이어가 깊어질수록 기울기가 소실 될 수 있다.
⇒ He 초기화(He Initialization)는 이러한 치명적인 문제를 완화시키려는 목적으로 제안
He 초기화도 Xavier 초기화와 동일하게 이전 레이어의 노드 수에 비례하여 가중치를 초기화한다. 하지만 He 초기화는 ReLU 활성화 함수의 특성 때문에 더 큰 스케일(표준편차 좀 더 크게)을 사용한다. 이는 ReLU 활성화 함수가 음수일 때 0을 출력하므로, 더 큰 가중치로 시작하여 기울기 소실 문제를 완화하는 데 도움이 된다.
가중치 초기화를 선택할 때, 결국 어떤 활성화 함수를 선택하느냐에 달려있다.
⇒ 시그모이드와 같은 활성화 함수를 쓰게 된다면, Xavier 초기화 방법을 써보자.
⇒ ReLU와 같은 활성화 함수를 쓰게 된다면, He 초기화 방법을 써보자.
가중치 초기화도 데이터를 정규화하고 배치 정규화도 활성후 레이어 이후의 출력을 정규화한다는 공통점이 있다. 하지만, 두 방법은 언제 누구에게 사용되느냐에 차이점이 있다.
큰 가중치에 대한 패널티를 부과함으로써 모델의 가중치를 작게 유지하려고 한다. 이를 통해 모델의 복잡도를 감소시켜 모델이 훈련 데이터에 과도하게 적합하는 것을 억제(훈련 데이터가 적거나, 훈련 데이터에 노이즈가 많은 경우에 유용)
동일한 가중치 값을 갖는다면 가능하면 작은 가중치를 갖는 것이 좀 더 나은 솔루션이라는 직관
- 가중치가 크다면 상대적으로 역전파 신호가 적기 때문에 학습속도 느려짐/.
class Net:
...
def loss(self,y_pred,y_true):
"""
정답(y_true)와 예측값(y_pred)을 기반으로 손실값을 계산.
L2 정규화가 적용된 가중치 감쇠 포함.
"""
#가중치 감쇠 계산
for idx in range(1,self.hidden_layer_num+2):
W = self.params[f'W{idx}']
weight_decay += 0.5 * self.weight_decay_lambda * np.sum(W**2)
return self.last_layer.forward(y_true,y_pred) + weight_decay
> 각 레이어를 돌면서 파라미터값을 가져와서 제곱해서 더함 easy
학습이 진행될수록, 모델의 학습 오차는 계속 해서 줄어들어 과적합이 되고 검증 오차는 어느 순간 증가한다. 이렇게 학습 오차는 줄어들지만 검증 오차가 줄어들지 않고 늘어나는 시점에서 학습을 중지하는 방법
딥러닝 훈련 과정에서 사용되는 학습률을 동적으로 조절하는 역할