梯度下降算法以及随机梯度下降算法
1.梯度下降算法:
梯度下降算法是一种常用的最优化算法,它的目的是找到一个函数的最小值点,或者说是使得函数值尽可能地小。梯度下降算法的基本思想是,从一个初始点开始,沿着函数的负梯度方向(即函数下降最快的方向)不断地更新点的位置,直到达到一个局部最小值或者满足一定的停止条件。
梯度是一个向量,它表示了函数在某一点处的方向导数最大的方向,也就是函数上升最快的方向。负梯度则表示了函数下降最快的方向。梯度的大小反映了函数变化的速率,梯度越大,说明函数变化越快,梯度越小,说明函数变化越缓慢。
2.梯度下降算法的优点:
- 梯度下降算法相比于大规模数值矩阵的求解,效率更高,因为它只需要计算函数的梯度,而不需要计算函数的二阶导数或者逆矩阵等复杂的运算。
- 梯度下降算法可以适用于多种类型的函数,不仅仅是凸函数,也可以是非凸函数。对于某些最小二乘法无法计算全局唯一最优解的情况,梯度下降算法仍然能够有效地进行最小值点或者解空间的寻找。
- 梯度下降算法可以结合不同的优化器、学习率、损失函数、正则化等技巧来提高性能和稳定性,例如随机梯度下降、小批量梯度下降、Momentum、Nesterov Momentum、AdaGrad、RMSprop、Adam等。
- 梯度下降算法在大规模数据集和复杂模型下表现良好,可以处理高维度和非线性的问题,是深度学习中最常用的优化方法之一。
公式:
权重-=学习率*loss函数的导数
比如下面那道例子 y = x*w
loss: (x*w - y)的平方 再求平均数
对它求导等于 2*x*(x*w - y)求平均数
4.梯度下降算法的例子
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
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)
def loss(xs ,ys): # 随机梯度算法的loss
y_pred = forward(xs)
return (ys-y_pred)**2
def gradient(xs, ys):
grad = 0
for x, y in zip(xs, ys):
grad += 2*x*(x*w-y)
return grad / len(xs)
def gradient1(x, y):#随机梯度算法的gradien1
return 2*x*(x*w - y)
loss_list =[]
w_list = []
ep_list = []
print('Predict (before training)', 4, forward(4))
for epoch in range(100):
cost_val = cost(x_data, y_data)
grad_val = gradient(x_data, y_data)
w -= 0.01 * grad_val
w_list.append(w)
loss_list.append(cost_val)
ep_list.append(epoch)
print('Epoch:', epoch, 'w = ', w, 'loss = ', cost_val)
print('Predict (after training', 4, forward(4))
plt.plot(ep_list, loss_list)
plt.show()
5.随机梯度下降算法
您好,这是 Bing。我可以帮您了解随机梯度下降算法的概念和特点。😊
优点
- 随机梯度下降算法可以适应动态变化的数据,因为它每次只使用一部分数据来更新参数,而不需要遍历所有数据。
- 随机梯度下降算法可以跳出局部最优解,因为它每次使用的梯度是近似的,有一定的随机性,有可能在某些方向上有更大的下降空间。
- 随机梯度下降算法可以处理高维度和非线性的问题,因为它不需要计算目标函数的二阶导数或者逆矩阵等复杂的运算。
缺点:
- 随机梯度下降算法可能会收敛到次优解,因为它每次使用的梯度并不是准确的,有可能偏离了全局最优解的方向。
- 随机梯度下降算法可能会震荡不稳定,因为它每次使用的梯度有一定的随机性,有可能在某些方向上有过大或过小的更新幅度。
- 随机梯度下降算法需要合适地选择学习率和批量大小等超参数,因为它们会影响收敛速度和稳定性。
例子跟上面一样的例题
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
def loss(xs, ys):
y_pred = forward(xs)
return (ys-y_pred)*(ys-y_pred)
def gradient(x, y):
return 2*x*(x*w - y)
loss_list = []
ep_list = []
for epoch in range(200):
for x, y in zip(x_data, y_data):
grad = gradient(x, y)
w = w - 0.001 * grad
l = loss(x, y)
loss_list.append(l)
print("\tgrad: ", x, y, grad,l)
print("progress:", epoch, "w = ", w)
ep_list.append(epoch)
print('Predict (after training', 4, forward(4))