일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- Python
- C언어
- 역전파
- 소프트맥스 함수
- 백준
- PostgreSQL
- 코딩
- 오차역전파법
- sgd
- 리뷰
- PHP
- 기울기
- 설치
- Python Challenge
- 신경망 학습
- AdaGrad
- flag
- 신경망
- HTML
- FastAPI
- 아파치
- picoCTF
- 딥러닝
- CTF
- Apache2
- 순전파
- 우분투
- 파이썬
- PICO CTF
- 책
- Today
- Total
Story of CowHacker
딥러닝 4.1 오차역전파법 본문
이번 글에서는 먼저 연쇄 법칙에 대해서 알아볼 것이다.
연쇄 법칙이란?
합성 함수의 미분은 합성 함수를 구성하는 각 함수의 미분의 곱으로 나타낼 수 있다.
여기서 합성 함수가 뭔지 알아야만 한다.
합성함수란?
여러 함수로 구성된 함수다.
그림 1의 식은
그림 2처럼 두 개의 식으로 구성된다.
다음은 역전파에 대해서 알아보겠다.
역전 파는 연쇄 법칙이랑 같은 원리다.
먼저 덧셈 노드의 역전파에 대해 알아보겠다.
z = x + y
라는 식을 미분해보면
그림 3처럼 된다.
이것을 계산 그래프로 표현하면
그림 4는 순 전파를 나타낸 것이고,
그림 5는 역전파를 나타낸 것이다.
그림 5에서 상류에서 전해진 미분에 1을 곱하여 하류를 거친다.
결국 덧셈 노드의 역전 파는 1을 곱하기만 할 뿐이므로 입력된 값을 그대로 다음 노드로 보내게 된다.
다음은 곱셈 노드의 역전파에 대해서 알아보겠다.
z = xy
라는 식을 미분해보면
그림 6처럼 되는데 이걸 계산 그래프로 나타내 보면
그림 7은 순 전파를 나타낸 것이고
그림 8은 역전파를 나타낸 것이다.
덧셈의 역전파에서는 순 전파의 입력이 필요하지 않았는데
곱셈의 역전파에서는 순 전파의 입력이 필요하다.
그럼 이제 곱셈 계층을 파이썬으로 구현해보겠다.
코드는
출처 : https://github.com/WegraLee/deep-learning-from-scratch
WegraLee/deep-learning-from-scratch
『밑바닥부터 시작하는 딥러닝』(한빛미디어, 2017). Contribute to WegraLee/deep-learning-from-scratch development by creating an account on GitHub.
github.com
위에서 다운로드한 파일의
ch05/layer_naive.py에 있다.
곱셈 계층 코드
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 # x와 y를 바꾼다.
dy = dout * self.x
return dx, dy
위 코드를 해석해보면
forward는 순 전파
backward는 역전파를 처리한다.
__init__ 에서 인스턴스 변수인 x와 y를 초기화한다.
이 두 변수는 순 전파 시의 입력 값을 유지하기 위해 사용한다.
forward에서는 x와 y를 인수로 받고 두 값을 곱해서 반환한다.
backward에서는 상류에서 넘어온 미분 ( dout )에 순 전파 때의 값을 서로 바꿔 곱한 후 하류로 보낸다.
다음은 덧셈 계층을 파이썬으로 구현해보겠다.
덧셈 계층 코드
class AddLayer:
def __init__(self):
pass
def forward(self, x, y):
out = x + y
return out
def backward(self, dout):
dx = dout * 1
dy = dout * 1
return dx, dy
위 코드를 해석해보면
덧셈 계층에서는 초기화가 필요 없으니 __init__에서는 아무 일도 하지 않는다.
덧셈 계층의 forward에서는 입력받은 두 인수 x, y를 더해서 반환한다.
backward에서는 상류에서 내려온 미분 ( dout )을 그대로 하류로 흘러 보낸다.
이까지 연쇄 법칙의 덧셈 곱셉 계층에 대해 알아보았다.
'공부 > 딥러닝' 카테고리의 다른 글
딥러닝 4.3 오차역전파법 (0) | 2020.08.18 |
---|---|
딥러닝 4.2 오차역전파법 (0) | 2020.08.17 |
딥러닝 4.0 오차역전파법 (0) | 2020.08.16 |
딥러닝 3.5 신경망 학습 (0) | 2020.08.14 |
딥러닝 3.4 신경망 학습 (0) | 2020.08.13 |