人工神经网络——反向传播算法初体验(python实现)

背景

初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下

【神经网络分类算法原理详解】

注意

站长提供的图片有点小问题,我们更正如下

人工神经网络——反向传播算法初体验(python实现)_第1张图片

问题

根据上图所示,我们有已知

#输入层
i1=0.05
i2=0.1

#输出层
o1=0.01
o2=0.99

这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的

神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1

神经元h2的输入  (hi2)=w3*i1+w4*i2+b1

神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出

神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))

同理

神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))

接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式

神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2

神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2

再经过非线性变换Sigmoid函数得到

神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))

神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))

我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为

损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2

由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足

学习次数 (learning_time 简写为 lt)我们限定最大为10000次

学习率 (learning_rate 简写为 lr)我们设定为0.5

依次求解代求参数

w1~w8,以及b1,b2

损失值 (eo) 的偏导数

再更新该参数,更新公式为

参数_new=参数-学习率*偏导(eo,参数)

随后进入下一轮学习

终止条件(满足其中一个即可停止训练)

1.学习次数达到上限

2.损失值达到可容忍的范围

导数

f(x)=1/(1+e^(-x))的导数是
f'(x)=f(x)*(1-f(x))

源码

import math

#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
#网址中图片有误,请看我博文上的图片

#输入层
i1=0.05
i2=0.1
#权值参数
w1=0.15
w2=0.2
w3=0.25
w4=0.3
w5=0.4
w6=0.45
w7=0.5
w8=0.55
#输出层标记(即期望值)
o1=0.01
o2=0.99
#偏置项参数
b1=0.35
b2=0.6

#学习率
lr=0.5
#学习周期
lt=0
max_lt=10000
#允许误差
eo_allow=1e-5

#线性转换
def linear(w_one,w_two,i_one,i_two,b):
    return w_one*i_one+w_two*i_two+b
#非线性转换
def none_linear(i):
    return 1.0/(1+math.exp(-i))

print("训练开始")
#学习周期结束前一直学习
while lt

结果

人工神经网络——反向传播算法初体验(python实现)_第2张图片

结语

可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。

补充

程序中d_{a}_{b}格式的变量表示a对b偏导

你可能感兴趣的:(经验分享,算法,人工智能,机器学习)