但这两个公式只可以或许更新输出层与前一层连接线的权重和输出层的偏置,原因是因为 δ 值依附了真实值y这个变量,然则我们肮脏道输出层的┞锋实值而不知道每层隐蔽层的┞锋实值,导致难以估计每层隐蔽层的 δ 值,所以我们欲望可以或许应用 l+1 层的 δ 值来计算 l 层的 δ 值,而恰好经由过程一些列数学转换后可以做到,这也就是逆向反馈名字的由来,公式如下:
逆向反馈(Back Propagation)
应用激活函数的原因是因为线性模型(无法处理线性弗成分的情况)的表达才能不敷,所以这里平日须要参加 Sigmoid 函数来参加非线性身分获得神经元的输出值。
但其实想要练习好一个神经收集还面对着很多的坑(譬如下面四条):
大年夜式子中我们可以看到,我们只须要知道下一层的权重和神经元输出层的值就可以计算出上一层的 δ 值,我们只要经由过程赓续的应用膳绫擎这个式子就可以更新隐蔽层的全部权重和偏置了。
在推导之前请先不雅察下面这张图:
也等于说我们可以将 E 看做是 l+1 层所有神经元输入值的 z 函数,而膳绫擎式子的 n 表示的是 l+1 层神经元的数量,再进行化简后就可以获得膳绫擎所说的式子。
在这里的推导过程只说清楚明了关键的部分,如不雅要查看加倍具体的推导内容,可以点击此处下载我在进修过程中参考的一篇 pdf 文档,琅绫擎的推导过程异常具体。别的也参考了周志华所写的机械进修中的神经收集部分的内容和 neural networks and deep learning 的内容。
Python 源码解析
源率攀来自于 Michael Nielsen 大年夜神的深度进修在线教程,但他的内容都是英文的,我结合了本身的懂得和膳绫擎的理论常识对源码进行了注释。>>点击此处查看整顿的代码和数字辨认实例<<
应用 Python 实现的神经收集的代码行数并不多,仅包含一个 Network 类,起首来看看该类的构造办法。
- def __init__(self, sizes):
- """
- :param sizes: list类型,储存每层神经收集的神经元数量
- 譬如说:sizes = [2, 3, 2] 表示输入层有两个神经元、
- 隐蔽层有3个神经元以及输出层有2个神经元
- """
- # 有几层神经收集
- self.num_layers = len(sizes)
- self.sizes = sizes
- # 除去输入层,随机产生每层中 y 个神经元的 biase 值(0 - 1)
- self.biases = [np.random.randn(y, 1) for y in sizes[1:]]
- # 随机产生每条连接线的 weight 值(0 - 1)
- self.weights = [np.random.randn(y, x)
- for x, y in zip(sizes[:-1], sizes[1:])]
推荐阅读
PHP说简单,然则要精晓也不是一件简单的事。我们除了会应用之外,还得知道它底层的工作道理。懂得PHP底层实现的目标是什么?动态说话要像用好起首得懂得它,内存治理、框架模型值得我们借鉴>>>详细阅读
本文标题:神经网络中 BP 算法的原理与 Python 实现源码解析
地址:http://www.17bianji.com/lsqh/35499.html
1/2 1