2013-06-07 4 views
2

나는 일련의 15 개 입력 (신호의 통계적 고장)으로부터 매우 시끄러운 신호를 예측하는 간단한 반복적 인 신경망을 구축했다.Pybrain : 사용자 정의 오류/성능 기능?

pybrain 소스 (pybrain \ supervised \ trainers \ backprop.py)에서 알 수 있듯이 오류 기능은 제곱 된 오류의 합계를 총 목표 (MSE)로 나눈 값으로 _calcDerivs 함수에 하드 코드됩니다. 구분은 train 함수에서 발생합니다.

필자의 경우 네트워크가 정확한 변화량보다 신호 변경 방향을 예측하는 것이 가장 중요합니다. 따라서 NN이 예측할 때 NN을 페널티하고 신호가 올라갈 때 페널티를 적용하고 그 반대의 경우도 마찬가지입니다. 나는 _calcDerivs뿐만 아니라 현재 대상뿐만 아니라 대상이 방향을 올바르게 추측했는지에 따라 가중치를 계산하는 데 사용하는 이전 대상 및 출력을 전달했지만 네트워크가 두 rprop을 사용하여 수렴하지 못했습니다. 및 배경. 이 모든 일은 저에게 매우 해킹입니다.

내 질문 : 이 있습니까? 기본 성능 기능을 수정하는 방법은 무엇입니까? 모든 성능 함수 코드가 _calcDerivs에 보관되어 있습니까? 아니면 뭔가 빠졌습니까?

답변

2

좋아요, 그래서 내 문제의 원인과 가능한 솔루션, albiet PyBrain에 하나도 발견하지 못했습니다.

내 문제의 원인은 내 맞춤형 비용 (a.k.a 성능 등) 기능의 파생물 또는 그 부족 때문이었습니다.

0.5 * (error ** 2) # 1/2 the average square error 

그리고 이것의 유도체

간단하다 : 사용되는 비용 함수는로 표시

I 더 복잡한 유도체보다 복잡한 에러 함수를 구현하고, I는 '을 한게 때문에
error 

하드 코딩 된 파생물을 변경했는데 (어디로 가든간에), 그라디언트 디센트는 오류 그라데이션을 따라 합리적인 단계를 밟지 못했습니다.

해결책은 neurolab을 사용하는 것이 었습니다. 모듈 방식으로 맞춤 오류 기능을 구현하는 것이 훨씬 쉬워졌습니다. 핵심 파일에 해킹이 필요했지만 대략 3 ~ 4 줄의 핵심 코드 만 변경하면됩니다. (특히, tool.py의 ff_grad_step과 core.py의 Train 클래스의 마지막 줄을 수정했습니다. error.py에 새 함수를 만들고 net.py에서 네트워크를 연결하여 맞춤형 비용 함수를 구현했습니다.)

나는이 상황이 비슷한 상황에있는 다른 누군가에게 내 자신의 문제에 너무 구체적이지 않기를 바란다. 그러나 이것은 신경 네트워크를 배우는 데 매우 중요한 요소 일 수있다.