(* DeepLearning from scratch2 서적을 학습한 후 정리한 내용임 )
역전파(back-propagation)를 살펴보기 전에 "계산 그래프"를 설명한다.
덧셈노드
위 그림은 z = x + y 식을 계산 그래프로 나타낸 것이다.
연산자 + 는 노드로 표시하고 입력과 출력을 화살표로 나타낸다.
계산그래프의 장점은 계산과정을 시각적으로 파악할 수 있다.
계산 그래프에서 연산자를 이용한 정상적인 계산 흐름을 순전파라고 한다.
역전파는 정상계산 흐름의 반대방향으로 흘러간다.
역전파 상황을 좀 더 자세히 살펴보기 위해 예를들어 설명한다.
z = x + y 계산 과정의 이전과 이후에 어떤 계산과정이 있다고 가정한다. 그리고 최종적으로는 스칼라 값인 L이 출력된다고 가정한다.
이 상황을 계산 그래프로 그리면 다음과 같다. 검은색 화살표가 순전파, 푸른색 화살표가 역전파를 나타낸다.
∂L/∂x 은 x가 L에 미치는 영향을 의미한다
x와 L 사이에는 복잡한 합성함수들이 들어있어 직접적으로 미분이 어려운 상황이다. 이런 경우 바로 앞절에서 언급한 연쇄법칙을 활용하여 계산한다
즉,
∂L/∂x = ∂L/∂z * ∂z/∂x
여기서 ∂z/∂x 는 z = x + y 공식에서 계산이 가능하다.
∂z/∂x = 1
따라서,
∂L/∂x = ∂L/∂z * 1 이 된다.
∂L/∂y = ∂L/∂z * ∂z/∂y
∂z/∂y 는 z = x + y 공식에서 계산이 가능하다.
∂z/∂y = 1
따라서,
∂L/∂y = ∂L/∂z * 1 이 된다.
이 결과를 적용하면 역전파에서 덧셈노드는 상류로 부터 받은 미분값을 그대로 흘려보낸다.
계산 그래프를 구축하는 연산 노드로는 덧셈노드 외에 다양한 연산을 생각할 수 있다.
대표적인 연산노드 몇 가지를 소개한다
곱셈노드
z = x × y 를 계산그래프로 표현해보면 다음과 같다.
검은색 화살표는 순전파를 의미하며 푸른색 화살표는 역전파를 의미한다.
z = x × y 에 대해서 ∂L/∂x 값을 연쇄법칙을 이용하여 다음과 같이 정리할 수 있다.
z = x × y 에서 ∂z/∂x를 계산하면
이 결과를 ∂L/∂x 공식에 대입하면 다음과 같다.
같은 방식으로 ∂L/∂y 에 대해 계산하면 결과는 다음과 같다.
결과적으로 곱셈노드의 역전파는 상류로부터 받은 기울기에 순전파시 입력을 서로 바꾼 값을 곱한다
분기노드
분기노드는 노드표시 원을 그리지 않고 선이 나뉘도록 그린다. 분기전의 입력값이 분기하면서 같은 값들이 복사되는 특징이 있다. 이런 이유때문에 "복제노드" 라고도 한다.
분기노드의 역전파는 위 그림에서 푸른색 화살표로 나타내고 있다.
상류에서 전달되어 온 미분값들을 하류로 흘러보낼 때 미분값(기울기)들을 합산하게 된다.
Repeat 노드
위의 2개로 분기하는 분기노드를 N개로의 분기로 확장할 수 있으며 이것을 "Repeat 노드" 라고 한다.
길이가 D인 배열을 N개로 복제하는 예
해당 그래프의 역전파는 아래와 같다.
앞의 분기노드에서 설명했듯이 상류에서 흘러온 N개의 미분값(기울기)를 합산하여 하류로 흘려보낸다.
MatMul 노드
행렬의 곱셈을 MatMul(Maxtrix Multiply) 노드로 표현한다.
y = xW 라는 행렬곱셈 계산식을 생각해보자.
여기서 각 행렬의 형상은 다음과 같다.
x : 1 × D, W : D × H, y : 1 × H
x행렬의 i번째 원소에 대한 미분 ∂L/∂xi 는 다음과 같다.
이것은 xi를 (조금)변화시켰을 때 L이 얼마나 변할 것인가라는 "변화의 정도"를 나타낸다.
위 식이 나오게 된 과정을 좀 더 살펴보자.
각 행렬의 크기가 다음과 같다.
x : 1 × D, W : D × H, y : 1 × H
여기서
위 식에서 알 수 있듯이 xi는 y행렬의 모든 원소에 영향을 주고 있다.
'인공지능 > DeepLearning from Scratch 2' 카테고리의 다른 글
CBOW 모델의 흐름도 (속도개선버전) (0) | 2019.08.01 |
---|---|
DeepLearning from scratch2 - 1.3.3 연쇄법칙 (딥러닝 학습) (0) | 2019.07.11 |
DeepLearning from scratch2 - 1.3.2 미분과 기울기 (딥러닝 학습) (0) | 2019.07.11 |
DeepLearning from scratch2 - 1.3.1 손실함수 (딥러닝 학습) (0) | 2019.07.09 |
DeepLearning from scratch2 - 1.2.2 계층으로 클래스화 및 순전파 구현 (딥러닝 학습) (0) | 2019.07.07 |