Tôi đang cố gắng thực hiện backpropagation với đệ quy cho mục đích học tập, nhưng có vẻ như tôi đã đi sai ở đâu đó. Đã được tinkering với nó trong một thời bây giờ nhưng hoặc là không có học tập ở tất cả hoặc không học tập trên mô hình thứ hai.ANN: Đệ quy ngược lại
Vui lòng cho tôi biết nơi tôi đã đi sai. (Đây là cú pháp javascript) Lưu ý: các lỗi được đặt lại thành null
trước mỗi chu kỳ học tập.
this.backpropagate = function(oAnn, aTargetOutput, nLearningRate) {
nLearningRate = nLearningRate || 1;
var oNode,
n = 0;
for (sNodeId in oAnn.getOutputGroup().getNodes()) {
oNode = oAnn.getOutputGroup().getNodes()[sNodeId];
oNode.setError(aTargetOutput[n] - oNode.getOutputValue());
n ++;
}
for (sNodeId in oAnn.getInputGroup().getNodes()) {
this.backpropagateNode(oAnn.getInputGroup().getNodes()[sNodeId], nLearningRate);
}
}
this.backpropagateNode = function(oNode, nLearningRate) {
var nError = oNode.getError(),
oOutputNodes,
oConn,
nWeight,
nOutputError,
nDerivative = oNode.getOutputValue() * (1 - oNode.getOutputValue()), // Derivative for sigmoid activation funciton
nInputValue = oNode.getInputValue(),
n;
if (nError === null /* Dont do the same node twice */ && oNode.hasOutputs()) {
nDerivative = nDerivative || 0.000000000000001;
nInputValue = nInputValue || 0.000000000000001;
oOutputNodes = oNode.getOutputNodes();
for (n=0; n<oOutputNodes.length; n++) {
nOutputError = this.backpropagateNode(oOutputNodes[n], nLearningRate);
oConn = oAnn.getConnection(oNode, oOutputNodes[n]);
nWeight = oConn.getWeight();
oConn.setWeight(nWeight + nLearningRate * nOutputError * nDerivative * nInputValue);
nError += nOutputError * nWeight;
}
oNode.setError(nError);
}
return oNode.getError();
}
Cấu trúc lưới thần kinh của bạn trông như thế nào? Có lý do nào bạn đang sử dụng đệ quy không? Bạn sẽ có thể lặp qua các lớp riêng lẻ bằng cách bắt đầu với lớp đầu ra và làm việc theo cách của bạn trở lại. –
Vivin, điểm học tập của bài tập này là sử dụng đệ quy cho BP. (Không, đây không phải là bài tập ở nhà của tôi, tôi chỉ cố gắng để có được tâm trí của tôi xung quanh này :) Mạng lưới tại thời điểm này là rất đơn giản: 2-2-1 3 lớp mạng với chức năng kích hoạt sigmoid, mà tôi đang cố gắng để đào tạo với [1, 0] -> [0.2] và [0, 1] -> [0.9] mẫu đào tạo. –
Thuật toán điển hình tôi đã thấy làm điều này lặp đi lặp lại; Tôi đã tự hỏi tại sao bạn lại chọn đệ quy. :) –