이 줄 : 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_i
은 i
클래스의 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
입니다.이것은 y
가 y
가 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입니다. 이전에 보지 못한 것은 sparse
및 full
함수입니다. sparse
을 사용하면 0 행렬을 만들 수 있으며 0이 아닌 행 및 열 위치와 각 위치가 차지하는 값을 지정할 수 있습니다. 이 경우 행마다 하나의 요소에 정확히 액세스하고 예제의 클래스 ID를 사용하여 열에 액세스하고 각 위치를 1로 설정합니다. 또한 클래스를 추측하고 있으므로 1을 더 추가한다는 것을 기억하십시오. ID는 0부터 시작합니다. sparse
행렬이므로 full
으로 변환하여 sparse
형식으로 표시하는 대신 숫자 형 행렬을 제공합니다. 따라서이 코드는 앞서 설명한 코드 조각과 동등합니다. 그러나 그래디언트 계산을 용이하게하기 위해 추가 행렬을 만들지 않기 때문에 첫 번째 방법을 사용하는 것이 더 효율적입니다. 그래디언트를 대신 수정하고 있습니다. (!) 참고로
는 sklearn
는 scikit-learn 파이썬 기계 학습 패키지, 그리고 NameError
는 설치된 실제 패키지를 가지고 있지 참조입니다. pip install sklearn
나 :
그러나 easy_install sklearn
, scikit를 설치하려면, 그것만큼 간단 명령 줄에서, 그래서 .... 컴퓨터에 파이썬 패키지를 설치 pip
또는 easy_install
를 사용 위의 빼기 코드를 실행하는 데 필요하지 않습니다.그래도 NumPy이 필요하지만 패키지가 설치되어 있는지 확인하십시오. pip
를 들어
:
pip install numpy
... 그리고 easy_install
에 대한`delta3`은 무엇입니까
easy_install numpy
? 'NameError'는'sklearn'을 찾을 수 없다는 것을 의미합니다, 그래서 당신은 아마'import'하지 않았을 것입니다. –