连载|神经网络(下)

简介: 连载|神经网络(下)

误差逆传播算法(BP神经网络)

BP神经网络是一种按误差反向传播(简称误差反传)训练的多层前馈网络,其算法称为BP算法,它的基本思想是梯度下降法,利用梯度搜索技术,以期使网络的实际输出值和期望输出值的误差均方差为最小。

基本BP算法包括信号的前向传播和误差的反向传播两个过程。即计算误差输出时按从输入到输出的方向进行,而调整权值和阈值则从输出到输入的方向进行。


下面让我们从数学原理上来看一下BP算法是怎样工作的。


我们给定训练集image.png输入示例有d个属性,输出是一个l维的实值向量,转换成如下图所示的前馈神经网络的输入输出的形式,该神经网络拥有d个输入神经元、l个输出神经元以及q个隐藏神经元。

98.png

image.png

image.png

对于上图中的神经网络我们需要确定输入层到隐层的d*q个权值、隐层到输出层的q*l个权值、q个隐层神经元的阈值、l个输出层神经元的阈值,一共则是(d+l+1)*q+l个参数需要确定。


和之前的参数更新方式一样,我们对于任意参数v的更新方式可以表示为如下的形式:

image.png

image.png

image.png

我们在前面假设神经元内都是sigmoid函数,并且sigmoid函数有一个很重要的导数性质如下:

image.png

因此我们可以根据式(1)(2)得到如下的式子image.png

image.png

我们把式子(5)(6)带入(4)式再带入(3)式可以得到如下的参数更新公式:

image.png

类似的我们也可以得到其他参数的更新公式:

image.png

以上便是我们BP算法的推导过程,在整个过程中我们先通过输出层得到误差,再从误差入手进行反向传播更新参数就OK了。


注:通常我们把学习率设置为0.1,学习率控制着算法的每一轮迭代时的更新步长,若太大则容易震荡,太小则收敛速度又会过慢,有时我们会在不同的网络层之间设定不同的学习率。


下面给出BP神经算法的简单代码实现(带有隐层的神经网络):

import numpy as np
def nonlin(x, deriv=False):
    if deriv == True:
        # 如果deriv=True我们就进行求导
        return x * (1 - x)
    else:
        # 返回sigmoid函数
        return 1 / (1 + np.exp(-x))
# 给定输入输出
x = np.array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])
y = np.array([[0, 1, 1, 0]]).T
# 均值与标准差
mu, sigma = 0, 0.1
w0 = np.random.normal(mu, sigma, (3, 5))
w1 = np.random.normal(mu, sigma, (5, 1))
# 定义迭代次数
iter_size = 1000
# 定义学习率
lr = 1
for i in range(iter_size):
    # 输入层
    L0 = x
    # 隐藏层(输入层和隐藏层间权重为w0)
    L1 = nonlin(L0.dot(w0))
    # 输出层(隐藏层和输出层间权重为w1)
    L2 = nonlin(L1.dot(w1))
    # 损失函数
    L2_loss = L2 - y
    # 输出层的导数
    L2_delta = L2_loss * nonlin(L2, True)
    # 隐藏层到输出层的梯度
    grad1 = L1.T.dot(L2_delta)
    # 隐藏层到输出层参数更新
    w1 -= grad1 * lr
    # L1对L2_loss贡献了多少,反过来传梯度时就要乘以这个权重
    L1_loss = L2_delta.dot(w1.T)
    # 隐藏层的导数
    L1_delta = L1_loss * nonlin(L1, True)
    # 输入层到隐藏层的梯度
    grad0 = L0.T.dot(L1_delta)
    # 输入层到隐藏层的参数更新
    w0 -= grad0 * lr
print(L2)


相关文章
|
7月前
|
机器学习/深度学习 网络架构
神经网络4
与单层神经网络不同。理论证明,两层神经网络可以无限逼近任意连续函数。 这是什么意思呢?也就是说,面对复杂的非线性分类任务,两层(带一个隐藏层)神经网络可以分类的很好。 下面就是一个例子(此两图来自colah的博客),红色的线与蓝色的线代表数据。而红色区域和蓝色区域代表由神经网络划开的区域,两者的分界线就是决策分界。 可以看到,这个两层神经网络的决策分界是非常平滑的曲线,而且分类的很好。有趣的是,前面已经学到过,单层网络只能做线性分类任务。而两层神经网络中的后一层也是线性分类层,应该只能做线性分类任务。为什么两个线性分类任务结合就可以做非线性分类任务? 我们可以把输出层的决策分界单独拿出来看一下
46 0
|
机器学习/深度学习 数据可视化
|
18小时前
|
机器学习/深度学习 算法 网络架构
什么是神经网络学习中的反向传播算法?
什么是神经网络学习中的反向传播算法?
9 2
|
18小时前
|
机器学习/深度学习 人工智能 算法
训练神经网络的7个技巧
训练神经网络的7个技巧
44 1
|
7月前
|
机器学习/深度学习 存储 人工智能
神经网络
3.效果 与神经元模型不同,感知器中的权值是通过训练得到的。因此,根据以前的知识我们知道,感知器类似一个逻辑回归模型,可以做线性分类任务。 我们可以用决策分界来形象的表达分类的效果。决策分界就是在二维的数据平面中划出一条直线,当数据的维度是3维的时候,就是划出一个平面,当数据的维度是n维时,就是划出一个n-1维的超平面。 下图显示了在二维平面中划出决策分界的效果,也就是感知器的分类效果。 4.影响 感知器只能做简单的线性分类任务。但是当时的人们热情太过于高涨,并没有人清醒的认识到这点。于是,当人工智能领域的巨擘Minsky指出这点时,事态就发生了变化。 Minsky在1969年出版了一本叫
56 0
|
7月前
|
机器学习/深度学习 算法 自动驾驶
神经网络5
4.训练 下面简单介绍一下两层神经网络的训练。 在Rosenblat提出的感知器模型中,模型中的参数可以被训练,但是使用的方法较为简单,并没有使用目前机器学习中通用的方法,这导致其扩展性与适用性非常有限。从两层神经网络开始,神经网络的研究人员开始使用机器学习相关的技术进行神经网络的训练。例如用大量的数据(1000-10000左右),使用算法进行优化等等,从而使得模型训练可以获得性能与数据利用上的双重优势。 机器学习模型训练的目的,就是使得参数尽可能的与真实的模型逼近。具体做法是这样的。首先给所有参数赋上随机值。我们使用这些随机生成的参数值,来预测训练数据中的样本。样本的预测目标为yp,真实目标
45 0
|
9月前
|
机器学习/深度学习 算法 PyTorch
神经网络知识蒸馏
翻译:《Distilling the knowledge in a neural network》
|
9月前
|
机器学习/深度学习 自然语言处理 算法
简单了解神经网络
神经网络是一种强大的机器学习算法,具有很广泛的应用,可以用于图像识别、语音识别、自然语言处理、推荐系统等多个领域。
70 0
|
机器学习/深度学习 存储 算法
一文让你掌握22个神经网络训练技巧
一文让你掌握22个神经网络训练技巧
一文让你掌握22个神经网络训练技巧
|
12月前
|
机器学习/深度学习 算法
连载|神经网络(上)
连载|神经网络(上)

相关实验场景

更多