目标:寻找最优点
分治——容易出现缺漏,无法找到最低点
非凸函数中容易出现局部最优点。 鞍点同样会陷入停滞。
假设某个损失函数里,模型损失值 cost 与权重 w 有下图这样的关系。实际模型里,可能会有多个权重 w ,这里为了简单起见,举只有一个权重 w 的例子。权重 w 目前的位置是在小红点。此时如果求出A点的梯度 dL/dw ,便可以知道如果我们向右移动,可以使损失函数的值变得更小。
通过计算梯度,我们就可以知道 w 的移动方向,应该让 w 向右走而不是向左走,也可以知道什么时候会到达最低点(梯度为0的地方)。
当dL/dw>0说明此时这一段函数为增函数,w应该向左移即减小,当dL/dw<0说明为减函数即右移增大,直到最小值,dL/dw=0。
a为学习率,计算步长。
绘制老师例题代码。
#引入库
from faulthandler import cancel_dump_traceback_later
from typing import ChainMap
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy.matlib
import numpy as np
import matplotlib.pyplot as plt
w=1.0
x=[1.0,2.0,3.0]
y=[2.0,4.0,6.0]
#预测值
def forward(x):
return x*w
#损失函数
def cost(xs,ys):
cost=0
for x,y in zip(xs,ys):
y_pred =forward(x)
cost+=(y_pred-y)**2
return cost/len(xs)
#更新w
def gradient(xs,ys):
grad=0
for x,y in zip(xs,ys):
grad+=2*x*(x*w-y)
return grad/len(xs)
Epoch=[]
cost_ok=[]
print("predict(before traioning)",4,forward(4))
for epoch in range(100):
cost_try=cost(x,y)
grad_try=gradient(x,y)
w-=0.01*grad_try
Epoch.append(epoch)
cost_ok.append(cost_try)
print("EPOCH:",epoch,"w=",w,"loss=",cost_try)
print("Predict(after training):",4,forward(4))
#制图
plt.plot(Epoch,cost_ok)
plt.xlabel("Epoch")
plt.ylabel("cost")
plt.show()
利用加权均值平滑曲线 ,如果发散可以尝试减小啊(学习率)
利用随机梯度下降提高性能。
利用分组在性能和时间复杂度之间寻找平衡。