我正在用 python 创建一个非常简单的神经网络。我所要求的不是任何具体的代码,而是它如何工作的总体思路。 我了解输入、权重等,以及前向传播中的所有内容。 我不明白的是反向传播。它将输出与所需输出进行比较并计算误差(差异),但它如何将所有权重更改为正确的呢?特别是如何才能将权重更改为不同的(并非全部相同)?
其次,当您更改权重时,如何使其适用于多个输入,而不仅仅是一个输入或另一个输入?
最后,偏差有什么作用以及您如何确定偏差是什么?我听说它被添加到它所连接的节点,但在 1 个输入、1 个输出和 1 个偏置连接到输出的情况下:
输入为0 输入和输出之间的权重为-17.2 偏差为-1.79 输出为 0.9999999692839459
但是怎么办呢? 0 x -17.2 - 1.79 = -1.79???那不是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
哪里X
和Y
是来自样本 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
和b
。对于神经网络,参数是权重。这是因为我们想要学习一个满足我们目标的函数,即最小化函数输出和训练输入之间的平方差。
直觉上:梯度,函数的偏导数向量,总是指向函数表面最陡上升的方向。但由于我们想要最小化函数,所以我们想要朝梯度的负方向前进。这样我们就可以逐步向下移动 alpha
的值。同时每一步都更新参数值,直到达到最小值。当梯度 c'(X,Y)
时达到这一点等于或几乎等于零。
因此,在我们的示例中,我们构建 c(X,Y)
的偏导数关于m
和b
并编写几行代码使其运行。
正如我之前所说,它与神经网络的训练/学习相同。但对于神经网络,我们有一系列依赖参数。因此,例如,隐藏层的权重取决于梯度下降期间输出层的权重。所以你总是会得到一连串的偏导数。这就是链式法则非常有用的地方。
线性回归和神经网络之间的另一个区别是函数 c(X,Y)
对于神经网络来说是非凸的,而对于线性回归来说是凸的。这是因为底层函数的属性 f(x)
。因此,当函数是凸函数时,局部最小值始终是全局最小值。这就是为什么你永远无法判断神经网络是否有最佳解决方案。
关于python - 创建神经网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43546156/