【问题标题】:How to utilize Hebbian learning?如何利用 Hebbian 学习?
【发布时间】:2012-05-25 07:50:58
【问题描述】:

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

所以,权重是这样更新的:

weight_change = learning_rate * input * output

我找到的关于它如何有用的信息非常少,我不明白。

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

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

【问题讨论】:

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


    【解决方案1】:

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

    您可以通过构建一个使用Hebbian learning 的网络来完成您想做的事情。我不太确定您将什么作为输入传递到系统中,或者您是如何设置的。但是您可以查看LISSOM,它是SOM, (self-organising map) 的Hebbian 扩展。

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

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

    【讨论】:

      【解决方案2】:

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

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

      所以,如果你坚持使用神经网络,我建议在权重中添加隐藏的神经元层并引入非线性,例如正如 fraxel 提议的那样,在神经元的放电中——在这里你可以使用一个 sigmoid 函数,比如tanh(是的,使用负值来表示“不触发”是好的,因为它可以导致减轻重量)。 Hebbian规则的广义形式可以表示为

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

      其中f1f2 是一些函数。在你的情况下,没有target_output,所以f2 可以随意忽略它。

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 我希望网络不是前馈的,大脑不会那样工作,而且我认为循环可能会很酷。所以,没有反馈,你说......所以基本上,你能详细说明这将如何运作吗?因为它看起来还是坏掉了,所以它会把输入A和输出B关联起来,只是因为初始权重已经这样设置了,然后它似乎会无限增加then之间的连接。
        【解决方案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);
                }
            }
        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-01-17
          • 1970-01-01
          • 2018-01-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-22
          相关资源
          最近更新 更多