項目 | 內容 |
---|---|
這個做業屬於哪一個課程 | 人工智能實戰 2019(北京航空航天大學) |
這個做業的要求在哪裏 | 第二次做業 - 雙變量的反向傳播 |
我在這個課程的目標是 | 瞭解人工智能的基礎理論知識,鍛鍊實踐能力 |
這個做業在哪一個具體方面幫助我實現目標 | 學習神經網絡的雙變量反向傳播,並經過代碼實踐來練習 |
做業正文 | 見下文 |
其餘參考文獻 | 無 |
\(x=2*w+3*b\)
\(y=2*b+1\)
\(z=x*y\)
給定\(w\)和\(b\)以及\(z\)的值,根據反向傳播原理來更新\(w\),\(b\)的值,並前向計算\(z\)的值,不斷循環,直到\(z\)與目標的偏差在容許範圍以內。python
見課堂課件內容網絡
target_z=150.0 min=1e-5 w=3.0 b=4.0 x=2*w+3*b y=2*b+1 z=x*y delta_z=abs(z-target_z) count=0 print("double variable new: w, b -----") print("count=%d,w=%.6f,b=%.6f,z=%.6f,delta_z=%.6f"%(count,w,b,z,delta_z)) while delta_z>min: count+=1 factor_b=2*x+3*y factor_w=2*y delta_b=((z-target_z)/(2*factor_b)) delta_w=((z-target_z)/(2*factor_w)) print("count=%d,factor_b=%.6f,factor_w=%.6f,delta_b=%.6f,delta_w=%.6f"%(count,factor_b,factor_w,delta_b,delta_w)) w=w-delta_w b=b-delta_b x=2*w+3*b y=2*b+1 z=x*y delta_z=abs(z-target_z) print("w=%.6f,b=%.6f,z=%.6f,delta_z=%.6f"%(w,b,z,delta_z)) print("done!") print("final b=%.6f\nfinal w=%.6f"%(b,w))
double variable new: w, b ----- count=0,w=3.000000,b=4.000000,z=162.000000,delta_z=12.000000 count=1,factor_b=63.000000,factor_w=18.000000,delta_b=0.095238,delta_w=0.333333 w=2.666667,b=3.904762,z=150.181406,delta_z=0.181406 count=2,factor_b=60.523810,factor_w=17.619048,delta_b=0.001499,delta_w=0.005148 w=2.661519,b=3.903263,z=150.000044,delta_z=0.000044 count=3,factor_b=60.485234,factor_w=17.613053,delta_b=0.000000,delta_w=0.000001 w=2.661517,b=3.903263,z=150.000000,delta_z=0.000000 done! final b=3.903263 final w=2.661517
target_z=150.0 min=1e-5 w=3.0 b=4.0 x=2*w+3*b y=2*b+1 z=x*y delta_z=abs(z-target_z) count=0 print("double variable: w, b -----") print("count=%d,w=%.6f,b=%.6f,z=%.6f,delta_z=%.6f"%(count,w,b,z,delta_z)) factor_b=2*x+3*y factor_w=2*y while delta_z>min: count+=1 delta_b=((z-target_z)/(2*factor_b)) delta_w=((z-target_z)/(2*factor_w)) print("count=%d,delta_b=%.6f,delta_w=%.6f"%(count,delta_b,delta_w)) w=w-delta_w b=b-delta_b x=2*w+3*b y=2*b+1 z=x*y delta_z=abs(z-target_z) print("w=%.6f,b=%.6f,z=%.6f,delta_z=%.6f"%(w,b,z,delta_z)) print("done!") print("final b=%.6f\nfinal w=%.6f"%(b,w))
double variable: w, b ----- count=0,w=3.000000,b=4.000000,z=162.000000,delta_z=12.000000 count=1,delta_b=0.095238,delta_w=0.333333 w=2.666667,b=3.904762,z=150.181406,delta_z=0.181406 count=2,delta_b=0.001440,delta_w=0.005039 w=2.661628,b=3.903322,z=150.005526,delta_z=0.005526 count=3,delta_b=0.000044,delta_w=0.000154 w=2.661474,b=3.903278,z=150.000170,delta_z=0.000170 count=4,delta_b=0.000001,delta_w=0.000005 w=2.661469,b=3.903277,z=150.000005,delta_z=0.000005 done! final b=3.903277 final w=2.661469
能夠看到,當每次迭代都從新計算\(\Delta b\),\(\Delta w\)的貢獻值時,迭代次數明顯比不從新計算\(\Delta b\),\(\Delta w\)的貢獻值要少,收斂速度更快。可是,咱們把偏差按1:1分配到\(b\)和\(w\)上未必是合理的。若咱們按當地梯度來分配,或許能獲得更快的降低速度。學習