- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 569618 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 176108
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
人工神经网络——反向传播算法初体验(python实现)
8 G! s' Q- N$ j& d1 r% t7 R8 J& K5 z
( }: W& W0 }0 F! | b2 C- X3 U背景
H; ~& W- C( T+ `4 k4 w0 G初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下$ Y/ U: a: \& r) B5 l1 E5 t
7 @7 H9 a& p: p$ p+ Y
【神经网络分类算法原理详解】/ j( A/ ^& f+ I! I: Z) }4 H2 X" C# i- S
; [; f( _& f% r! }5 a% F( L
注意* k, W; M" i: p
站长提供的图片有点小问题,我们更正如下
7 x$ y0 a) ?5 o) d- j9 J
3 U- y- Q% C2 T3 M7 n, l% [0 r0 D
6 K2 i2 O1 `2 m+ O6 m! _% F问题* S6 R, }, f) G3 W7 A+ D' g3 l
根据上图所示,我们有已知' U4 j% ~$ C: t( F. E
0 Q5 f( k: a4 M" O1 E0 f#输入层# w5 B0 M2 U% [0 q& y b
i1=0.05% U: i: U) V4 @5 [- i! X
i2=0.1( k2 ^! p+ |! x, b( h
: t" x0 {. d! J, A#输出层
0 p/ @# a8 i) d, _# G; t" Go1=0.01
+ g) I" n X4 ]o2=0.99
2 H( ~* }+ F# z6 P3 N) V这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
6 r |2 W; o5 J) T1 A
( e+ Q5 I7 d, e- u" E$ F神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1: a* r6 O/ r ~' n+ T, V: L
5 S0 q1 d; J7 J$ R4 I神经元h2的输入 (hi2)=w3*i1+w4*i2+b1
+ l# ]* F" e: U0 E( E4 H: b, n: W
' ~4 n% S5 W, U( k4 w+ Q神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出
. w2 i2 `& B# k1 w3 ^& ?% `1 S, L5 t; G' d6 \
神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))
& @' [; g( Q; O0 }* {7 W( p/ c& ^
同理4 K/ u6 G- v7 c; E
4 W5 X+ x# d1 G神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))3 H5 [6 F; d9 g) q+ D* j9 ^
# v9 ~& U2 m7 y/ ^接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式# W1 O1 B" j! X, v g# t
; z c$ \7 n5 w+ d4 i
神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
' E& L* k$ C7 r7 P5 H& }- X/ {; k( } L ?* L" G0 r: S
神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2
1 Z; |, k$ U7 I9 g& w0 d$ H
0 a8 {: R2 w$ c再经过非线性变换Sigmoid函数得到
# A9 S$ ]9 m% O* q/ P& N
0 E, G& p$ n* H5 V. E1 c7 R1 L% G" i. Y! m神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
& k+ K- {3 n [8 _. _; t2 w2 E6 I$ k4 d
神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
' e9 u% K8 a5 I# H
* W; J7 D( o+ k5 r; Q) U, C我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为( P7 t b+ V% F& S3 _' d9 P
6 y3 ?$ a/ u" S# I* D; }
损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/23 \4 K: O; A4 E$ T$ Y
7 L6 _, M& t/ P
由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
: b+ R7 i0 A+ U/ @% h9 M" i% e6 }4 `: _6 Q7 }1 x
学习次数 (learning_time 简写为 lt)我们限定最大为10000次5 H' |$ j/ u# y- e, h+ `
) o, i. u: t/ T
学习率 (learning_rate 简写为 lr)我们设定为0.5
, V2 g* O2 c0 N0 |1 ~: D: |6 p8 z j4 q0 ^* F: U
依次求解代求参数4 E' b7 H1 c" J" ?3 |
/ l% `# B- U* O8 Cw1~w8,以及b1,b2& ]- r- c$ c5 o' @* ]
4 [; y4 I( u* F/ H M6 R跟4 f/ u& W2 S7 E0 R. X1 B& w
. W }0 t1 M+ n# p4 H* F7 N* y
损失值 (eo) 的偏导数( c% W7 _4 c) l) G, X' H
0 X" B f% K2 g# m8 }& _" k再更新该参数,更新公式为2 r: l$ p5 b1 c$ G) A/ a' Z- ~9 h
' l! L* p9 K- u% I' `2 [参数_new=参数-学习率*偏导(eo,参数)
9 g) U0 M$ ^0 i1 U1 \. v- H' B随后进入下一轮学习* L1 ]; }5 W. o
- I+ @: x0 @- w: I3 [
终止条件(满足其中一个即可停止训练)
9 W3 p; ?& Q7 s4 y0 y
% J$ t; b! X8 R( ?1.学习次数达到上限
3 D. h9 x8 r0 e) a, k
3 X* O2 v) d6 c8 n6 z2.损失值达到可容忍的范围
& Z) |; ^' {( j! U/ z" }; r \: j& W: A7 d+ B
导数
4 o) Z+ |8 O# c% h5 Z% |8 e5 g6 f0 {! Vf(x)=1/(1+e^(-x))的导数是
- U6 S7 Z$ n, e: g }5 S1 Yf'(x)=f(x)*(1-f(x))5 |, E" H8 v5 W( y9 T7 [* J9 |" B
源码1 f( R. K3 ?6 P# K4 d3 s& B3 e
import math
3 T1 V& v, P. |$ z, f
/ [% I) G7 ]0 [- s#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
# {" O( S0 w& ?- l#网址中图片有误,请看我博文上的图片
8 F- M- N; }, T
8 D1 y! r& J+ \! c3 Y# {* u#输入层. Q" O6 c- Q# n1 K7 t- \
i1=0.05- k$ s2 W6 j& t% I# M \" m3 K
i2=0.1
$ q! B( Q3 n' w U0 L' x#权值参数9 P; e3 C- {- i" b- m+ j# ]
w1=0.15
' ^3 J- J/ b5 A5 ]) rw2=0.23 S4 j# a) R6 _+ o
w3=0.25
- g# U/ g4 T$ M! ]+ k3 ]w4=0.3
/ [9 F$ n+ W4 Q4 f0 O6 E) tw5=0.49 x' ^5 K6 R0 H2 g& @ z7 G% e6 C
w6=0.45
. Z) U6 I" [& R: v. V. iw7=0.5
; ]7 r) w1 u* {9 F; Uw8=0.55& |/ Y! g0 B% _
#输出层标记(即期望值)7 Y& l' V1 r% }. V: m
o1=0.01
3 T# U( q, T& ?7 h. ko2=0.99- o: b# Y- M; i& {8 J0 F+ h- u
#偏置项参数9 F3 D; [5 Z0 \5 j$ v" {* M6 Z
b1=0.35' T$ [) a# a* h5 e" ^5 n% W
b2=0.6
0 s$ Y! h( @) f+ m6 W' _* c5 o, r+ B2 t& t' R7 Q
#学习率
6 l: [. y/ q W+ ]; e5 Zlr=0.5
, H" w5 [' L1 @0 n, `, D#学习周期" O# @& Z# W( e+ O
lt=0
: Y. x2 F& ?; V; v. }8 ?) Hmax_lt=10000
; e8 ~- I. z1 n- [" b3 ?4 d# _#允许误差3 u6 M# M# i" w# `6 w9 z5 L0 k8 U. d
eo_allow=1e-5
4 k' c/ @# Y" ]$ f6 |- ^/ U( h+ Y- Z( z9 U2 I
#线性转换, ]8 y4 V. ~, G/ `& F0 `
def linear(w_one,w_two,i_one,i_two,b):) j6 v! v; Z4 U3 S. w
return w_one*i_one+w_two*i_two+b+ F6 g8 h- ^: Z3 T
#非线性转换
: u# L6 e: o: \5 a/ C! ^def none_linear(i):) G1 N1 e6 [6 H+ D
return 1.0/(1+math.exp(-i))
0 J" i8 ^, X2 `
& T6 W1 Z" \" J: J6 y B; iprint("训练开始")
2 v% X% b5 @$ o#学习周期结束前一直学习
' w' a3 P3 i1 ewhile lt<max_lt:
( w/ c0 M; ^/ j+ h6 p lt+=11 _1 I3 O, D9 H' [
#求h1和h2输入值
! O7 K1 Y# C& r* Y0 w) ` hi1=linear(w1,w2,i1,i2,b1)
E# ?" g. n$ d2 x+ R hi2=linear(w3,w4,i1,i2,b1)
7 m, k% v: I% _ #求h1和h2输出值
, Z* b" ?% I" Z$ i ho1=none_linear(hi1): e9 j ~4 d6 q6 y4 D
ho2=none_linear(hi2)9 M9 U8 A' F* l7 |: K+ C3 e6 o2 r8 c% y7 j
#求o1和o2输入值
7 _/ F7 r7 Q" R& ~7 b oi1=linear(w5,w6,ho1,ho2,b2)
4 u8 T, k( e& _% b% t) ]! D O" t oi2=linear(w7,w8,ho1,ho2,b2)5 e$ S& t$ G+ \# N; s9 K
#求o1和o2输出值" F! Y* V: {. |+ l0 {' U
oo1=none_linear(oi1)* E. ?3 A5 k# c9 t2 f, r' w
oo2=none_linear(oi2)/ p, m E$ B. `
L2 m; P% c. N #求当前计算总误差% p- Y$ B$ T) b, ]3 ]
eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/25 F$ ?: k/ I) q! H8 h* E
print(f"第{lt}次训练,当前计算总误差={eo}")! x. r7 ~* o1 i6 ]# j" C, F
#误差已经在允许范围,退出训练( G- Y1 a4 ~; q2 [/ y* L
if eo<eo_allow:& n1 P0 ]$ Z3 ]! ^4 @
print("误差已经在允许范围,训练结束\n")8 h) }" s) ^) T
break5 Y6 A0 M, O4 E' d4 L$ c# \
#偏导0 z3 ~4 I. y( B7 q
d_eo_oo1=oo1-o1$ q7 o; z( t1 L( |$ }/ M
d_eo_oo2=oo2-o2
$ j, c: s6 H3 y, E5 |4 h/ S d_oo1_oi1=oo1*(1-oo1)* w6 ?; Z7 T! H6 V& w/ p
d_oo2_oi2=oo2*(1-oo2)
- Z2 \3 [* J. U" E0 b+ } d_eo_oi1=d_eo_oo1*d_oo1_oi1
d) s3 w) ]3 p0 [) _ d_eo_oi2=d_eo_oo2*d_oo2_oi2
9 R# D: @) \# J. w8 L #求w5_new h: h1 f Z% W+ e( @9 k
d_oi1_w5=ho16 i7 _2 V8 i- j
d_eo_w5=d_eo_oi1*d_oi1_w5% Y2 v# P6 a! p+ g
w5_new=w5-lr*d_eo_w5
1 c) F! R; l: S o% Y$ R7 a' G0 Y2 j #求w6_new4 L- @: w! s0 u" \
d_oi1_w6=ho2
: Z8 R- m1 R; w9 N- \ d_eo_w6=d_eo_oi1*d_oi1_w6
8 E0 X3 J0 x2 g( {; q w6_new=w6-lr*d_eo_w63 X8 P/ A2 O0 s* M
#求w7_new
2 o5 H* @! U [. C1 n! U8 S d_oi2_w7=ho1
4 g- z1 V( M4 r s! l: ^; Y+ Q# e d_eo_w7=d_eo_oi2*d_oi2_w7
( k2 f# z: c- F6 ?& [ w7_new=w7-lr*d_eo_w7
& e3 Z+ X! P7 m9 w6 S( ]- ]2 u) P& g #求w8_new! } f, R) ]2 y+ B+ q
d_oi2_w8=ho2
; m' V- _# A8 H+ S, e' }- O$ s, o d_eo_w8=d_eo_oi2*d_oi2_w8. P# v" i. G3 [
w8_new=w8-lr*d_eo_w8- u" B3 X7 X' A# H' e9 x9 I/ _4 w
#求b2_new7 }$ Y, ? Z0 S' I, `
d_oi1_b2=1
/ W: ^- A' U+ u' B d_oi2_b2=1/ R0 |/ s5 t0 p+ Y
d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
, d$ I3 J- Y. r4 F b2_new=b2-lr*d_eo_b2
" D( r! v- ^. s9 U. M: \ d_oi1_ho1=w5
5 t- k4 a! W, ^$ h; l d_oi1_ho2=w6
- j/ H! a P2 {* V8 ?% ] d_oi2_ho1=w7
: W4 `4 }0 E# {1 V+ ^ d_oi2_ho2=w8! k, [. Y+ r' q: D
d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
: j+ m3 j7 [% e! }; P d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
# d! a8 Z/ X+ y2 @+ ^/ S d_ho1_hi1=ho1*(1-ho1)
2 d3 X* b' }; {6 C& U5 e d_ho2_hi2=ho2*(1-ho2)( R+ s' M% h4 A
d_eo_hi1=d_eo_ho1*d_ho1_hi1
" V( r( q8 Z+ |) Q: m d_eo_hi2=d_eo_ho2*d_ho2_hi2
D# C3 g* ]. x6 R #求w1_new
( M% X) Q, l6 d$ K0 c0 s0 W d_hi1_w1=i1
0 h- _3 X/ q2 D1 s9 _' w% w _ d_eo_w1=d_eo_hi1*d_hi1_w15 m2 a4 \1 k0 s6 N, n
w1_new=w1-lr*d_eo_w1
o9 s( m% c* [9 S6 f* A7 [* d8 j #求w2_new: l# k0 k# o3 g
d_hi1_w2=i2
3 y( a6 |) ^! X0 E# F3 v d_eo_w2=d_eo_hi1*d_hi1_w28 J& t; w% { F0 E
w2_new=w2-lr*d_eo_w2# N7 B- M& x( e
#求w3_new
& c) z" c8 _! Q; s% ^, e0 |* H d_hi2_w3=i1
- H3 N1 ]) y8 \. \+ _! T8 q d_eo_w3=d_eo_hi2*d_hi2_w3/ D, [5 D' ?5 ~. {/ J$ E* h: J
w3_new=w3-lr*d_eo_w3
) F8 u/ L& U, Y& F4 T8 R3 U #求w4_new
4 [; ?+ C' O: b- D0 [* _2 T6 H d_hi2_w4=i2
+ B' m% a- b, V8 a0 `3 v ~0 e d_eo_w4=d_eo_hi2*d_hi2_w4
/ u+ i x* H+ D/ S w4_new=w4-lr*d_eo_w4& A! ? }1 G9 e3 ?5 g
#求b1_new
1 z; F" V# c; ?, j( q o$ ? d_hi1_b1=1& |6 S! L6 ` \0 \" D$ A# g
d_hi2_b1=1, m* q4 z' q1 @% L9 D- t7 J
d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b11 d7 Q: @7 y, @+ J' x' X
b1_new=b1-lr*d_eo_b1
z$ S' Y, o" o6 P7 j, { y) ?4 ] #更新反向传播1 b3 j) [; J4 M; u* N
w1=w1_new
0 R, R- v+ @* c: J# R. u. B w2=w2_new8 m; d0 d* y9 x. x5 n
w3=w3_new
3 Y; W$ C7 c, d! f; S) {+ Y5 A; k w4=w4_new2 |- ^. x- e" r, o" c3 D( q4 Q
b1=b1_new
# Y# P% i9 T$ `# _: P w5=w5_new5 E* S. b& L: G# t
w6=w6_new
5 c; g- _$ i; i- G w7=w7_new
7 G+ [3 l/ h, V w8=w8_new- l3 A1 r$ N, \% l. E
b2=b2_new9 c/ o/ A: k: V% d, T8 [
print(f"当前计算总误差={eo}")5 i, d) f: {# Z0 j4 Y
print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
( a+ s( ?8 f9 v K4 \print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")3 k2 d/ v# c% k/ d" A: a
print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")7 R! T# E$ B9 j4 c
4 [: E6 Q9 g5 F& I结果$ ?2 t, e \% V
- O6 i6 ?1 q( a
$ G# M: S r! u, F结语0 u! }& t) ?, Z O) }, m
可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。5 {! M0 b1 y7 m, w X1 u
( u/ k0 U; o; F/ g0 Z+ b$ @9 u1 ]补充
- Y3 q4 m4 K) m3 b6 ^4 ^程序中d_{a}_{b}格式的变量表示a对b偏导
1 Q; B' N+ d+ Z* U6 t————————————————
1 m9 a" `2 V. l- p$ e) o9 A版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
& U% M# o, p v9 E% S/ [原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
& c5 X3 l$ V/ P& C, b; K' |( h" z% @3 M2 R0 i; {" b6 s' h) M! y
- A$ k; f4 N* B! `6 I: H7 h* [' k! Z |
zan
|