배치 정규화

  • 데이터 셋을 사전에 정규화하는 것과는 달리 배치 정규화(batch normalization)은 각 미니 배치별로 학습 전에 정규화 처리를 하는 기법이다.
  • 데이터의 전처리로서 데이터 셋을 정규화하고 weight의 초기값을 정리함으로써 학습이 잘 진행되기는 하지만 학습시킬 대에는 신경망 모델 내부에서 분산이 편중되어 버리기 때문에 전처리를 한 효과가 한정적일 수 밖에 없다.
  • 배치 정규화는 학습에 사용하는 각 미니 배치별로 정규화를 하기 때문에 학습 과정 전체에서 효과가 나타난다.
  • 예를 들어 $m$개의 데이터로 구성된 미니 배치 $\mathbf{B}=\{x_1, x_2, \cdots, x_m\}$이 있다고 하면 미니 배치의 평균 $\mu_\mathbf{B}$과 분산 $\sigma^2_\mathbf{B}$은 각각 식 $(14.1)$과 식 $(14.2)$로 나타낼 수 있다.

\begin{align}\mu_\mathbf{B} &= \frac{1}{m} \sum_{i=1}^mx_i\tag{15.1}\\\\ \sigma^2_\mathbf{B} &= \frac{1}{m}\sum_{i=1}^m(x_i-\mu_\mathbf{B})^2\tag{15.2}\end{align}


  • 이와 달리 배치 정규화는 미니 배치에 포함된 각 데이터 $x_i$는 식 $(15.3)$와 식 $(15.4)$를 통해 변환된 $\{y_1,y_2,\cdots,y_m\}$을 배치 정규화된 출력 값으로 사용한다.
    • $\gamma$와 $\beta$가 이 모델의 매개변수이다.

\begin{align} \hat{x}_i &= \frac{x_i - \mu_\mathbf{B}}{\sqrt{\sigma^2_\mathbf{B} + \epsilon}}\tag{15.3}\\\\ y_i &= \gamma \hat{x}_i + \beta\tag{15.4}\end{align}


  • 배치 정규화를 사용한 딥러닝에서는 오차함수 $E$에 관해 해당 모델의 매개변수인 $\gamma$와 $\beta$가 이전 층에 전달할 $x_i$에 대한 경사를 각각 계산해야 하는데, 계산식은 다음과 같다.

\begin{align} \frac{\partial E}{\partial \gamma} &= \sum_{i=1}^m \frac{\partial E}{\partial y_i} \frac{\partial y_i}{\partial \gamma}\tag{15.5}\\&= \sum_{i=1}^m \frac{\partial E}{\partial y_i} \frac{\partial}{\partial \gamma}(\gamma \hat{x}_i + \beta)\tag{15.6}\\&= \sum_{i=1}^m \frac{\partial E}{\partial y_i} \hat{x}_i\tag{15.7}\\\\\frac{\partial E}{\partial \beta} &= \sum_{i=1}^m \frac{\partial E}{\partial y_i} \frac{\partial y_i}{\partial \beta}\tag{15.8}\\&= \sum_{i=1}^m \frac{\partial E}{\partial y_i} \frac{\partial}{\partial \beta}(\gamma \hat{x}_i + \beta)\tag{15.9}\\&= \sum_{i=1}^m \frac{\partial E}{\partial y_i} \tag{15.10}\\\\\frac{\partial E}{\partial x_i} &= \frac{\partial E}{\partial  \hat{x}_i} \frac{\partial \hat{x}_i}{\partial x_i} + \frac{\partial E}{\partial \mu_\mathbf{B}} \frac{\partial \mu_\mathbf{B}}{\partial x_i} + \frac{\partial E}{\partial \sigma^2_\mathbf{B}} \frac{\partial \sigma^2_\mathbf{B}}{\partial x_i} \tag{15.11}\\&= \frac{\partial E}{\partial  \hat{x}_i} \frac{\partial }{\partial x_i}\Bigg(\frac{x_i - \mu_\mathbf{B}}{\sqrt{\sigma^2_\mathbf{B} + \epsilon}}\Bigg) + \frac{\partial E}{\partial \mu^2_\mathbf{B}} \frac{\partial}{\partial x_i}\Bigg(\frac{1}{m} \sum_{i=1}^mx_i\Bigg) +\frac{\partial E}{\partial \sigma^2_\mathbf{B}} \frac{\partial}{\partial x_i} \Bigg(\frac{1}{m}\sum_{i=1}^m(x_i-\mu_\mathbf{B})^2\Bigg)\tag{15.12}\\&= \frac{\partial E}{\partial \hat{x}_i} \frac{1}{\sqrt{\sigma^2_\mathbf{B} + \epsilon}} + \frac{\partial E}{\partial \mu^2_\mathbf{B}} \frac{1}{m} +\frac{\partial E}{\partial \sigma^2_\mathbf{B}} \frac{2(x_i-\mu_\mathbf{B})}{m}\tag{15.13}\end{align}


  • 여기서 $\frac{\partial E}{\partial y_i}$는 역전파되어 온 오차로 우리가 알고 있는 값이다.  그러나 다른 경사값은 다음과 같이 구할 수 있기 때문에 모든 경사를 오차역전파법으로 최적화할 수 있다.

\begin{align} \frac{\partial E}{\partial \hat{x}_i} &= \frac{\partial E} {\partial y_i} \frac {\partial y_i} {\partial \hat{x}_i}\tag{15.14}\\&= \frac{\partial E} {\partial y_i} \frac {\partial } {\partial \hat{x}_i}\Bigg( \gamma \hat{x}_i + \beta\Bigg)\tag{15.15}\\&= \frac{\partial E} {\partial y_i} \gamma \tag{15.16}\\\\ \frac{\partial E}{\partial \sigma^2_\mathbf{B}} &= \sum_{i=1}^m \frac{\partial E} {\partial \hat{x}_i} \frac {\partial \hat{x}_i} {\partial \sigma^2_\mathbf{B}} \tag{15.17}\\&= \sum_{i=1}^m \frac{\partial E} {\partial \hat{x}_i} \frac {\partial } {\partial \sigma^2_\mathbf{B}} \Bigg( \frac{x_i - \mu_\mathbf{B}}{\sqrt{\sigma^2_\mathbf{B} + \epsilon}} \Bigg)\tag{15.18}\\&= \sum_{i=1}^m \frac{\partial E} {\partial \hat{x}_i} \frac {\partial } {\partial \sigma^2_\mathbf{B}} \Bigg( \bigg(x_i - \mu_\mathbf{B}\bigg)\bigg(\sigma^2_\mathbf{B} + \epsilon\bigg)^{-\frac{1}{2}}\tag{15.19}\\&= \sum_{i=1}^m \frac{\partial E} {\partial \hat{x}_i} \bigg(-\frac{1} {2}\bigg) \bigg(x_i - \mu_\mathbf{B}\bigg)\bigg(\sigma^2_\mathbf{B} + \epsilon\bigg)^{-\frac{1}{2}-1}\cdot \frac{\partial}{\partial \sigma^2_\mathbf{B}}\Big(\sigma^2_\mathbf{B}+\epsilon\Big)\tag{15.20}\\&= -\sum_{i=1}^m \frac{\partial E} {\partial \hat{x}_i}  \frac{x_i - \mu_\mathbf{B}} {2\sqrt{\big(\sigma^2_\mathbf{B} + \epsilon\big)^3 }}\tag{15.21}\\\\\end{align}


\begin{align}\frac{\partial E}{\partial \mu_\mathbf{B}}  &= \sum_{i=1}^m \frac{\partial E} {\partial \hat{x}_i} \frac {\partial \hat{x}_i} {\partial \mu_\mathbf{B}} + \frac {\partial E} {\partial \sigma^2_\mathbf{B} } \frac {\partial \sigma^2_\mathbf{B}} {\partial \mu_\mathbf{B}}\tag{15.22}\\&= \sum_{i=1}^m \frac{\partial E} {\partial \hat{x}_i} \frac {\partial } {\partial \mu_\mathbf{B}} \Bigg( \frac{x_i - \mu_\mathbf{B}}{\sqrt{\sigma^2_\mathbf{B} + \epsilon}} \Bigg)+ \frac {\partial E} {\partial \sigma^2_\mathbf{B} } \frac {\partial } {\partial \mu_\mathbf{B}} \Bigg( \frac{1}{m}\sum_{i=1}^m(x_i-\mu_\mathbf{B})^2 \Bigg) \tag{15.23}\\ &= \sum_{i=1}^m \frac{\partial E} {\partial \hat{x}_i} \Bigg( \frac{- 1}{\sqrt{\sigma^2_\mathbf{B} + \epsilon}} \Bigg)+ \frac {\partial E} {\partial \sigma^2_\mathbf{B} } \Bigg( \frac{2}{m}\sum_{i=1}^m(x_i-\mu_\mathbf{B})^{2-1} \Bigg) \frac{\partial } {\partial \mu_\mathbf{B}}\Big( x_i-\mu_\mathbf{B} \Big) \tag{15.24}\\&= \sum_{i=1}^m \frac{\partial E} {\partial \hat{x}_i} \Bigg( \frac{- 1}{\sqrt{\sigma^2_\mathbf{B} + \epsilon}} \Bigg)+ \frac {\partial E} {\partial \sigma^2_\mathbf{B} } \Bigg( \frac{2}{m}\sum_{i=1}^m(x_i-\mu_\mathbf{B})^{2-1} \Bigg) (-1) \tag{15.25}\\&= \sum_{i=1}^m \frac{\partial E} {\partial \hat{x}_i} \Bigg( \frac{- 1}{\sqrt{\sigma^2_\mathbf{B} + \epsilon}} \Bigg) - \frac {\partial E} {\partial \sigma^2_\mathbf{B} } \Bigg( \frac{2}{m}\sum_{i=1}^m(x_i-\mu_\mathbf{B}) \Bigg) \tag{15.26}\end{align}


  • 배치 정규화는 미니 배치에 포함된 데이터를 정규화하기 때문에 지금까지는 층의 활성화 함수를 식 $(12.127)$과 같이 표현했다.

\begin{align} \mathbb{h} = f(W\mathbb{x}+\mathbb{b})\tag{15.27}\end{align}


  • 미니 배치에 해당하는 식 $(15.4)$의 처리과정을 $BN_{\gamma,\beta}(\mathbb{x}_i)$라고 한다면 층의 활성화를 나타내는 식 $(15.27)$은 다음과 같이 쓸 수 있다.

\begin{align} \mathbb{h} = f(BN_{\gamma,\beta}(W\mathbb{x}_i) )\tag{15.28}\end{align}


  • 식 $(15.28)$에서 바이어스는 신경쓰지 않아도 된다는데 왜 그렇지?
  • 위 논문에서 주장하는 미니 배치의 장점으로는 다음과 같다.
    • 학습률을 크게 설정해도 학습이 잘 진행됐다.
    • 드롭아웃을 사용하지 않아도 일반화 성능이 높다.


  • TensorFlow에서는 tf.nn.batch_normalization()를 사용하면 되지만 해당 API를 사용하지 않고 코드로 구현하면 다음과 같다.
    • 식 $(15.3)$과 식 $(15.4)$를 구현한 것이 batch_normalization()이다.
    • tf.nn.moments() 함수는 평균과 분산을 계산해 반환한다.
    • '은닉층-출력층'은 지금까지 해왔던 것처럼 softmax() 함수를 사용한다.
def inference(x, keep_prob, n_in, n_hiddens, n_out):
    # 미니 배치
    def weight_variable(shape):
        initial = np.sqrt(2.0 / shape[0]) * tf.truncated_normal(shape)
        return tf.Variable(initial)

    def bias_variable(shape):
        initial = tf.zeros(shape)
        return tf.Variable(initial)

    def batch_normalization(shape, x):
        # 배치 정규화 처리
        eps = 1e-8
        beta = tf.Variable(tf.zeros(shape))
        gamma = tf.Variable(tf.ones(shape))
        mean, var = tf.nn.moments(x, [0])
        return gamma * (x - mean) / tf.sqrt(var + eps) + beta

    # 미니 배치  입력층-은닉층, 은닉층-은닉층
    for i, n_hidden in enumerate(n_hiddens):
        if i == 0:
            input = x
            input_dim = n_in

        else:
            input = output
            input_dim = n_hiddens[i-1]

        W = weight_variable([input_dim, n_hidden])
        u = tf.matmul(input, W)
        h = batch_normalization([n_hidden], u)
        output = tf.nn.relu(h)

    # 은닉층-출력층
    W_out = weight_variable([n_hiddens[-1], n_out])
    b_out = bias_variable([n_out])
    y = tf.nn.softmax(tf.matmul(output, W_out) + b_out)

    return y

그림 15.1 TensorFlow에서 미니 배치 정규화 알고리즘에서 Adam Optimizer를 사용했을 때의 정확도와 오차 변화


  • Keras에서는 from keras.layers.normalization import BatchNormalization을 선언하고 학습과정에서 BatchNormalization()을 사용하면 된다.
model = Sequential()

for i, input_dim in enumerate(([n_in] + n_hiddens)[:-1]):
    model.add(Dense(input_dim=input_dim, units=n_hiddens[i], init=weight_variable))
    model.add(BatchNormalization())
    model.add(LeakyReLU(alpha=alpha))

model.add(Dense(units=n_out, kernel_initializer=weight_variable))
model.add(Activation('softmax'))

그림 15.2 Keras에서 미니 배치 정규화 알고리즘에서 Adam Optimizer를 사용했을 때의 정확도와 오차 변화


출처 : 정식으로 배우는 딥러닝

+ Recent posts