Hidden Layer의 오차 계산

Neural Network에서는 Forward Propagation 결과로 계산된 Output Layer 출력과 해당 입력 데이터 레이블의 차이를 계산하여 오차(손실, Error/Loss)를 계산합니다. 그리고 이 오차 최소화를 목표로 Hidden Layer들의 Weight(가중치)와 Bias(편향)를 업데이트합니다. 이렇게 딥러닝에서는 Neural Network에 데이터를 지속해서 흘려보내고, 오차를 계산한 후 Weight와 Bias를 수정하는 작업을 반복합니다.

Output Layer 출력과 레이블의 차이를 계산하고 은닉층의 Weight와 Bias를 업데이트하는 일련의 과정을 “역전파” 혹은 “Backpropagation“이라고 합니다. “Backpropagation“에서는 출력층의 오차로부터 은닉층의 노드별 오차를 계산하는 것이 핵심입니다. 은닉층의 노드별 오차를 알아야 은닉층의 Weight와 Bias를 수정할 수 있습니다.

본 문서에서는 한 개의 은닉층과 1개의 출력층으로 구성된 2 Layer 신경망에서 Forward Propagation을 적용하는 방법과 출력층의 오차로부터 은닉층의 오차를 계산하는 방법을 살펴보고, 그 계산법을 일반화하겠습니다.

시작하기 전에

본 문서는 Neural Network 표기법의 표기법을 따르고 있습니다. 본문에서 사용하는 용어는 다음과 같습니다.

  • Weight: 가중치
    • 각 레이어에 포함된 가중치 행렬
    • $W^{[l]}$로 표현
  • Bias: 편향
    • 각 레이어에 포함된 편향 행렬
  • Z: 각 레이어의 Input Sum 행렬
    • $Z^{[l]}$로 표현
    • Z 행렬은 컬럼 벡터로 구성
    • Z의 요소는 $z^{[l]}_i$로 표현, i는 행 인덱스
  • A: 각 레이어의 출력 행렬
    • $A^{[l]}$로 표현
    • A 행렬은 컬럼 벡터로 구성
    • A의 요소는 $a^{[l]}_i$로 표현, i는 행 인덱스
  • Output Layer: 출력층
    • 네트워크의 마지막 레이어
  • Input Layer: 입력층
    • 네트워크에서 입력데이터가 유입되는 층
    • $A^{[0]}$로 표현

예제 신경망

<그림 1>은 예제로 사용할 신경망입니다. 2 Layer Neural Network입니다.

Neural Network 예제: L=2, 2 Layer Neural Network
그림 1: Neural Network 예제: L=2, 2 Layer Neural Network
  • 입력층

$$ Input Feature = A^{[0]} = \begin{bmatrix} x_1 \\
x_2 \end{bmatrix} $$

  • 은닉층, Layer 1

$$ W^{[1]} = \begin{bmatrix} w^{[1]}11 & w^{[1]}12 \\
w^{[1]}21 & w^{[1]}22 \\
\end{bmatrix}, Z^{[1]} = \begin{bmatrix} z_1 \\
z_2 \end{bmatrix}, A^{[1]} = \begin{bmatrix} a_1 \\
a_2 \end{bmatrix}
$$

  • 은닉층, “Layer 2

$$ W^{[2]} = \begin{bmatrix} w^{[2]}11 & w^{[2]}12 \\
w^{[2]}21 & w^{[2]}22 \\
\end{bmatrix}, Z^{[2]} = \begin{bmatrix} z_1 \\
z_2 \end{bmatrix}, A^{[2]} = \begin{bmatrix} a_1 \\
a_2 \end{bmatrix},
E^{[2]} = \begin{bmatrix} e_1 \\
e_2 \end{bmatrix}
$$

Forward Propagation

Layer 1“과 “Layer 2“에서 Forward Propagation이 적용되는 절차를 소개합니다.

Layer 1“의 Forward Propagation

<그림 2>는 “Layer 1“에서 Forward Propagation을 설명합니다. “Layer 1“에서 Forward Propagation은 Input Sum과 활성화 함수 적용으로 구성됩니다.

Input Feature를 이용한 Forward Propagation
그림 2: Input Feature를 이용한 Forward Propagation

Layer 1“에서는 다음과 같은 수식이 수행됩니다.

  • Input Sum $$ Z^{[1]} = W^{[1]}A^{[0]}= \begin{bmatrix} w^{[1]}11 & w^{[1]}12 \\
    w^{[1]}21 & w^{[1]}22
    \end{bmatrix} \begin{bmatrix} x_1 \\
    x_2
    \end{bmatrix}= \begin{bmatrix} w^{[1]}11*x_1 + w^{[1]}12*x_2 \\
    w^{[1]}21*x_1 + w^{[1]}22*x_2
    \end{bmatrix}
    $$
  • Activation Function의 출력 $$ A^{[1]} = g(Z^{[1]})= \begin{bmatrix} a^{[1]}_1 \\
    a^{[1]}_2
    \end{bmatrix}
    $$

Layer 2“의 Forward Propagation

<그림 3>은 “Layer 2“의 Forward Propagation을 설명합니다. “Layer 2“에서 Forward Propagation은 Input Sum과 활성화 함수 적용, 출력에 대한 오차 계산을 수행합니다.

Layer 2에서 Forward Propagation
그림 3: Layer 2에서 Forward Propagation

Layer 2“에서 Input sum과 활성화 함수 적용 시 다음과 같은 수식이 적용됩니다.

  • Input Sum $$ Z^{[2]} = W^{[1]}A^{[1]}= \begin{bmatrix} w^{[2]}11 & w^{[2]}12 \\
    w^{[2]}21 & w^{[2]}22
    \end{bmatrix} \begin{bmatrix} a^{[1]}_1 \\
    a^{[1]}_2
    \end{bmatrix}= \begin{bmatrix} w^{[2]}11*a^{[1]}_1 + w^{[2]}12*a^{[1]}_2 \\
    w^{[2]}21*a^{[1]}_1 + w^{[2]}22*a^{[1]}_2
    \end{bmatrix}
    $$
  • Activation Function $$ A^{[2]} = g(Z^{[2]})= \begin{bmatrix} a^{[2]}_1 \\
    a^{[2]}_2
    \end{bmatrix}
    $$

출력층인 “Layer 2” 출력으로부터 오차는 <그림 4>와 같이 계산됩니다.

Layer 2(출력층)의 출력을 이용한 오차 계산
그림 4: Layer 2(출력층)의 출력을 이용한 오차 계산

Y“는 Input Feature의 실제 값인 레이블 행렬입니다.

  • 출력층의 오차 계산 $$ E^{[2]} = (Y - A^{[2]})^2 = ( \begin{bmatrix} y_1 \\
    y_2
    \end{bmatrix} - \begin{bmatrix} a^{[2]}_1 \\
    a^{[2]}_2
    \end{bmatrix}
    )^2 = \begin{bmatrix} e^{[2]}_1 \\
    e^{[2]}_2
    \end{bmatrix}
    $$

오차에 영향을 주는 인자

지금까지 Neural Network를 Forward Propagation을 진행하고 출력층의 결과로부터 오차를 계산하였습니다. 이 오차를 이용하면 출력층의 $\frac{dc}{dW^{[2]}}$와 $\frac{dc}{db^{[2]}}$를 계산하고 $W^{[2]}$와 $b^{[2]}$를 업데이트할 수 있습니다.1

우선 $E^2$의 첫 번째 노드의 오차 $e^{[2]}_1$에 영향을 미치는 요소는 무엇일까요? <그림 5>는 $e^{[2]}_1$에 영향을 미치는 요소를 설명합니다.

출력층의 첫 번째 노드의 오차에 영향을 미치는 요소
그림 5: 출력층의 첫 번째 노드의 오차에 영향을 미치는 요소

$e^{[2]}_1$에 영향을 미치는 인지는 “Layer 1“의 출력 값인 $a^{[1]}_1$과 $a^{[1]}_2$이며, 이 두 출력의 Input Sum(Z)에 이용되는 $w^{[2]}11$와 $w^{[2]}12$입니다. 이 4개의 인자로 부터 Input Sum을 계산합니다. 마지막으로 Input Sum의 결과인 $Z^2$를 활성화 함수에 적용한 출력값으로부터 오차를 계산합니다. 따라서 오차에 영향을 미치는 핵심 인자는 2개의 출력과 2개의 Weight입니다.

출력층의 두 번째 노드의 오차에 영향을 미치는 요소
그림 6: 출력층의 두 번째 노드의 오차에 영향을 미치는 요소

그렇다면 $e^{[2]}_2$에 영향을 미치는 요소를 무엇일까요? <그림 6>에서 확인할 수 있는 것처럼, $e^{[2]}_2$에 영향을 미치는 인지는 “Layer 1“의 출력 값인 $a^{[1]}_1$과 $a^{[1]}_2$, $w^{[2]}21$와 $w^{[2]}22$입니다.

결과적으로 오차에 영향을 미치는 인자는 이전 레이어 출력 값과 해당 노드에 할당된 Weight 값입니다. Fully Connected Neural Network2에서 앞 레이어의 출력은 다음 레이어의 모든 노드에 같이 사용됩니다. 노드별로 달라지는 인자는 노드 별로 지정된 Weight입니다. 결과적으로 오차에 영향을 미치는 핵심 인자는 해당 노드에 지정된 Weight 입니다. 노드에 지정된 Weight는 이전 레이어 노드 출력에 적용될 가중치입니다.

Hidden Layer의 오차 계산

출력층에서는 출력값과 출력 노드의 결과를 레이블로 갖고 있기 때문에 오차를 바로 계산할 수 있습니다. 그러나 Hidden Layer에는 레이블이 없습니다. 그렇다면 Hidden Layer의 오차는 어떻게 계산할까요?

다음과 같은 논리를 생각해 볼 수 있습니다.

  • 출력층에서 계산된 오차는 이전 레이어의 영향을 받은 결과이다.
  • 출력층의 오차는 이전 레이어 출력으로 부터 영향을 받고 있으며, 그 영향도를 현재 오차에 반영하여 이전 레이어에 오차를 분배할 수 있다.
  • 오차의 영향도 관점에서 출력층의 각 노드 오차 총합과 이전 레이어의 각 노드 오차 총합은 같다.
  • 출력층을 제외한 모든 은닉층은 다음 레이어의 오차와 가중치 비율로 부터 현재 레이어의 오차를 계산할 수 있다.

결과적으로 출력층의 오차를 비율로 이전 레이어에 순차적으로 재분배할 수 있고, 이 방식을 통해서 전체 은닉층 오차를 재 구성하여, 학습3을 진행할 수 있습니다. Hidden Layer의 오차는 <그림 7>에서 설명하는 오차 재분배 방식으로 계산될 수 있습니다.

Layer 2(출력층) 첫번째 노드 오차를 Layer 1에 분배
그림 7: Layer 2(출력층) 첫번째 노드 오차를 Layer 1에 분배

출력층의 $e^{[2]}_1$은 “Layer 1“의 출력 값인 $a^{[1]}_1$과 $a^{[1]}_2$와 해당 노드의 Weight인 $w^{[2]}11$와 $w^{[2]}12$에 의해 영향을 받습니다. “Layer 1“의 출력 값은 모든 노드에 공통된 입력 값입니다. 앞에서 설명한 것처럼 $e^{[2]}_1$에 영향을 미치는 핵심 인자는 지정된 Weight입니다. 따라서 Weight의 비율로 출력층의 오차를 이전 레이어에 재분배할 수 있습니다.

<그림 7>에서와 같이 $e^{[2]}_1$의 오차를 이전 레이어의 각 노드에 Weight의 비율로 재분배해보겠습니다. 여기서 비율은 이전 레이어의 해당 노드에 할당된 Weight의 합을 분모 $e^{[2]}_1$에 할당된 Weight를 분자로 하는 Weight 비율입니다.

$e^{[2]}_1$의 오차에서 $a^{[1]}_1$의 영향으로 만들어진 오차를 다음과 같이 계산할 수 있습니다.

  • $e^{[2]}_1$의 오차에서 $a^{[1]}_1$에서 발생한 오차 계산 $$ \frac{w^{1}11}{w^{1}11 + w^{1}12} * e^{[2]}_1 $$

추가로 $e^{[2]}_1$의 오차에서 $a^{[1]}_2$의 영향으로 만들어진 오차를 다음과 같이 계산할 수 있습니다.

  • e^{[2]}_1의 오차에서 $a^{[1]}_2$에서 발생한 오차 계산 $$ \frac{w^{1}21}{w^{1}21 + w^{1}22} * e^{[2]}_1 $$

예제에서 “Layer 1“은 2개의 노드로 구성되기 있기 때문에 $e^{[2]}_1$는 위에서 전개한 2개의 식으로 “Layer 1“의 두 노드에 분배됩니다.

  • $e^{[2]}_1$에서 Layer 1에 배분된 오차의 합 $$ \begin{align} e^{[2]}_1 & = \frac{w^{2}11}{w^{1}11 + w^{2}12} * e^{[2]}_1 + \frac{w^{2}21}{w^{2}21 + w^{2}22} * e^{[2]}_1 \\
    & = (\frac{w^{2}11}{w^{2}11 + w^{1}12} + \frac{w^{1}21}{w^{1}21 + w^{2}22} ) * e^{[2]}_1 \\
    & = \frac{w^{2}11 + w^{2}12}{w^{1}11 + w^{2}12} * e^{[2]}_1 \\
    & = e^{[2]}_1 \end{align} $$

위 식에서 $e^{[2]}_1$의 모든 오차는 비율에 따라서 이전 레이어에 재 분배되었으며, 재 분배의 총 합은 $e^{[2]}_1$과 같음을 확인할 수 있습니다.

Layer 1의 첫 번째 노드 오차

이제 관점을 달리해서 출력층의 오차로부터 은닉층의 첫 번째 노드 오차를 계산해 보겠습니다.

Lyaer 1의 첫번째 노드 오차 계산하기
그림 8: Lyaer 1의 첫번째 노드 오차 계산하기
  • $e^{[1]}_1$의 오차 계산 $$ e^{[1]}_1 = \frac{w^{2}11}{w^{2}11 + w^{2}12} * e^{[2]}_1 + \frac{w^{2}21}{w^{2}21 + w^{2}22} * e^{[2]}_2 $$

Layer 1의 오차 계산 행렬식

앞에서 계산한 공식은 <그림 8>과 같이 행렬식으로 표현할 수 있습니다.

Layer 1의 오차 계산 행렬식
그림 9: Layer 1의 오차 계산 행렬식

$$ E^{[1]}=\begin{bmatrix} \frac{w^{[2]}11}{w^{[2]}11+w^{[2]}12} & \frac{w^{[2]}21}{w^{[2]}21+w^{[2]}22} \\
\frac{w^{[2]}12}{w^{[2]}11+w^{[2]}12} & \frac{w^{[2]}22}{w^{[2]}21+w^{[2]}22}
\end{bmatrix} \begin{bmatrix} e^{[2]}_1 \\
e^{[2]}_2 \end{bmatrix} $$

오차 계산식 단순화

위 계산식은 다음과 같이 단순화할 수 있습니다.

$$ \begin{align} E^{[1]} & =\begin{bmatrix} \frac{w^{[2]}11}{w^{[2]}11+w^{[2]}12} & \frac{w^{[2]}21}{w^{[2]}21+w^{[2]}22} \\
\frac{w^{[2]}12}{w^{[2]}11+w^{[2]}12} & \frac{w^{[2]}22}{w^{[2]}21+w^{[2]}22}
\end{bmatrix} \begin{bmatrix} e^{[2]}_1 \\
e^{[2]}_2 \end{bmatrix} \\
& \equiv \begin{bmatrix} w^{[2]}11 & w^{[2]}21 \\
w^{[2]}12 & w^{[2]}22
\end{bmatrix} \begin{bmatrix} e^{[2]}_1 \\
e^{[2]}_2 \end{bmatrix} \end{align} $$

기존에 출력 노드의 오차에 대한 이전 레이어에서 대상 노드의 비율을 계산하기 위해서 관련 Weight 요소들의 합으로 나눈 부분(정규화)을 간소화된 식에서는 제거했습니다. 물론 기존에 비율을 정규화하던 부분이 제외했기 때문에 오차의 정확한 배분은 이뤄지지 않지만, 전체 학습 관점에서 보면 정규화를 제거한 영향도가 미비합니다. 이 방식은 Neural Network가 정확한 수치 보다는 경향성을 유지하는 방향으로 반복적으로 수행되는 특성 때문에 가능한 접근법 입니다. 이러한 이유로 은닉층의 오차를 계산할 때 일반적으로 단순화된 식을 사용합니다.

결론: 은닉층 오차는 W.T와 E의 행렬 곱

위에서 계산한 가중치 행렬은 <그림 10>과 같이 출력층의 W 전치행렬임을 알 수 있습니다. 따라서 <그림 10>과 같이 은닉층의 오차 계산식을 출력층의 W 전치행렬로 표현할 수 있습니다.

Layer 1의 오차 계산 결과
그림 10: Layer 1의 오차 계산 결과

은닉층 오차 계산식 일반화

지금까지 은닉층의 오차를 계산하는 과정을 살펴보았습니다. 은닉층의 오차를 계산하는 방법은 다음 레이어의 W 전치행렬과 E(오차) 행렬 곱으로 계산됩니다. 따라서 은닉층의 오차는 다음과 같이 일반화할 수 있습니다.

$$E^{[l]} \equiv W^{[l+1]T}E^{[l+1]}$$


  1. 오차로부터 $W^{[2]}$와 $b^{[2]}$ 업데이트하는 것을 Backpropagation이라고 합니다. Backpropagation의 세부적인 절차는 별도의 문서로 다루겠습니다.
    [return]
  2. Fully Connected Neural Network이란 앞 레이어의 모든 노드가 다음 레이어의 모든 노드에 연결되는 방식입니다.
    [return]
  3. 여기서 학습이란 오차로부터 Weight와 Bias의 미분을 구하고 Weight와 Bias를 업데이트하는 과정을 의미합니다. [return]
김태완 avatar
작성자: 김태완
1999년 부터 Java, Framework, Middleware, SOA, DB Replication, Cache, CEP, NoSQL, Big Data, Cloud를 키워드로 살아왔습니다. 현재는 빅데이터와 Machine Learning을 중점에 두고 있습니다.
E-mail: taewanme@gmail.com