Deep LearningGoodfellow · Bengio · Courville
Chapter 6§ 6.5
Chapter 6 · 심층 순방향 네트워크 — Deep Feedforward Networks

역전파와 미분 알고리즘

정보는 입력에서 비용으로 순방향으로 흐른다. 그러면 기울기는 어떻게 얻는가 — 비용에서 출발해 계산 그래프를 거꾸로 거슬러, 연쇄 법칙을 단 한 번씩만 적용하며 흐른다.

§ 6.5 계산 그래프 (computational graph) 연쇄 법칙 (chain rule) back-propagation

Section 1순방향, 그리고 역방향

순방향 신경망이 입력 x를 받아 출력 ŷ를 낼 때, 정보는 네트워크를 통해 순방향으로 흐른다. 입력 x는 각 층의 은닉 유닛으로 전파되어 마침내 ŷ를 만든다. 이것을 순방향 전파(forward propagation)라 한다. 훈련 중에는 순방향 전파가 스칼라 비용 J(θ)를 낼 때까지 계속된다.

역전파 알고리즘(back-propagation, Rumelhart et al., 1986)은 비용으로부터의 정보가 기울기를 계산하기 위해 네트워크를 거꾸로 흐르게 한다. 기울기에 대한 분석적 표현을 적는 일은 간단하지만, 그것을 수치적으로 평가하는 일은 계산적으로 비쌀 수 있다 — 역전파는 간단하고 저렴한 절차로 이를 해낸다.

함정 — Pitfall 역전파는 다층 신경망의 학습 알고리즘 전체가 아니다. 역전파는 오직 기울기를 계산하는 방법만을 가리킨다. 그 기울기로 실제 학습을 수행하는 데는 확률적 경사 하강법(SGD) 같은 또 다른 알고리즘이 쓰인다. 또한 역전파는 신경망 전용도 아니다 — 원칙적으로 임의의 함수의 도함수를 계산할 수 있다.

학습에서 가장 자주 필요한 기울기는 매개변수에 대한 비용의 기울기 θJ(θ)이다. 네트워크를 통해 정보를 전파해 도함수를 계산한다는 아이디어는 매우 일반적이며, 여기서는 f가 단일 출력을 갖는 가장 흔한 경우로 설명을 한정한다.

Section 2계산 그래프

역전파를 정확히 설명하려면 계산 그래프(computational graph) 언어가 필요하다. 그래프의 각 노드는 변수를 — 스칼라, 벡터, 행렬, 텐서 — 나타낸다. 연산(operation)은 하나 이상의 변수에 대한 간단한 함수다. 변수 y가 변수 x에 연산을 적용해 계산되면, x에서 y로 향하는 방향 에지를 그린다.

Example로지스틱 회귀의 계산 그래프

예측 ŷ = σ(xᵀw + b)는 여러 연산의 합성이다 — 곱셈으로 u⁽¹⁾ = xᵀw, 덧셈으로 u⁽²⁾ = u⁽¹⁾ + b, 시그모이드로 ŷ = σ(u⁽²⁾). 대수식에서 이름이 없던 중간 표현식도 그래프에서는 노드로서 이름 u⁽ⁱ⁾을 갖는다.

아래 첫 스테이지에서 이 작은 그래프를 따라, 순전파가 입력에서 비용까지 값을 채우는 과정을 본다.

Stage A · 계산 그래프 위의 순전파 STEP 01 / 5
스페이스 재생 · ← → 단계 이동

Section 3미적분의 연쇄 법칙

미적분의 연쇄 법칙(확률의 연쇄 법칙과 혼동하지 말 것)은, 도함수가 알려진 다른 함수들을 합성해 만든 함수의 도함수를 계산하는 데 쓰인다. 역전파는 매우 효율적인 특정 연산 순서로 연쇄 법칙을 계산하는 알고리즘이다.

y = g(x)이고 z = f(g(x)) = f(y)인 스칼라 경우, 연쇄 법칙은 다음과 같다.

Equation 6.44 — 스칼라 연쇄 법칙
dz/dx = (dz/dy) · (dy/dx)
dz/dy 바깥 함수 f의 도함수 · dy/dx 안쪽 함수 g의 도함수 — 둘을 곱한다.

이를 벡터로 일반화하면, x ∈ ℝᵐ, y ∈ ℝⁿ, y = g(x), z = f(y)에 대해 다음이 성립한다.

Equation 6.46 — 벡터 연쇄 법칙
x z = ( ∂y/∂x )  ∇y z
∂y/∂x 함수 g의 n × m 야코비안(Jacobian) 행렬 · yz 출력 쪽 기울기 — 야코비안 전치를 기울기에 곱한다.
핵심 — Key 변수 x의 기울기는 야코비안 행렬 ∂y/∂x에 기울기 yz를 곱해 얻는다. 역전파 알고리즘은 그래프의 각 연산마다 이 야코비안–기울기 곱을 한 번씩 수행하는 것이다. 텐서에 대해서도 개념은 동일하다 — 평탄화해 벡터로 보면 똑같이 야코비안에 기울기를 곱하는 일이다.

Section 4기울기가 거꾸로 흐른다

먼저 단일 스칼라 u⁽ⁿ⁾(예: 한 훈련 예시의 손실)을 계산하는 그래프를 생각하자. 우리는 입력 노드 u⁽¹⁾, …, u⁽ⁿⁱ⁾에 대한 기울기 — 즉 모든 i에 대해 ∂u⁽ⁿ⁾/∂u⁽ⁱ⁾ — 를 원한다. 경사 하강에 적용할 때 u⁽ⁿ⁾은 비용이고, 입력 노드들은 모델의 매개변수다.

Equation 6.53 — 역전파의 연쇄 법칙
∂u⁽ⁿ⁾/∂u⁽ʲ⁾  =  Σi : j∈Pa(u⁽ⁱ⁾)  ( ∂u⁽ⁿ⁾/∂u⁽ⁱ⁾ ) · ( ∂u⁽ⁱ⁾/∂u⁽ʲ⁾ )
Pa(u⁽ⁱ⁾) 노드 u⁽ⁱ⁾의 부모 집합 · 각 자식 u⁽ⁱ⁾에 대해 — 이미 계산된 기울기와 국소 편도함수를 곱해 더한다.

역전파는 출력에서 grad_table[u⁽ⁿ⁾] ← 1로 시작해, 그래프를 역순으로 거슬러 각 노드의 기울기를 채운다. 아래 스테이지에서 손실에서 출발한 기울기가 계산 그래프를 거꾸로 흘러 입력 매개변수까지 도달하는 전 과정을 본다.

Stage B · 역전파 — 기울기의 역방향 흐름 STEP 01 / 6
스페이스 재생 · ← → 단계 이동
Algorithm 6.2 — 역전파 (단순화된 스칼라 버전)
# 순전파(Algorithm 6.1)를 실행해 네트워크의 활성화를 얻는다.
# grad_table: 계산된 도함수를 저장하는 자료 구조.
grad_table[u⁽ⁿ⁾]  1
for j = n−1 down to 1 do
    # 저장된 값을 써서 ∂u⁽ⁿ⁾/∂u⁽ʲ⁾ 를 계산한다:
    grad_table[u⁽ʲ⁾]  sum(
        grad_table[u⁽ⁱ⁾] · (∂u⁽ⁱ⁾/∂u⁽ʲ⁾)
        for i in {i : j  Pa(u⁽ⁱ⁾)} )
end for
return { grad_table[u⁽ⁱ⁾] for i = 1 .. nᵢ }

Section 5반복 부분식을 피하다

왜 역전파가 효율적인가. 기울기에 대한 전체 표현식 안에서, 많은 부분 표현식(subexpression)이 여러 번 반복될 수 있다. 같은 함수 f를 체인의 각 단계에 적용하는 경우 — x=f(w), y=f(x), z=f(y) — 를 보자.

Equations 6.51 – 6.52 — 두 가지 전개
∂z/∂w = f′(y) · f′(x) · f′(w)   (6.51)
= f′(f(f(w))) · f′(f(w)) · f′(w)   (6.52)
식 6.51 f(w)를 한 번 계산해 저장 — 역전파의 방식 · 식 6.52 f(w)가 거듭 나타나 그때그때 재계산.
함정 — Pitfall 식 6.52처럼 같은 부분식을 매번 재계산하면, 복잡한 그래프에서는 낭비되는 계산이 기하급수적으로 늘어 — 연쇄 법칙의 순진한 구현을 실현 불가능하게 만든다. 식 6.52도 유효한 구현이며 메모리가 극히 제한될 때 쓰일 수 있지만, 일반적으로는 저장이 옳다.

역전파(식 6.51 방식)는 그래프의 노드당 하나의 야코비안 곱 순서로 수행되며, 노드 u⁽ʲ⁾에서 u⁽ⁱ⁾로 가는 각 에지를 정확히 한 번씩만 방문한다. 따라서 반복 부분식의 기하급수적 폭발을 피한다. 역전파를 수행하는 데 드는 계산량은 그래프의 에지 수에 선형으로 비례하며, 이는 순방향 전파와 같은 차수다 — 각 에지마다 편도함수 하나를 구하고, 곱셈 하나와 덧셈 하나를 할 뿐이다.

핵심 — Key 역전파의 본질은 단 한 줄로 요약된다 — 비용에서 시작해 계산 그래프를 거꾸로 거슬러, 각 에지를 한 번씩만 방문하며 야코비안–기울기 곱을 누적한다. 중간 결과를 저장해 반복 계산을 없앤 덕분에, 거대한 심층 네트워크의 모든 매개변수 기울기를 순전파 한 번과 맞먹는 비용으로 얻는다.