본문 바로가기
지능형시스템/머신러닝

[머신 러닝/딥 러닝] 인공신경망 (Artificial Neural Network, ANN)과 역전파 알고리즘 (Backpropagation Algorithm)

by CHML 2018. 4. 21.

Artificial neural network (ANN)는 딥 러닝의 가장 핵심적인 기술로써, 신경 세포인 neuron을 추상화한 artificial neuron으로 구성된 네트워크이다. ANN은 일반적으로 어떠한 형태의 function이든 근사할 수 있는 universal function approximator로도 알려져 있다. 이 글에서는 ANN을 구성하는 가장 작은 요소인 artificial neuron부터 multi-layer ANN과 이를 학습시키기 위한 algorithm에 대해 서술한다.


1. Neuron과 artificial neuron

Neuron은 생물체의 신경계를 이루는 신경 세포를 말하며, artificial neuron은 생물체의 neuron을 구성하는 dendrite, soma, axon의 기능을 추상화한 것이다. 생물체의 neuron과 artificial neuron은 [그림 1]과 같은 구조를 갖는다.


[그림 1] 생물체의 neuron (좌)과 artificial neuron (우)


Artificial neuron은 생물체의 neuron을 구성하는 각 요소를 다음과 같이 추상화한다.


  • Dendrite: 전기적 신호를 통해 입력 신호를 받는 기능을 수행한다. Artificial neuron에서는 벡터의 형태로 입력된 데이터 $\textbf{x}= [x_1 \: x_2 \: ... \: x_M]^T$를 전달받는 역할을 한다.

  • Soma: dendrite를 통해 전달받은 입력을 합산하는 기능을 수행한다. Artificial neuron에서는 각각의 dendrite의 입력에 weight라고 하는 $\textbf{w} = [w_1 \: w_2 \: ... \: x_M]^T$를 곱하여 합산한다. Artificial neuron에서 soma의 output $s(\textbf{x};\theta)$는 $s(\textbf{x};\theta) = \sum_{j=1}^{M} w_j x_j + b$로 정의되며, linear function의 형태를 갖는다. 이때 $b$는 bias라고 하는 linear function의 상수항이며, $\theta$는 artificial neuron을 구성하는 parameter인 $\textbf{w}$와 $b$를 의미한다.

  • Axon: soma에서 계산된 값을 출력한다. Artificial neuron에서는 soma에서 출력된 $s(\textbf{x};\theta)$를 activation function $f$에 입력하여 계산된 output $y$를 전달한다. 이때 activation function은 $s(\textbf{x};\theta)$를 바탕으로 어떠한 결정을 내리는 기능을 수행한다. Activation function으로는 unit step function, sigmoid function, cross entropy 등 다양한 형태의 function을 이용될 수 있다.

Classification 문제를 풀고자 할 때, artificial neuron (이하 neuron)의 역할은 주어진 데이터 $\textbf{x}$가 어떠한 class에 속하는지를 판별하는 것이다. 이때 Neuron은 $\textbf{x}$와 $\textbf{w}$를 곱하여 생성된 $s(\textbf{x};\theta)$를 $f$에 입력한 뒤, $f$를 통해 출력된 값을 바탕으로 주어진 데이터가 어디에 속하는지를 판별한다. Neuron을 이용하여 데이터를 분류하기 위해서는 classification과 training이라는 두 가지 문제를 해결해야 한다.


  • Classification: 주어진 데이터 $\textbf{x}$에 대한 neuron의 output $y = g(\textbf{x};\theta)$를 계산하여, 이를 바탕으로 $\textbf{x}$가 어떠한 class에 속하는지를 판별한다. 이 문제는 $y = g(\textbf{x};\theta) = f(s(\textbf{x};\theta)) = f(\sum_{j=1}^{M} w_j x_j + b)$를 계산함으로써 해결된다.
  • Training: 주어진 training dataset $\mathcal{X}$를 이용하여 neuron의 특정한 역할을 수행하도록 조정한다. Neuron의 output $y$는 activation function $f$와 weight $\textbf{w}$, bias $b$에만 영향을 받으며, 일반적으로 $f$의 형태는 사람이 직접 설정하기 때문에 neuron을 training한다는 것은 적절한 $\textbf{w}$와 $b$를 찾는 것과 같다.

Neuron을 이용한 classification에 대한 예제로써 하나의 neuron을 이용하여 [표 1]과 같은 AND 연산을 training하는 문제를 생각할 수 있다.


[표 1] AND 연산


[표 1]은 neuron을 training하기 위한 training dataset $\mathcal{X}$에 해당하며, [표 1]에서 $t$는 주어진 데이터에 대한 답을 나타내는 label (또는 target value)이다. 예를 들어, $\textbf{x} = [0 \: 0]^T$일 경우 $t = 0$이므로, [표 1]에 대한 training이 완료된 neuron은 $[0 \: 0]^T$에 대해 $0$을 출력해야 한다. 이 문제를 풀기 위해 우리는 activation function으로써 [식 1]과 같은 unit step function을 이용할 수 있다.



적절한 training algorithm을 이용하여 $\textbf{w} = [0.3 \: 0.2]^T$와 $b = -0.4$를 찾았다고 가정할 때, neuron은 다음과 같은 과정을 통해 classification을 수행한다.






따라서, neuron을 통해 정의된 함수 $y = f(0.3x_1 + 0.2x_2 - 0.4)$는 AND 연산과 동일하게 동작하는 것을 확인할 수 있다. Neuron을 비롯한 ANN의 기본적인 원리는 위의 AND 연산에 대한 예제처럼 training dataset을 바탕으로 neuron 또는 ANN을 training하여 우리가 원하는 함수를 근사하는 것이다.


2. Neuron의 training

Neuron을 training한다는 것은 위의 AND 연산에 대한 예제처럼 주어진 training dataset에 의도된 대로 neuron이 동작하도록 $\theta = \{\textbf{w}, b\}$를 결정하는 것이다. Neuron을 학습시키기 위해서는 먼저 cost function $C$를 정의해야 한다. $C$는 반드시 입력 데이터 $\textbf{x}$에 대한 정답인 $t$와 학습시키고자 하는 model의 출력인 $y = g(\textbf{x};\theta)$의 차이를 계산할 수 있도록 설계되어야 한다. 예를 들어, 우리는 $N$개의 데이터를 포함하는 training dataset을 학습시키기 위해 [식 2]와 같은 sum of squared error를 cost function으로써 이용할 수 있다.



적당한 cost function $C$를 설정하였다면, neuron을 training한다는 것은 $C$가 작아지도록 $\textbf{w}$와 $b$를 찾아가는 것과 같다. Neuron을 training할 때는 주로 gradient descent method 이용하며, 아래의 [Algorithm 1]과 같이 neuron을 training 한다.



따라서, gradient descent method를 이용하여 neuron을 training하기 위해서는 $C$를 $\theta = \{\textbf{w}, b\}$에 대해 편미분 해야 한다. 이 글에서는 activation function을 [그림 2]와 같이 미분 가능한 sigmoid function으로 설정했다고 가정하고, [Algorithm 1]의 (a)와 (b)에 해당하는 $\textbf{w}$와 $b$에 대한 update rule을 전개한다.


[그림 2] Sigmoid function


Cost function $C$를 $w_j$에 대해 편미분 하면 다음과 같다.



따라서, $w_j$에 대한 update rule은 [식 4]와 같다.



이때 $\eta$는 learning rate 또는 step size라고 하는 gradient descent method의 hyper-parameter이며, 주로 0.1 이하의 매우 작은 값으로 설정된다. 마찬가지로 $b$에 대한 update rule은 [식 5]와 같다.



[Algorithm 1]의 (a)와 (b)에 각각 [식 4]와 [식 5]의 결과를 대입하면, neuron을 training하기 위한 gradient descent method의 구현이 완료된다.


3. Single-layer ANN

ANN은 위에서 정의한 neuron을 다수 포함하는 layer라는 구조를 여러 개 쌓아서 만든 것이다. 그중에서도 single-layer ANN은 neuron으로 이루어진 layer가 하나뿐인 것을 말한다. 아래의 [그림 3]은 single-layer ANN의 구조를 보여주며, 각각의 원은 하나의 neuron을, 화살표는 neuron이 연결되어 있음을 나타낸다. 이때 각각의 연결에는 weight가 부여된다.


[그림 3] Single-layer ANN


그러나 [그림 3]의 ANN에는 분명 2개의 layer가 존재하는데, 이러한 ANN을 왜 single-layer라고 하는지 생각할 수 있다. 모든 ANN에는 input layer라는 층이 존재하지만, input layer는 단순히 주어진 데이터 $\textbf{x}$를 그대로 전달하는 역할만 하기 때문에 [그림 3]의 ANN에서 실제 neuron으로 이루어진 layer는 output layer 하나뿐이다.

일반적으로 ANN에서 하나의 neuron은 binary class를 분류하도록 설계된다. 즉, neuron의 output $y$는 $\{0, 1\}$의 값을 갖거나 $[0, 1]$ 사이의 값을 갖도록 설정된다. 따라서, $K$개의 class가 존재하는 classification 문제를 풀기 위해서는 ANN이 output layer에 $K$개의 neuron을 포함하도록 설계해야 한다. 예를 들어, ANN을 이용하여 class가 3개인 classification 문제를 풀고자한다면, output layer에는 3개의 neuron이 존재하며, neuron들의 출력 $\textbf{y} = [y_1 \: y_2 \: y_3]$는 1, 2, 3번째 class에 대해 각각 [1 0 0], [0 1 0], [0 0 1]이 될 것이다.


4. Single-layer ANN의 training

Single-layer ANN을 training하기 위한 sum of squared error형태의 cost function $C$는 [식 6]과 같다.



위의 [식 6]에서 $t_{ni}$는 $n$번째 데이터에 대한 label vector $t_n$의 $i$번째 요소이며, $y_i$는 output layer를 구성하는 $i$번째 neuron의 output이다. Neuron의 각 parameter에 대한 update rule을 유도할 때와 마찬가지로 cost function $C$를 $i$번째 neuron의 $j$번째 weight $w_{ij}$에 대해 편미분 하면 다음과 같다. 이때 activation function은 sigmoid function으로 설정되었다고 가정한다.



따라서, $i$번째 neuron의 $j$번째 weight $w_{ij}$에 대한 update rule은 [식 8]과 같다.



또한, $i$번째 neuron의 bias $b_i$에 대한 update rule은 [식 9]와 같다.



Single-layer ANN은 실질적으로 서로 독립적인 neuron을 여러 개 나열한 것이기 때문에 single-layer ANN의 각 neuron에 대한 update rule은 [식 4, 5]에 정의된 neuron의 update rule과 크게 다르지 않다.


5. Multi-layer ANN

아래의 [그림 4-(a)]는 우리가 classification하고자 하는 데이터의 분포를 보여준다. 이 데이터를 완벽하게 분류하기 위해서는 [그림 4-(a)]와 같이 다소 복잡한 형태의 function이 필요하다. 게다가 때로는 너무나도 복잡한 형태의 function이 필요하여 단순한 single-layer ANN으로는 표현하는 것의 불가능에 가까울 수도 있다. 이러한 문제의 대표적인 예시로는 XOR 문제가 있다. 그러나 만약 어떠한 변환을 적용하여 [그림 4-(a)]의 데이터 분포를 [그림 4-(b)]와 같이 변경할 수 있다면, 단순한 형태의 linear function만으로도 데이터를 완벽히 classification할 수 있게 될 것이다.


[그림 4] 데이터 변환과 classification


Multi-layer ANN의 가장 중요한 특성은 주어진 데이터를 그대로 이용하여 classifier를 형성하는 것이 아니라, hidden layer라는 구조를 추가함으로써 classifier를 형성함과 동시에 주어진 데이터에 최적화된 변환 연산을 training한다는 점이다. 또한, hidden layer의 neuron의 수에 따라서는 주어진 데이터의 차원을 축소하거나 증가시키는 기능도 수행할 수 있다.

Multi-layer ANN은 neuron으로 이루어진 layer를 2개 이상 포함하는 ANN을 말한다. 아래의 [그림 5]는 multi-layer ANN의 구조를 나타내며, output layer와 input layer를 제외한 모든 layer를 hidden layer라고 한다. 이 글에서는 앞으로 multi-layer ANN을 단순히 ANN이라고 할 것이다.


[그림 5] Multi-layer ANN


ANN의 hidden layer는 output layer와 마찬가지로 neuron들로 구성된다. 따라서, output layer처럼 각각의 hidden layer도 weight 행렬과 bias 벡터를 parameter로 갖는다. 예를 들어, 3차원 입력 데이터에 대해 neuron의 수가 각각 10, 6, 4인 2개의 hidden layer와 output layer로 구성된 ANN을 생성했다면, 이 ANN에 존재하는 weight와 bias의 수는 총 134가 된다.


6. Multi-layer ANN의 training과 backpropagation algorithm

Multi-layer ANN의 output layer는 single-layer ANN의 output layer와 동일하게 cost function을 정의하여 이를 최소화하는 방식으로 training할 수 있다. 따라서, activation function으로 sigmoid function을, cost function으로 sum of squared error를 사용할 경우 output layer를 구성하는 neuron에 대한 update rule은 [식 10, 11]과 같다. 이때 $L$은 ANN을 구성하는 layer의 수이며, $w_{ij}^{(l)}$은 $l$번째 layer를 구성하는 $i$번째 neuron의 $j$번째 weight, $b_{i}^{(l)}, y_{i}^{(l)}$은 각각 $i$번째 neuron의 bias와 output이다. 또한 $l$번째 layer에 입력되는 $j$번째 입력 $x_{j}^{(l)}$은 $y_{j}^{(l-1)}$과 같다.




그동안 neuron을 구성하는 parameter에 대한 update rule은 training dataset에 포함된 label을 이용하여 정의한 cost function을 최소화하는 weight와 bias를 계산함으로써 유도되었다. 그러나 hidden layer의 경우에는 label이 존재하지 않기 때문에 cost function을 정의할 수가 없다는 문제가 있다. Backpropagation algorithm은 이러한 문제를 해결하여 multi-layer ANN을 training하기 위해 고안되었다. Backpropagation의 기본적인 아이디어는 [그림 6]과 같이 output layer의 output과 cost function으로부터 계산된 오차 ($t$와 $y$의 차이)를 hidden layer로 역전파하는 것이다.


[그림 6] 오차의 역전파


먼저, backpropagation algorithm에서는 $\delta_{k}^{(l)}$라는 변수를 [식 12]와 같이 정의한다.



이때 $C$는 output layer의 cost function이다. 최상층 hidden layer인 $L-1$번째 layer을 구성하는 $i$번째 neuron의 $j$번째 weight $w_{ij}^{(L-1)}$에 대한 update rule은 아래와 같이 유도된다. 이때 $K_l$은 $l$번째 layer를 구성하는 neuron의 수이며, $M_l$은 $l$번째 layer에 입력되는 데이터의 차원이다.



따라서, $w_{ij}^{(L-1)}$은 [식 13]과 같이 update된다.



만약 activation function으로 sigmoid function을 이용한다면, $w_{ij}^{(L-1)}$의 update rule은 [식 14]와 같다.



이를 일반화하면, $l$번째 layer를 구성하는 $i$번째 neuron의 $j$번째 weight $w_{ij}^{(l)}$에 대한 update rule은 [식 15]와 같다.



또한, $b_{i}^{(l)}$에 대한 update rule은 [식 16]과 같다.



Backpropagation algorithm에서는 $l$번째 layer에 대한 training을 진행할 때, [식 12]에서 정의한 $\delta_{i}^{(l)}$을 메모리에 저장하여 $l-1$번째 layer를 training할 때 이용할 수 있도록한다. 이는 동적 프로그래밍 (dynamic programming)의 개념과 같다.