梯度下降(Gradient-Descent)
在机器学习的旅途中,不可避免需要与它打交道,那么该如何初步理解它的用途呢?
好的,想象你在一个山谷中,想要找到最低点(山谷的底部)。你现在在某个地方,但不确定如何到达最低点。这个过程就像是梯度下降。
寻找方向:你看看四周,发现周围的地势向下倾斜的方向是你应该走的方向。这个“倾斜”就对应于梯度。
一步一步前进:你每次只走一小步,朝着那个倾斜的方向前进。每走一步,你再次查看周围的地形,找到新的倾斜方向,并继续向前走。
直到达到最低点:你重复这个过程,直到不再有明显的倾斜方向,或者再走一步几乎没有下降,这时候你就到达了山谷的底部,也就是你的目标——最低点。
那么在机器学习中,损失函数就像地形,模型参数就是你的位置,而梯度就是指向最低点的方向。通过不断调整参数,梯度下降帮助我们找到最佳的模型设置。
这个过程就像在不断探索和调整,直到找到最优解。
再回到通用的概念中来:梯度下降是一种优化算法,用于最小化损失函数,从而提高模型的性能。
在机器学习中,它的主要用途是调整模型参数,使得预测值更接近实际值。通过计算损失函数相对于参数的梯度,梯度下降能指引我们朝着减少损失的方向更新参数,最终找到最佳的参数设置。简而言之,它帮助我们优化模型,使其在训练数据上表现更好。Gradient-Descent(全世界最通俗易懂的梯度下降法详解-优化函数大法)
损失函数(loss function)
ok,现在在简单讲解一下损失函数。同样,我们可以用一个生动的例子来理解:
想象你在打保龄球,目标是把球滚向瓶子,尽量击倒所有瓶子。损失函数就像是你每次投球后的“得分”。
得分计算:如果你把球准确地滚到瓶子前,得分很高;如果偏离目标,得分就低。得分的高低反映了你与理想结果的距离。
最小化损失:你的目标是尽量提高得分,降低失误。在机器学习中,损失函数就是计算你预测值与实际值之间的差距,越小越好。
优化过程:每次投球后,你会分析一下哪种姿势或力量最有效,以便下一次投得更好。这个调整过程就是优化模型参数,以减少损失。
因此,损失函数帮助我们评估模型的表现,指导我们进行调整,最终达到更好的预测效果。
简单的理解就是每一个样本经过模型后会得到一个预测值,然后得到的预测值和真实值的差值就成为损失(当然损失值越小证明模型越是成功),我们知道有许多不同种类的损失函数,这些函数本质上就是计算预测值和真实值的差距的一类型函数,然后经过库(如pytorch,tensorflow等)的封装形成了有具体名字的函数。
损失函数(lossfunction)的全面介绍(简单易懂版)
随机梯度下降
有了前面的一点基础知识,再来学习理解随机梯度下降便会容易些。
随机梯度下降(SGD)是一种改进的梯度下降方法。
放上一张李沐大大的图,介绍它的运作机制,引入名词:mini-batch,意味小批量
主要优点如下:
1.效率:每次只用一小部分数据(一个样本或小批量),比使用整个数据集更新参数要快得多。这在处理大规模数据集时尤为重要。
2.更快的收敛:由于随机性,SGD可以在损失函数的复杂面上“跳跃”,避免陷入局部最优,可能更快找到全局最优解。
3.更强的泛化能力:随机更新引入了噪声,有助于避免过拟合,使模型在新数据上表现更好。
而这些优点结合实际的例子就是,
假设你在拼图,你采取的拼图方法是每次只拿一小部分拼图块来试拼,而这样就会导致
更快:你不用等整个拼图完成,就能快速尝试和调整。
更灵活:偶尔拼错的块可能让你发现新的组合,帮助你找到更好的拼图方式。
更容易找到整体效果:通过随机选择不同的块,你能更好地应对整个拼图,而不是只依赖一种方式。
简单python代码实现
import numpy as np
import matplotlib.pyplot as plt
# 生成一些示例数据
np.random.seed(0)
X = 2 * np.random.rand(100, 1) # 100个随机点
y = 4 + 3 * X + np.random.randn(100, 1) # 线性关系加上一些噪声
# 初始化参数
theta = np.random.randn(2, 1) # 权重和偏置
learning_rate = 0.01
n_epochs = 50
m = len(X)
# 增加偏置项
X_b = np.c_[np.ones((m, 1)), X] # 在X的第一列加上偏置项1
# 随机梯度下降
for epoch in range(n_epochs):
for i in range(m):
random_index = np.random.randint(m) # 随机选择一个样本
Xi = X_b[random_index:random_index + 1] # 取出这个样本
yi = y[random_index:random_index + 1]
# 计算预测
gradient = 2 * Xi.T.dot(Xi.dot(theta) - yi) # 计算梯度
theta -= learning_rate * gradient # 更新参数
# 打印最终参数
print("Learned parameters:", theta)
# 可视化结果
plt.scatter(X, y, color='blue', label='Data')
plt.plot(X, X_b.dot(theta), color='red', label='Linear regression')
plt.xlabel('X')
plt.ylabel('y')
plt.legend()
plt.title('Linear Regression with SGD')
plt.show()