Written by joezou(邹镇洪), 2019/3/19
项目 内容 这个作业属于课程 人工智能实战 2019 - 北京航空航天大学 这个作业的要求在 第三次作业:使用minibatch的方式进行梯度下降 我在这个课程的目标是 学会利用云部署机器学习模型并完成一个app 这个作业在这些方面帮助我实现目标 练习神经网络批处理操作 其他参考文献 无
作业正文:
问题1:代码练习
- 示例代码位置:/B-教学案例与实践/B6-神经网络基本原理简明教程/微软-方案1/NeuralNetwork/ch04/level4-BatchGradientDescent.py
- 采用随机选取数据的方式
- batch size分别选择5,10,15进行运行
代码如下
import numpy as np
import matplotlib.pyplot as plt
from pathlib import Path
from matplotlib.font_manager import FontProperties
from matplotlib.pyplot import savefig
def ReadData():
Xfile = Path('TemperatureControlXData.dat')
Yfile = Path('TemperatureControlYData.dat')
if Xfile.exists() & Yfile.exists():
X = np.load(Xfile)
Y = np.load(Yfile)
return X,Y
else:
return None,None
def forward(X,Y,w,b): # s输入单个batch的数据,输出误差
Z = np.dot(X,w) + b - Y
return Z
def backward(X,w,b,Z,rate,batchsize): # 当前batch的数据
w -= rate / batchsize * np.dot(Z,X)
b -= rate / batchsize * sum(Z)
eta = [z**2 / 2 / batchsize for i in Z] #每个batch的误差
return w,b,sum(Z), eta
def Simu(xx,yy,w,b,batchsize,EPOCH,rate):
rank = np.arange(0,len(xx))
np.random.shuffle(rank) # 随机顺序
index = [rank[i:i+batchsize] for i in range(0,len(xx),batchsize)] # 随机batch
iteration = len(index) # 迭代次数
epoch,eta= 1,1
LOSS = []
while (eta>=1e-6)*(epoch<=EPOCH):
eta = 0
for i in range(iteration):
X = [xx[k] for k in index[i]]
Y = [yy[k] for k in index[i]]
Z = forward(X,Y,w,b)
w,b,_,eta_ = backward(X,w,b,Z,rate,len(index[i]))
eta += eta_
LOSS.append(eta)
print('epoch=%d,iteration=%d,w=%.6f,b=%.6f,eta=%.6f\n' %(epoch, iteration, w, b,eta))
epoch += 1
result = w * 0.346 + b
print("result is %.3f\n" %result)
return w,b,LOSS
if __name__ == '__main__':
w0, b0, rate,epoch = 0, 10, 1, 50
Batchsize = [5,10,15]
X, Y = ReadData()
i=0
plt.figure(figsize=(12,6))
for size in Batchsize:
w,b,LOSS = Simu(X, Y, w0, b0, size, epoch, rate)
#point = np.arange(0.,1.,0.01)
#line = [w*i+b for i in point]
#xl = np.arange(1,epoch,1/size)
color = ['gray','orange','blue']
plt.plot(LOSS,color=color[i],label='batchsize='+str(size))
i += 1
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)
plt.title(str(epoch)+'个epoch上的loss变化'+',学习率为'+str(rate),fontproperties=font)
#plt.plot(X,Y,'.',color='orange')
#plt.plot(point,line,color='blue')
plt.ylabel('loss')
plt.xlabel('epoch number')
plt.legend()
plt.show()
savefig("D:/courses/AI in Action/codes/mini_batch/"+str(rate)+".png")
问题2:为什么是椭圆而不是圆?如何把这个图变成一个圆?
二次曲面-百度百科
MSE对应的loss函数为二次型,根据二次曲面分类:
\[loss=(wx+b-y)^2/2\] 记loss为z,化为下列公式 \[x^2w^2+b^2+2xwb-2xyw-2yb-2z+y^2=0\] 对应二次曲面为椭圆抛物面
因此在2D平面上的投影是椭圆
那么有没有可能为其他图像?有,只需让loss对应参数满足二次曲面的不同判别式即可,但不一定是MSE
如何才能变成圆?令二次曲面为(椭圆/双曲)抛物面即可,此时参数满足\[loss=(w^2±b^2)(x-y)\]但此时loss失去意义
问题3:为什么中心是个椭圆区域而不是一个点?
当中心为一个点时表明可以完全拟合散点(最优解),而实际上不可能完全拟合散点,该区域表明基于MSE优化的最小误差对应的(w,b)值域,除非所有点都在直线上才是一个点。