180822-reminders

이제 1단원을 마무리하며 최종 정리 및 요약을 해보겠습니다. 이 포스트에 MLP(Multi Layer Perceptrons)의 내용을 모두 담았습니다. MLP를 훈련하기 위해서는 다음과 같은 과정을 거쳐야 합니다.

이제 차근차근 따라가면서 한 과정을 복습해보겠습니다.


Feedforward Neural network

180822-ffnn

가장 기본적인 FFNN (Feed Forward Neural Network)의 다이어그램입니다. 우리의 목표는 Input에 대한 Output을 가장 잘 예상하는 Weights를 찾는 것입니다. 그렇게 하기 위해서는 학습셋을 이용하여 출력을 구하고(feedforward) 출력에 대한 에러를 구한 후 error가 줄어드는 방향을 찾아 업데이트 해주는 과정(Backpropagation)을 반복하여 Weights를 찾습니다.

180822-ffnn2

네트워크에서 하나의 노드를 다이어그램으로 나타내면 다음과 같습니다. input은 Weight (우리가 찾고자 하는 값)에 의해 가중되고 더해진 뒤 bais가 더해진 후 Activation 함수를 거쳐 출력됩니다. 이후, 이렇게 출력된 output과 실제 값을 비교하여 error를 계산한 후 backpropagate 하여 weight를 업데이트 할 것입니다.

Feedforward

180822-ffnn3

그럼 본격적으로 input을 네트워크에 입력하여 출력을 얻는 과정을 살펴보겠습니다.

180822-ffnn4

input은 벡터로, weight는 행렬이므로 node의 출력은 행렬곱에 의해 구해집니다.

110822-eq1

이렇게 구해진 node의 출력은 Activation 함수에 들어갑니다.

180822-ffnn5

110822-eq2

이렇게 레이어의 한 층 - hidden layer - 까지 왔습니다.
같은 방식으로 계산해 나가면 최종 출력 를 계산할 수 있습니다.

마지막으로, Error를 계산합니다. 우리는 squared-error를 사용하겠습니다. (loss function이라고 부릅니다.)

$$ e = (d - y)^2 $$ e: error d: desired output y: calculated output

Backpropagation

180822-ffnn6

이제는 앞서 구한 error를 다시 뒤로 돌려보냅니다.
그리고 error를 줄이는 방향으로 weight를 업데이트 해줍니다.
이를 backpropagation이라고 합니다.

이 때 두가지 수학적 방법을 사용합니다.

따라서 update된 Weight는 다음과 같습니다.

180822-ffnn7

Generalization

180822-ffnn8

그림과 같이 레이어 k의 노드 i와 레이어 k+1의 노드 j 사이의 Weight를 라고 해봅시다.

180822-ffnn9

그렇다면 weight가 바뀌면 에러가 얼마나 바뀌는가? 를 찾아야 합니다.

즉 output Error에 대한 의 편미분은 1번,
update된 weight는 2번입니다.

이때, error는 위에서 말한대로 입니다. 이후 미분 계산의 편의성을 고려하여 으로 사용하겠습니다.

180822-ffnn10

그렇다면 update되는 weight은
이 됩니다. ​ output의 편미분은 라고 씁니다.

이를 gradiant라고 합니다.


Example

180822-ffnn11

문제를 단순화 하여 실제 계산을 해보겠습니다. 간단한 input과 output, 3개의 hidden node로 구성된 네트워크입니다.

우리의 목표는 다음과 같습니다.

Feedforward example

180822-ffnn12

가장 먼저 input에 대한 hidden node의 출력은 다음과 같습니다.
input과 weight W1를 행렬곱 한 후 activation 함수 계산을 합니다.

180822-ffnn13

최종 출력은 위와 같습니다. 마찬가지로 W2와 행렬곱을 해줍니다. 이 값이 우리가 구한 값에 해당합니다.

우리가 원하는 출력인 와 비교하여 Error를 구할 수 있습니다.

180822-ffnn10

이때 gradient는 다음과 같다고 했습니다.

Backpropagation example

이제 backpropagation을 해줍니다.
backpropagation은 두 단계로 나누어집니다.

180822-ffnn14

Step 1: hidden layer <- output

180822-ffnn15 180822-ffnn16

gradient를 계산해보니, gradient는 로 나왔습니다.
이는 출력 가 single node이기 때문입니다.

이전에 update되는 weight은 다음과 같다고 했습니다.

그러므로 update되는 weight는 다음과 같이 구할 수 있습니다.

180822-ffnn17

참 쉽네요.

Step 2: input <- hidden layer

180822-ffnn18

이제 hidden node에서 input node의 gradient를 계산하겠습니다. 바로 계산하지는 못하므로, chain rule을 사용합니다. 이를 계산하면 다음과 같습니다.

180822-ffnn19

h에 대한 편미분을 찾는다는 뜻은 (우측 아래 네모)
activation function의 편미분을 찾고 (출력에 대한 입력의 편미분)
linear combination의 편미분을 찾아 곱한 것과 같습니다.

180822-ffnn20

위 식을 간단하게 나타낼 수 있습니다.

180822-ffnn21

이제 gradient 를 찾을 수 있습니다. 방금 계산한 두 편미분의 곱으로 나타낼 수 있습니다.

180822-ffnn22

처음의 예제를 보겠습니다.
각각의 weight에 대해 gradient를 구하면 위 그림과 같습니다. 이렇게 gradient 를 구하면 weight를 update할 수 있습니다.

계산 끝! 참 쉽네요! 이렇게 weight의 변화를 구했으므로 기존 weight에 더해 update해줍니다.

180822-ffnn23

layer가 많은 네트워크 역시 이 두 단계를 이용하여 weight를 update합니다.

180822-ffnn24

지금까지 bias를 고려하지 않았습니다. bias는 constant input이므로 더해주기만 하면 됩니다. 이 과정을 전혀 해치지 않습니다.

Mini Batch training

180822-ffnn25

MiniBatch Training은 Weight를 여러 스텝을 평균내어 한번만 업데이트 하는 방법입니다. 이렇게 하게 되면 두가지 큰 이점이 있습니다.

QUIZ

간단하게 퀴즈 하나만 내보겠습니다.

180822-ffnn26

위 네트워크에서 weight matrix W1에 대한 update rule은 무엇일까요? (힌트: y에 대한 W1의 편미분을 구해보세요. 체인룰!)

180822-ffnn27

Comments

Eungbean Lee's Picture

About Eungbean Lee

Lee is a Student, Programmer, Engineer, Designer and a DJ

Seoul, South Korea https://eungbean.github.io