在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 563428 点 威望 12 点 阅读权限 255 积分 174251 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
人工神经网络——反向传播算法初体验(python实现) / l: V* H& B, r
/ n7 {( E0 h: v2 [
背景
9 `: f( b0 m0 s& m 初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下% Y7 J7 a2 ~2 ~8 j$ e* K/ a j2 y' v
( ?% I. x0 ]3 ^4 {" m" o5 ~ 【神经网络分类算法原理详解】5 E4 [* u& F' R7 A4 Q; f0 {
$ M) p9 ~+ I8 ^ {, ~0 `
注意$ c5 x a7 R' u. a
站长提供的图片有点小问题,我们更正如下6 B) q2 E2 r. ^5 p& s x
; j i# V ~0 F9 j
" ]! W, {2 V- r' O) {8 @ , R7 g& C( T6 k/ E" ?7 Q
问题
. k# N$ ~+ h2 S7 w1 E 根据上图所示,我们有已知
+ m* P3 S# `" L1 l+ U* _/ X
8 a, H( M" j! V5 Y #输入层' t; t. w/ O7 D9 n/ S- I/ ]
i1=0.05
% S) L+ y- d3 K( `- | i2=0.1
+ F" w5 B) ~( N9 z( Y' Q4 x* C: j
) o9 X: v9 U$ K$ Q #输出层
( d7 @3 O& C, e( y o1=0.01; r8 ^ d1 p, i
o2=0.99: N, M2 S8 J+ r2 }. M
这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的; c1 Y% t8 I% H6 B% f6 h) `: X: h
3 q7 J4 d$ o/ P' I# o1 t8 X0 U" e: a! }
神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1
! F3 X+ I1 {% \8 }* C / E5 A i& f4 d& N
神经元h2的输入 (hi2)=w3*i1+w4*i2+b1
; m8 `1 r* I7 z. E' ^
) \) {( O& O9 H- q7 C. g 神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出* g% L& L9 A B! n3 v
) H6 x w& H+ L- B
神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))/ G( C- O! I; @4 Y/ u _4 [
) k. `; t/ W1 e- {1 _ 同理. j2 W; O& g4 a/ l: B. y; q
) A5 U4 {1 _% g- Y& }9 g4 W) I 神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))
, \8 K+ R& a* h( h
& B0 [, `1 W9 Y1 V 接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式+ j# j/ r% l( ? j; Y. F
" Z9 r4 C; W4 O+ |0 R 神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b20 a) Q- f4 L& ^" g' n
) z5 g0 G9 n' C, `7 l H
神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2$ y' n5 r7 t- A+ N; N: P n
7 [ q8 \3 @* W* G 再经过非线性变换Sigmoid函数得到) m! X8 `, R% S7 W0 {
, Y& C, q) J5 q$ Y
神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))! X1 c9 l; Q; _/ \
4 V: ~% |; t$ ?7 A6 ?) f* R
神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))8 |2 S+ s+ K/ H0 W
! N. e0 ?9 Y T% Y/ [ 我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
" j! t9 @! ^2 Q3 y % m7 x( r9 D8 c
损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2! C8 C4 _ S5 ~4 p+ a
* n5 d) G3 X1 C7 }3 B) H 由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足7 z5 g& z- {; ? }) u8 r9 ]' s# z" D
: Q1 b7 u) F d, Z* d: v
学习次数 (learning_time 简写为 lt)我们限定最大为10000次
3 y: y( [! n! Z' p6 h3 z8 r5 @5 z 8 q6 y% ^2 Y- u7 |- H
学习率 (learning_rate 简写为 lr)我们设定为0.5
; V; ~" \- a: h6 ~. J/ G% M 0 ?" Z D0 ` E0 a, _' v
依次求解代求参数/ b6 b& }! ~6 O4 L5 j C
* S, r% A3 \1 w
w1~w8,以及b1,b2$ X# \% z1 n: ~7 S8 Q
7 O1 G2 \! P. K5 Q6 D
跟
8 e) h9 h/ x6 r! j& b& w+ [) B8 B 4 n' h, @+ G9 O; P
损失值 (eo) 的偏导数
; d5 }( n. r+ m, ~3 q( n) _4 l q% c
/ j0 b p* i8 S! E' ?# g 再更新该参数,更新公式为4 V& V8 B5 o1 o+ @7 Y7 H
& Y- S* a" j. O6 m3 o9 r9 `
参数_new=参数-学习率*偏导(eo,参数)
( G- _0 \( R( D/ y: V* I* Q 随后进入下一轮学习$ k& v0 o6 X% D
' t, y7 m' E+ L) V, O
终止条件(满足其中一个即可停止训练)
- u2 e7 {& s' |3 O: P3 m / D }6 I: S" J8 m
1.学习次数达到上限
& |' o6 S% @/ y3 ^3 i, Q
) c+ V$ _: l! k( e' ~3 n# N 2.损失值达到可容忍的范围5 v# n7 u0 C2 }
6 _9 n X3 S' p 导数+ [8 o2 l! J. t- ]$ i& ~
f(x)=1/(1+e^(-x))的导数是
/ d' f7 i0 b$ e7 v7 ~ f'(x)=f(x)*(1-f(x))' f$ ]# q$ a5 {! I- r0 n9 Q
源码9 V. K' O' b4 T+ b0 b9 @
import math
u" p' z" q$ w- A/ a
- E7 r6 w2 F. I( n( f4 x #参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
3 T0 X9 }0 ]: B( b7 S t) [ #网址中图片有误,请看我博文上的图片/ w5 S# ~. Q3 g1 p3 E
" o1 B8 D1 }( C) ~7 s5 k) a2 W: z! y
#输入层
$ l- n1 S& S+ R4 C% |0 R i1=0.053 [" i: c' A+ H7 e6 Y4 n9 {
i2=0.1
: z1 I" i# _ u- m. W #权值参数1 E) U/ p* G* X0 {
w1=0.15
( H* a% ^) R2 I/ \( A7 c5 H: W w2=0.2( Q* N( Y5 ]! ]8 l* w) I, `7 C
w3=0.25# ]; {3 C7 S' c5 o/ q6 Y
w4=0.3
: K# `7 Q& s& [6 U1 i4 ?2 b w5=0.44 v& Z& y; |% r. f( v
w6=0.45: v! d M+ j8 Q8 s2 C1 P% `+ f
w7=0.5
/ M9 j7 }) m. Y! U w8=0.55* _3 {: p2 ]9 G$ Y$ u6 ^+ b# m6 L$ C
#输出层标记(即期望值)
: v5 x# n5 D/ X o1=0.01% {7 o* `5 Y/ y
o2=0.99! t: b1 Q. ?6 W4 {2 _* [
#偏置项参数$ q3 }/ l" [ F- L2 I
b1=0.35
$ P/ u. f0 Q$ N: o b2=0.6
& f* m6 Y, @+ `+ _" z' M- l 6 R2 K! m! w% P7 ]% E
#学习率/ ^, d: H( l0 J' \" O; }3 [% I# h
lr=0.5
( k- `- o/ s+ ]# c3 S #学习周期
A$ S4 }9 ?, K5 o) A lt=0- X% [ O* }4 J# c1 X
max_lt=10000
/ ^) B. t( l4 u( y$ T #允许误差7 \( |0 e( l3 ~ L
eo_allow=1e-5
, i5 L; g) J* ~1 J) \& D7 o) W' q ]1 e7 p8 z3 t" c
#线性转换
5 \# }0 E" t/ [7 E0 `1 g& t def linear(w_one,w_two,i_one,i_two,b):# [3 T/ s4 s: h+ t# m# C$ j
return w_one*i_one+w_two*i_two+b) L+ k ?1 D& M
#非线性转换
8 c4 @% `% Z/ U def none_linear(i):0 q- _' m6 n0 l3 L% E" |+ ~; ?
return 1.0/(1+math.exp(-i))
0 a( [& ^: p' ]! T8 T: I o% a6 D5 k( L
; _3 r- ?' H1 [8 Y& }6 ~8 ]4 ?& W* T print("训练开始")0 m2 |, z6 Z- Q1 w, {+ A
#学习周期结束前一直学习
! v. z2 X+ E0 V6 o& f while lt<max_lt:: X8 z; B6 q7 }6 b8 d1 n0 G% j" y
lt+=16 p1 p" X! u7 m; c
#求h1和h2输入值
6 f; b0 O& a+ B2 }1 q" l hi1=linear(w1,w2,i1,i2,b1)* \6 s) L4 s' c: b
hi2=linear(w3,w4,i1,i2,b1)% O' ^: ~# f& R5 _* h; d
#求h1和h2输出值, s* n% [ Y5 b' @ w
ho1=none_linear(hi1), |" M$ Q( S6 v: ]' O
ho2=none_linear(hi2)( s4 z# Y' V" }- j% X
#求o1和o2输入值 L( o* m {/ K- ~4 j
oi1=linear(w5,w6,ho1,ho2,b2)/ m n' S% C/ s+ `
oi2=linear(w7,w8,ho1,ho2,b2)' b0 a; a; Y% P J# s' V8 o
#求o1和o2输出值9 h/ r8 h2 ?' F6 ]
oo1=none_linear(oi1), n/ W' E# ?4 M. a' y& m9 C u" A$ Y
oo2=none_linear(oi2)- v9 i8 q2 |; `; ]7 E
& l- \4 z* y' \% ]) u8 G
#求当前计算总误差
4 F: M# Y1 z/ S5 D% \& Y. L/ b eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
4 i! p# M; n# S print(f"第{lt}次训练,当前计算总误差={eo}")8 I; ~2 b m: n% H: ?" @8 I
#误差已经在允许范围,退出训练
4 w; N0 U1 m: ~' t: \3 n( U if eo<eo_allow:
: [2 ]$ F9 D, g, T0 k) z- p print("误差已经在允许范围,训练结束\n")9 R! N1 M& @& x8 `4 ~& B& L
break: g" `' ]" A8 H/ {
#偏导
0 t# O8 ?+ R8 c' o" p' O d_eo_oo1=oo1-o1$ S- W/ d; j+ [/ j1 A8 M A
d_eo_oo2=oo2-o23 B r5 d" M" ~2 G; \
d_oo1_oi1=oo1*(1-oo1)
e; I7 _$ x9 J; q d_oo2_oi2=oo2*(1-oo2)% P! f2 G5 O7 e
d_eo_oi1=d_eo_oo1*d_oo1_oi1/ S' A' L. o: {0 G+ d
d_eo_oi2=d_eo_oo2*d_oo2_oi2+ B- y7 r+ F( I8 K
#求w5_new N: T- t! e, k! \/ S
d_oi1_w5=ho1
) ~# C6 k+ P- \$ g! Q4 f* U d_eo_w5=d_eo_oi1*d_oi1_w5
' h7 R" o3 a B. I# A9 Q: z, p1 `/ f$ S w5_new=w5-lr*d_eo_w5
1 }& S6 z! _: P* E. q' Y; V #求w6_new+ O; R2 P/ z* U! \- ~# T
d_oi1_w6=ho2 L) ]; ~" K% G) E2 s; n5 n
d_eo_w6=d_eo_oi1*d_oi1_w6
( u( q) H0 W! P7 Z6 J w6_new=w6-lr*d_eo_w6
3 L& H. u: r i2 ~ #求w7_new
9 D& o7 m& }6 n2 X. g d_oi2_w7=ho1
$ a, V0 c C& D# U, H1 u7 g d_eo_w7=d_eo_oi2*d_oi2_w7
5 E, s1 B2 M) e/ W5 x2 R$ h w7_new=w7-lr*d_eo_w76 Z6 ?$ O5 G6 ?0 @ y
#求w8_new0 _& M5 Z& C+ ?9 @- S5 R
d_oi2_w8=ho2
. n# V) i, \$ T) t d_eo_w8=d_eo_oi2*d_oi2_w8
, ?$ Q# i' S( d w8_new=w8-lr*d_eo_w8% n9 Z% F7 O+ b5 S# N5 O
#求b2_new2 B+ w/ r8 ?1 n5 R: }( C8 N- f8 K
d_oi1_b2=1% h5 W1 x& W% R9 z+ _) x/ ^
d_oi2_b2=1& U3 g3 g* I/ Z ?6 U S# B
d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2; T. S2 A1 x0 c" ^+ V5 g/ W) P. \
b2_new=b2-lr*d_eo_b2
! ^; J' D7 U4 `6 H$ G d_oi1_ho1=w5: G9 e0 B" \* |/ ?6 Q% y3 r
d_oi1_ho2=w6/ |9 Z8 J8 e/ i- ?
d_oi2_ho1=w7& ^/ a& o. I, K" C( A
d_oi2_ho2=w8
u( ?8 n; K2 @- x7 x8 m d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
+ U* @' W8 S* m d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
: u& A% U5 U/ ^$ l: n; A; r d_ho1_hi1=ho1*(1-ho1); d; e& f! l3 Q5 o: o# L' f' r, q
d_ho2_hi2=ho2*(1-ho2)7 O1 ~5 m; W1 e E3 f2 ]5 P0 v
d_eo_hi1=d_eo_ho1*d_ho1_hi1
7 k5 h6 i( e) C- Z+ M d_eo_hi2=d_eo_ho2*d_ho2_hi2
3 {' i+ k- g% f5 u$ ~! z/ L" h5 q: r #求w1_new' n! p: z9 k* x( y' u0 H
d_hi1_w1=i12 X7 _4 e3 Q6 {7 R, H6 q3 k
d_eo_w1=d_eo_hi1*d_hi1_w1
8 R8 ?8 L6 Q3 Y w1_new=w1-lr*d_eo_w1/ s( r$ @. T1 @% v- x! v
#求w2_new8 U3 K/ e4 |+ F, K2 ~: q _
d_hi1_w2=i2/ w" C, X# h6 _7 U S N6 ^# O
d_eo_w2=d_eo_hi1*d_hi1_w2/ D, [+ @+ _+ S+ r# a, b% v
w2_new=w2-lr*d_eo_w2' o5 @* U6 m5 l+ e% N# }
#求w3_new+ ^: D4 F; ]7 Y6 Z; N' D3 y
d_hi2_w3=i13 k* N5 |; Z( F$ |: S
d_eo_w3=d_eo_hi2*d_hi2_w3
6 q; K/ e' i* q3 ?, ?0 H+ P w3_new=w3-lr*d_eo_w3
c% G n# p" ?4 Z6 i6 o8 m5 G #求w4_new1 U3 ^7 W6 N! K7 F
d_hi2_w4=i2- ?' f. Q9 u4 a7 P+ [" q
d_eo_w4=d_eo_hi2*d_hi2_w4
' o: s y4 U/ P8 ~' H! `4 V' l w4_new=w4-lr*d_eo_w4
]# n7 y$ Y) U5 m: M& S% ^ #求b1_new8 E/ Z7 I/ C& r3 ?% U$ h1 R
d_hi1_b1=1
+ W8 U: L+ T* C. M2 B d_hi2_b1=1
+ G; R4 \: l' ~ d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
# ]# g5 i7 a1 w! o/ P2 i# o0 W b1_new=b1-lr*d_eo_b1
+ [7 C) j. t0 T" T! Z #更新反向传播
8 T3 J- G+ X( r# b) G) s/ T w1=w1_new
9 C5 h$ S `$ O w2=w2_new8 }. ^. N5 l7 m/ g& A( ?! _; c
w3=w3_new8 q* E, V8 Y: k/ |: S
w4=w4_new4 [' v. ]0 v1 u! |5 F) r! L
b1=b1_new
4 u4 `2 {# C0 s6 `7 ~ w5=w5_new& Y' w6 h# {+ i& x: N; R6 t: z
w6=w6_new+ B0 R5 F3 o H1 s
w7=w7_new
% z& D; |$ B5 X. I/ }0 P6 N w8=w8_new
; J+ [: A" Q. k0 E C* x) l& Q b2=b2_new0 c2 M; Q% \/ e& s" }1 \
print(f"当前计算总误差={eo}")" r, }6 W; A0 j5 a4 a
print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")6 {+ X/ W6 `3 t, E6 E* Z- o% e
print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")! W5 x B- ^4 e" ]+ G; r8 C6 @
print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")7 p6 Y6 J5 @9 B5 c
6 I9 C/ K& H+ R t& x3 c. D
结果9 x4 w" g4 _) w7 J4 {9 Q
& r4 \6 a7 ], [7 a$ f- ` % G/ ]( b% A) {0 S
结语5 r @' m4 J& }3 y0 j U
可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
: o$ \# j0 E Z3 D! c
f. R& O" s4 ^: l( ? 补充0 B( v. j$ q6 ^6 q9 O( w
程序中d_{a}_{b}格式的变量表示a对b偏导
0 p" v. {, l3 ?% i ————————————————
* Y6 l! |% M7 p, h; g c 版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
( d9 W& S, A7 h3 a) x s 原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
2 o5 l$ v I2 N1 ?% A % C6 Z3 [: H- Q' W4 w: U2 c
. y6 D/ I H ~4 ^6 C6 W. x: y
zan