Batch Normalization - λ°°μΉ μ κ·ν
Batch Normalization (λ°°μΉ μ κ·ν)μ κ°λ
μ 2015λ
μ μ μλ λ°©λ²μ
λλ€.
- μΌλ¨, Batch Normalization(λ°°μΉ μ κ·ν)κ° μ£Όλͺ©λ°λ μ΄μ λ λ€μμ μ΄μ λ€κ³Ό κ°μ΅λλ€.
- Training(νμ΅)μ 빨리 ν μ μμ΅λλ€. μ¦, Training(νμ΅) μλλ₯Ό κ°μ νλ ν¨κ³Όκ° μμ΅λλ€.
- μ΄κΉκ°μ ν¬κ² μμ‘΄νμ§ μλλ€λ νΉμ§μ΄ μμ΅λλ€.
- κ·Έλ¦¬κ³ Overifttingμ μ΅μ νλ νΉμ§μ΄ μμ΅λλ€. μ¦, Dropoutλ±μ νμμ±μ΄ κ°μν©λλ€.
- Batch Normalization(λ°°μΉ μ κ·ν)μ κΈ°λ³Έ μμ΄λμ΄λ μμμ λ§νλ―μ΄ κ° Layer(μΈ΅)μμμ Activation Value(νμ±ν κ°)μ΄ μ λΉν λΆν¬κ° λλλ‘ μ‘°μ νλ κ²μ
λλ€. νλ² μμλ₯Ό λ³΄κ² μ΅λλ€.
Batch Normalization(λ°°μΉ μ κ·ν)λ₯Ό μ¬μ©ν Neural Network(μ κ²½λ§)μ μμ
- Batch Normalization(λ°°μΉ μ κ·ν)λ κ·Έ μ΄λ¦κ³Ό κ°μ΄ νμ΅μ Mini-Batchλ₯Ό λ¨μλ‘ μ κ·νλ₯Ό ν©λλ€.
λ―Έλ λ°°μΉ(mini-batch)λ λ°μ΄ν°μ
μ μμ ν¬κΈ°μ μΌλΆλ‘ λλμ΄ λ€νΈμν¬λ₯Ό νμ΅μν€λ λ°©λ²μ
λλ€.
μ 체 λ°μ΄ν°μ
μ ν λ²μ λͺ¨λ μ¬μ©νλ κ²μ΄ μλλΌ λ°μ΄ν°λ₯Ό μμ λ°°μΉλ‘ λλμ΄ κ° λ°°μΉμ λν΄ μμ°¨μ μΌλ‘ νμ΅μ μ§νν©λλ€.
- ꡬ체μ μΌλ‘λ Mean(νκ· )μ΄ 0, Variance(λΆμ°)μ΄ 1μ΄ λλλ‘ μ κ·νν©λλ€. μμμΌλ‘λ μλμ μκ³Ό κ°μ΅λλ€.
- μ μμμ Mini-Batch B = B=x1β, x2 , ... ,xmβ mκ°μ μ
λ ₯ λ°μ΄ν°μ μ§ν©μ λν€ νκ· μBμ λΆμ° σBβ²μ ꡬν©λλ€.
- κ·Έλ¦¬κ³ μ
λ ₯ λ°μ΄ν°λ₯Ό Mean(νκ· )μ΄ 0, Variance(λΆμ°)μ΄ 1μ΄ λκ² Normalization(μ κ·ν) νκ³ , εμ 0μΌλ‘ λλλ μ¬νλ₯Ό μλ°©νλ μν μ ν©λλ€.
- λ Batch Normalization(λ°°μΉ μ κ·ν) Layer λ§λ€ μ΄ μ κ·νλ λ°μ΄ν°μ κ³ μ ν νλ scaleμ μ΄λ shift λ³νμ μνν©λλ€.
- μμμΌλ‘λ μλμ κ°μ΅λλ€.
- γ : νλ, β : μ΄λμ λ΄λΉν©λλ€.
- λ κ°μ μ²μμλ γ=1, β=0 (1λ°° νλ, μ΄λ μμ=μλ³Έ κ·Έλλ‘)μμ μμν΄μ νμ΅νλ©° μ ν©ν κ°μΌλ‘ μ‘°μ ν΄κ°λλ€.
- μ΄κ²μ΄ Batch Normalization(λ°°μΉ μ κ·ν)μ μκ³ λ¦¬μ¦μ
λλ€. μ€λͺ
ν λ΄μ©μ μλμ κ·Έλνλ‘ λνλΌ μ μμ΅λλ€.
Batch Normalization(λ°°μΉ μ κ·ν)μ κ³μ° κ·Έλν
Batch Normalization (λ°°μΉ μ κ·ν)μ ν¨κ³Ό
νλ² Batch Normalization(λ°°μΉ μ κ·ν) κ³μΈ΅μ μ¬μ©ν μ€νμ νλ² Mnist Datasetμ μ¬μ©νμ¬ Batch Normalization Layerλ₯Ό μ¬μ©ν λ, μ¬μ©νμ§ μμλμ νμ΅ μ§λκ° μ΄λ»κ² λ¬λΌμ§λμ§λ₯Ό λ³΄κ² μ΅λλ€.
# coding: utf-8
import sys
import os
import numpy as np
import matplotlib.pyplot as plt
sys.path.append(os.pardir) # λΆλͺ¨ λλ ν°λ¦¬μ νμΌμ κ°μ Έμ¬ μ μλλ‘ μ€μ
from dataset.mnist import load_mnist # MNIST λ°μ΄ν°μ
μ λΆλ¬μ€λ ν¨μ
from common.multi_layer_net_extend import MultiLayerNetExtend # λ€μΈ΅ μ κ²½λ§ λͺ¨λΈ ν΄λμ€
from common.optimizer import SGD, Adam # μ΅μ ν μκ³ λ¦¬μ¦ ν΄λμ€
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True)
# νμ΅ λ°μ΄ν°λ₯Ό μ€μ
x_train = x_train[:1000]
t_train = t_train[:1000]
max_epochs = 20
train_size = x_train.shape[0]
batch_size = 100
learning_rate = 0.01
# κ°μ€μΉ μ΄κΈ°ν νμ€νΈμ°¨ μ€μ λ° νμ΅ ν¨μ μ μ
def __train(weight_init_std):
# λ°°μΉ μ κ·νλ₯Ό μ μ©ν μ κ²½λ§ λͺ¨λΈκ³Ό μ μ©νμ§ μμ μ κ²½λ§ λͺ¨λΈ μμ±
bn_network = MultiLayerNetExtend(input_size=784,
hidden_size_list=[100, 100, 100, 100, 100],
output_size=10,
weight_init_std=weight_init_std,
use_batchnorm=True) # λ°°μΉ μ κ·ν μ¬μ©
network = MultiLayerNetExtend(input_size=784,
hidden_size_list=[100, 100, 100, 100, 100],
output_size=10,
weight_init_std=weight_init_std) # λ°°μΉ μ κ·ν λ―Έμ¬μ©
optimizer = SGD(lr=learning_rate) # νλ₯ μ κ²½μ¬ νκ°λ²
train_acc_list = [] # νμ΅ μ νλ κΈ°λ‘ λ¦¬μ€νΈ
bn_train_acc_list = [] # λ°°μΉ μ κ·ν μ μ© νμ΅ μ νλ κΈ°λ‘ λ¦¬μ€νΈ
iter_per_epoch = max(train_size / batch_size, 1)
epoch_cnt = 0
for i in range(1000000000):
batch_mask = np.random.choice(train_size, batch_size) # 무μμ λ°°μΉ μνλ§
x_batch = x_train[batch_mask]
t_batch = t_train[batch_mask]
for _network in (bn_network, network):
grads = _network.gradient(x_batch, t_batch) # κΈ°μΈκΈ° κ³μ°
optimizer.update(_network.params, grads) # κ°μ€μΉ μ
λ°μ΄νΈ
if i % iter_per_epoch == 0:
train_acc = network.accuracy(x_train, t_train) # μ νλ κ³μ°
bn_train_acc = bn_network.accuracy(x_train, t_train) # λ°°μΉ μ κ·ν μ μ© μ νλ κ³μ°
train_acc_list.append(train_acc)
bn_train_acc_list.append(bn_train_acc)
print("epoch:" + str(epoch_cnt) + " | " + str(train_acc) + " - "
+ str(bn_train_acc))
epoch_cnt += 1
if epoch_cnt >= max_epochs:
break
return train_acc_list, bn_train_acc_list
# κ·Έλν 그리기==========
weight_scale_list = np.logspace(0, -4, num=16)
x = np.arange(max_epochs)
for i, w in enumerate(weight_scale_list):
print("============== " + str(i+1) + "/16" + " =============
Batch Normalization ν¨κ³Ό: Batch Normalizationκ° νμ΅ μλλ₯Ό λμΈλ€.
- 보면 Batch Normalization (λ°°μΉ μ κ·ν)κ° νμ΅μ 빨리 μ§μ μν€κ³ μμ΅λλ€.
- κ·Έλ¬λ©΄ Weight μ΄κΉκ°μ νμ€νΈμ°¨λ₯Ό λ€μνκ² λ΄κΏκ°λ©΄μ νμ΅ κ²½κ³Όλ₯Ό κ΄μ°°ν κ·Έλν μ
λλ€.
- κ±°μ΄ λͺ¨λ κ²½μ°μμ Batch Normalization(λ°°μΉ μ κ·ν)λ₯Ό μ¬μ©ν λμ Training(νμ΅) μλκ° λΉ λ₯Έ κ²μΌλ‘ λνλ©λλ€.
- μ€μ λ‘ Batch Normalization(λ°°μΉ μ κ·ν)λ₯Ό μ΄μ©νμ§ μλ κ²½μ°μλ μ΄κ°κ°μ΄ μ λΆν¬λμ΄ μμ§ μμΌλ©΄ Training(νμ΅)μ΄ μ ν μ§νλμ§ μμ λͺ¨μ΅λ νμΈν μ μμ΅λλ€.
Summary: Batch Normalization(λ°°μΉ μ κ·ν)λ₯Ό μ¬μ©νλ©΄ Training(νμ΅)μ΄ λΉ¨λ¦¬μλ©΄, Weight(κ°μ€μΉ) μ΄κΉκ°μ ν¬κ² μμ‘΄ νμ§ μμλ λλ€λ νΉμ§μ΄ μμ΅λλ€.