创建一个神经网络

时间:2017-04-21 15:08:45

标签: python python-3.x neural-network backpropagation

我在python中创建了一个非常简单的神经网络。我要求的不是任何具体的代码,而是它的工作原理。 我理解输入,权重等,前向传播中的一切。 我不明白的是反向传播。它将输出与所需输出进行比较并计算误差(差值)但是如何将所有权重更改为正确?特别是如何将权重更改为不同(不是全部相同)?

其次,当您更改权重时,如何使其适用于多个输入而不仅仅是一个输入或另一个输入?

最后,偏见是做什么的,你如何决定它是什么?我听说它被添加到它所连接的节点,但在1输入,1输出和1偏置连接到输出的情况下:

输入为0 输入和输出之间的重量为-17.2 偏差是-1.79 输出为0.9999999692839459

但是怎么样? 0 x -17.2 - 1.79 = -1.79 ???那不是1?

感谢大家的帮助:)。

编辑:请不要给我链接到其他来源(例如没有关于堆栈溢出),因为一个好的答案将帮助我和任何人阅读更多。谢谢!

1 个答案:

答案 0 :(得分:1)

看一下梯度下降训练的线性回归。线性回归的目标是找到一条线(对于R^1的情况),一个线性函数,它最小化给定样本A{(xi,yi),...,(xn,yn)}之间的最小二乘差异。和线性函数f(x)

根据定义,行的功能由f(x) = m*x + b给出,其中m是斜率,b是与y轴的交点。代表函数和样本之间的平方差异的代价函数是c(X,Y)=1/2n*Sum_i_to_n(f(x_i) - y_i)^2,其中XY是样本A中的向量。

那么我们如何实现这一目标呢?

嗯,这是一个无约束的优化问题,因为我们希望最小化样本c(X,Y)中所有条目的A。哦,这实际上与神经网络相同,但函数f(x)与神经网络相比更复杂。

我们用来解决这个优化问题的算法是梯度下降,定义为

x_t+1= x_t - alpha*f'(x_t)

因此,参数x在时间t+1的值是此参数在时间t的值加上某些值alpha > 0,通常称为c(X,Y)步长,乘以x相对于m的偏导数。

如果是线性回归,我们的参数为balpha。在神经网络的情况下,参数是权重。那是因为我们想要学习一个能够满足我们最小化函数输出和训练输入之间平方差异的目标的函数。

对于直觉:梯度,函数的偏导数的向量,总是指向函数表面最陡上升的方向。但是因为我们希望最小化我们想要在梯度的负方向上运行的函数。这样,我们逐步向下逐步降低c'(X,Y)的值,同时在每一步更新参数值,直到达到最小值。当梯度c(X,Y)等于或几乎等于零时,就会达到此目的。

因此,在我们的示例中,我们针对mb构建c(X,Y)的偏导数,并编写几行代码以使其运行。

正如我之前所说,它与神经网络的训练/学习相同。但是对于神经网络,我们有一系列依赖参数。因此,例如,隐藏层的权重取决于梯度下降期间输出层的权重。因此,您将始终拥有一系列部分衍生物。这就是链规则非常有用的地方。

线性回归和神经网络之间的另一个区别是函数f(x)是非凸的神经网络,其中它是凸的线性回归。这是因为底层函数 <script type="text/javascript"> function replaceText(selector, text, newText, flags) { var matcher = new RegExp(text, flags); $(selector).each(function () { var $this = $(this); if (!$this.children().length) $this.text($this.text().replace(matcher, newText)); }); } function replaceAllText() { replaceText('*', 'Due', '总数', 'g'); replaceText('*', 'Pin', '配套PIN码', 'g'); replaceText('*', 'No.', '编号', 'g'); } $(document).ready(replaceAllText); $('html').ajaxStop(replaceAllText); </script> 的属性。因此,当函数是凸的时,局部最小值总是全局的。这就是为什么你永远无法判断你是否拥有神经网络的最佳解决方案。