24

Tôi muốn nâng cấp trình mô phỏng tiến hóa của mình để sử dụng học tập Hebb, như this one. Về cơ bản, tôi muốn những sinh vật nhỏ có thể học cách tìm thức ăn. Tôi đã đạt được điều đó với các mạng feedforward cơ bản, nhưng tôi bị mắc kẹt khi hiểu làm thế nào để làm điều đó với việc học tập của Hebb. Nguyên tắc cơ bản của việc học tập của Hebb là, nếu hai tế bào thần kinh bắn vào nhau, chúng nối với nhau.Làm thế nào để sử dụng học tập của Hebbian?

Vì vậy, các trọng số được cập nhật như thế này:

weight_change = learning_rate * input * output 

Thông tin mà tôi đã tìm thấy trên cách này có thể hữu ích là khá khan hiếm, và tôi không nhận được nó.

Trong phiên bản giả lập hiện tại, trọng số giữa hành động và đầu vào (chuyển động, mắt) được tăng lên khi một sinh vật ăn một miếng thức ăn và tôi không thấy cách dịch có thể chuyển thành mẫu mới này. Chỉ đơn giản là không có chỗ để cho biết nếu nó đã làm điều gì đó đúng hay sai ở đây, bởi vì các thông số duy nhất là đầu vào và đầu ra! Về cơ bản, nếu một đầu vào kích hoạt chuyển động theo một hướng, trọng lượng sẽ tiếp tục tăng lên, cho dù sinh vật có đang ăn gì đó hay không!

Tôi có áp dụng cách học sai Hebb không? Chỉ để tham khảo, tôi đang sử dụng Python.

Trả lời

18

Hebbs law là thông tin chi tiết tuyệt vời cho associative learning, nhưng chỉ là một phần của hình ảnh. Và bạn đã đúng, thực hiện như bạn đã làm, và bỏ chọn một trọng lượng sẽ chỉ tiếp tục tăng. Điều quan trọng là để thêm vào một số hình thức bình thường hoặc quá trình hạn chế. Điều này được minh họa khá tốt trên trang wiki cho Oja's rule. Những gì tôi đề nghị bạn làm là thêm vào một bước post-synaptic divisive normalisation, điều này có nghĩa là bạn chia cho một trọng số bằng tổng của tất cả các trọng số hội tụ trên cùng một nơ-ron sau synap (tức là tổng của tất cả các trọng lượng hội tụ trên một nơron là cố định tại 1).

Điều bạn muốn làm có thể được thực hiện bằng cách tạo mạng sử dụng Hebbian learning. Tôi không hoàn toàn chắc chắn về những gì bạn đang đi vào như là đầu vào vào hệ thống của bạn, hoặc làm thế nào bạn đã thiết lập mọi thứ. Nhưng bạn có thể xem số LISSOM là một tiện ích mở rộng của người Hê-bơ-rơ đến SOM, (self-organising map).

Trong một lớp thuộc loại này, tất cả các tế bào thần kinh có thể được kết nối với nhau. Bạn truyền vào vector đầu vào và cho phép hoạt động trong mạng giải quyết, đây là một số bước giải quyết. Sau đó, bạn cập nhật các trọng số. Bạn làm điều này trong giai đoạn đào tạo, ở phần cuối của các mục được liên kết trong không gian đầu vào sẽ có xu hướng tạo thành các bản vá hoạt động được nhóm trong bản đồ đầu ra. Cũng cần lưu ý rằng bộ não được kết nối ồ ạt, và có tính đệ quy cao (tức là có sự chuyển tiếp, phản hồi, liên kết ngang, vi mạch, và nhiều thứ khác nữa ..).

1

Tôi không quen thuộc với loại mạng thần kinh này, nhưng có vẻ như bạn đang mong đợi nó hoạt động như một phương pháp cập nhật được giám sát trong khi nó không được giám sát. Điều này có nghĩa là bạn không thể dạy điều gì là đúng, nó sẽ chỉ học những gì khác biệt, bằng cách kết hợp. Nghĩa là, nó cuối cùng sẽ kết hợp các hành động với các cụm đầu vào cụ thể. Trong tình huống của bạn, nơi bạn muốn nó cải thiện quyết định của mình bằng phản hồi, tôi không nghĩ rằng cập nhật Hebbian chỉ đủ. Bạn có thể kết hợp nó với một số loại backpropagation mặc dù.

+0

Tôi muốn các mạng không phải là feedforward, não không có tác dụng như vậy, và tôi nghĩ rằng vòng có thể làm mát. Vì vậy, không có thông tin phản hồi, bạn nói ... Vì vậy, về cơ bản, bạn có thể xây dựng chính xác như thế nào sẽ làm việc? Bởi vì nó vẫn có vẻ bị hỏng, nó sẽ kết hợp đầu vào A với đầu ra B, chỉ vì các trọng số bắt đầu đã được thiết lập như thế, và sau đó nó sẽ làm tăng kết nối giữa sau đó vô hạn, có vẻ như. – corazza

2

Mặc dù học tiếng Hebbian, như một khái niệm chung, tạo cơ sở cho nhiều thuật toán học tập, bao gồm backpropagation, công thức đơn giản, tuyến tính mà bạn sử dụng rất hạn chế. Không chỉ làm tăng trọng lượng vô hạn, ngay cả khi mạng đã học được tất cả các mẫu, nhưng mạng hoàn toàn có thể học các mẫu trực giao (tuyến tính độc lập).

Học tập Hebbian tuyến tính thậm chí không đáng tin cậy về mặt sinh học. Mạng thần kinh sinh học lớn hơn nhiều so với mạng của bạn và có tính phi tuyến tính cao, cả tế bào thần kinh và khớp thần kinh giữa chúng. Trong các mạng lớn, phi tuyến tính, cơ hội các mẫu của bạn gần với trực giao cao hơn.

Vì vậy, nếu bạn nhấn mạnh vào việc sử dụng mạng nơ-ron, tôi khuyên bạn nên thêm các lớp tế bào thần kinh ẩn và giới thiệu phi tuyến tính, cả về trọng lượng, ví dụ: như fraxel được đề xuất, và trong bắn các tế bào thần kinh --- ở đây bạn có thể sử dụng chức năng sigmoid, như tanh (có, sử dụng các giá trị âm cho "không bắn" là tốt vì nó có thể dẫn đến giảm trọng lượng). Ở dạng tổng quát của nó, quy tắc Hebbian có thể được diễn tả như

weight_change = learning_rate * f1(input, weight) * f2(output, target_output) 

nơi f1f2 là một số chức năng. Trong trường hợp của bạn, không có target_output, do đó, f2 là miễn phí để bỏ qua nó.

Để có các nơron trong các lớp ẩn của bạn kích hoạt, và do đó để có kết nối giữa đầu vào và đầu ra, bạn có thể khởi tạo trọng số thành các giá trị ngẫu nhiên.

Nhưng mạng lưới thần kinh có thực sự cần thiết hay thậm chí phù hợp với vấn đề của bạn không? Bạn đã xem xét mối tương quan đơn giản chưa? Ý tôi là, Hebb bắt nguồn từ quy tắc của mình để giải thích cách thức học tập có thể hoạt động trong các hệ thống sinh học, không phải là thuật toán học máy tốt nhất có thể.

-1

Bạn có thể thử bằng mã của mình.

/* 
 
* To change this license header, choose License Headers in Project Properties. 
 
* To change this template file, choose Tools | Templates 
 
* and open the template in the editor. 
 
*/ 
 
package modelhebb; 
 

 
/** 
 
* 
 
* @author Raka 
 
*/ 
 
public class ModelHebb { 
 
    public static void main(String[] args) { 
 
     Integer xinput[][] = new Integer[][]{ 
 
      {1, 1}, 
 
      {1, -1}, 
 
      {-1, 1}, 
 
      {-1, -1} 
 
     }; 
 
     Integer xtarget[] = new Integer[]{ 
 
      1, 
 
      -1, 
 
      -1, 
 
      -1 
 
     }; 
 
     Integer xweight[] = new Integer[xinput[0].length]; 
 
     System.out.println("\t Iterasi \t"); 
 
     Integer bayes = 0; 
 
     for (int i = 0; i < xtarget.length; i++) { 
 
      for (int j = 0; j < xinput[i].length; j++) { 
 
       int temp = xweight[j]==null?0:xweight[j]; 
 
       xweight[j] = temp + (xinput[i][j] * xtarget[i]); 
 
       System.out.print("W"+j+": "+xweight[j]+"\t"); 
 
      } 
 
      bayes = bayes + xtarget[i]; 
 
      System.out.println("Bobot : " + bayes); 
 
     } 
 
    } 
 
}

Các vấn đề liên quan