回顾:
线性回归回顾
上面的是一个w(权重),可以直接进行搜索,比较简单,但是如果是多个变量,在使用这种方法查找就很费时,并且有时候还计算不出来。
还有一个问题就是,如果是很多权重,就会是多维的,并且还会有局部最小值的问题。
因此就有本节的梯度下降法出现
虽然不能得到最优解,但是可以得到局部最小值
可能会出现局部最小值的情况(非凸函数)局部最优
因此,梯度下降只能找到局部最优,并不一定是局部最小值(全局最优点)。
有一种特殊情况,叫做鞍点
由于g在某一段是0,那么就没有办法进行迭代了。
随机梯度下降法
代码复现,其中有一步是为了接收训练后的参数
#定义两个空列表,用于接收计算的epoch和cost(也就是所谓的损失)用于绘制可视化图像
epoch1 = []
cost1 = []
print(‘Predict (after training’,4,forward(4))
plt.plot(epoch1, cost1, c=‘g’)
plt.show()
import numpy as np
import matplotlib.pyplot as plt
# 准备数据
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]
# 设置一个初始的权重
w = 1.0
# 定一个前向传播
def forward(x):
return x*w
# MSE的目标函数
def cost(xs,ys):
cost = 0
for x,y in zip(xs,ys):
y_pred = forward(x)
cost += (y_pred - y)**2
# print("cost",cost)
return cost / len(xs)
# 梯度下降
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(也就是所谓的损失)用于绘制可视化图像
epoch1 = []
cost1 = []
print('Predict (before training',4,forward(4))
for epoch in range(200):
cost_val = cost(x_data,y_data)
grad_val = gradient(x_data,y_data)
w -= 0.01 * grad_val
epoch1.append(epoch)
cost1.append(cost_val)
print("Epoch:",epoch,'w=',w,"loss=",cost_val)
print('Predict (after training',4,forward(4))
plt.plot(epoch1, cost1, c='g')
plt.show()
使用随机梯度下降法,可以克服鞍点的问题,即使陷入到鞍点,由于随机噪声的存在,就有可能跨越这个鞍点。
性能和时间复杂度取一个折中
使用batch进行,每次使用一组进行。
小批量的