2017-12-19 19 views
0

나는 MNIST 데이터 세트를 해킹하기 위해 숨겨진 계층이 아닌 신경망을 구현하려고 시도했다.Backpropagation 알고리즘 구현의 문제점은 무엇입니까?

저는 Sigmoid를 활성화 함수로 사용하고 교차 엔트로피를 손실 함수로 사용했습니다.

내 네트워크에는 숨겨진 레이어가없고 입출력 만 있습니다.

이 코드는 backpropagation 알고리즘을 구현 한 부분이지만 예상대로 작동하지 않습니다. 손실 함수의 강하는 극도로 느립니다 (0.001에서 1로 학습 속도로 시도했습니다). 정확도는 0.1 이상으로 증가하지 않습니다.

결과는 다음과 같다 :

내가 여기서 무엇을보고에서
# 0 loss: 279788.368245 acc: 0.0903333333333 
# 1 loss: 279788.355211 acc: 0.09035 
# 2 loss: 279788.350629 acc: 0.09035 
# 3 loss: 279788.348228 acc: 0.09035 
# 4 loss: 279788.346736 acc: 0.09035 
# 5 loss: 279788.345715 acc: 0.09035 
# 6 loss: 279788.344969 acc: 0.09035 
# 7 loss: 279788.3444 acc: 0.09035 
# 8 loss: 279788.343951 acc: 0.09035 
# 9 loss: 279788.343587 acc: 0.09035 
# 10 loss: 279788.343286 acc: 0.09035 
# 11 loss: 279788.343033 acc: 0.09035 

답변

0

, 작동이 방지되는 몇 가지 가능한 요인이있다.

우선, 가중치와 바이어스를 무작위로 초기화해야합니다. 내가보고있는 것으로부터 당신은 확실한 가치 (예 : w1 = 0)가없는 값을 변경하려고합니다.

두 번째로, 옵티 마이저는 MNIST 데이터 세트에 적합하지 않습니다. 옵티 마이저는 backpropagation을 기반으로 값을 변경하기 때문에 올바른 옵티 마이저를 선택하는 것이 매우 중요합니다. Gradient Descent는이 데이터 세트에 더 적합하며, 내가 볼 수있는 것에서부터 Gradient Descent를 사용하지 않습니다. 코드를 사용하여 Gradient Descent 최적화 프로그램을 만들려고한다면 잘못했을 가능성이 큽니다. 그라디언트 디센트 (Gradient Descent)는 SSE (Sum of Squared Error)의 부분 파생물을 포함하며이 코드에서는 볼 수 없습니다.

그래디언트 하강 옵티 마이저를 사용하려면 그래디언트 디센트 뒤에 수학을 구현하는 것 외에 코드를 약간 변경해야합니다. Sigmoid 기능 대신 ReLU 활성화 기능 (필자는 어쨌든해야 함)을 사용해야합니다. 이것은 소실점 그라디언트 문제가 발생하지 않도록합니다. 또한, 당신은 손실 엔트로피의 감소 된 평균을 가져야합니다. 옵티마이 저가 훨씬 더 효과적입니다.

희망이 도움이됩니다.