項目 | 內容 |
---|---|
這個做業屬於哪一個課程 | 人工智能實戰 2019(北京航空航天大學) |
這個做業的要求在哪裏 | 第三次做業:使用minibatch的方式進行梯度降低 |
我在這個課程的目標是 | 瞭解人工智能的基礎理論知識,鍛鍊實踐能力 |
這個做業在哪一個具體方面幫助我實現目標 | 學習梯度降低的原理和幾種算法,並經過代碼實踐來練習 |
做業正文 | 見下文 |
其餘參考文獻 | 無 |
見課堂課件內容python
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()
當eta=0.1時
算法
當eta=0.05時
app
當eta=0.01時
dom
能夠看到,eta越小,均方差損失loss的波動程度越小。同時,在eta必定的狀況下,batch_size越大,loss的波動程度也越小。函數
問題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相同的點。人工智能