brunch

You can make anything
by writing

C.S.Lewis

by Chris송호연 Aug 11. 2017

Vanishing Gradient Problem

어디서 많이 들어봤죠?

이 글은 아래 Rohan Kapur 글을 번역한 것입니다. 


한국어로된 아티클 중에 일부 Vanishing Gradient Problem을 설명한 글이 있습니다만, 저는 좀 더 디테일하고 친절한 글로 Vanishing Gradient Problem을 이해를 하고 싶었습니다. 


마침 아주 좋은 글을 발견했네요!

Vanishing Gradient Problem을 가장 잘 설명한 글이라 생각해서 번역했습니다.

공부할 시간이 퇴근 후 밖에 없어서.. 잠을 늦게 자네요 ㅠ


https://ayearofai.com/rohan-4-the-vanishing-gradient-problem-ec68f76ffb9b





이것은 2016 년에 인공 지능에 대한 지식을 넓힐 수 있는 여정 중 네 번째 항목 입니다. 이 소개 글에서 내 집필 동기에 대해 자세히 알아보십시오 .
이 게시물은 당신이 신경 네트워크 및 backpropagation 알고리즘에 대한 지식이 있다고 가정합니다. 혹시나 모르신다면 여기 링크에서 내용을 공부한 후 따라잡을 수 있습니다

여름입니다! 그리고 당신은 최근 나의 backpropagation 알고리즘에 대한 게시물 을 읽었습니다. 당신은 흥분한 상태로 Deep, Multi-Layer 신경망을 만들고 프로그램을 실행하기 시작합니다. 그러나 당신의 노력이 있더라도 Training을 하거나 영원히 정확하게 수행하지 못합니다. 왜 당신은 신경망이 최적이라고 생각 했습니까?


나는 사실이 문제에 잠시 막혔었습니다.


다음은 반복 최적화 알고리즘(Iterative Optimization Algorithm)에 대해 알고있는 것입니다. 즉, 비용 함수의 출력이 감소하도록 그라디언트에서 추론 된 방향으로 가중치를 교란하여 로컬 최적 값으로 천천히갑니다. 그래디언트 디센트 알고리즘은 특히 0에서 1 사이의 작은 스칼라 값을 곱한 그래디언트의 음수로 가중치를 업데이트합니다.

보시다시피 컨버전스까지 "반복"해야 합니다. 실제로는 최대 반복 횟수에 대한 하이퍼 파라미터를 설정했습니다. 특정 Deep Neural Network에 대한 반복 횟수가 너무 적으면 부정확 한 결과가 나타납니다. 숫자가 너무 많으면 훈련 기간이 비현실적으로 길어집니다. 그것은 훈련 시간과 정확성 사이의 불안정한 절충점입니다.


그래서, 왜 이게 이슈가 되는 걸까요? 각 단계의 기울기가 너무 작으면, 간단히 말하면, 반복이 발생할 때마다 Weight이 충분히 변하지 않기 때문에 더 큰 반복이 수렴 될 때까지 필요합니다. 또는 설정된 반복 횟수에서 Weight이 최소 (vs 큰 그라디언트)에 근접하지 않습니다. 그리고 정말 정말 작은 그라디언트는 문제가된다. 신경망을 훈련시키는 것은 실행 불가능하며, 예측이 어려워집니다.


다음과 같이 길쭉한 비용 함수를 얻습니다.

평면 그라디언트 및 길쭉한 비용 함수가 필요한 더 많은 업데이트에 대한 시각적 표현

그 모양을 다음과 같은 최적의 모양과 비교해보겠습니다. 예를 들면 다음과 같습니다.

후자에는 더 큰 그라디언트가 있기 때문에 그라디언트 디센트는 훨씬 더 빠르게 수렴 할 수 있습니다.


이것은 유일한 문제는 아닙니다. 그래디언트가 너무 작아지면 컴퓨터에서 수치를 나타내는 것도 어려워집니다. 우리는 이것을 언더 플로라고 부릅니다. 오버플로의 반대입니다.


오케이. 작은 그라디언트 = 나쁜 소식, 알겠습니다. 문제는 다음과 같습니다. 이 문제가 존재합니까? 많은 경우에 실제로 그렇게되며, 우리는 이를 Vanishing Gradient Problem이 라고 부릅니다 .


분류 컨텍스트에서 ANN에 대한 활성화 함수로 거의 항상 사용 된 Sigmoid 함수를 생각해보십시오.

시그 모이 드 함수는 모든 입력 값을 (0, 1) 출력 범위 (점근선이있는 곳)에 "압축"하기 때문에 유용합니다. 이는 확률 및 분류의 표현에 적합합니다. Sagmoid 함수는 tanh 함수와 함께 최근 몇 년 동안 인기를 잃었습니다. 왜? 그들은 vanishing gradient problem을 가지고 있기 때문입니다!


Sigmoid 함수의 미분을 살펴 보겠습니다. 나는 당신을 위해 그것을 사전 계산했습니다 :


간단히는 S (1-s)


자, 그래프를 그려 봅시다 :

https://www.desmos.com/calculator의 Courtesy


기울기를 보세요. 좀 더 가까이 봐보세요. 함수의 최대 점은 1/4이고, 함수는 수평으로 0에서 점근합니다. 즉, 비용 함수의 미분 출력은 항상 0과 1/4 사이입니다. 수학 용어로, 범위는 (0, 1/4]입니다. 명심하십시오.


이제 신경망의 구조와 backprop과 그라디언트 크기에 미치는 영향에 대해 알아 보겠습니다.


단순한 단 변량 신경망을 위한 이 일반적인 구조를 생각해보십시오. 각 뉴런 또는 "활동"은 이전 활동에서 파생됩니다. 이전 활동에 일부 Weight을 곱한 다음 활성화 함수를 통해 공급됩니다. 물론 입력은 주목할만한 예외입니다. 끝에 있는 Error 상자 J 는 시스템의 Error를 집계하여 반환합니다. 그런 다음 J 의 출력 이 최소화 되도록 그라데이션 디센트를 통해 Weight를 수정하기 위해 Backpropagation을 수행합니다 .


첫 번째 Weight으로 미분을 계산하려면 체인 규칙을 사용하여 다음과 같이 "backpropagate"합니다.


그런 다음이 미분을 사용하여 그래디언트 디센트를 사용하여 반복적으로 최소 점을 만듭니다.

이 개별 derivatives에 초점을 맞춰봅시다.

1 차 미분과 관련하여 출력은 2 차 hidden unit의 활성화이므로 우리는 Sigmoid 함수를 활성화 함수로 사용하고 출력 의 미분은 Sigmoid 함수의 미분 을 포함하게 됩니다. 구체적으로 표현식은 다음과 같습니다.

출력에서 hidden2로


두 번째에도 똑같이 적용됩니다.

hidden 2에서 hidden 1로


두 경우 모두, derivatives는 Sigmoid 함수의 derivatives를 포함합니다. 자, 함께 넣어 봅시다.

Sigmoid 함수의 미분 값은 0과 1/4사이의 값을 출력 함을 상기하십시오. 이 두 도함수를 곱하면 범위 (0, 1/4]에 두 값이 곱해집니다. 0과 1 사이의 두 숫자가 곱 해지면 값이 더 작아 집니다 (예 : 1/3 × 1/3 은 1/9입니다).


일반적인 신경망의 가중치로 초기화하기 위한 표준 접근법은 평균 0, 표준 편차 1에 따라서 가우시안을 사용하여 weight를 선택하는 방법입니다.  Weight의 가중치는 보통 -1과 1 사이에있을 것입니다.


이제 우리 expression의 크기를 살펴보겠습니다.

이 시점에서 우리는 0과 1 사이에있는 4 개의 값을 곱합니다. 이것은 매우 작아 집니다. 그리고이 weight 초기화 기술을 사용하지 않더라도 사라지는 그라디언트 문제는 여전히 발생할 가능성이 큽니다. 이 시그 모이 derivatives의 대부분은 다른 무게를 보상 할만큼 작은 것입니다 함께 곱한, 다른 가중치는 1 이하의 범위로 이동 할 수 있습니다.


이 신경망은 그다지 깊지 않습니다. 그러나 산업용 어플리케이션에 사용되는 것보다 더 깊은 것을 상상해보십시오. 우리가 더 뒤쪽으로 backpropagate 할 때, 제품에 더 많은 작은 숫자가 포함되어 더 작은 그라데이션을 만듭니다! 따라서 깊은 신경망에서는 사라지는 그라디언트 문제가 주요 관심사가됩니다. (!) 참고는 : 그라디언트가보다 큰 1 인 경우에 우리는 심지어, exploding gradient를 가질 수있습니다 (1보다 큰 값들을 곱하다보면 엄청나게 큰 값이 나오게 됩니다) 이런 것들도 역시나 좋지 않습니다.


이제 일반적인 ANN을 살펴 보겠습니다.

보시다시피, 첫 번째 레이어는 오류에서 가장 멀리 떨어져 있으므로 체인 규칙을 사용하는 derivatives가 더 긴 표현이되고 더 많은 Sigmoid derivatives가 포함되어 작아집니다. 이 때문에 첫 번째 레이어는 학습시키기가 가장 느린 것 입니다. 그러나 이것에 또 다른 문제가 있습니다 : 후자의 레이어 (그리고 가장 주목할만한 출력)가 이전 레이어에 기능적으로 의존하기 때문에, 부정확 한 초기 레이어는 후자의 레이어가이 부정확성을 간단히 구축하여 전체 신경 망을 손상시킵니다. 회선 신경망을 예로 들어보겠습니다. 그들의 초기 레이어는보다 높은 레벨의 피쳐 검출을 수행하여, 후자의 레이어가 이들을 더 분석하여 선택을 할 수있게한다. 또한 작은 단계로 인해 그라디언트 디센트는 로컬 최소값에 수렴 할 수 있습니다.


이것이 신경 네트워크 (특히 깊은 네트워크)가 처음에는 인기를 얻지 못하는 이유입니다. 이전 계층을 올바르게 교육하는 것이 전체 네트워크의 기본 이었지만, 일반적으로 사용되는 활성화 기능과 사용 가능한 하드웨어 때문에 너무 어렵고 실행 불가능한 것으로 판명되었습니다.


어떻게 해결할 수 있을까요? 자, 근본 원인이 sigmoid 활성화 함수 미분의 본질이라는 것은 꽤 분명합니다. 이것은 또한 가장 대중적인 대안 인 tanh 기능에서도 발생했습니다. 최근까지는 다른 많은 정품 인증 기능을 생각하거나 사용하지 않았습니다. 그러나 이제 Sigmoid 및 tanh 기능은 ReLU 활성화 기능에 비추어 인기가 떨어졌습니다.


ReLU-Rectified Linear Unit 기능이란 무엇입니까? 그것은 다음에 해당하는 조각 별 함수입니다.

ReLU 함수를 작성하는 또 다른 방법은 다음과 같습니다.

즉, 입력이 0보다 작 으면 함수는 0을 출력합니다. 그렇지 않으면 함수가 identity 함수를 모방합니다. ReLU 기능을 계산하는 것은 매우 빠릅니다.

The “Rectified Linear Unit” acivation function — http://i.stack.imgur.com/8CGlM.png


이 함수의 미분을 계산하는 데는 천재가 필요하지 않습니다. 입력이 0보다 작 으면 출력은 항상 0이므로 함수의 변화율은 0입니다. 입력이 0보다 크거나 같으면 출력은 단순히 입력이므로 미분은 1과 같습니다.

함수는 0에서 구별 할 수 없습니다.

이 미분을 그래프로 나타내면 전형적인 스텝 함수와 똑같이 보입니다.

이봐 요 ... 그것은 Step function입니다!

그래서, 그것은 해결되었습니다! 활성화 함수의 derivatives는 (0,1) 범위에 의해 제한되지 않기 때문에 우리의 derivatives는 더 이상사라지지 않습니다.


ReLU에는 하나의주의 사항이 있습니다. 입력 값이 음수이면 "죽습니다"(출력 0). ReLU 함수에 하나의 음수 값이 입력 된 후에 그라디언트가 0이되기 때문에 많은 경우에 backpropagation을 완전히 차단할 수 있습니다. 이것은 large negative bias term / constant term이 학습 된 경우에도 문제가 될 수 있습니다. 양수가 bias term의 중요성을 보상 할 수 없기 때문에 뉴런으로 공급되는 weight 합이 음수가 될 수 있습니다. 음수 weight 또는 음수 입력 (또는 음수 가중치를 제공하는 조합)을 염두에 두어야합니다. 따라서 죽은 ReLU는 거의 모든 활동 (예 : 0)에 대해 동일한 값을 출력합니다. ReLUs는 어떤 식 으로든 가중치를 수정하지 않으므로이 문제에서 "복구"할 수 없습니다. 음수 입력에 대한 출력이 0 일뿐만 아니라, derivatives 도 있습니다. 신경망이 전체 네트워크의 손상으로부터 탈출 할 수 있도록 (예를 들어) 바이어스 항을 음의 크기보다 작게 수정하는 업데이트는 이루어지지 않습니다. 만약 우리가 이런 이슈가 발생할 것을 염려한다면, 우리가 weight을 초기화할 때 오직 양수값을 쓰거나 0 부터 1 사이의 정규화된 값을 쓴다고 했을 때, 가중 합(weighted sum)이 음수로 발생하는 일은 발생하지 않습니다. 


편집 : 그것이 밝혀지면서, 그라디언트가 죽어가는 몇 가지 매우 유용한 속성이 있습니다. 특히, "희소성(sparsity)"의 개념. 그래서, 여러 번, 배경막이 막혀 실제로 이점 이 될 수 있습니다 . 


http://stats.stackexchange.com/a/176905/98975


"leaky" ReLU는 이 문제를 해결합니다. Leaky Rectified Linear Units는 입력값이 음수일 때 0 대신 아주 작은 그라이언트를 사용합니다. 이렇게 함으로써, net에 학습을 계속하기 위한 기회를 제공합니다.


편집 : 0.2-0.3 범위의 값을 같은 0.01보다 일반적인 것 같습니다.


입력이 음수 일 때 0을 출력하는 대신 함수는 그라데이션 ε을 사용하여 매우 평평한 선을 출력합니다. ε에 사용할 공통 값은 0.01입니다. 결과 함수는 다음 다이어그램에 표시됩니다.

보시다시피, 학습은 부정적인 입력으로는 작지만 그럼에도 불구하고 존재할 것입니다. 이런 의미에서, Leaky ReLUs는 죽지 않습니다.


그러나 ReLUs / Leaky ReLUs가 항상 최적 일 필요는 없습니다. 결과가 일치하지 않아 작은 상수로 인해 다시 기울기가 사라질 수 있습니다. 그 모든 것을 자주). 또 다른 주목할만한 문제는 ReLU의 출력이 tanh / sigmoid처럼 0과 1 또는 -1과 1 사이에 국한되지 않기 때문에 활성화 (그라디언트가 아닌 네트워크의 뉴런에있는 값)가 실제로 폭발 할 수 있다는 것입니다 재발 성 신경 네트워크와 같은 매우 깊은 신경 네트워크. 트레이닝을하는 동안 잘못된 방향으로 가중치를 조금이라도 업데이트하면 활성화가 폭발 할 수 있기 때문에 전체 네트워크가 약하고 불안정 해집니다. 마지막으로 ReLU derivatives가 0 또는 1 인 경우에도 우리의 전반적인 미분 표현에는 곱한 가중치가 포함됩니다.


따라서 전반적으로 흑백 문제는 아닙니다. ReLUs는 여전히 vanishing gradient problem에 직면합니다. 다만, 그들은 좀 더 낮은 수준으로 겪고 있다는 것 뿐입니다. 제 생각에는 vanishing gradient problem는 바이너리가 아닙니다. 당신은 하나의 기술로 그것을 해결할 수는 없지만, 당신은 그것의 영향력을 지연시킬 수 있습니다.


그런데 ReLUs는 값을 확률로 집어 넣지 않습니다. 왜 그렇게 자주 사용됩니까? 이진 분류 시나리오에서 신경망 끝에 sigmoid / logistic 활동을 쉽게 적용 할 수 있습니다. 다중 출력의 경우 softmax 함수 를 사용하여 1에 더하는 확률 분포를 만들 수 있습니다 .


결론

이 아티클은 이론적 인 알고리즘과 계산을 보는 것보다 기계 학습의 복잡함과 연습에 대한 첫 걸음 이었기 때문에 작성하는 것이 기쁨이었습니다. vanishing gradient problem은 deep learning의 성공을 가로막는 주요 장애물 이었지만 이제는 weight 초기화 (오늘은 덜 이야기했습니다), feature preparation (batch normalization - 모든 입력 기능 중심화 값을 0으로 설정) 및 활성화 함수를 사용하면 필드가 번성 할 것입니다. 우리는 게임 AI ( AlphaGo , 물론이지!)의 최근 혁신을 통해 이 필드를 이미 보았습니다 . 여기에 다층 신경망의 미래가 있습니다! 

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari