Backpropagation - 구글 브레인 Chris Olah
이 글은 colah.github.io 의 블로그의 글을 저작자 Chris Olah의 허락을 받고 번역한 글입니다.
http://colah.github.io/posts/2015-08-Backprop/
역전파(Backpropagation)는 딥 모델을 컴퓨터연산으로 추적가능하게 훈련시키는 핵심 알고리즘입니다. 현대 뉴럴 네트워크를 위해서 기울기 하강(Gradient descent)으로 단순한 알고리즘에 비해 천만배 이상 빠르게 학습을 시킬 수 있게 되었습니다. 그것을 비교해보자면, 일주일 만에 학습시킬 수 있는 학습량이 원래는 20만 년이 걸릴 수 있는 거라고 생각하시면 됩니다.
딥 러닝에서의 활용을 넘어서, 역전파는 다른 여러분야에서 강력한 계산 도구입니다. 날씨 예측부터 수치적인 안정성을 분석하기까지 다른 이름으로 많이 쓰여왔습니다. 사실상, 이 알고리즘은 여러 분야에서 적어도 열번 이상 다른 방식으로 재발명되어왔습니다.(see Griewank (2010)) 일반적으로, 활용처에 무관하게 역전파의 이름은 "역방향 미분(reverse-mode differentiation)입니다."
근본적으로, 이는 미분을 빠르게 구하는 기법입니다. 그리고 이는 딥러닝 뿐만아니라도 여러분야에서 쓰이기에 여러분이 꼭 아셔야 하는 내용입니다.
계산 그래프들은 수학적인 표현을 생각하기 위한 멋진 방법입니다. 예를 들어, e=(a+b)∗(b+1) 이런 공식을 생각해봅시다. 여기에는 세가지 연산이 있습니다. 두개의 더하기와 하나의 곱하기가 있습니다. 이에 대해 이야기하기 위해, 두개의 중간 변수 c와 d를 소개하겠습니다. c와 d는 각 연산의 결과값을 담는 변수입니다. 그럼 우리는
c = a + b
d = b + 1
e = c * d
세가지 공식을 갖습니다.
이로부터 계산 그래프를 그리기 위해, 우리는 입력값을 포함한 각각의 연산을 노드들로 표현하겠습니다. 하나의 노드의 값은 다른 노드의 입력값이 됩니다. 화살표는 한 노드에서 다른 노드로 갑니다.
이러한 종류의 그래프는 컴퓨터 과학에서 항상 나타나며, 특히 함수형 프로그램에 관해 이야기 할 때 그렇습니다. 이들은 의존성 그래프(dependency graphs) 및 콜 그래프(call graphs)의 개념과 매우 밀접하게 관련되어 있습니다. 또한 인기있는 딥러닝 프레임워크 인 Theano의 핵심적인 추상화 개념입니다.
입력 변수를 특정 값으로 설정하고 그래프를 통해 노드를 계산하여 표현식을 평가할 수 있습니다. 예를 들어 a = 2 및 b = 1로 설정합니다.
표현식은 6으로 평가됩니다.
계산 그래프에서 미분을 이해하기 원한다면, 가장 중요한 것은 미분을 파 악하는 것입니다. a가 c에 직접적으로 영향을주는 경우 c에 미치는 영향을 알고 싶습니다. a가 조금이라도 변한다면, c는 어떻게 변경 될까요? 이것을 a와 관련하여 c의 편미분이라고 부릅니다.
이 그래프에서 편미분을 계산하려면 합 규칙과 곱 규칙이 필요합니다.
아래 그래프는 각 가장자리의 미분을 표시합니다.
직접 연결되지 않은 노드가 서로 어떻게 영향을 미치는지 이해하려면 어떻게해야합니까? e가 어떻게 영향을 받는지 고려해 봅시다. 우리가 a를 1의 속도로 변경하면 c는 1의 속도로 변경됩니다. 차례로 c의 속도가 1로 변경되면 e가 2의 속도로 변경됩니다. 따라서 e는 a에 대하여 1 * 2의 비율로 변경됩니다.
일반적인 규칙은 한 노드에서 다른 노드로가는 모든 가능한 경로를 합하여 경로의 각 가장자리에있는 도함수(Derivates)을 함께 곱하는 것입니다. 예를 들어, b와 관련하여 e의 도함수(Derivates)를 얻으려면 다음을 얻습니다.
이것은 b가 c를 통해 e에 어떻게 영향을 미치는지, 그리고 b가 d를 통해 e에 어떻게 영향을 미치는지를 설명합니다.
이 일반적인 "경로를 통한 합계"규칙은 다 변수 체인 룰(multivariate chain rule)에 대한 생각의 다른 방식 일뿐입니다.
"경로를 합하는 것"에 대한 문제는 가능한 경로의 수에서 조합을 너무나 많이 얻기가 쉽다는 것입니다.
위 그림에서 X에서 Y까지의 세 경로와 Y에서 Z까지의 세 경로가 있습니다. 모든 경로를 합하여 ∂Z / ∂X 미분을 얻으려면 3 * 3 = 9 경로를 거쳐야 합니다.
위의 경로는 9 개 뿐이지 만 그래프가 복잡해질수록 경로 수가 기하 급수적으로 늘어나는 것은 쉽습니다.
경로를 순진하게 합산하는 대신, 그것들을 고려하는 것이 훨씬 더 낫습니다.
이것은 "순방향 미분(Forward-mode differentiation)"와 "역방향 미분(Backward-mode differentiation)"가 들어간 곳입니다. 이들은 경로를 인수 분해하여 합계를 효율적으로 계산하기위한 알고리즘입니다. 모든 경로를 명시 적으로 합산하는 대신 모든 노드에서 경로를 다시 병합하여 동일한 합계를 더 효율적으로 계산합니다. 사실, 두 알고리즘은 각 노드를 정확히 한 번 만집니다!
순방향 미분(Forward-mode differentiation)은 그래프의 입력에서 시작하여 끝으로 이동합니다. 모든 노드에서 입력되는 모든 경로를 합산합니다. 각 경로는 입력이 해당 노드에 영향을주는 한 가지 방법을 나타냅니다. 노드를 추가함으로써 노드가 입력의 영향을받는 총합을 얻습니다.이 노드는 도함수(Derivates)입니다.
여러분이 비록 미분을 그래프의 관점에서 생각하지 않았겠지만, 순방향 미분은 대학교 Calculus 수업을 들으셨다면 직관적으로 하실 수 있는 미분과 비슷합니다.
반대로 역방향 미분은 그래프 출력에서 시작하여 처음으로 이동합니다. 각 노드에서 해당 노드에서 시작된 모든 경로를 병합합니다.
순방향 미분은 하나의 입력이 모든 노드에 미치는 영향을 추적합니다. 역방향 미분은 모든 노드가 하나의 출력에 미치는 영향을 추적합니다. 즉, 순방향 미분은 모든 노드에 연산자 ∂/∂X를 적용하는 반면, 역방향 미분은 모든 노드에 ∂Z/∂ 연산자를 적용합니다 .
이 시점에서 왜 역방향 미분에 신경을 쓰고 있는지 궁금해 할 것입니다. 그것은 순방향 미분과 동일한 일을 하는 이상한 방법처럼 보입니다. 뭔가 이점이 있을까요?
원래 예제를 다시 살펴 보겠습니다.
우리는 b에서 순방향 미분을 사용할 수 있습니다. 이것은 우리에게 b에 관한 모든 노드의 미분을 제공합니다.
우리는 입력 값 중 하나와 관련하여 출력 값의 미분 ∂e / ∂b를 계산했습니다.
우리가 e에서 역방향 미분을 한다면? 이렇게하면 모든 노드와 관련하여 e의 도함수(Derivates)를 얻을 수 있습니다.
역방향 미분이 모든 노드와 관련하여 e의 도함수(Derivates)을 제공한다고 말하면 모든 노드를 의미합니다. 우리는 양쪽 입력에 대해 e의 도함수 인 ∂e/∂a와 ∂e/∂b를 얻습니다. 순방향 미분는 단일 입력과 관련하여 산출물의 도함수를 나타내지 만 역방향 미분은 우리에게 모든 것을 제공합니다.
이 그래프의 경우, 이것은 단지 두 가지 속도 향상 요인 일 뿐이지 만 백만개의 입력과 하나의 출력이있는 함수를 상상해보십시오. 순방향 미분은 도함수를 얻기 위해 그래프를 100 만 회 통과해야 할 것입니다. 역방향 미분을 통해 한꺼번에 모든 것을 얻을 수 있습니다. 100 만 배율의 속도는 꽤 좋습니다!
신경망을 훈련 할 때, 우리는 매개 변수 (네트워크가 어떻게 행동 하는지를 나타내는 숫자)의 함수로서 Loss (신경망이 얼마나 나쁜지를 나타내는 값)을 생각합니다. 우리는 모든 매개 변수와 관련하여 비용의 파생어를 계산하여 Gradient Descent에 사용하려고합니다. 자, 신경망에는 종종 수백만 개 또는 수천만 개의 매개 변수가 있습니다. 그래서, 신경망의 맥락에서 역 전파라고 불리는 역방향 미분은 우리에게 엄청난 속도를 제공합니다!
(순방향 미분이 더 적합한 경우가 있습니까? 예, 있습니다! 역방향 미분이 모든 입력에 대해 한 출력의 도함수(Derivates)을 제공하는 경우, 순방향 미분은 다음과 같은 모든 출력의 도함수(Derivates)을 제공합니다. 하나의 입력. 많은 출력을 갖는 함수가 있다면, 순방향 미분은 훨씬 더 빠릅니다.)
처음에 역방향전파(Backpropagation)이 무엇인지 이해했을 때, 제 반응은 이랬습니다.
"오, 그냥 Chain Rule 일뿐이네! 왜 이렇게 이해하는 데 오래 걸렸지? "
나는 그 반응을 보인 유일한 사람이 아닙니다. "피드 포워드 신경 회로망에서 도함수(Derivates)을 계산하는 현명한 방법이 있습니까?"라고 묻는다면 대답은 그리 어렵지 않습니다.
그러나 나는 생각보다 훨씬 어려웠다 고 생각합니다. 역방향 전파(backpropagation)가 발명되었을 당시 사람들은 우리가 연구하는 피드 포워드 신경 네트워크에별로 집중하지 않았습니다. 도함수가 그들을 훈련시키는 올바른 방법이라는 것도 분명하지 않았습니다. 도함수를 신속하게 계산할 수 있다는 것을 알게되면 분명합니다. 순환 의존성이있었습니다.
더 나쁜 것은, 단순한 생각에 순환 의존성을 불가능하다고 생각하는 것은 매우 쉽습니다. 도함수를 이용한 신경망 훈련? 분명히 당신은 단지 지역 최저점(local minima) 에 달라 붙을 것입니다. 그리고 모든 도함수를 계산하는 데 비용이 많이 듭니다. 이 접근법이 효과가 있다는 것을 알기 때문에 우리가 즉시 그렇게하지 못할 이유를 나열하지 않습니다.
그것은 뒤늦은 지혜의 이점입니다. 일단 질문을 골라 내면, 가장 어려운 일이 이미 끝났습니다.
도함수(Derivates)는 생각보다 저렴합니다. 이 포스팅에서 주는 가장 중요한 교훈입니다. 사실, 그들은 비현실적으로 저렴합니다. 우리 바보 같은 인간은 이 사실을 반복해서 발견해야했습니다. 이 사실은 딥러닝을 이해하는 데 중요한 사실입니다. 다른 분야에서도 알아야 할 것은 정말 유용합니다. 일반적인 지식이 아니라면 더 많이 알 수 있습니다.
다른 레슨이 있습니까? 나는 더 있다고 생각합니다.
역방향전파(Backpropagation)는 도함수가 모델을 통과하는 방법을 이해하는 데 유용한 렌즈입니다. 이는 왜 일부 모델을 최적화하기 어려운지 추론하는데 매우 유용 할 수 있습니다. 이에 대한 고전적인 예는 RNN(Recurrent Neural Network)에서 사라지는 그라디언트의 문제(the problem of vanishing gradients)입니다.
마지막으로, 나는이 기술들로부터 벗어날 수있는 광범위한 알고리즘 교훈이 있다고 주장합니다. 역방향전파(Backpropagation) 및 순방향 미분은 강력한 기법의 세트로, (선형화 및 동적 프로그래밍)을 사용하여 상상이상으로 효율적으로 도함수을 계산합니다. 이 기술을 정말로 이해한다면 도함수(Derivates)와 관련된 몇 가지 흥미로운 표현을 효율적으로 계산할 수 있습니다. 우리는 나중에 블로그 게시물에서 이것을 탐구 할 것입니다.
이 포스팅은 역방향전파(backpropagation)에 대한 매우 추상적인 레벨의 이해를 돕습니다. 좀 더 자세히 공부하고 싶으시다면, 마이클 닐슨 (Michael Nielsen)의 이 챕터에서 탁월한 토론, 특히 신경망에 중점을 두어 읽는 것이 좋습니다.
이 게시물을 교정하기 위해 시간을내어 주신 Greg Corrado, Jon Shlens, Samy Bengio 및 Anelia Angelova에게 감사드립니다.
이것은 dynamic programming과 같이 느껴지네요!