问题标签 [backpropagation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
classification - 多层感知器 - 反向传播
我有一个学校项目来编写多层感知器,将数据分为三类。我已经从http://home.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html实现了反向传播算法。我检查了我的算法(通过手动计算反向传播的每个步骤)是否真的符合这个解释的步骤并且符合。
对于分类,我使用的是 one-hot 代码,我的输入由具有 2 个值的向量和三个输出神经元(每个用于单个类)组成。在每个时代之后,我都会对输入数据进行洗牌。对于分类,我使用的是 sigmoid 函数。我也尝试实现 softmax,但我还没有发现派生 softmax 看起来如何。权重调整是否需要导数 softmax?为了检查网络是否成功分类输入,我正在比较具有输出神经元最大输出的输出神经元的位置是否对应于当前输入 one-hot 代码向量中等于 1 的位置。
但是我的实现并没有训练这个神经网络。我正在为此工作并调试几天,并在互联网上查找我做错了什么,但我没有找到答案。我真的不知道我在哪里犯错。当我有 10 个输入时,我的神经网络将成功训练,但是当我有 100、200、400 和 800 个输入时,当它有一半好的分类输入时,它开始循环。正如我所说,我的反向传播算法很好。Visual Studio 2010 中带有输入文件的整个 C++ 项目在这里: http: //www.st.fmph.uniba.sk/~vajda10/mlp.zip
结构:
全局变量:
这是我的反向传播算法代码:
拜托,谁能告诉我我做错了什么,或者给我一个建议,告诉我必须在哪里寻找错误?我希望我已经告诉了所有重要的事情。请原谅我英语不好。
neural-network - 何时开始使用反向传播神经网络中的选择集?
ANN 初学者:
我正在实施一个反向传播神经网络来预测黄金价格。我知道我必须将我的数据拆分为训练数据、选择数据和测试数据。
但是我不确定如何继续使用这些数据集。起初我用我的训练集训练数据网络,然后在训练之后,我从测试集中获得了我的网络的一些输入,并比较了输出。
我不确定我是否做对了,选择集是否进来了?
提前致谢!
machine-learning - 井字神经网络作为评估函数
我一直在尝试使用多层感知器和反向传播为井字游戏编写 AI。我的想法是训练神经网络成为棋盘状态的准确评估函数,但问题是即使在分析了数千场游戏之后,网络也无法输出准确的评估。
我正在使用 27 个输入神经元;3x3 板上的每个方块都与三个输入神经元相关联,这些神经元接收值 0 或 1,具体取决于方块是否有 x、o 或空白。这 27 个输入神经元向 10 个隐藏神经元发送信号(我随意选择了 10 个,但我也尝试了 5 个和 15 个)。
对于训练,我已经让程序通过使用当前评估函数与自己对战来生成一系列游戏,从而为每一方选择被认为是最佳动作的动作。生成游戏后,NN 通过将给定棋盘状态的正确输出作为跟随它的棋盘状态的值(使用评估函数)来编译训练示例(包括棋盘状态和正确输出)。游戏顺序。我认为这是 Gerald Tesauro 在编写 TD-Gammon 时所做的,但我可能误解了这篇文章。(注意:我把更新权重的具体机制放在了这篇文章的底部)。
我尝试了不同的学习率值,以及不同数量的隐藏神经元,但似乎没有任何效果。即使经过数小时的“学习”,策略也没有明显的改进,评估功能也无法接近准确。
我意识到有更简单的方法来编程井字游戏,但我想用一个多层感知器来做,这样我以后可以将它应用到连接 4。这甚至可能吗?我开始认为对于具有合理数量的隐藏神经元的井字棋棋盘来说,没有可靠的评估函数。
我向你保证,我不是在寻找一些快速代码来完成家庭作业。我已经工作了一段时间没有成功,只是想知道我做错了什么。感谢所有建议。
这是我用于 NN 的特定机制:
27 个输入神经元中的每一个都接收一个 0 或 1,它通过可微 sigmoid 函数 1/(1+e^(-x))。每个输入神经元 i 发送这个输出(i.output),乘以某个权重(i.weights[h])到每个隐藏神经元 h。这些值的总和作为隐藏神经元 h (h.input) 的输入,该输入通过 sigmoid 形成每个隐藏神经元的输出 (h.output)。我将 lastInput 表示为所有隐藏神经元的 (h.output * h.weight) 之和。然后板的输出值是 sigmoid(lastInput)。
我将学习率表示为 alpha,将 err 表示为正确输出减去实际输出。我也让 dSigmoid(x) 等于 sigmoid 在点 x 的导数。
每个隐藏神经元 h 的权重增加值: (alpha*err*dSigmoid(lastInput)*h.output) 并且从给定输入神经元 i 到给定隐藏神经元 h 的信号的权重增加值: (alpha*err*dSigmoid(lastInput)*h.weight*dSigmoid(h.input)*i.output)。
我从这个关于反向传播的讲座中得到了这些公式:http ://www.youtube.com/watch?v=UnWL2w7Fuo8 。
c++ - 并行化动态数组
这是神经网络上反向传播算法代码的一部分。
在我们的例子中,我们想要并行化 for( pt=0; pt< N_PT_pair; pt++) 循环,for(epoch=0; epoch< MaxEpoch; epoch++) 不能并行化。
这些是分配和释放数组的代码
你能帮我们并行化代码吗?
neural-network - 神经网络学习率和批量权重更新
我已经用 Java 编写了一个神经网络,现在正在研究反向传播算法。
我读过权重的批量更新将导致更稳定的梯度搜索,而不是在线权重更新。
作为测试,我创建了一个 100 点的时间序列函数,例如x = [0..99]
和y = f(x)
。我创建了一个具有一个输入和一个输出的神经网络以及 2 个具有 10 个神经元的隐藏层用于测试。我正在努力解决这个问题时反向传播算法的学习率。
我有 100 个输入点,所以当我计算dw_{ij}
每个节点的权重变化时,它实际上是一个总和:
在p = 100
这种情况下。
现在权重更新变得非常大,因此我的错误E
会反弹,以至于很难找到最小值。我得到一些正确行为的唯一方法是将学习率设置y
为0.7 / p^2
.
是否有一些基于样本量设置学习率的一般规则?
artificial-intelligence - 在反向传播中使用 sigmoid 函数计算误差
我有一个关于反向传播的快速问题。我正在查看以下内容:
http://www4.rgu.ac.uk/files/chapter3%20-%20bp.pdf
在这篇论文中,它说要计算神经元的误差为
误差 =输出(i) * (1 - 输出(i)) * (目标(i) - 输出(i))
我将等式中我不理解的部分用粗体表示。在论文中,它说由于 sigmoid 函数需要Output(i) * (1 - Output(i))项 - 但我仍然不明白为什么这会是必要的。
使用会有什么问题
?
误差函数是否与神经元激活/传递函数无关?
neural-network - 为什么 sigmoid 函数在神经网络中起作用?
我刚刚开始为神经网络编程。我目前正在研究反向传播 (BP) 神经网络的工作原理。虽然在 BP 网络中训练的算法非常简单,但我找不到任何关于该算法为何有效的文本。更具体地说,我正在寻找一些数学推理来证明在神经网络中使用 sigmoid 函数的合理性,以及是什么让它们模仿了几乎所有扔给它们的数据分布。
谢谢!
java - 神经网络反向传播不能正确计算权重
目前,我遇到了反向传播算法的问题。我正在尝试实现它并用它来识别人脸的方向(左、右、下、直)。基本上,我有 N 个图像,读取像素并将其值(0 到 255)更改为从 0.0 到 1.0 的值。所有图像均为 32*30。我有一个 960 个神经元的输入层、一个 3 个神经元的隐藏层和一个 4 个神经元的输出层。例如,输出 <0.1,0.9,0.1,0.1> 表示该人向右看。我遵循了伪代码。但是,它不能正常工作——它没有计算正确的权重,因此它无法处理训练和测试示例。以下是部分代码:
随着算法的工作,它计算越来越大的权重,最终接近无穷大(NaN 值)。我检查了代码。唉,我没有设法解决我的问题。我会非常感谢任何愿意帮助我的人。
backpropagation - 反向传播算法:我在哪里犯了错误?
有我的BP算法的实现。我测试了一下,训练后发现数据不正确。那么,我在哪里犯错了?
以及如何计算网络输出的误差以停止训练过程?
以及如何改变神经元的偏差?
如果您需要,这里有我的完整代码:https ://github.com/NicholasShatokhin/OpenNNL。
algorithm - Part 2 弹性反向传播神经网络
这是这篇文章的后续问题。对于给定的神经元,我不清楚如何取其误差的偏导数及其权重的偏导数。
从这个网页工作,很清楚传播是如何工作的(尽管我正在处理弹性传播)。对于前馈神经网络,我们必须 1)在通过神经网络向前移动时触发神经元,2)从输出层神经元计算总误差。然后 3) 向后移动,通过神经元中的每个权重传播该错误,然后 4) 再次前进,更新每个神经元中的权重。
确切地说,这些是我不明白的事情。
A)对于每个神经元,你如何计算误差对权重的偏导数的偏导数(定义)?我的困惑是,在微积分中,偏导数是根据 n 变量函数计算的。我有点理解ldog和拜耳在这篇文章中的回答。我什至理解了链式法则。但是,当我准确地想到如何将其应用于 ai) 线性组合器和 ii) sigmoid 激活函数的结果时,它并没有凝固。
B)使用弹性传播方法,你将如何改变给定神经元的偏差?还是使用弹性传播训练的 NN 中没有偏差或阈值?
C)如果有两个或更多输出神经元,你如何传播总误差?每个输出神经元值是否会出现总误差 * 神经元权重?
谢谢