Practice makes perfect

[DeepLearning] 오차역전파법 (backpropagation) 본문

Anaconda/DeepLearning

[DeepLearning] 오차역전파법 (backpropagation)

kerpect 2020. 8. 10. 13:26

오차역전파법 (backpropagation)

: 가중치 매개변수의 기울기를 효율적으로 계산하는 방법

  1. 결과값을 손실함수로 변환한다
  2. 손실함수의 기울기를 수치 미분
  3. 기울기가 0이 되는 지점까지 weight를 변화

- 수치 미분을 통하여 기울기를 구하는데, 이는 단순하고 구현하기는 쉽지만 계산 시간이 오래 걸린다는 단점이 있습니다. 따라서, 가중치 매개변수의 기울기를 가장 효율적으로 계산할 수 있는 오차역전파법(backpropagation)을 사용합니다. 

 

순전파 : 왼쪽 -> 오른쪽

역전파 : 오른쪽 > 왼쪽  

 

 

계산 그래프 

: 계산 그래프는 계산 과정을 그래프로 나타낸 자료구조로, 복수의 노드와 에지로 표현합니다. 

 

예제1) 

현빈 군은 슈퍼에서 1개에 100원인 사과를 2개 샀습니다. 이때 지불금액을 구하시오, 단 소비세가 10% 부과됩니다.

최초에 사과를 두 개 사고, 소비세를 곱한 값이 답이 됩니다.(220원). 위의 그래프에서는 x2와 x1.1을 각각 하나의 연산으로 취급했지만, 곱하기만을 연산으로 취급할수도 있습니다. 이렇게 하면 곱한 값 또한 변수가 되어 원 밖에 위치하게 됩니다.

 

  1. 계산 그래프를 구성
  2. 그래프에서 계산을 왼쪽에서 오른쪽으로 진행

여기서 2번, ‘계산을 왼쪽에서 오른쪽으로 진행하는 것’을 순전파이고, 역전파는 반대로(오른쪽에서 왼쪽으로) 계산을 진행합니다.

 

 

예제2)

현빈군은 슈퍼에서 사과를 2개, 귤을 3개 샀습니다. 사과는 1개에 100원, 귤은 1개 150원 입니다. 소비세가 10%일 때 지불 금액을 구하세요.

 

 

계산 그래프의 특징은 '국소적 계산'을 통해 최종 결과를 얻는 것으로 '자신과 직접 관계된' 범위 내에서만 계산이 이루어 집니다. 

 

 

- 계산그래프의 장점

 

국소적 계산을 통해 각 노드의 계산에 집중하여 문제를 단순화

: 아무리 복잡한 최종결과가 이루어진다고 하더라도 계산 그래프로 표현하면 각각의 항목별로 독립적으로 표현하고, 독립적으로 연산합니다. 연관지어서 대상을 표현하는 것이 아니라 독립적으로 표현합니다. 독립적으로 수행한 결과만 합쳐주면 됩니다. 

 

역전파를 통해 '미분'을 효율적으로 계산 



사과 가격이 오르면 최종 금액에 어떠한 영향을 주는가'에 대해서 사과 가격에 대한 지불 금액의 미분을 구해 계산할 수 있습니다.  사과의 값을 ​x, 지불 금액을 ​L라 했을 때, ​ 𝜕L/𝜕x(분수)를 구하는 것으로, 이러한 미분 값은 사과 값(x)가 '아주 조금'올랐을 때 지불 금액(​L)이 얼마나 증가하는지를 나타냅니다. 

 

계산 그래프의 역전파

 

 

               y = f(x)

 

 

 

 

 

역전파의 계산 절차

- 신호 E에 노드의 국소적 미분( 𝜕𝑦/𝜕𝑥 (분수))을 곱한 후 다음 노드로 전달.
- 국소적 미분이란 : 순전파 때의 y = f(x) 계산의 미분을 구한다는 것이며, 이는 x에 대한 y의 미분( 𝜕𝑦/𝜕𝑥(분수))을 구함. 

 

* 𝜕𝑦/𝜕𝑥(분수) 의 값을 구하기 위해서는 x, y 의 값을 알아야 하는데, 계산 그래프를 그려서 확인하면 결과 값들을 보관함으로 빠르게 확인할 수 있습니다. 

 

- 입력에 대한 변화를 미분으로 정의한 것이라고 볼 수 있습니다. 

  

 

연쇠법칙

: 연쇄법칙은 합성 함수의 미분에 대한 성질로, 합성 함수의 미분은 합성 함수를 구성하는 각 함수의 미분의 곱으로 나타낼 수 있습니다.

 

* 합성함수 : 여러 함수로 구성된 함수

 

예시) 

t^2을 미분하면 2t이고, t를 미분하면 1입니다. 그래서, 최종적으로 z를 미분한 값은 2t * 1 = 2t = 2(x+y)입니다.

 

연쇄법칙과 계산 그래프

x의 변화량 분의 z의 변화량의 편미분값

 

덧셈 노드의 역전파 

 

z = x + y 라는 식을 대상으로, 역전파를 살펴보겠습니다. 그래프를 그리면 다음과 같은 모양이 될 것입니다.

x + y 의 식에 대해, 위의 임의의 계산으로 가는 노드는 x를 기준으로 편미분을 하므로, y가 사라지면서 1이 남게 됩니다. 밑의 임의의 계산으로 가는 노드는 y 를 기준으로 편미분을 하므로, x가 사라지면서 1이 남게 됩니다. 따라서, + 노드를 대상으로 하는 역전파는 결과적으로 입력받은 데이터를 그대로 흘려주게 됩니다. 별도의 부정을 수행할 필요 없다는 것이 함축 되어 있습니다. 

 

예제 ) 사과 2개와 귤 3개 구입

from chap05.layer_naive import *

apple = 100
apple_num = 2
orange = 150
orange_num = 3
tex = 1.1

# layer
mul_apple_layer = MulLayer()
mul_orange_layer = MulLayer()
add_apple_orange_layer = AddLayer()
mul_tax_layer = MulLayer()

# forward - 순정파
apple_price = mul_apple_layer.forward(apple, apple_num)
orange_price = mul_orange_layer.forward(orange, orange_num)
all_price = add_apple_orange_layer.forward(apple_price, orange_price)
price = mul_tax_layer.forward(all_price, tex)

# backward - 역전파
dprice = 1
dall_price, dtax = mul_tax_layer.backward(dprice) # 입력의 편미분, 세금
dapple_price, dorange_price = add_apple_orange_layer.backward(dall_price)
dorange, dorange_num = mul_orange_layer.backward(dorange_price)
dapple, dapple_num = mul_apple_layer.backward(dapple_price)

print("price : " , int(price))
print("dApple : ", dapple)
print("dApple_num" , int(dapple_num))
print("dOrange :", dorange)
print("dOrange_num", int(dorange_num))
print("dTax :", dtax)

< console > 

 

곱셈 노드의 역전파 

 

z = xy라는 식을 생각해보자. 이 식의 미분은 다음과 같습니다.

 - x로 편미분 : y

 - y로 편미분 : x

 

해석학적으로 다음과 같이 미분이 되므로, 그래프로 보았을 때는 이웃 노드의 데이터 * 위에서 흘러내려온 데이터가 내려감을 알 수 있습니다. 

그래프가 있고, 역전파 시 상류에서 1.3이라는 값이 흘러내려온다고 가정, 역전파 그래프는 다음과 같이 나오게 됩니다.

 

즉, 곱하기 노드에서는 순전파 때의 입력 신호들에 ‘서로 바꾼 값’을 곱하여 하류로 보내게 됩니다.

 

예제 ) 곱셈 계층 – 사과 2개 구입

(console) 

 

활성화 함수 계층 구현하기 – ReLU 계층

ReLU :  0이하의 값은 0으로 출력하고, 0이상은 입력값 그대로의 값을 넣어줍니다. 최근에 많이 사용됩니다. 

 

- ReLU 계층의 계산 그래프

 

예시 ) ReLU 함수 이해

( console ) 

 

ReLU의 역전파

 

 

활성화 함수 계층 구현하기 – Sigmoid 계층

 

- 시그모이드 함수 

 

 

 

sigmoid 계층의 계산 그래프(역전파) 

 

 

Sigmoid 계층의 계산 그래프(간소화 버전)

 

순전파의 출력 y만으로 역전파 계산

 

sigmoid의 역전파

- 순전파의 출력을 인스턴스 변수 out에 보관 했다가, 역전파 계산 때 그 값을 사용합니다. 

 

 

Affine 계층 

: 행렬의 내적에서는 대응하는 차원의 원소 수 일치

 

어파인 변환(Affine transformation) : 신경망의 순전파 때 수행하는 행렬의 내적을 기하학에서 일컫는 말.


Affine 계층 : affine 변환을 수행하는 처리.

 

 

 

 

 

 

Affine 계층의 계산 그래프 : 변수가 행렬(다차원 배열)임에 주의

 

 

- 순정파의 계산에서 내적을 계산

 

 

 

 

 

 

 

 

 

 

 

affine의 역전파 

(console) 

 

Softmax-with-Loss 계층의 계산 그래프

 

간소화한 Softmax-with-Loss 계층의 계산 그래프