6

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(); 
} 
+0

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. –

+0

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. –

+0

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. :) –

Trả lời

2

Đã giải quyết. Rõ ràng mạng lưới chiều thấp có nhiều khả năng bị kẹt trong một minima địa phương. Điều này rất dễ hiểu khi biết rằng các mạng có chiều cao hơn ít có khả năng đạt được bất kỳ minima nào, thậm chí toàn cầu.

Thực hiện động lượng tăng với mỗi lần lặp lại giúp tôi vượt qua hầu hết các minima. Vì vậy, tái khởi tạo trọng số ngẫu nhiên (-0,5 đến 0,5) giá trị và tiến hành nhiều buổi đào tạo cuối cùng đã giúp tôi vượt qua tất cả chúng.

Tôi vui mừng thông báo rằng mạng của tôi hiện đang được đào tạo trong 100% các trường hợp nếu dữ liệu được phân loại.