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