2

NN 및 백 프레젠테이션에서 this tutorial을 따르고 있습니다.백 프로 그레이션의 스케일링

나는 python에 익숙하지 않으며 코드를 MATLAB으로 변환하려고합니다. 는 누군가가 친절하게 (튜토리얼)에서 다음 코드 라인을 설명 할 수 : 한마디로

delta3[range(num_examples), y] -= 1 

, 그리고 내가 잘못 아니에요 경우, delta3y는 벡터이며 num_examples는 정수이다.

저는 delta3=probs-ythis math exchange entry (안녕하세요. 감사합니다.)과 같이 이해합니다. 왜 그리고 언제 1을 뺄까요?

그렇지 않은 사람이라면 누구든지 나를 온라인 사이트로 안내 할 수 있습니까? 단순히 코드를 실행하면됩니다.

: (아마 가져 오기 내가 놓친 거지) "나가서 설명하자면 NameError : 정의되지 않은 이름 'sklearn'는"

+1

? 'NameError'는'sklearn'을 찾을 수 없다는 것을 의미합니다, 그래서 당신은 아마'import'하지 않았을 것입니다. –

답변

3

이 줄 : delta3[range(num_examples), y] -= 1가 속한 나는 (내 홈 PC 포함) 실행하려고 사방 오류를 얻고 있었다 소프트 맥스 손실 함수의 구배를 계산. 나는 당신에게이 손실 함수가 공식화 된 방법과 그것에 대한 직감에 대한 더 많은 정보를 제공하는 좋은 링크를 참조한다 : http://peterroelants.github.io/posts/neural_network_implementation_intermezzo02/.

또한 소프트 스택 손실의 그래디언트가 어떻게 유도되는지 보여주는 수학 스택 교환에 관한이 게시물을 참조하십시오 : https://math.stackexchange.com/questions/945871/derivative-of-softmax-loss-function. 두 번째 링크가 첫 번째 링크의 tl;dr 인 반면 첫 번째 링크는 심층 다이브로 간주합니다.

소프트 맥스 손실 함수의 그래디언트는 출력 레이어가 백 프로 모션 알고리즘을 계속 진행하기 전에 레이어로 거꾸로 전파해야하는 출력 레이어의 그라디언트입니다.

위의 링크를 요약하면 교육 사례의 softmax 손실의 그래디언트를 계산하면 각 클래스의 손실 그라디언트는 해당 클래스에 대해 평가 된 softmax 값입니다. 또한 실제 학습 예제가 속한 클래스에 대해 손실 값을 1 씩 뺄 필요가 있습니다. i에 대한 예제의 그래디언트는 p_i - y_i과 같습니다. 여기서 p_ii 클래스의 softmax 점수이고 y_i은 one-hot 인코딩 체계를 사용하는 분류 레이블입니다. 예를 들어, y_i = 0 인 경우 i이 실제 클래스가 아니고 y_i = 1이면 true입니다. delta3에는 미니 배치의 예제마다 softmax loss 함수의 그래디언트가 있습니다. 특히 총 행 수가 학습 예제의 수와 같은 2D 행렬 또는 num_examples이며 열의 수가 총 클래스 수입니다.

먼저 우리는 각 트레이닝 예제와 각 클래스에 대한 softmax 점수를 계산합니다. 다음으로 그라디언트의 각 행에 대해 예제가 속한 실제 클래스에 해당하는 열 위치를 결정하고 점수를 1 씩 빼서 0부터 num_examples - 1까지 목록을 생성하고 y은 예제 당 실제 클래스 레이블을 포함합니다 . 따라서 range(num_examples)y의 각 쌍에 대해 오른쪽 행과 열 위치에 액세스하여 1을 빼면 손실 함수의 그래디언트가 마무리됩니다.

이제 Mathematics Stack Exchange 게시물뿐만 아니라 사용자의 이해에 따라 그래디언트는 delta3 = probs - y입니다.이것은 yy가 1로 설정되어 올바른 클래스를 포함하는 열 인덱스 제외한 모든 제로 probs 같이 y의 각 행에 동일한 크기를 갖는 것을 의미하는 한 핫 부호화 행렬 있다고 가정 따라서 정확하게 생각해 보면 매트릭스가 y 인 경우, 각 행에 대해 예제가 속한 클래스 번호를 제외하고 열이 모두 0 인 경우 각 행의 오른쪽 열에 액세스하고 점수를 빼는 것과 같습니다 by

MATLAB에서이 빼기를 쉽게하기 위해 실제로 선형 인덱스를 만들어야합니다. 특히, 선형 지수 이러한 행과 열 위치를 변환 sub2ind를 사용해야합니다, 우리는 그라데이션 행렬에 액세스하고 따라서 1

하여 값을 뺄 수 있습니다 파이썬 튜토리얼에서는

ind = sub2ind(size(delta3), 1 : num_examples, y + 1); 
delta3(ind) = delta3(ind) - 1; 

당신 연결된 클래스 레이블은 0에서 N-1까지이며, 여기서 N은 총 클래스 수입니다. 1에서 시작하는 인덱스 배열을 시작하는 MATLAB에서 조심해야합니다. 그래서 0 대신에 에서 레이블이 시작되도록 위의 코드에서 을 y에 추가했습니다. ind에는 액세스해야하는 행 및 열 위치의 선형 인덱스가 포함되어 있으므로 이러한 인덱스를 사용하여 빼기를 완료합니다. 당신이 당신의 편집에서 얻은 지식을 사용하여이 문제를 공식화한다면

대신이 작업을 수행 할 것입니다 :

ymatrix = full(sparse(1 : num_examples, y + 1, 1, size(delta3, 1), size(delta3, 2)); 
delta3 = probs - ymatrix; 

ymatrix 내가 각 행은 모두와 함께 예에 해당하는 경우에 대해서 이야기 행렬을 포함 예제가 속한 클래스와 관련된 열을 제외하고는 0입니다. 이전에 보지 못한 것은 sparsefull 함수입니다. sparse을 사용하면 0 행렬을 만들 수 있으며 0이 아닌 행 및 열 위치와 각 위치가 차지하는 값을 지정할 수 있습니다. 이 경우 행마다 하나의 요소에 정확히 액세스하고 예제의 클래스 ID를 사용하여 열에 액세스하고 각 위치를 1로 설정합니다. 또한 클래스를 추측하고 있으므로 1을 더 추가한다는 것을 기억하십시오. ID는 0부터 시작합니다. sparse 행렬이므로 full으로 변환하여 sparse 형식으로 표시하는 대신 숫자 형 행렬을 제공합니다. 따라서이 코드는 앞서 설명한 코드 조각과 동등합니다. 그러나 그래디언트 계산을 용이하게하기 위해 추가 행렬을 만들지 않기 때문에 첫 번째 방법을 사용하는 것이 더 효율적입니다. 그래디언트를 대신 수정하고 있습니다. (!) 참고로


sklearnscikit-learn 파이썬 기계 학습 패키지, 그리고 NameError는 설치된 실제 패키지를 가지고 있지 참조입니다.

pip install sklearn 

나 :

그러나
easy_install sklearn 

, scikit를 설치하려면, 그것만큼 간단 명령 줄에서, 그래서 .... 컴퓨터에 파이썬 패키지를 설치 pip 또는 easy_install를 사용 위의 빼기 코드를 실행하는 데 필요하지 않습니다.그래도 NumPy이 필요하지만 패키지가 설치되어 있는지 확인하십시오. pip를 들어

:

pip install numpy 

... 그리고 easy_install에 대한`delta3`은 무엇입니까

easy_install numpy 
+0

첫 번째로 나는 'y_i'의 구조 나 1을 빼야하는 이유를 이해하지 못하기 때문에이 문제를 이해하는 데 어려움을 겪고 있다고 생각합니다. 내 이식 (different)에서 'y'는 하나의 라벨 'x'에있는 각 엔트리. 레이블에는 올바른 클래스의 번호가 포함됩니다. 나는 당신이 공유 한 [Mathematics Stack Exchange] (http://math.stackexchange.com/questions/945871/derivative-of-softmax-loss-function)에 대해 잘 알고 있으며 여전히'-1' 또는 내 'y'가 그대로 표시 될 때 어떻게하는지. – havakok

+0

나는 정교한 헌신적 인 답을 당신에게주었습니다. 고마워. – havakok

+0

당신은 무엇을 이해하지 못합니까? 'y'는 레이블의 벡터이며 변경되지 않습니다. 내가 링크 한 게시물은 클래스 레이블을 'N'값의 0 벡터로 변환하고이 벡터의 0이 아닌 위치는 클래스 레이블이 있고 1로 설정됩니다. 파생을 이해할 필요조차 없습니다. ... 그라디언트는 softmax 점수이며, 각 예제 또는 각 행에 대해 해당 예제의 클래스 레이블과 연결된 열에 액세스하여 1을 뺍니다. 그래도 여전히 명확하지 않으면 나는 알고있다. 그러나 나는 그것이 나의 대답에서 매우 자명하다고 생각한다. – rayryeng