Machine Learning---Hebbian Learning

MachineLearning---Hebbian Learning

引言

前面介紹了許多“監督式”學習方式,比如PNN、Backpropagation、LMS等。這些算法有一個共同點:提供的數據中,有目標值。相當於一本帶有答案的練習本。接下來將介紹“非監督式”學習方式。

    首先就介紹Hebbian Learnig。


一、HebbianLearning 算法基本介紹

1.算法思想

這裏需要介紹一下Hebb’s Rule。以下來自維基百科:

Whenan axon of cell A is near enough to excite a cell B and repeatedly orpersistently takes part in firing it, some growth process or metabolic changetakes place in one or both cells such that A's efficiency, as one of the cellsfiring B, is increased.

大致意思就是:如果兩個神經元,某一個激活了另一個,並且反覆持續的激活,那麼它們之間的聯繫值應該被加強。

這背後的意思就是:兩個單元有相似的激活值,那麼他們的聯繫將會隨着之間的聯繫而不斷加強。

2.權值調整公式


這個公式計算i和j之間的聯繫權值, 是一個學習參數; 便是兩個神經元的激活值。

如果聯繫我們之前介紹的神經網絡模型,那麼我們可以這麼建模。

一個非常簡單的神經網絡結構:一層爲輸入層,一層爲輸出端。我們把一個輸入端和一個輸出端看成上面兩個神經元。

大致就如下面這張圖所示:


3.算法流程

接下來是該算法的流程:

1.將訓練數據作爲輸入端,按照當前的計算模型計算各個輸出端的值;

2.將計算得到的輸出端的值和輸入端的值,按照上面的公式(1),調整各個權值(w);

3.利用訓練數據按照上述方式調整計算模型。

如果新的數據集進入,按照原先的計算模型計算輸出值。這個時候,如果新進入的數據集和已分類的某一個patternA相似,那麼按照上訴的計算方式調整權值,patternA相對應的權值就會增強,另外的則會減弱。


二、算法實現

下面關鍵的兩個函數

void calculate_activations()
{
    for(int iOut = 0 ; iOut < NUMCELL; ++iOut)
    {
        doubleval = 0.0;
        for(int iIn = 0 ; iIn < NUMCELL ; ++iIn)
        {
            val += weight[iIn][iOut]* input[iIn];
        }
        if(val> 0.0) output[iOut] = 1;
        else
            output[iOut] = -1;
    }
}
void adjust_weights()
{
    for(int iIn = 0 ; iIn < NUMCELL ; ++iIn)
    {
        for(int iOut = 0 ; iOut < NUMCELL ; ++iOut)
        {
            weight[iIn][iOut] +=ration * input[iIn] * output[iOut];
        }
    }
}

三、擴充

1.Hebbian Learning的侷限

比如一個新進入的數據集和當前其中某一個模式patternA完全相同,那麼所有的權值都會增加,包括不和patternA對應的權值也會增加,這樣就導致計算模型的偏差。

2.修改HebbianLearning

我們將公式1修改爲:

 


下面對這個公式稍加解釋:參數和上面公式1中是一樣的。這麼做之後,可以均衡每一次加強或者減弱權值。


四、總結

由於筆者不是專門研究人工智能方面,所以在寫這些文章的時候,肯定會有一些錯誤,也請諒解,上面介紹中有什麼錯誤或者不當地方,敬請指出,不甚歡迎。

如果有興趣的可以留言,一起交流一下算法學習的心得。

聲明:本文章是筆者整理資料所得原創文章,如轉載需註明出處,謝謝。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章