이번 포스트(Part 1)에서는 TensorFlow로 DNN을 구현하기 전에 먼저 기본 개념을 알아보고 다음 포스트(Part 2)에서는 인공 신경망을 가능하게 한 Back Propagation 에 대해 알아보도록 하겠다.(모바일에는 최적화되어있지 않으니 가능하면 PC로 보시길 추천한다)

thumbnail

목차

Neural Network 역사

1943년, 워런 맥컬록(Warren McCulloch)와 월터 피츠(Walter Pitts)의 수학과 임계 논리(Threshold logic)라 불리는 알고리즘을 바탕으로 Neural Network 역사가 시작되었다.

하지만, 1969년에 마빈 민스키(Marvin Minsky)와 시모어 페퍼트(Seymour Papert)에 의해 기계학습 논문이 발표된 후 침체되었는데, 그 이유는 두 가지였다.

  1. 단층 신경망 은 선형으로 분류하기 때문에 아래의 그림처럼 문제가 배타적 논리합 회로(XOR problem)인 경우에는 해결하지 못한다.

  2. Computing power가 부족하다.

위의 두 가지 문제점 외에도 가중치를 업데이트하기 위한 회로 수학 계산이 너무 복잡하였기에 오차역전파법(Back Propagation) 이 세상에 나오기 전까지는 연구가 침체될 수밖에 없었다.

Feedforward Propagation 설명

네트워크 초기화

network $$ Input = \left[ \begin{array}{cccc} i_{1} & i_{2} \\\end{array} \right] $$ $$ W_{ij} = \left[ \begin{array}{cccc} W_{i1j1} & W_{i1j2} & W_{i1j3} \\ W_{i2j1} & W_{i2j2} & W_{i2j3} \\\end{array} \right] W_{jk} = \left[ \begin{array}{cccc} W_{j1k1} & W_{j1k2} & W_{j1k3} \\ W_{j2k1} & W_{j2k2} & W_{j2k3} \\ W_{j3k1} & W_{j3k2} & W_{j3k3} \\ \end{array} \right] W_{ko} = \left[ \begin{array}{cccc} W_{k1o1} & W_{k1o2} \\ W_{k2o1} & W_{k2o2} \\ W_{k3o1} & W_{k3o2} \\ \end{array} \right] $$ $$ Output = \left[ \begin{array}{cccc} o_{1} & o_{2} \\\end{array} \right] $$

이 포스트에서는 간단한 계산을 위해 Hidden layer가 2층 구조인 모형으로 초기화를 하였지만, 실제로는 layer마다 Neuron 개수나 Hidden layer의 층수는 우리가 알아내야 할 하이퍼 파라미터이다.

인공 신경망 알고리즘에는 여느 예측 문제와 마찬가지로 Feature에 해당하는 Input이 존재하고, 들어온 데이터들이 Hidden layer의 Neuron이 가진 하이퍼 파라미터에 의해 모양이 바뀌는 비선형 기저 함수

기저 함수 는 위에서 설명한 배타적 논리합 회로(XOR problem)를 해결하기 위한 방법으로, Input데이터 x대신 φ(x)를 사용하는 것을 의미한다. 여기서 "하이퍼 파라미터에 의해 모양이 바뀌는"라는 수식어가 붙은 이유는 Hidden layer로 이동할 때 계산되는 행렬(Matrix)Bias 에 의해서 계속해서 모양을 바뀌는 것을 의미한다. 가장 기본적인 Activation 함수 인 Logistic Sigmoid를 예로 보자면, $$ Sigmoid = 1/(1+\mathrm{e}^{-(w_{ji}x + b_{j})}) $$ 형태의 기저함수를 가지게 되는 것.

에 의해서 비선형 문제를 해결할 수 있는 형태로 정보의 차원을 변경하며 전파하는 과정을 거친다. 마지막에는 Output으로 분류인 경우에는 Class 개수만큼, 회귀분석인 경우에는 1개의 실수값을 내보내는 것으로 마무리 된다.

역방향 전파(Back Propagation) 을 이해하기 위해서는 먼저 인공신경망의 계산 과정인 순방향 전파(Feedforward propagation) 를 이해해야 하므로 살펴보도록 하자.


Layer 1 (Input -> J)

layer j
$$ \definecolor{first}{RGB}{10, 199, 139} \definecolor{second}{RGB}{74, 144, 226} \left[ \begin{array}{cccc} i_{1} & i_{2} \\\end{array} \right] \times \left[ \begin{array}{cccc} \textcolor{first}{W_{i1j1}} & \textcolor{first}{W_{i1j2}} & \textcolor{first}{W_{i1j3}} \\ \textcolor{second}{W_{i2j1}} & \textcolor{second}{W_{i2j2}} & \textcolor{second}{W_{i2j3}} \\\end{array} \right] + \left[ \begin{array}{cccc} b_{j1} & b_{j2} & b_{j3} \\\end{array} \right] $$ $$ \downarrow $$ $$ \definecolor{first}{RGB}{10, 199, 139} \definecolor{second}{RGB}{74, 144, 226} \left[ \begin{array}{cccc} \textcolor{first}{W_{i1j1}} \times i_{1} + \textcolor{second}{W_{i2j1}} \times i_{2} + b_{j1} \\ \textcolor{first}{W_{i1j2}} \times i_{1} + \textcolor{second}{W_{i2j2}} \times i_{2} + b_{j2} \\ \textcolor{first}{W_{i1j3}} \times i_{1} + \textcolor{second}{W_{i2j3}} \times i_{2} + b_{j3} \\ \end{array} \right]^{T} = \left[ \begin{array}{cccc} J_{in1} \\ J_{in2} \\ J_{in3} \\\end{array} \right]^{T} $$

계산은 어려운게 없으니 따로 설명하지 않겠다. 중요한 점은 Hidden layer는 들어온 값(Jin)과 나가는 값(Jout)이 다르다는 것이다. 그 과정은 아래에서 살펴보자.