24

我想升級我的進化模擬器以使用Hebb學習,如this one。我基本上希望小生物能夠學習如何找到食物。我通過基本的前饋網絡實現了這一目標,但我一直在理解如何使用Hebb學習。 Hebb學習的基本原理是,如果兩個神經元一起發射,它們連接在一起。如何利用Hebbian學習?

因此,權重更新如下:

weight_change = learning_rate * input * output 

我如何這會很有用找到的信息是非常稀缺的,我不明白這一點。

在我目前的模擬器版本中,當一個生物吃一塊食物時,一個動作和一個輸入(動作,眼睛)之間的權重增加了,我看不出這個模型可以轉換成這個新模型。根本沒有空間可以告訴它是否在這裏做對或錯,因爲唯一的參數是輸入和輸出!基本上,如果一個輸入激活一個方向的運動,無論該生物是否在吃東西,重量會持續增加!

我是否以錯誤的方式應用Hebb學習?僅供參考,我正在使用Python。

回答

18

Hebbs lawassociative learning的精彩見解,但它的唯一部分是圖片。你是對的,如你所做的那樣執行,並且不加控制,重量會持續增加。關鍵是要加入某種形式的規範化或限制過程。這在Oja's rule的wiki頁面中有很好的說明。我建議你做的是增加一個post-synaptic divisive normalisation步驟,這意味着你將權重除以所有收斂在相同的突觸後神經元上的權重之和(即,所有權重在神經元上收斂的和是固定的在1)。

你想做的事可以通過建立一個利用Hebbian learning的網絡來完成。我不太清楚你是通過什麼傳遞給你的系統的,或者你是如何設置的。但你可以看看LISSOM,這是一個赫比比亞延伸到SOM, (self-organising map)

在這種類型的層中,通常所有的神經元都可以互相連接。您傳入輸入向量,並允許網絡中的活動解決,這是一些建立步驟。然後你更新權重。您在訓練階段執行此操作,輸入空間中的相關項目將趨於在輸出映射中形成分組的活動補丁。還有一點值得注意的是,大腦是大量互連的,並且是高度遞歸的(即有前饋,反饋,橫向互聯,微電路以及其他許多東西)。

1

我對這種類型的神經網絡並不十分熟悉,但它看起來像是期待它在無監督的情況下像監督式更新方法一樣工作。這意味着你不能教它什麼是對的,它只會通過關聯來了解什麼是不同的。也就是說,它最終將行動與特定的投入集合聯繫起來。在您希望通過反饋改進決策制定的情況下,我認爲只有Hebbian更新纔夠用。儘管如此,你可以將它與某種反向傳播結合起來。

+0

我想網絡不被前饋,大腦不喜歡的工作,我認爲可能的循環冷卻。所以,沒有反饋,你說...基本上,你能否詳細說明這個工作到底是怎麼回事?因爲它似乎仍然被破壞,它會將輸入A和輸出B關聯起來,這是因爲起始權重已經被設置爲這樣,然後它會增加無限的連接,看起來像這樣。 – corazza

2

雖然Hebbian學習作爲一般概念形成許多學習算法(包括反向傳播)的基礎,但您使用的簡單線性公式非常有限。即使網絡已經學習了所有的模式,網絡也不能完全學習正交(線性無關)模式。

線性Hebbian學習甚至在生物學上似乎並不合理。生物神經網絡比你的要大得多,並且非常非線性,神經元和它們之間的突觸。在大的非線性網絡中,您的模式接近正交的機率更高。因此,如果你堅持使用神經網絡,我建議增加神經元的隱藏層和引入非線性,兩者都在權重中,例如,如fraxel提出的,並在神經元的觸發---在這裏你可以使用sigmoid函數,如tanh(是的,使用負值表示「不發射」是好的,因爲它可以減少權重)。在它的一般形式,赫布規則可以表示爲

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

其中f1f2一些功能。在你的情況下,沒有target_output,所以f2是可以忽略它。

爲了讓隱藏層中的神經元激發,從而獲得輸入和輸出之間的連接,可以將權重初始化爲隨機值。

但是神經網絡確實是必要的,甚至適合您的問題?你認爲簡單的相關性?我的意思是,Hebb推導他的規則來解釋學習如何在生物系統中起作用,而不是最好的機器學習算法。

-1

你可以試試我的代碼。

/* 
 
* 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); 
 
     } 
 
    } 
 
}