python - 创建神经网络

标签 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?

感谢大家的帮助:)

编辑:请不要给我其他来源的链接(例如不在堆栈溢出上),因为一个好的答案将帮助我和任何阅读此内容的人。谢谢!

最佳答案

看一下通过梯度下降训练的线性回归。线性回归的目标是找到一条线(对于 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 .

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

直觉上:梯度,函数的偏导数向量,总是指向函数表面最陡上升的方向。但由于我们想要最小化函数,所以我们想要朝梯度的负方向前进。这样我们就可以逐步向下移动 alpha 的值。同时每一步都更新参数值,直到达到最小值。当梯度 c'(X,Y) 时达到这一点等于或几乎等于零。

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

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

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

关于python - 创建神经网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43546156/

相关文章:

python - 如何连接 pandas.read_html 的结果列表

python - URLS.py 的 pybbm 错误

python - 在 Ipython 中使用 Pylint(Jupyter-Notebook)

python-3.x - 'Word2Vec' 对象没有属性 'index2word'

machine-learning - 感知器的几何表示(人工神经网络)

Python Numpy 平方均值计算(这是正确的方法吗)

python - Pyqt4,QtCore4.dll应用崩溃

python - Colab 找不到文件

python - 在 Python 中比较 2 个字符串的最有效方法是什么

python - 在 TensorFlow 中获取一个简单的 MLP 来对 XOR 进行建模