그래디언트 디센트
25 Sep 2017 | Gradient Descent
이번 글에서는 그래디언트 디센트(Gradient Descent)에 대해 살펴보도록 하겠습니다. 이 글은 고려대 강필성 교수님 강의와 하용호 님의 자료를 정리했음을 먼저 밝힙니다. 그럼 시작하겠습니다.
산등성이 내려가기
우리는 오차가 적은 모델을 만들고 싶습니다. 이 오차는 미리 구해졌다고 칩시다. 딥러닝 모델의 오차가 무엇인지에 관련해서는 이곳을 참고하시기 바랍니다. 어쨌든 오차를 줄이는 과정, 즉 학습과정은 높은 산등성이에서 산 아래로 이동할 때 두 눈을 가리고 한발한발 내딛어 더 낮은 쪽으로 한걸음씩 내려가는 것에 비유할 수 있을 것입니다.
이 때 중요한 것은 현재 위치 $x_{old}$에서 내려가야 할 방향과 보폭입니다. 우리가 만들고 있는 모델을 $f$, 방향을 그래디언트(gradient) $f’$, 보폭을 학습률(learning rate) $α$(0<$α$<1)라고 두면, 그래디언트 디센트에 의해 정해진 다음 위치 $x_{new}$는 다음과 같이 정의됩니다.
\[{ x }_{ new }={ x }_{ old }-\alpha f^{ \prime }\left( {x}_{old} \right)\]
$f(x_{new})$는 $f(x_{old})$보다 항상 작습니다. 테일러 급수 전개(Taylor Series Expansion)를 활용해 유도해보겠습니다. $f(x+Δx)$는 테일러 급수 전개에 의해 다음과 같이 무한합으로 나타낼 수 있습니다.
\[f\left( x+\Delta x \right) =f\left( x \right) +\frac { f^{ ' }\left( x \right) }{ 1! } \Delta x+\frac { f^{ '' }\left( x \right) }{ 2! } { \Delta x }^{ 2 }+...\]
$x_{new}=x_{old}-αf’(x_{old})$이므로 양변에 $f$를 적용하면 $f(x_{new})=f(x_{old}-αf’(x_{old}))$이 성립합니다. 여기에서 $x_{old}-αf’(x_{old})$를 위 테일러 급수 전개식의 $x+Δx$라고 보면 다음 또한 성립합니다.
\[\begin{align*}
f\left( { x }_{ new } \right) &=f\left[ { x }_{ old }-\alpha f^{ ' }\left( x \right) \right] \\&=f\left( { x }_{ old } \right) +\frac { f^{ ' }\left( { x }_{ old } \right) }{ 1! } \left[ -\alpha f^{ ' }\left( { x }_{ old } \right) \right] +\frac { f^{ '' }\left( { x }_{ old } \right) }{ 2! } { \left[ -\alpha f^{ ' }\left( { x }_{ old } \right) \right] }^{ 2 }+...\\ &\cong f\left( { x }_{ old } \right) -\alpha { \left[ f^{ ' }\left( { x }_{ old } \right) \right] }^{ 2 }<f\left( { x }_{ old } \right)
\end{align*}\]
위 식의 마지막 줄은 테일러 급수 전개식을 2차항까지만 써서 근사한 결과입니다. 그런데 $f’(x_{old})^2$의 값은 항상 양수이므로 결론적으로 $f(x_{new})<f(x_{old})$가 성립합니다. 요컨대 그래디언트 디센트 기법을 취해 오차를 줄여나갈 수 있다는 이야기입니다.
오차를 역전파하기
딥러닝 학습 과정에서는 모델이 틀린 정도(오차)를 모델 전체의 파라메터에 역전파(backpropagation)하게 됩니다. 미분하고 곱하고 더하고를 역방향으로 반복하며 파라메터를 업데이트하는 구조입니다. 오차를 역전파하는 과정에 대해서는 이곳을 참고하시면 좋을 것 같습니다.
딥러닝 모델 파라메터 업데이트는 체인룰(chain rule)에 의해 그래디언트를 계속 곱하는 과정에서 이뤄집니다. 그런데 중간에 있는 계층의 그래디언트가 0이거나 작은 값이면 곱셈이 누적되는 과정에서 파라메터 업데이트가 잘 안되는 경우가 발생할 수 있습니다. 이를 Vanishing Gradient 문제라고 합니다.
Vanishing Gradient 문제는 맨 뒤에 있는 학생까지 줄을 세우려는 교장 선생님에 비유할 수 있습니다. (정말 명쾌한 비유라고 생각됩니다, 하용호님 감사합니다)
Vanishing Gradient 문제를 해결하기 위해 활성함수(activation function)를 바꾸는 방안이 제시됐습니다. 매우 큰 양수이거나 작은 음수일 때 그래디언트가 사그라드는 시그모이드 대신 ReLU 등을 사용하는 것입니다. 활성함수와 관련해서는 이곳을 참고하시면 좋을 것 같습니다.
파라메터 최적 업데이트
그래디언트 디센트 방법은 현재 위치 $x_{old}$에서 학습데이터 전체를 넣어 전체 오차를 계산한 뒤 나온 그래디언트를 구해 이 그래디언트의 역방향으로 $x_{old}$를 업데이트하는 방식입니다. 하지만 학습데이터의 양이 기본적으로 많은 만큼 계산량이 커질 수밖에 없습니다. 이 때문에 학습데이터의 일부만 활용해 그래디언트를 구하는 Stochastic Gradient Descent(SGD) 같은 다양한 업데이트 기법들이 제안되었습니다. 하용호 님 표현에 따르면 ‘느린 완벽보다는 불완전하나마 빠른 방식’을 택한 것이라 볼 수 있겠습니다. 그 개념을 도식화하면 다음과 같습니다.
파라메터 업데이트 기법으로는 SGD를 비롯해 Momentum, RMSProp, Adam 등 다양한 방식이 제안되었습니다. 이 가운데 Adam의 성능이 좋은 것으로 알려져 있다고 합니다. 파라메터 업데이트 기법 간 관계도(하용호님 자료)는 다음과 같습니다. 파라메터 업데이트 기법과 관련 자세한 내용은 이곳을 참고하시기 바랍니다.
이번 글에서는 그래디언트 디센트(Gradient Descent)에 대해 살펴보도록 하겠습니다. 이 글은 고려대 강필성 교수님 강의와 하용호 님의 자료를 정리했음을 먼저 밝힙니다. 그럼 시작하겠습니다.
산등성이 내려가기
우리는 오차가 적은 모델을 만들고 싶습니다. 이 오차는 미리 구해졌다고 칩시다. 딥러닝 모델의 오차가 무엇인지에 관련해서는 이곳을 참고하시기 바랍니다. 어쨌든 오차를 줄이는 과정, 즉 학습과정은 높은 산등성이에서 산 아래로 이동할 때 두 눈을 가리고 한발한발 내딛어 더 낮은 쪽으로 한걸음씩 내려가는 것에 비유할 수 있을 것입니다.
이 때 중요한 것은 현재 위치 $x_{old}$에서 내려가야 할 방향과 보폭입니다. 우리가 만들고 있는 모델을 $f$, 방향을 그래디언트(gradient) $f’$, 보폭을 학습률(learning rate) $α$(0<$α$<1)라고 두면, 그래디언트 디센트에 의해 정해진 다음 위치 $x_{new}$는 다음과 같이 정의됩니다.
\[{ x }_{ new }={ x }_{ old }-\alpha f^{ \prime }\left( {x}_{old} \right)\]$f(x_{new})$는 $f(x_{old})$보다 항상 작습니다. 테일러 급수 전개(Taylor Series Expansion)를 활용해 유도해보겠습니다. $f(x+Δx)$는 테일러 급수 전개에 의해 다음과 같이 무한합으로 나타낼 수 있습니다.
\[f\left( x+\Delta x \right) =f\left( x \right) +\frac { f^{ ' }\left( x \right) }{ 1! } \Delta x+\frac { f^{ '' }\left( x \right) }{ 2! } { \Delta x }^{ 2 }+...\]$x_{new}=x_{old}-αf’(x_{old})$이므로 양변에 $f$를 적용하면 $f(x_{new})=f(x_{old}-αf’(x_{old}))$이 성립합니다. 여기에서 $x_{old}-αf’(x_{old})$를 위 테일러 급수 전개식의 $x+Δx$라고 보면 다음 또한 성립합니다.
\[\begin{align*} f\left( { x }_{ new } \right) &=f\left[ { x }_{ old }-\alpha f^{ ' }\left( x \right) \right] \\&=f\left( { x }_{ old } \right) +\frac { f^{ ' }\left( { x }_{ old } \right) }{ 1! } \left[ -\alpha f^{ ' }\left( { x }_{ old } \right) \right] +\frac { f^{ '' }\left( { x }_{ old } \right) }{ 2! } { \left[ -\alpha f^{ ' }\left( { x }_{ old } \right) \right] }^{ 2 }+...\\ &\cong f\left( { x }_{ old } \right) -\alpha { \left[ f^{ ' }\left( { x }_{ old } \right) \right] }^{ 2 }<f\left( { x }_{ old } \right) \end{align*}\]위 식의 마지막 줄은 테일러 급수 전개식을 2차항까지만 써서 근사한 결과입니다. 그런데 $f’(x_{old})^2$의 값은 항상 양수이므로 결론적으로 $f(x_{new})<f(x_{old})$가 성립합니다. 요컨대 그래디언트 디센트 기법을 취해 오차를 줄여나갈 수 있다는 이야기입니다.
오차를 역전파하기
딥러닝 학습 과정에서는 모델이 틀린 정도(오차)를 모델 전체의 파라메터에 역전파(backpropagation)하게 됩니다. 미분하고 곱하고 더하고를 역방향으로 반복하며 파라메터를 업데이트하는 구조입니다. 오차를 역전파하는 과정에 대해서는 이곳을 참고하시면 좋을 것 같습니다.
딥러닝 모델 파라메터 업데이트는 체인룰(chain rule)에 의해 그래디언트를 계속 곱하는 과정에서 이뤄집니다. 그런데 중간에 있는 계층의 그래디언트가 0이거나 작은 값이면 곱셈이 누적되는 과정에서 파라메터 업데이트가 잘 안되는 경우가 발생할 수 있습니다. 이를 Vanishing Gradient 문제라고 합니다.
Vanishing Gradient 문제는 맨 뒤에 있는 학생까지 줄을 세우려는 교장 선생님에 비유할 수 있습니다. (정말 명쾌한 비유라고 생각됩니다, 하용호님 감사합니다)
Vanishing Gradient 문제를 해결하기 위해 활성함수(activation function)를 바꾸는 방안이 제시됐습니다. 매우 큰 양수이거나 작은 음수일 때 그래디언트가 사그라드는 시그모이드 대신 ReLU 등을 사용하는 것입니다. 활성함수와 관련해서는 이곳을 참고하시면 좋을 것 같습니다.
파라메터 최적 업데이트
그래디언트 디센트 방법은 현재 위치 $x_{old}$에서 학습데이터 전체를 넣어 전체 오차를 계산한 뒤 나온 그래디언트를 구해 이 그래디언트의 역방향으로 $x_{old}$를 업데이트하는 방식입니다. 하지만 학습데이터의 양이 기본적으로 많은 만큼 계산량이 커질 수밖에 없습니다. 이 때문에 학습데이터의 일부만 활용해 그래디언트를 구하는 Stochastic Gradient Descent(SGD) 같은 다양한 업데이트 기법들이 제안되었습니다. 하용호 님 표현에 따르면 ‘느린 완벽보다는 불완전하나마 빠른 방식’을 택한 것이라 볼 수 있겠습니다. 그 개념을 도식화하면 다음과 같습니다.
파라메터 업데이트 기법으로는 SGD를 비롯해 Momentum, RMSProp, Adam 등 다양한 방식이 제안되었습니다. 이 가운데 Adam의 성능이 좋은 것으로 알려져 있다고 합니다. 파라메터 업데이트 기법 간 관계도(하용호님 자료)는 다음과 같습니다. 파라메터 업데이트 기법과 관련 자세한 내용은 이곳을 참고하시기 바랍니다.
Comments