각 층에서 활성화값이 적당히 분포되도록 조정하는 방법이 배치 정규화이다.
배치 정규화의 이점
배치 정규화를 사용한 신경망

배치 정규화는 학습 시 미니배치를 단위로 정규화한다. 데이터 분포가 평균이 0, 분산이 1이 되도록 정규화한다.

이 처리를 활성화 함수의 앞, 뒤에 삽임함으로써 데이터 분포가 덜 치우치게 할 수 있다.
배치 정규화 계층마다 이 정규화된 데이터에 고유한 확대와 이동 변환을 수행한다.

가 확대, 가 이동을 담당한다. , 부터 시작하고, 학습하면서 적합한 값으로 조정해간다.
오버피팅이란 신경망이 훈련 데이터에만 지나치게 적응 되어 그 외의 데이터에는 제대로 대응하지 못하는 상태이다.
가중치 감소는 학습 과정에서 큰 가중치에 대해서는 그에 상응하는 큰 페널티를 부과하여 오버피팅을 억제하는 방법이다.

드롭아웃은 뉴런을 임의로 삭제하면서 학습하는 방법이다.

class Dropout:
def __init__(self, dropout_ratio=0.5):
self.dropout_ratio = dropout_ratio
self.mask = None
def forward(self, x, train_flg=True):
if train_flg:
self.mask = np.random.rand(*x.shape) > self.dropout_ratio
return x * self.mask
else:
return x * (1.0 - self.dropout_ratio)
def backward(self, dout):
return dout * self.mask
순전파 때 신호를 통과시키는 뉴런은 역전파 때도 신호를 그대로 통과시키고, 순전파 때 통과시키지 않은 뉴런은 역전파 때도 신호를 차단한다.

(x_train, t_train), (x_test, t_test) = load_mnist()
x_train, t_train = shuffle_dataset(x_train, t_train)
validation_rate = 0.20
validation_num = int(x_train.shape[0] * validation_rate)
x_val = x_train[:validation_num]
t_val = t_train[:validation_num]
x_train = x_train[validation_num:]
t_train = t_train[validation_num:]
shuffle_dataset 함수는 np.random.shuffle을 이용해 훈련 데이터를 분리하기 전에 입력 데이터와 정답 레이블을 뒤섞는다.
weight_decay = 10 ** np.random.uniform(-8, -4)
lr = 10 ** np.random.uniform(-6, -2)