2016-11-16 4 views
2

ANN을 구현하려고하는데 backpropagation에 대한 수치 그라디언트 검사를 작성했습니다. 시그 모이 드 함수를 사용하면 수치 그라디언트 검사가 올바르게 작동합니다.
그러나 relu 활성화를 사용하면 그라디언트 검사가 실패합니다.relu 그라디언트를 확인하는 방법

switch opts.act_function 
    case 'relu' 
     d_act = a{i} > 0; 
    case 'sigmoid' 
     d_act = a{i} * (1 - a{i}); 
end 

내 문제는 내가 0 0의 subgradient을 설정하면 0에서 아니 그라디언트가 없다는 것입니다,이 올바른지 다음과 같이

내가 얻는 구배는 기록?

+0

정확히 무엇이 실패합니까? 아니면'x = 0'에서의 그래디언트가 어떨지에 대한 질문입니까? – hbaderts

+0

무게 기울기를 확인하지 못합니다. 그라디언트를 검사하기 위해'dw = f (w + epsilon) - f (w-epsilon)/(2 * 엡실론)'을 사용합니다. Sigmoid 정품 인증을 사용할 때 이것은 정확하지만 relu 정품 인증을 사용하면 실패합니다. 그래서'x = 0' 일 때 올바른 그래디언트를 설정해야합니다. –

답변

4

ReLU 기능을 이용한 수치 검사는 x = 0에서 문제가있는 것으로 알려져 있습니다. 리콜하면 ReLU 기능은 f(x) = max(0, x)과 같이 정의됩니다. 이 값은 0보다 작은 값을 0으로 클램핑하고 양의 값은 동일한 값을 유지하는 램프 기능입니다.

ReLU와 같은 숫자 그라디언트 검사 기능에서 발생하는 문제는 일반적으로 꼬임의 문제로 알려져 있습니다. 꼬임은 객관적 또는 활성화 기능의 차별화 할 수없는 부분을 지칭합니다. ReLU 함수, x = 0의 왼쪽 및 x = 0 오른쪽에서 접근 도함수 가되지 동일하고 그래서 유도체 x = 0 존재하지 않는 이상 놓고, x = 0에서 꼬임이 존재한다.

그라디언트가 0이 아니더라도 그라디언트 검사를 수행 할 때 0이 아닌 그래디언트를 계산할 수 있습니다. 주어진 wepsilon에 대해 그래디언트를 계산할 수 있습니다. 예를 들어 x = -1e-5이 0이 아닌 경우를 생각해 보면 epsilon = 1e-4 인 경우를 생각해보십시오. 귀하의 의견에서 볼 수있는 중심 차이점 근사법을 사용하여 ReLU의 정의가 주어진 f(x + epsilon) = f(-1e-5 + 1e-4) = f(9e-5) = 9e-5. 마찬가지로 ReLU의 정의가 주어진 f(x - epsilon) = f(-1e-5 - 1e-4) = f(-1.1e-5) = 0. 그러므로이 유도체 근사하려고하는 경우 :

(f(x + epsilon) - f(x - epsilon))/(2*epsilon) = (9e-5 - 0)/2e-4 = 0.45 

수치 구배가 이론적 따라서 0이 될 때에 0.45가 수치 구배 x = 0 향하여 작은 값의 경우는 여기에 의존 할 수없는 우리에게 제공한다. Sigmoid 함수는 모든 곳에서 구별 할 수있는 함수이기 때문에이 문제가 발생하지 않으므로 충분히 작은 epsilon의 경우 함수의 실제 파생 값과 거의 같은 값을 얻을 수 있어야합니다.

대신 숫자로 부정확 할 경우 입니다. 당신이 할 수있는 일은 f(x + epsilon)f(x - epsilon)의 기호가 다른 경우에 당신이 꼬임을 건너는 것 (x = 0)을 줄 때를 결정하는 것입니다. 그런 다음 사용자에게 이러한 상황이 발생했고 수치 그라디언트를 사용해서는 안된다는 경고를 출력 할 수 있습니다. 그렇지 않은 경우, 그래디언트는 f(x + epsilon)f(x - epsilon)이 모두 같은 부호 일 때 정상적으로 통과 할 수 있어야합니다.

+0

''f (x + ε)'와'f (x - ε)'의 부호가 다른 경우의 의미는 무엇입니까? 'f (x) = max (0, x)'.'x + 엡실론'과 'x-엡실론'이 부호가 다를 수 있습니까? –

+0

아니요,'f (x + 엡실론)'과'f (x-ε)'의 부호가 기호가 다를 때 ... 일반적으로. 두 양을 모두 계산할 때 두 값이 모두 양수인지, 음수인지 또는 둘 다 극성이 동일하지 않은지 검사하십시오. 두 값의 극성이 동일하지 않으면 ReLU의 경우 꼬임이 발생합니다. 그러나 당신이 알아 차렸 듯이, 극성이 다른'x + epsilon'과'x-epsilon'을 단순화하여 꼬임이 있음을 알 수 있습니다. 이 단순화는 모든 활성화 또는 목표 함수에 일반적으로 적용되지 않습니다. ReLU와 함께 작동하는 것만으로도 그렇게됩니다. – rayryeng

+0

고마워요. 그러나, 신경망에서 숫자 검사를 할 때, 내가 얻는 것은 사각 손실 함수입니다. 그러므로'f (w + ε)'와'f (w-ε)'는 항상 양수입니다. 꼬임이 있음을 어떻게 알 수 있습니까? 'w + epsilon'과'w-epsilon'이 기호가 다른 경우에 꼬임이 있습니까? f (x + f)는 제곱 손실이고, g (x)는 relu이다. –

관련 문제