创建神经网络

Creating a neural network

我正在 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,其中 XY 是来自样本 A.

的向量

那么我们如何实现这一点?

好吧,这是一个不受约束的优化问题,因为我们想要最小化样本 A 中所有条目的 c(X,Y)。哦,这实际上与神经网络相同,但函数 f(x) 对于神经网络更复杂。

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

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

所以参数 x 在时间 t+1 的值是该参数在时间 t 的值加上 alpha > 0 的一些值,这通常是称为步长,乘以 c(X,Y) 关于 x.

的偏导数

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

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

所以在我们的例子中,我们构建了 c(X,Y) 关于 mb 的偏导数,并写了几行代码来得到它 运行 .

正如我之前所说,它与神经网络的 training/learing 相同。但是对于神经网络,我们有一系列依赖参数。因此,例如,隐藏层的权重取决于梯度下降期间输出层的权重。所以你总是会有一系列的偏导数。这就是链式法则非常有用的地方。

线性回归和神经网络之间的另一个区别是函数 c(X,Y) 对于神经网络是非凸函数,而对于线性回归函数是凸函数。那是因为底层函数的属性f(x)。因此,当函数是凸函数时,局部最小值始终是全局最小值。这就是为什么您永远无法判断您是否拥有神经网络的最佳解决方案。