【问题标题】:How do we Initialize a Hopfield Neural Network?我们如何初始化 Hopfield 神经网络?
【发布时间】:2011-08-30 21:06:01
【问题描述】:

我刚刚开始阅读有关神经网络的内容,并且有一个基本问题。关于“初始化” Hopfield 网络,我无法理解初始化的概念。也就是说,我们是否输入了一些随机数?或者输入一个定义明确的模式,使神经元第一次稳定下来,假设所有神经元都处于等于 0 的状态,输入后其他稳定状态为 1 或 -1。

考虑下面的神经网络。我取自HeatonResearch

很高兴有人向我解释这一点。

【问题讨论】:

    标签: artificial-intelligence neural-network


    【解决方案1】:

    在初始化神经网络(包括循环 Hopfield 网络)时,通常使用随机权重进行初始化,因为这通常会在多次试验和一组运行中提供良好的学习时间,并且会避免局部最小值。在多次运行中从相同的起始权重开始通常不是一个好主意,因为您可能会遇到相同的局部最小值。使用某些配置,可以通过分析节点在功能映射中的角色来加快学习速度,但这通常是在使某些东西正常工作后进行分析的后续步骤。

    【讨论】:

    • Hopfield 网络是零初始化的,因为它们充当内容可寻址的内存——它们回忆起他们已经训练过的数据。据我所知,这不适用于随机初始化。
    • @Don Reba:我不确定您指出它的用途是什么意思。是的,它的用途通常是作为记忆,用于训练它的东西。当它没有经过训练时,这并不意味着返回 0 初始化网络的结果是正确的,除非它以某种方式作为附加要求添加(这很奇怪)。我见过的大多数示例(例如codeproject.com/KB/recipes/HopfieldNeuralNetwork.aspx)都使用随机初始化(参见 Neuron ctor),原因是我给出的(避免遇到相同的最小值)。
    • 另见daniweb.com/software-development/cpp/threads/329353(第 31 行),它还创建了一个起始随机权重矩阵。这是我多次看到的初始化的标准解决方案。我唯一看到的其他情况是,具体分析表明训练可以在不同的起点更快地发生,这发生在诸如两级反馈训练网络之类的情况下,其中一些标准响应调整用于训练非线性函数逼近。即便如此,我还没有看到 0 是合适的起点......
    • @Don 和 ex0du5,据我所知,这看起来我们仍然可以使用随机权重矩阵。但正如 ex0du5 指出的那样,我们可以使用不同的起点,因为我们知道它会产生更好的结果。不过,你的回答清楚了很多疑问。
    • @ex0du5,很公平。然后+1。
    【解决方案2】:

    Hopefiled 网络的目的是调用它已显示的数据,用作内容可寻址存储器。它从一张白纸开始,所有权重都设置为零。在向量上训练网络会调整权重以对其做出响应。

    Hopfield 网络中节点的输出取决于每个其他节点的状态以及节点与其连接的权重。状态对应于输入,输入 0 映射到 -1,输入 1 映射到 1。因此,如果您示例中的网络具有输入 1010,则 N1 将具有状态 1、N2 -1、N3 1 和 N4 - 1.

    训练网络意味着将输出和自身之间的点积添加到权重矩阵中,将对角线设置为零。因此,要在 10101 上进行训练,我们将 [1 -1 1 -1 ] · [1 -1 1 -1 ]ᵀ 添加到权重矩阵。

    【讨论】:

      【解决方案3】:

      你可以签出这个仓库 --> Hopfield Network

      您有一个在离线训练网络后测试模式的示例。这是测试

      @Test
      public void HopfieldTest(){
       double[] p1 = new double[]{1.0, -1.0,1.0,-1.0,1.0,-1.0,1.0,-1.0,1.0};
       double[] p2 = new double[]{1.0, 1.0,1.0,-1.0,1.0,-1.0,-1.0,1.0,-1.0};
       double[] p3 = new double[]{1.0, 1.0,-1.0,-1.0,1.0,-1.0,-1.0,1.0,-1.0};
      
       ArrayList<double[]> patterns = new ArrayList<>();
       patterns.add(p1);
       patterns.add(p2);
      
       Hopfield h = new Hopfield(9, new StepFunction());
      
       h.train(patterns); //train and load the Weight matrix
      
       double[] result = h.test(p3); //Test a pattern
      
       System.out.println("\nConnections of Network: " + h.connections() + "\n"); //show Neural connections
       System.out.println("Good recuperation capacity of samples: " + Hopfield.goodRecuperation(h.getWeights().length) + "\n");
       System.out.println("Perfect recuperation capacity of samples: " + 
       Hopfield.perfectRacuperation(h.getWeights().length) + "\n");
       System.out.println("Energy: " + h.energy(result));
      
       System.out.println("Weight Matrix");
       Matrix.showMatrix(h.getWeights());
       System.out.println("\nPattern result of test");
       Matrix.showVector(result);
      
       h.showAuxVector();
      }
      

      运行测试后你可以看到

      Running HopfieldTest
      
      Connections of Network: 72
      
      Good recuperation capacity of samples: 1
      
      Perfect recuperation capacity of samples: 1
      
      Energy: -32.0
      
      Weight Matrix
       0.0        0.0     2.0    -2.0      2.0       -2.0       0.0       0.0     0.0
       0.0        0.0     0.0     0.0      0.0        0.0      -2.0       2.0    -2.0
       2.0        0.0     0.0    -2.0      2.0       -2.0       0.0       0.0     0.0
      -2.0        0.0    -2.0     0.0     -2.0        2.0       0.0       0.0     0.0
       2.0        0.0     2.0    -2.0      0.0       -2.0       0.0       0.0     0.0
      -2.0        0.0    -2.0     2.0     -2.0        0.0       0.0       0.0     0.0
       0.0       -2.0     0.0     0.0      0.0        0.0       0.0      -2.0     2.0
       0.0        2.0     0.0     0.0      0.0        0.0      -2.0       0.0    -2.0
       0.0       -2.0     0.0     0.0      0.0        0.0       2.0      -2.0     0.0
      
      Pattern result of test 
      
      1.0        1.0     1.0     -1.0     1.0       -1.0      -1.0       1.0     -1.0
      -------------------------
      The auxiliar vector is empty
      

      我希望你觉得它有用。问候

      【讨论】:

        猜你喜欢
        • 2012-12-29
        • 2012-03-04
        • 2016-01-19
        • 1970-01-01
        • 2020-02-08
        • 1970-01-01
        • 1970-01-01
        • 2019-10-09
        • 2021-06-25
        相关资源
        最近更新 更多