如何利用Hebbian学习?

时间:2012-05-17 17:44:18

标签: machine-learning artificial-intelligence neural-network evolutionary-algorithm

我想升级我的进化模拟器以使用Hebb学习,例如this one。我基本上希望小动物能够学习如何找到食物。我通过基本的前馈网络实现了这一点,但我仍然坚持理解如何使用Hebb学习。 Hebb学习的基本原则是,如果两个神经元一起发射,它们就会连在一起。

因此,权重更新如下:

weight_change = learning_rate * input * output

我发现的关于它如何有用的信息是非常稀缺的,我不明白。

在我当前版本的模拟器中,当一个生物吃掉一块食物时,动作和输入(动作,眼睛)之间的权重会增加,我无法看到它如何转化为这个新模型。在这里没有空间来判断它是否正确或错误,因为唯一的参数是输入和输出!基本上,如果一个输入激活一个方向的运动,无论该生物是否在吃东西,重量都会继续增加!

我是否以错误的方式应用Hebb学习?仅供参考,我使用的是Python。

4 个答案:

答案 0 :(得分:19)

Hebbs lawassociative learning的精彩见解,但它只是图片的一部分。而且你是对的,按照你的方式实施,如果不加以控制,体重就会不断增加。关键是要添加某种形式的规范化或限制过程。 Oja's rule的维基页面很好地说明了这一点。我建议你做的是添加一个post-synaptic divisive normalisation步骤,这意味着你将权重除以收敛于相同的突触后神经元上的所有权重之和(即所有权重的总和收敛于神经元固定在1)。

您可以通过构建利用Hebbian learning的网络来完成您想要做的事情。我不太确定你输入到系统中的内容是什么,或者你是如何设置的。但是你可以看LISSOM这是SOM, (self-organising map)的Hebbian扩展。

在这种层中,通常所有神经元都可以相互连接。您传入输入向量,并允许网络中的活动结算,这是一些安定步骤。然后更新权重。您可以在训练阶段执行此操作,在输入空间中,相关项目将在输出映射中形成分组活动补丁。

值得注意的是,大脑是大规模互联的,并且是高度递归的(即前馈,反馈,横向互连,微电路以及许多其他东西......)。

答案 1 :(得分:2)

尽管Hebbian学习作为一般概念,构成了许多学习算法的基础,包括反向传播,但您使用的简单线性公式非常有限。即使网络已经学习了所有模式,权重不仅无限上升,而且网络也可以完美地学习正交(线性独立)模式。

线性Hebbian学习甚至在生物学上都不合理。生物神经网络比你的大得多,并且非常非线性,包括神经元和它们之间的突触。在大的非线性网络中,模式接近正交的可能性更高。

所以,如果你坚持使用神经网络,我建议在权重中加入隐藏的神经元层并引入非线性,例如:正如fraxel提出的那样,并且在激发神经元时 - 在这里你可能会使用sigmoid函数,比如tanh(是的,使用负值来表示“非射击”是好的,因为它可以导致减少重量)。在其广义形式中,Hebbian规则可以表示为

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

其中f1f2是某些功能。在您的情况下,没有target_output,因此f2可以忽略它。

为了让隐藏层中的神经元触发,从而在输入和输出之间建立连接,您可以将权重初始化为随机值。

但神经网络是否真的有必要,甚至适合你的问题?你考虑过简单的相关性吗?我的意思是,Hebb推导出他的规则来解释学习如何在生物系统中起作用,而不是最好的机器学习算法。

答案 2 :(得分:1)

我对这种类型的神经网络并不是很熟悉,但看起来你期望它在没有监督的情况下像监督更新方法那样工作。这意味着你不能教它什么是正确的,它只会通过联想来学习不同的东西。也就是说,它最终将动作与特定的输入集群相关联。在您希望通过反馈改进决策的情况下,我不认为Hebbian更新只会满足要求。你可以将它与某种反向传播结合起来。

答案 3 :(得分:-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);
        }
    }
}
&#13;
&#13;
&#13;