惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
SegmentFault 最新的问题
爱范儿
爱范儿
博客园 - 三生石上(FineUI控件)
Microsoft Security Blog
Microsoft Security Blog
Google DeepMind News
Google DeepMind News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
GbyAI
GbyAI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
V2EX
酷 壳 – CoolShell
酷 壳 – CoolShell
量子位
博客园_首页
T
Tailwind CSS Blog
aimingoo的专栏
aimingoo的专栏
A
About on SuperTechFans
T
The Blog of Author Tim Ferriss
Stack Overflow Blog
Stack Overflow Blog
Recent Announcements
Recent Announcements
P
Proofpoint News Feed
博客园 - 司徒正美
有赞技术团队
有赞技术团队
Engineering at Meta
Engineering at Meta
Last Week in AI
Last Week in AI
MongoDB | Blog
MongoDB | Blog

少数派

派早报:Google 发布 Fitbit Air 等 - 少数派 「新人报到」確認需求,再開始 - 少数派 从 SOLO 独立开发者社区,我看到了越来越多开发者开始做自己的产品 - 少数派 我怎么管理那些"不常做,但总会忘"的生活事项 - 少数派 人形机器人量产元年,数据才是具身智能的“生死线” - 少数派 BuhoLaunchpad 高度还原 Mac 启动台:开发历程与思考 - 少数派 五年陪伴依然不舍,DIY 换壳后让罗技 MX Master 3 继续服役 - 少数派 新玩意 240|少数派的编辑们最近买了啥? - 少数派 一日一技|为什么你应该关闭 iOS 的键盘声音 - 少数派 我做了个插件和 Skills,一键提取任何网站的设计规范 Design.md - 少数派 住在三四线城市的你,该开始录播客了 - 少数派 甘南秘境,大白高国 - 少数派 AI的审美:谁让把我变成川内倫子 - 少数派 返工怎能不烦恼,打工人片单总有一部是你的「嘴替」 - 少数派 为了让「上厕所」更健康,我做了一个小工具 - 少数派 AI + Skill,能够让生成的文章去除 AI 味吗? - 少数派 新玩意|韶音OpenDots ONE 耳夹式耳机 - 少数派 《美满》| 在每一个春天的晚上相爱(362) - 少数派 新玩意|优篮子 PS01 MagSnap 磁吸支架 - 少数派 自我整合手记 | 我开始早睡了:用稳定规则,为自由托底 - 少数派 用龙虾(OpenClaw)两个多月,我最深的12个体会 - 少数派 听歌时间到,12 张你可能错过的 2025 华语乐坛好专辑 - 少数派 承诺能追吗 - 少数派 macOS 26启动台没了? 我做了个不一样的App启动器 - Keboard - 少数派 《四海为家的人》| INTJ对话INTJ(361) - 少数派 你发过的那些黑历史,是时候一次清干净了 - 少数派 新玩意:安安静静玩,越玩越专注:计客密码机 - 少数派 iPad 用户首次体验 Android 平板:vivo Pad6 Pro - 少数派 数据逻辑强 - 少数派 极北行+ | 一路向北,探访日本至北之地 | 001 - 少数派
认识论的数学表示——梯度下降算法 - 少数派
2026-01-30 · via 少数派

这是一篇一位学习者学习梯度下降算法时的一点思考与想法,记录了在此阶段的初步理解和认识。依照马克思主义认识论的观点,认识是一个从感性认识到理性认识不断上升,不断发展的过程。因此,我深知我对梯度下降算法的理解尚处于初级阶段,受限于知识背景和实践水平,文中可能或多或少出现理解上的不准确和局限性。

算法从根本上说,还是一个”工具“,工具无论如何”高大上“,都是为了”目的“服务的。那么,梯度下降的算法要解决的是一个什么问题呢?

在现实生活中,我们知道,它被用于训练机器学习模型。但是这对我们来说有些复杂,我们先来看一个简单的数学问题:二元线性回归。

数学是对现实世界的抽象,用抽象的符号和公式,反应现实世界的某种规律,但是在从现实事物到符号的抽象过程中,不可避免的出现”失真“的情况,换句话说,数学讨论的是一种理想情况。

文章结构

文章脉络:
├── 问题概述 (二元线性回归、数学抽象与失真、待处理数据)
├── 梯度下降算法核心思想 (损失函数、下山比喻、偏导数与步长、参数迭代更新)
├── 梯度下降算法的四个要素 (初始值、计算梯度、迭代更新参数、停止条件)
├── 回到问题 - 实践篇
│   ├── 初始化参数 (w, lr, num_iterations)
│   └── 梯度下降核心步骤 (数学公式推导与Python代码实现)
│       ├── 计算预测值
│       ├── 计算损失
│       ├── 计算梯度 (w0, w1, w2)
│       └── 更新参数 (w0, w1, w2)
└── 结语

问题概述:二元线性回归

首先什么是”线性回归“?线性回归是一个预测模型,也就是说,它会根据已有的信息总结出一个规律——用数学的语言表达就是:拟合出一条曲线——然后利用这个规律对未来的事情进行预测。所谓”二元“,就是变量有两个,有两个事情会对最终的结果产生影响。现在用数学公式对这个事情进行表达:
 


其中 w0-2 叫做参数,是训练过程中由算法调整的,也就是输入到底经历了什么样的运算才到输出,我们究竟根据已有的经验建构了什么样的规律。

我们已有的数据如下:

$x_{1}$$x_{2}$$y$
10360
20385
253100
282.5120
302140
352.5145
402.5163

我们就是要从这堆数据中找到一个规律,一个从x到y的规律,以便于当我们遇到新的x时,可以预测出一个尽可能接近真实y的y帽。

梯度下降算法

那么怎么找到这个规律呢?(怎么拟合这个曲线呢?)
利用这个规律得出的结果尽可能贴近现实情况就是一个”好“的规律,也就是 y帽 与 y 之间的差值越小,就越好。描述这个差值的东西数学上叫做:损失函数,公式如下
 


这个例子中,需要调整的参数有三个,可能不太好理解,我们先考虑只有两个参数的损失函数,理解其精髓,然后类比理解三个参数。

假如说你现在在一座浓雾弥漫的山上,想要尽快下山,奈何看不清远处的路,如何选择最快的下山路径呢?梯度下降的算法就是在当前位置选择最陡峭的一个方向走一步,然后再看哪个方向陡峭,再走一步,直到走到山底。

在随机给定一组参数的情况下(w0,w1),判断哪个方向最陡峭使用的数学工具是偏导(w1,w2),步长则使用导数值的负数乘一个小于1的数——这个小于1的数被称为学习率lr。


 


经过不断地迭代,就可以下山了,也就是找到$Loss$最小的参数(w0,w1)。

以上是两个参数的梯度下降,三个参数,多个参数的也是同理。

梯度下降算法的四个要素

这四个要素是在具体使用这个算法进行计算时,必须要注意的事情:

初始值

每一个参数,都要随机化一个初始值。

计算梯度

梯度就是前文所提到的偏导值,需要计算梯度才能为接下来的迭代更新参数做准备。

迭代更新参数

利用梯度值和学习率的乘积更新参数,不断减小Loss值。

停止条件

可以预先设定一个迭代次数,也可以设置若连续更新参数Loss值不改变为停止条件。

回到问题

对梯度下降算法有了一个整体的感性认识后,便可以动手实践检验我们的理论了,回到我们的问题,我们要利用这些数据拟合出来一条曲线,便于遇到新的输入值x时可以预测出来近似的y值。用生活化的语言表达就是:我们要根据已有的经验归纳总结出来一条规律,一个知识,便于我们遇到新情况的时候可以灵活应对,游刃有余。

$x_{1}$$x_{2}$$y$
10360
20385
253100
282.5120
302140
352.5145
402.5163

初始化参数

根据前文的分析,在进行拟合之前,我们要对参数进行初始化,并设定一个学习率和迭代的次数。

# Feature 数据
X = [[10, 3], [20, 3], [25, 3], [28, 2.5], [30, 2], [35, 2.5], [40, 2.5]]
y = [60, 85, 100, 120, 140, 145, 163]  # Label 数据
# 初始化参数
w = [0.0, 0.0, 0.0]  # w0, w1, w2
lr = 0.0001  # 学习率
num_iterations = 10000  # 迭代次数

梯度下降核心步骤

整体上,这是一个不断迭代的过程,用编程的语言表达就是:这是一个循环。

为了实时看到机器学习这个规律的过程,每次迭代我们都计算一下预测值,并利用预测值和实际值计算出来Loss值。

也就是说,这个循环分为四个步骤,先用数学形式表达一下

计算预测值
 

计算Loss值
 

计算梯度
 

更新参数
 

然后把数学语言转化成python语言就行了:

# 梯度下降
for i in range(num_iterations):
    # 计算预测值
    y_pred = [w[0] + w[1] * x[0] + w[2] * x[1] for x in X]
    # 计算损失
    loss = sum((y_pred[j] - y[j]) ** 2 for j in range(len(y))) / len(y)
    # 计算梯度
    grad_w0 = sum(y_pred[j] - y[j] for j in range(len(y))) * 2 / len(y)
    grad_w1 = sum((y_pred[j] - y[j]) * X[j][0] for j in range(len(y))) * 2 / len(y)
    grad_w2 = sum((y_pred[j] - y[j]) * X[j][1] for j in range(len(y))) * 2 / len(y)
    # 更新参数
    w[0] -= lr * grad_w0
    w[1] -= lr * grad_w1
    w[2] -= lr * grad_w2
    # 输出结果
    if i % 1000 == 0:
        print(f'Iteration {i}: Loss = {loss}, w = {w}')
# 输出最终参数
print(f'final parameters: w = {w}')

完整的代码如下:

# Feature 数据
X = [[10, 3], [20, 3], [25, 3], [28, 2.5], [30, 2], [35, 2.5], [40, 2.5]]
y = [60, 85, 100, 120, 140, 145, 163]  # Label 数据
# 初始化参数
w = [0.0, 0.0, 0.0]  # w0, w1, w2
lr = 0.0001  # 学习率
num_iterations = 10000  # 迭代次数
# 梯度下降
for i in range(num_iterations):
    # 计算预测值
    y_pred = [w[0] + w[1] * x[0] + w[2] * x[1] for x in X]
    # 计算损失
    loss = sum((y_pred[j] - y[j]) ** 2 for j in range(len(y))) / len(y)
    # 计算梯度
    grad_w0 = sum(y_pred[j] - y[j] for j in range(len(y))) * 2 / len(y)
    grad_w1 = sum((y_pred[j] - y[j]) * X[j][0] for j in range(len(y))) * 2 / len(y)
    grad_w2 = sum((y_pred[j] - y[j]) * X[j][1] for j in range(len(y))) * 2 / len(y)
    # 更新参数
    w[0] -= lr * grad_w0
    w[1] -= lr * grad_w1
    w[2] -= lr * grad_w2
    # 输出结果
    if i % 1000 == 0:
        print(f'Iteration {i}: Loss = {loss}, w = {w}')
# 输出最终参数
print(f'final parameters: w = {w}')

至此我们用过往经验归纳出来了一条规律,至于这条规律如何,实践是检验真理的唯一标准,我们还需要在不断地实践-认识-实践的循环中加深理解,不断调整,趋近真理。

参考:
[1] https://www.rethink.fun/