人工智能實戰_第二次做業_陳澤寅

第二次做業


題目說明:

項目 內容
課程 人工智能實戰2019
做業要求 做業
我在這個課程的目標是 瞭解人工智能理論,提高coding能力
這個做業在哪一個具體方面幫助我實現目標 經過學習神經網絡反向傳播算法更好地鞏固本身的AI基礎

做業要求、

  • 實現雙變量的反向線性傳播
  • 經過梯度降低求解參數\(\omega\)\(b\)的最終值

解題思路

\[ \frac{\partial{z}}{\partial{b}}=\frac{\partial{z}}{\partial{x}} \cdot \frac{\partial{x}}{\partial{b}}+\frac{\partial{z}}{\partial{y}}\cdot\frac{\partial{y}}{\partial{b}}=y \cdot 3+x \cdot 2=3y+2x \]\[ \frac{\partial{z}}{\partial{w}}=\frac{\partial{z}}{\partial{x}} \cdot \frac{\partial{x}}{\partial{w}}+\frac{\partial{z}}{\partial{y}}\cdot\frac{\partial{y}}{\partial{w}}=y \cdot 2+x \cdot 0 = 2y \]
因此,在每次迭代中,要從新計算下面兩個值:
\[ \Delta b=\frac{\Delta z}{3y+2x} \]\[ \Delta w=\frac{\Delta z}{2y} \]
可是因爲$
\Delta b\(和\)\Delta\omega\(都對\)\Delta z$形成一半的影響,所以咱們這裏的公式應該改爲
\[ \Delta b=\frac{\Delta z /2}{3y+2x} \]\[ \Delta w=\frac{\Delta z /2}{2y} \]git

而後每次更新\(b\)\(\omega,z\)的值,循環迭代,直到\(z -150\leq 10^-5\)github

代碼實現(每次均更新\(\Delta b\)\(\Delta \omega\))

# -*-coding:utf-8-*-
from numpy import *

target = 150.0
w = 3.0
b = 4.0
z = 162
min = 1e-5;
print(z)
iter_count = 0
while ((abs(150 - z)) > min):
    iter_count +=1
    x = 2 * w + 3 * b
    y = 2 * b + 1
    z = x * y
    delta_b = ((z - 150) / ((2 * x + 3 * y)*2))
    delta_w = ((z - 150) / ((2 * y)*2))
    w = w - delta_w
    b = b - delta_b
    print("loop: %d, w = %.8f, b = %.8f, z = %.8f, error = %.8f"%(iter_count,w,b,z,abs(150-z)));
print("final result:loop = %d, w = %.8f, b = %.8f,z = %.8f,error = %.8f"%(iter_count,w,b,z,abs(z-150)));

運行結果

loop: 1, w = 2.66666667, b = 3.90476190, z = 162.00000000, error = 12.00000000
loop: 2, w = 2.66151866, b = 3.90326327, z = 150.18140590, error = 0.18140590
loop: 3, w = 2.66151740, b = 3.90326291, z = 150.00004434, error = 0.00004434
loop: 4, w = 2.66151740, b = 3.90326291, z = 150.00000000, error = 0.00000000
final result:loop = 4, w = 2.66151740, b = 3.90326291,z = 150.00000000,error = 0.00000000

當咱們在反向傳播過程當中認爲\(\Delta b\)\(\Delta \omega\)的值保持不變

delta_b = ((z - 150) / ((63)*2))
 delta_w = ((z - 150) / ((18)*2))

運行結果

loop: 1, w = 2.66666667, b = 3.90476190, z = 162.00000000, error = 12.00000000
loop: 2, w = 2.66162761, b = 3.90332218, z = 150.18140590, error = 0.18140590
loop: 3, w = 2.66147411, b = 3.90327832, z = 150.00552614, error = 0.00552614
loop: 4, w = 2.66146940, b = 3.90327697, z = 150.00016964, error = 0.00016964
loop: 5, w = 2.66146925, b = 3.90327693, z = 150.00000521, error = 0.00000521
final result:loop = 5, w = 2.66146925, b = 3.90327693,z = 150.00000521,error = 0.00000521

比較與分析

  • 咱們能夠看到,上面兩種方法都可以在有限次迭代中達到想要的結果,可是第一種明顯效果更好,速度也更快,由於神經網絡的反饋是實時的,也就是說參數的影響會直接做用於下一輪迭代,這也能使神經網絡調整參數的速度更加快。所以咱們須要在每次迭代時先更新參數的值,後計算下一輪的數據。
相關文章
相關標籤/搜索