初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
【神经网络分类算法原理详解】
站长提供的图片有点小问题,我们更正如下
根据上图所示,我们有已知
#输入层
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
可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
程序中d_{a}_{b}格式的变量表示a对b偏导