-
认识一个简单的神经网络
-
反向传播的推导(结合上图推导,慢慢来才比较快)
-
E
=
1
2
∑
j
?
1
l
(
y
j
^
?
y
j
)
2
,
误
差
表
示
;
f
(
x
)
=
s
i
g
m
o
i
d
(
x
)
=
1
1
+
e
?
x
,
激
活
函
数
对
上
式
分
别
求
导
:
?
E
?
y
j
^
=
y
j
^
?
y
j
;
?
f
(
x
)
?
x
=
f
(
x
)
(
1
?
f
(
x
)
)
隐
藏
层
权
重
修
正
量
的
公
式
:
Δ
w
h
j
=
?
η
?
E
?
w
h
j
,
梯
度
的
反
方
向
为
下
降
方
向
,
η
为
学
习
步
长
其
中
:
?
E
?
w
h
j
=
?
E
?
y
j
^
?
?
y
j
^
?
β
j
?
?
β
j
?
w
h
j
其
中
:
?
β
j
?
w
h
j
=
b
h
;
?
y
j
^
?
β
j
=
y
j
^
(
1
?
y
j
^
)
;
?
E
?
y
j
^
=
y
j
^
?
y
j
Δ
w
h
j
=
?
η
(
y
j
^
?
y
j
)
(
y
j
^
(
1
?
y
j
^
)
)
(
b
h
)
构
建
一
个
中
间
变
量
:
g
j
=
?
?
E
?
y
j
^
?
?
y
j
^
β
j
=
?
(
y
j
^
?
y
j
)
(
y
j
^
(
1
?
y
j
^
)
)
对
于
输
出
层
神
经
元
的
偏
置
更
新
量
:
Δ
θ
j
=
?
η
g
j
=
η
(
y
j
^
?
y
j
)
(
y
j
^
(
1
?
y
j
^
)
)
对
输
入
层
神
经
元
的
权
重
进
行
更
新
量
:
Δ
v
i
h
=
?
η
?
E
?
b
h
?
?
b
h
?
α
h
?
x
i
=
η
b
h
(
1
?
b
h
)
∑
j
=
1
l
w
h
j
g
j
x
i
对
隐
层
偏
置
进
行
更
新
量
:
Δ
γ
h
=
η
?
E
?
b
h
?
?
b
h
?
α
h
=
η
b
h
(
1
?
b
h
)
∑
j
=
1
l
w
h
j
g
j
E=\frac{1}{2}\sum_{j-1}^l(\hat{y_j}-y_j)^2,误差表示;f(x)=sigmoid(x)=\frac{1}{1+e^{-x}},激活函数\\ 对上式分别求导:\frac{\partial{E}}{\partial{\hat{y_j}}}=\hat{y_j}-y_j;\frac{\partial{f(x)}}{\partial{x}}=f(x)(1-f(x))\\ 隐藏层权重修正量的公式:\Delta{w_{hj}}=-\eta\frac{\partial{E}}{\partial{w_{hj}}},梯度的反方向为下降方向,\eta为学习步长\\ 其中:\frac{\partial{E}}{\partial{w_{hj}}}=\frac{\partial{E}}{\partial{\hat{y_j}}}·\frac{\partial{\hat{y_j}}}{\partial{\beta_j}}·\frac{\partial{\beta_j}}{\partial{w_{hj}}}\\ 其中:\frac{\partial{\beta_j}}{\partial{w_{hj}}}=b_h;\frac{\partial{\hat{y_j}}}{\partial{\beta_j}}=\hat{y_j}(1-\hat{y_j});\frac{\partial{E}}{\partial{\hat{y_j}}}=\hat{y_j}-y_j\\ \Delta{w_{hj}}=-\eta(\hat{y_j}-y_j)(\hat{y_j}(1-\hat{y_j}))(b_h)\\ 构建一个中间变量:g_j=-\frac{\partial{E}}{\partial\hat{y_j}}·\frac{\partial{\hat{y_j}}}{\beta_j}=-(\hat{y_j}-y_j)(\hat{y_j}(1-\hat{y_j}))\\ 对于输出层神经元的偏置更新量:\Delta\theta_j=-\eta{g_j}=\eta(\hat{y_j}-y_j)(\hat{y_j}(1-\hat{y_j}))\\ 对输入层神经元的权重进行更新量:\Delta{v_{ih}}=-\eta\frac{\partial{E}}{\partial{b_h}}·\frac{\partial{b_h}}{\partial\alpha_h}·x_i=\eta{b_h}(1-b_h)\sum_{j=1}^lw_{hj}g_jx_i\\ 对隐层偏置进行更新量:\Delta\gamma_h=\eta\frac{\partial{E}}{\partial{b_h}}·\frac{\partial{b_h}}{\partial\alpha_h}=\eta{b_h}(1-b_h)\sum_{j=1}^lw_{hj}g_j
E=21?j?1∑l?(yj?^??yj?)2,误差表示;f(x)=sigmoid(x)=1+e?x1?,激活函数对上式分别求导:?yj?^??E?=yj?^??yj?;?x?f(x)?=f(x)(1?f(x))隐藏层权重修正量的公式:Δwhj?=?η?whj??E?,梯度的反方向为下降方向,η为学习步长其中:?whj??E?=?yj?^??E???βj??yj?^????whj??βj??其中:?whj??βj??=bh?;?βj??yj?^??=yj?^?(1?yj?^?);?yj?^??E?=yj?^??yj?Δwhj?=?η(yj?^??yj?)(yj?^?(1?yj?^?))(bh?)构建一个中间变量:gj?=??yj?^??E??βj??yj?^??=?(yj?^??yj?)(yj?^?(1?yj?^?))对于输出层神经元的偏置更新量:Δθj?=?ηgj?=η(yj?^??yj?)(yj?^?(1?yj?^?))对输入层神经元的权重进行更新量:Δvih?=?η?bh??E???αh??bh???xi?=ηbh?(1?bh?)j=1∑l?whj?gj?xi?对隐层偏置进行更新量:Δγh?=η?bh??E???αh??bh??=ηbh?(1?bh?)j=1∑l?whj?gj?
-
手动实现一个两层(隐层,输出层)的神经网络(结合反向传播推到的各权重值及阈值的更新量推导结果)
-
-
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
def sigmoid(x):
return 1.0/(1+np.exp(-x))
real_values = 1
Inet_input = np.array([0.985,0.211,-1])
Onet_input = np.array([0.0,0,0,0,-1])
learning_rate = 1
w_mid = np.zeros([3,4])
w_out = np.zeros([5])
delta_w_mid = np.zeros([3,4])
delta_w_out = np.zeros([5])
history = []
error = []
for epoch in range(100):
for i in range(4):
Onet_input[i] = sigmoid(sum(Inet_input*w_mid[:,i]))
model_output = sigmoid(sum(Onet_input*w_out))
Err = abs(model_output - real_values)
print(epoch,model_output)
history.append(model_output)
error.append(Err)
delta_w_out = learning_rate * model_output * ( 1 - model_output )*( real_values - model_output ) * Onet_input
delta_w_out[4] = - learning_rate * model_output * ( 1 - model_output )*( real_values - model_output )
w_out = w_out + delta_w_out
for i in range(4):
delta_w_mid[:,i] = learning_rate*Onet_input[i]*(1-Onet_input[i])*w_out[i]*model_output*(1-model_output)*(real_values-model_output)*Inet_input
delta_w_mid[2,i] = - learning_rate*Onet_input[i]*(1-Onet_input[i])*w_out[i]*model_output*(1-model_output)*(real_values-model_output)
w_mid = w_mid + delta_w_mid
plt.plot(history,label="模型输出值",color="red",linewidth=1.0,linestyle='--')
plt.plot(error,label="模型损失值")
plt.legend(loc='best')
plt.show()
-
学习步长为1,真实值为1,训练轮次为100
BP神经网络简介
-
BP(back propagation)神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是应用最广泛的神经网络模型之一 -
人工神经网络无需事先确定输入输出之间映射关系的数学方程,仅通过自身的训练,学习某种规则,在给定输入值时得到最接近期望输出值的结果。作为一种智能信息处理系统,人工神经网络实现其功能的核心是算法。BP神经网络是一种按误差反向传播(简称误差反传)训练的多层前馈网络,其算法称为BP算法,它的基本思想是梯度下降法,利用梯度搜索技术,以期使网络的实际输出值和期望输出值的误差均方差为最小。 -
BP神经网络已广泛应用于非线性建摸、函数逼近、系统辨识等方面。理论上已经证明,在不限制隐含节点数的情況下,两层(只有一个隐层)的BP网络可以实现任意非线性映射。在模式样本相对较少的情況下,较少的隐层节点,可以实现模式样本空间的超平面划分,此时,选择两层BP网络就可以了。当模式样本数很多时,减小网络规模,增加一个隐层是有必要的,但是BP网络隐含层数一般不超过两层。 -
BP神经网络是一种多层的前馈神经网络,其主要的特点是:信号是前向传播的,而误差是反向传播的。 -
BP神经网络的过程主要分为两个阶段,
- 第一阶段是信号的前向传播,从输入层经过隐含层,最后到达输出层;
- 第二阶段是误差的反向传播,从输出层到隐含层,最后到输入层,依次调节隐含层到输出层的权重和偏置,输入层到隐含层的权重和偏置。
-
神经网络的基本组成单元是神经元。神经元的通用模型如图所示,其中常用的激活函数有阈值函数、sigmoid函数和双曲正切函数。
-
BP网络采用的传递函数是非线性变换函数——Sigmoid函数。其特点是函数本身及其导数都是连续的。
-
BP神经网络无论在网络理论还是在性能方面已比较成熟。其突出优点就是具有很强的非线性映射能力和柔性的网络结构。网络的中间层数、各层的神经元个数可根据具体情况任意设定,并且随着结构的差异其性能也有所不同。但是BP神经网络也存在以下的一些主要缺陷。
- 学习速度慢,即使是一个简单的问题,一般也需要几百次甚至上千次的学习才能收敛。
- 容易陷入局部极小值。
- 网络层数、神经元个数的选择没有相应的理论指导。
- 网络推广能力有限。
-
BP网络主要用于以下四个方面
- 函数逼近:用输入向量和相应的输出向量训练一个网络逼近一个函数。
- 模式识别:用一个待定的输出向量将它与输入向量联系起来。
- 分类:把输入向量所定义的合适方式进行分类。
- 数据压缩:减少输出向量维数以便于传输或存储。
|