신기술/AI

[밑바닥딥러닝1] 5장 오차역전파법

estherseo 2024. 7. 13. 18:42

 

신경망 학습은 손실 함수 값을 가장 작게 만드는 가중치 매개변수를 찾는 것.

-> 손실 함수의 기울기 활용

 

4장에서의 수치 미분 방법은 계산 시간이 오래 걸린다는 단점이 있다.

5장에서는 더 효율적으로 계산하는 '오차역전파법'을 다루고 있다.

 

 

* 국소적 계산

- 자신과 관계된 정보만으로 결과를 출력할 수 있다.

- 전체가 아무리 복잡해도 각 노드에서는 단순한 계산에 집중하여 문제를 단순화시킬 수 있다.

- 중간 계산 결과를 모두 보관할 수 있다.

 

* 미분을 효율적으로 계산

- 소비세에 대한 지불 금액의 미분, 사과 개수에 대한 지불 금액의 미분 등

- 중간 과정에서의 사과 가격이 전체에 얼마나 영향을 주는지 쉽게 구할 수 있다.

 

- 계산 방법 : 노드로 들어온 입력 신호 x 그 노드의 국소적 미분(편미분)

- 덧셈 노드의 역전파  : 미분이 1이 되어, 상부에서 받은 입력값을 그대로 forwarding 

- 곱셈 노드의 역전파 : 미분 값을 구하려면 순방향 입력 신호의 값이 필요함. 순전파 입력 신호를 변수에 저정할 필요가 있음.

 

 

 

<곱셈 계층>

1. 구현

### 곱셈 계층 구현
#1. forward() 순전파
#2. backward() 역전파

class MulLayer:
	def __init__(self):# x,y 초기화
    	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

 

2. 활용

## 사과 예시

apple = 100
apple_num = 2
tax = 1.1

mul_apple_layer = MulLayer()
mul_tax_layer = MulLayer()

# 순전파
apple_price = mul_apple_layer.forward(apple, apple_num)
price = mul_tax_layer.forward(apple_price, tax)

print(price) # 220​

 

 

<덧셈 계층>

1. 구현

### 덧셈 계층 구현
#1. forward() 순전파
#2. backward() 역전파

class AddLayer:
	def __init__(self):# x,y 초기화가 필요 없다 
    	pass
    def forward(self, x, y):
        out = x+y # 덧셈 연산
        return out
    def backward(self,dout): # 해당 노드에서 국소적 미분 값이 1
    	dx = dout * 1
        dy = dout * 1 
      
        return dx, dy # 상부에서 입력 받은 미분값을 그대로 반환

 

2. 활용

## 사과 예시

apple = 100
apple_num = 2
orange = 150
orrange_num = 3
tax = 1.1

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

# 순전파
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, tax)

# 역전파
dprice=1
dall_price, tax = 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, daaple_num = mul_apple_layer.backward(dapple_price)

print(price) #715
print(dapple_num, dapple, dorange, dorange_num, dtax) # 110 2.2 3.3 165 650​