人工智能實戰 第3次做業 鄭浩

項目 內容
這個做業屬於哪一個課程 人工智能實戰 2019(北京航空航天大學)
這個做業的要求在哪裏 第三次做業:使用minibatch的方式進行梯度降低
我在這個課程的目標是 瞭解人工智能的基礎理論知識,鍛鍊實踐能力
這個做業在哪一個具體方面幫助我實現目標 學習梯度降低的原理和幾種算法,並經過代碼實踐來練習
做業正文 見下文
其餘參考文獻

1.做業要求

  • 使用minibatch的方式進行梯度降低
  • 採用隨機選取數據的方式
  • 複習講過的課程(連接),並回答關於損失函數的 2D 示意圖的問題:
    問題2:爲何是橢圓而不是圓?如何把這個圖變成一個圓?
    問題3:爲何中心是個橢圓區域而不是一個點?

2.解題思路

見課堂課件內容python

3.代碼

import numpy as np
import matplotlib.pyplot as plt
from pathlib import Path

x_data_name="TemperatureControlXData.dat"
y_data_name="TemperatureControlYData.dat"

def ReadData():
    Xfile=Path(x_data_name)
    Yfile=Path(y_data_name)
    if Xfile.exists() & Yfile.exists():
        X=np.load(Xfile)
        Y=np.load(Yfile)
        return X.reshape(1,-1),Y.reshape(1,-1)
    else:
        return None,None

def GetBatchSamples(X,Y,batch_size,max_iter,r_index):
    X_batch=[]
    Y_batch=[]
    for i in range(0,max_iter):
        index=r_index[i*batch_size:(i+1)*batch_size]
        X_batch.append(X[0][index].reshape(1,batch_size))
        Y_batch.append(Y[0][index].reshape(1,batch_size))
        
    return X_batch,Y_batch

def ForwardCalculationBatch(w,b,batch_x):
    z=np.dot(w,batch_x)+b
    return z

def BackPropagationBatch(x,y,z):
    k=x.shape[1]
    dz=z-y
    dw=np.dot(dz,x.T)/k
    db=np.dot(dz,np.ones(k).reshape(batch_size,1))/k
    return dw, db

def UpdateWeights(w,b,dw,db,eta):
    w=w-eta*dw
    b=b-eta*db
    return w,b

def CheckLoss(w,b,x,y):
    k=x.shape[1]
    z=np.dot(w,x)+b
    LOSS=(z-y)**2
    loss=LOSS.sum()/k/2
    return loss

def random_index(n):
    test=np.arange(n)
    np.random.shuffle(test)
    return test

if __name__ == '__main__': 
    X, Y=ReadData()
    num_example=X.shape[1]
    num_feature=X.shape[0]
    eta=0.01
    batch_range=[5,10,15]
    batch_result={}
    
    for batch_size in batch_range:
        max_epoch=50
        max_iter=int(num_example/batch_size)
        w,b=0,0
        loss_result=[]
        for epoch in range(max_epoch):
            r_index=random_index(num_example)
            X_batch,Y_batch=GetBatchSamples(X,Y,batch_size,max_iter,r_index)
            for iteration in range(0,max_iter):
                x=X_batch[iteration]
                y=Y_batch[iteration]
                z=ForwardCalculationBatch(w,b,x)
                dw,db=BackPropagationBatch(x,y,z)
                w,b=UpdateWeights(w,b,dw,db,eta)
                erro=CheckLoss(w,b,X,Y)
                loss_result.append(erro)
        batch_result[str(batch_size)]=loss_result

    plt.figure(figsize=(16, 10))
    p5,=plt.plot(batch_result['5'])
    p10,=plt.plot(batch_result['10'])
    p15,=plt.plot(batch_result['15'])
    plt.legend([p5,p10,p15],["batch_size=5","batch_size=10","batch_size=15"])
    plt.ylim(0.006,0.1)
    plt.xlim(0,800)
    plt.xlabel('epoch')
    plt.ylabel('loss')
    plt.title("Learning Rate "+str(eta))
    plt.show()

4.實驗結果

  • 當eta=0.1時
    算法

  • 當eta=0.05時
    app

  • 當eta=0.01時
    dom

5.實驗結論

能夠看到,eta越小,均方差損失loss的波動程度越小。同時,在eta必定的狀況下,batch_size越大,loss的波動程度也越小。函數

6.額外問題

  • 問題2:爲何是橢圓而不是圓?如何把這個圖變成一個圓?
     答:損失函數\(Loss=\frac{1}{2m}\sum_{i=1}^{m}{(x_iw+b-y_i)^2}\)
    \(=\sum_{i=1}^{m}{(x_i^2w^2+b^2+2x_ibw-2y_ib-2x_iy_iw+y_i^2)}\)
    可得,損失函數爲橢圓函數。
    所以,當\(\sum_{i=1}^{m}{x_i^2}=1\)時,橢圓函數退化爲圓。學習

  • 爲何中心是個橢圓區域而不是一個點?
    答:理論上loss的最小值是一個點,可是計算機的計算是離散的,顏色相同的區域因爲loss很是接近,因而被計算機視爲是loss相同的點。人工智能

相關文章
相關標籤/搜索