如何利用赫宾学习?(How to utilize Hebbian learning?)

2019-07-29 10:41发布

我想升级我的进化模拟器使用赫布学习,像这一个 。 我基本上要小动物能够学会如何寻找食物。 我实现了与基本前馈网络,但我被困在了解如何与海布学习做到这一点。 赫布学习的基本原则是,如果两个神经元火起来,他们一起接线。

因此,权重更新如下:

weight_change = learning_rate * input * output

如何这可能是有用的,我发现的信息是非常稀缺的,我不明白这一点。

在我目前的模拟器版本,当动物吃了一块食物的动作和输入(动,眼睛)之间的权重增加,我看不出如何能转化为这种新模式。 目前根本没有房间,告诉它是否做了正确或错误的,因为这里的唯一参数是输入和输出! 基本上,如果一个输入在一个方向激活运动,体重也只是不断增加,无论这个女人是吃东西还是不行!

我在申请海布以错误的方式学习? 仅供参考,我使用Python。

Answer 1:

Hebbs law是一个辉煌的洞察力associative learning ,但只有图片的一部分。 你是对的,因为你所做的一切,并任其发展的重量只会继续增加实现的。 关键是要以某种形式或正常化限制处理的补充。 这说明相当不错的了维基页面欧雅的规则 。 我建议你做的是增加在post-synaptic divisive normalisation步,这是什么意思是,你通过一个重量除以所有的重量汇聚在同一个突触后神经元的总和(即所有的权重的总和收敛于神经元被固定在1 )。

你想要做什么可以通过构建一个利用网络完成Hebbian learning 。 我不是要传递什么作为输入到系统中,或者如何您已经设置好了十分肯定。 但是你可以看看LISSOM这是一个赫宾扩展SOM(自组织映射) 。

在这种类型的层通常所有的神经元可以被互连。 您传递的输入向量,并允许网络中的活动来解决,这是沉降一些步骤数。 然后你更新的权重。 你在训练阶段做到这一点,在其末端的输入空间相关联的项目往往会以在输出映射分组活动补丁。

另外值得一提的是,大脑是大量相互关联的,高度递归(即有前馈,反馈,横向互联,微电路,和很多其他的东西太..)。



Answer 2:

虽然赫宾学习,作为一个总的概念,形成了许多学习算法,包括反向传播,您可以用非常有限的简单的线性公式的基础。 不仅无限的权重上升,即使在网络了解到所有的模式,但网络可以完全只学正交(线性无关)的模式。

线性赫宾学习甚至没有生物合理。 生物神经网络是比你的更大,是高度非线性的,这两种神经元和它们之间的突触。 在大,非线性网络,你的模式是接近垂直的机会较高。

所以,如果你坚持要用一个神经网络,我建议增加神经元的隐藏层,并引入非线性,无论在重量,例如作为飞梭建议,并在神经元的射击---在这里,你可以使用一个双曲线函数,像tanh (是,使用负值的“非喷射”是好的,因为它可以导致抑制重)。 在它的一般形式,赫布规则可以表示为

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

其中f1f2是一些功能。 在你的情况,不存在target_output ,因此f2可以自由地忽略它。

为了在你的隐藏层神经元火,从而让输入和输出之间的连接,可以初始化权重随机值。

不过是一个神经网络确有必要,甚至是适合你的问题吗? 你有没有考虑简单的相关性? 我的意思是,赫布获得了他的规则来解释如何学习可能在生物系统中发挥作用,而不是最好的机器学习算法。



Answer 3:

我不是非常好,这种类型的神经网络的熟悉,但它看起来像你期望它像一个监督的更新方法工作,而它是无人监管。 这意味着你不能教它什么是正确的,它只会学习什么是不同的,由协会。 也就是说,它最终将与相关联的输入特定集群行动。 在你的情况,你想让它通过反馈来改进它的决策,我不认为赫宾只更新就足够了。 你可以用某种反向传播,虽然相结合。



Answer 4:

你可以用我的代码试试。

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



文章来源: How to utilize Hebbian learning?