오차역전파법
신경망 학습에서, 신경망의 가중치(weight)에 대한 손실 함수의 기울기를 구하기 위해 미분을 사용했습니다. 미분 계산은 단순하고 구현하기 쉽지만, 시간이 오래걸리는 단점이 있습니다. 초기 가중치에서의 손실 함수를 계산하고 그것을 미분하여 다음 가중치 계산에 사용하는데, 뉴런이 많아져 각 노드의 매개변수(가중치, 편향)가 많아지면 그 모든 매개변수를 임의로 대입하며 학습시키면 시간도 매우 오래걸리고 계산량도 많아 비효율적입니다. 이것을 효율적으로 하기 위한 것이 오차역전파 알고리즘입니다.
학습이란 각 뉴런의 파라미터에 의해 계산된 최종 출력을 토대로 손실함수를 구하고, 그 손실함수를 최소화하는 방향으로 각 뉴런의 매개변수(가중치, 편향)를 변화시켜나가는 것입니다. 학습이 완료되었다는 것은, 학습 모델이 손실함수가 최소화되도록 모든 뉴런에서 각각의 매개변수 값을 찾았다는 것입니다.
출력에 대한 영향력을 알기 위하여 오차역전파법(Back Propagation)을 사용합니다. 이 알고리즘은 학습 시에 입력부터 출발하여 각 노드의 매개변수를 통한 계산 후 출력으로 나오는 Forward Propagation과는 반대로 출력으로부터 입력까지 연쇄법칙(Chain Rule)을 통해 input쪽으로 거슬러 올라갑니다.
Chain Rule을 이용하면 출력에 대한 각 노드 매개변수의 미분 값이 계산되는데, 이 미분 값이 바로 특정 매개변수가 전체 출력에 주는 영향력이 되는 것입니다.
코드 구현
순전파와 역전파를 가진 간단한 클래스를 만든다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class MulLayer:
def __init__(self):
self.x = None
self.y = None
def forward(self, x, y):
self.x = x
self.y = y
out = x * y
return out
def backward(self, dout):
dx = dout * self.y
dy = dout * self.x
return dx, dy
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
apple = 100
apple_num = 2
tax = 1.1
mul_apple_layer = MulLayer()
mul_tax_layer = MulLayer()
# forward propagation
apple_price = mul_apple_layer.forward(apple, apple_num)
price = mul_tax_layer.forward(apple_price, tax)
print(price)
dprice = 1
dapple_price, dtax = mul_tax_layer.backward(dprice)
dapple, dapple_num = mul_apple_layer.backward(dapple_price)
print(dapple, dapple_num, dtax)
|
https://excelsior-cjh.tistory.com/171
https://ratsgo.github.io/deep%20learning/2017/05/14/backprop/
https://www.youtube.com/watch?v=Ilg3gGewQ5U
'대외활동 > DSC CV Study' 카테고리의 다른 글
week3 - CNN(Convolutional Neural Network) (0) | 2020.01.27 |
---|---|
week2 - Optimization 최적화 기법 (0) | 2020.01.13 |
week1 - Tensorflow로 MNIST 이미지 분류하기 (0) | 2020.01.10 |
week1 - 활성화 함수 (0) | 2020.01.10 |
week1 - 신경망 학습 (Loss Function, Gradient Descent) (0) | 2020.01.07 |