26

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

因此,权重更新如下:

weight_change = learning_rate * input * output

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

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

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

4

4 回答 4

19

Hebbs law是一个绝妙的洞察力associative learning,但它只是图片的一部分。你是对的,按照你的做法实施,如果不加以控制,重量只会继续增加。关键是添加某种形式的规范化或限制过程。Oja's rule的 wiki 页面很好地说明了这一点。我建议你做的是在一个post-synaptic divisive normalisation步骤中添加,这意味着你将一个权重除以收敛在同一个突触后神经元上的所有权重的总和(即收敛在一个神经元上的所有权重的总和固定为1)。

您想做的事情可以通过构建一个使用Hebbian learning. 我不太确定您将什么作为输入传递到系统中,或者您是如何设置的。但是您可以查看LISSOM哪个是SOM 的 Hebbian 扩展(自组织图)

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

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

于 2012-05-20T19:51:37.090 回答
2

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

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

所以,如果你坚持使用神经网络,我建议在权重中添加隐藏层神经元并引入非线性,例如 fraxel 提出的,以及在神经元的激发中——在这里你可以使用 sigmoid 函数,像tanh(是的,对“非触发”使用负值是好的,因为它可以导致减轻重量)。在其广义形式中,赫布规则可以表示为

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

wheref1f2是一些函数。在您的情况下,没有target_output,因此f2可以随意忽略它。

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

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

于 2012-05-23T21:27:26.510 回答
1

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

于 2012-05-20T01:51:05.803 回答
-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);
        }
    }
}

于 2017-03-16T07:38:30.210 回答