我们小蓝的神经元终于可以根据代价函数的斜率是否关学。
来决定w的调整行为了,当w距离最低点比较远的时候,其实我们希望它能快一点,而逐渐接近最低点的时候,我们希望它慢下来,这样就能既加快下降的速度,又能在最低点处稳如老狗
同时我们发现距离最低点越远的地方,这个斜率的绝对值越大,而越近的地方越小,当接近最低点的时候这个值几乎为0
而最低点斜率它就是0,是分界点,而斜率在左右的符号又正好不同
刚好可以利用斜率的值来做这件事情,让w每次直接减去这个点斜率的值
如此,当前w在右边的时候斜率是正数,w减去一个正数向小调整,w减去一个负数向大调整,同时也做到了距离最低点比较远的时候斜率大(绝对值),调整的多,大刀阔斧,比较近的时候斜率小(绝对值),调整的少,精雕细琢.
调整过程太震荡,无法收敛,考虑给斜率也乘上一个比较小的学习率α调和一下
mini-batch迷你批量梯度下降
ا每次选取全体样本中的一小批梯度下降
代码
import numpy as np
import dataset
from matplotlib import pyplot as plt
n=100
# 画豆豆散点图
xs, ys = dataset.get_beans(n)
plt.title("size-toxicity Fuction", fontsize=12)
plt.xlabel('bean size')
plt.ylabel("toxicity")
plt.scatter(xs, ys)
w=0.1
y_pre = w * xs
plt.plot(xs, y_pre)
plt.show()
for i in range(100):
x=xs[i]
y=ys[i]
k=2*(x**2)*w+(-2*x*y)
alpha=0.1
w=w-alpha*k
plt.clf()
plt.scatter(xs, ys)
y_pre = w * xs
#限制x,y坐标值
plt.xlim(0,1)
plt.ylim(0,1.2)
plt.plot(xs, y_pre)
plt.pause(0.01)
#重新绘制曲线
# xs, ys = dataset.get_beans(n)
# plt.title("size-toxicity Fuction", fontsize=12)
# plt.xlabel('bean size')
# plt.ylabel("toxicity")
# plt.scatter(xs, ys)
# y_pre = w * xs
# plt.plot(xs, y_pre)
# plt.show()
dataset
import numpy as np
def get_beans(counts):
xs = np.random.rand(counts)
xs = np.sort(xs)
ys = [1.2*x+np.random.rand()/10 for x in xs]
return xs,ys