Artificial intelligence 我们如何初始化Hopfield神经网络?

Artificial intelligence 我们如何初始化Hopfield神经网络?,artificial-intelligence,neural-network,Artificial Intelligence,Neural Network,我刚刚开始阅读有关神经网络的书籍,我有一个基本的问题。关于“初始化”Hopfield网络,我无法理解初始化的概念。也就是说,我们是否输入了一些随机数?或者输入一个定义良好的模式,使神经元第一次稳定下来,假设所有神经元处于等于零的状态,其他稳定状态在输入后为1或-1 考虑下面的神经网络。这是我从 很高兴有人能告诉我 Hopefied网络的目的是调用它所显示的数据,作为内容寻址存储器。它从一块干净的石板开始,所有权重都设置为零。在向量上训练网络会调整权重以响应它 Hopfield网络中节点的输出取决

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

考虑下面的神经网络。这是我从

很高兴有人能告诉我


Hopefied网络的目的是调用它所显示的数据,作为内容寻址存储器。它从一块干净的石板开始,所有权重都设置为零。在向量上训练网络会调整权重以响应它

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


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

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

您可以签出此存储库-->

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

@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();
}

我希望你觉得它有用。Hopfield网络是零初始化的,因为它们作为内容可寻址存储器——它们可以回忆训练过的数据。据我所知,这对随机初始化不起作用。@Don Reba:我不确定你指的是它的用途是什么意思。是的,它的使用通常是作为记忆,对于它训练过的东西。当它没有经过训练时,并不意味着返回0初始化网络的结果是正确的,除非它以某种方式被添加为附加要求(这会很奇怪)。我所看到的大多数例子(作为一个例子)都使用随机初始化(参见Neuron-ctor)作为我给出的理由(避免遇到相同的极小值)。另请参见(第31行),它也创建了一个起始随机权重矩阵。这是我多次看到的初始化的标准解决方案。我唯一一次看到其他情况是,具体分析表明,训练可以在不同的起点更快地进行,这发生在两级反馈训练网络中,通过一些标准的响应调整来训练非线性函数近似。即使如此,我还没有看到0是合适的起点…@Don和ex0du5,就我所见,这看起来我们仍然可以使用随机权重矩阵。但正如ex0du5所指出的,我们可以使用不同的起点,因为我们知道它会产生更好的结果。尽管如此,你的回答还是澄清了很多疑问。@ex0du5,很公平+1,那么。
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