22.03.22 딥러닝 학습과정2 - Forward propagation / Backpropagation

2022. 3. 24. 18:36카테고리 없음

Forward propagation : pred - 실제정답을 계산

Back propagation : Gradient Descent를 사용하여 가중치를 업데이트

 

이런 모양의 NN이 있다고 치자. 여기서 b는 고려하지 않고 w만 있다고 생각한다.

x: 입력층

h: hiddent layer

z: 이전 층의 모든 입력이 각각의 가중치와 곱해진 값들이 모두 더해진 가중합(sigmoid 처리 전) = 활성화함수의 입력

(z를 |모양(=활성화함수)를 거쳐 나오는 변수 h 또는 o가 z가 sigmoid(활성화함수)를 가치고 난 뒤의 값 = 각 뉴런의 출력값이다.)

o(또는 h): 뉴런의 출력값. o는 그냥 맨 마지막 layer의 출력값을 특별히 저렇게 쓴듯

 

Forward Propagation(순전파) : 입력층 -> 출력층

(소수점 생략 .3 = 0.3)

파란색 숫자 .1 = 입력값

빨간색 숫자 .3 = 각 가중치의 값(w)

 

z1, z2를 먼저 구하자(첫 번째 은닉층의 sigmoid의 입력값)

구하고 나면 각각의 은닉층 뉴런에서 sigmoid를 거친 후 h1,h2가 나오게 된다.

그리고 z3,z4를 또 구하게 된다. 이전 입력인 h1,h2에 w들을 곱하고 더해서 구한다

그럼 이제 출력층의 sigmoid를 거친 o1,o2가 나온다. 이 o1,o2는 드디어 pred가 된다.(정답과 비교할, loss에 쓰이는 값)

그럼 이제 Error = loss function값을 구한다. 이떄 loss function은 MSE를 사용한다.

outputo1 = 0.4 , outputo2 = 0.6

이 두 오차를 전부 더하면 전체 오차 Etotal이 나온다.

 

 

Backpropagation 1단계 : 출력층 -> 입력층 중에서 출력->그 이전층

출력층 바로 이전의 은닉층을 N층이라고 했을 때, 출력층과 N층 사이의 가중치를 업데이트 하는 단계가 역전파 1단계,

N층과 N층 이전층 사이의 가중치를 업데이트 하는 단계를 2단계라 치자.

여기서 업데이트 해야 할 가중치는 w5,w6,w7,w8 4개이다. 먼저 w5에 대해서 Gradient Descent를 진행해보자.

즉, loss function = Etotal = f(w) 이고 f(w)를 w에 대해 미분.

미분의 Chain Rule을 사용해 계산한다.

1. Etotal의 o1에 대한 미분 먼저 해보자.

targeto1 = sigmoid(w5h1 + w6h2)

outputo1 = 0.4

targeto2 = sigmoid(w7h1 + w8h2)

outputo2 = 0.6

2. o1의 z3에 대한 미분

o1 = sigmoid(z3)

sigmoid함수의 미분은 f(x)(1-f(x)) 이므로(https://en.wikipedia.org/wiki/Logistic_function#Derivative) 다음과 같다.

3. z3의 w5에 대한 미분

이제 w의 시작점을 업데이트 할 차례(w=w-lr*미분계수)

처음 w5는 0.45였다. 이제 다음 w5는 0.437이 된다. 이것이 바로 가중치 업데이트이다.

비슷한 과정으로 w6,w7,w8에도 업데이트를 하면 다음과 같다.

 

Backpropagation 2단계 : 마지막에서 두번째층 -> 세번쨰 층(여기선 세개가 끝이지만 더 많다면 계속 한 단계씩 계산해가야 한다.)

여기서 계산할 가중치는 w1,w2,w3,w4이다. 위와 동일한 과정이다. 저 4개가 모두 비슷한 과정이므로 w1만 보겠다.

w1를 업데이트(coss(w)를 줄이는) 하기 위해 Gradient 계산. loss function = Etotal = f(w) 이고 f(w)를 w에 대해 미분.

1. Etotal 을 h1에 대해 미분

 

두 번째 층에서의 Etotal은 그 이전의 output의 E(error=loss)를 더한 것과 같으므로

Etotal의 미분을 다음과 같이 표현할 수 있다.

또다시 Chain Rule을 적용하여 각 Eo1의 h1에 대한 미분을 z에 대한 미분, z의 h1에 대한 미분으로 분해하여 계산한다.

o1 = sigmoid(z3)

z3 = w5h1 + w6h2 (인데 h1에 대해서만 미분하므로 w5만 남는다)

(아래 z1,z2,z3,z4에 대한 정의는 아래와 같다.)

1-2. Eo2 을 h2에 대해 미분

그럼 아까 Etotal의 w1에 대한 미분의 첫번쨰 부분(h1으로 미분하기)가 완성됨.

 

2. h1의 z1에 대한 미분

3. z1의 w1에 대한 미분

즉, 최종 Etotal의 w1에 대한 미분은 다음과 같다.(1, 2, 3을 모두 곱)

그러면 이제 다음 w1(=w1+)는 무엇인지 잡을 수 있다(w1 업데이트 w1=w1-lr*미분계수)

같은 방식으로 w2,w3,w4도 업데이트 시킨다.

 

변수 업데이트 후 다시 Forward propagation

이렇게 backpropagation을 완료했으면 그 업데이트된 변수들(가중치 w1,w2,w3,w4,w5,w6,w7,w8)들을 넣어서 다시

Forward propagation을 진행해서 Etotal이 얼마나 줄었는지 확인해보자!

Gradient Descent로 업데이트 하기 전 Etotal

맨 처음 Forward propagation할 때 Etotal

Gradient Descent로 업데이트 하고 난 후 Etotal

0.02397 -> 0.02323으로 오차가 줄었다!

즉, 인공신경망(NN)의 학습은 loss = Etotal을 최소화 하는 가중치(w들)을 찾는 목적으로 Forward Propagation(순전파)와 Backpropagation(역전파)를 반복하는 것을 말한다.