查看全课大纲(第 20 / 82 节)
  1. 1.函数与数据泛化
  2. 2.向量:从几何直觉到高维空间
  3. 3.矩阵与张量
  4. 4.特征值与特征向量:矩阵变换的不动方向
  5. 5.凸函数:从向量求导的矩阵记号到好优化的函数形状
  6. 6.概率与统计:机器学习的数学基础
  7. 7.独立性与随机变量:贝叶斯公式与二项分布
  8. 8.期望、方差与协方差:随机变量的数字画像
  9. 9.联合概率:当一条轴不够用的时候
  10. 10.概率分布(一):从伯努利到伽马函数
  11. 11.概率分布(二):贝塔、泊松、正态与两个贝叶斯故事
  12. 12.机器学习的模型:找输入与输出的关系
  13. 13.机器学习的应用
  14. 14.过拟合
  15. 15.机器学习的分类
  16. 16.有监督学习:从房价预测说起
  17. 17.损失函数
  18. 18.梯度下降(上):更新规则与学习速率
  19. 19.梯度下降(2)
  20. 20.牛顿方法
  21. 21.KNN简介
  22. 22.距离测算
  23. 23.朴素贝叶斯
  24. 24.朴素贝叶斯的实际应用
  25. 25.信息熵:决策树构建的度量基础
  26. 26.信息增益与决策树的构建
  27. 27.ID3算法
  28. 28.决策树节点的划分
  29. 29.CART树
  30. 30.Bagging
  31. 31.Boosting:自适应提升算法
  32. 32.Gradient Boosting
  33. 33.线性模型:回归与分类的同一副骨架
  34. 34.最小二乘:把最优参数直接解出来
  35. 35.最小二乘法的几何与概率视角
  36. 36.极大似然:给最小二乘一个概率出身
  37. 37.逻辑回归(1):把线性模型接到分类上
  38. 38.逻辑回归(2):损失函数与多分类
  39. 39.---- 手造数据: 5 个样本, 2 个特征; x2 几乎 = 2*x1 (偏差手工指定, 无随机) ----
  40. 40.讲师例: 向量 "23014" -- 三把范数尺子量同一个向量
  41. 41.优化方法(1):坐标下降与前向选择
  42. 42.优化方法(2):前向策略与最小角回归
  43. 43.拉格朗日乘子法(1):从无约束到等式约束
  44. 44.拉格朗日乘子法(2):等式约束下的平行条件与拉格朗日函数
  45. 45.拉格朗日乘子法(3):不等式约束与 KKT 条件
  46. 46.最大间隔:把分类问题变成优化问题
  47. 47.拉格朗日对偶问题:把 w 和 b 全部换成 α
  48. 48.支持向量:边界上的少数派
  49. 49.SVM 计算过程:一笔到底算完,再走进核方法
  50. 50.贝叶斯公式:概率即信念
  51. 51.隐含变量和概率模型:给看不见的原因建模
  52. 52.EM 算法:期望与最大化的迭代
  53. 53.琴生不等式:EM 的数学钥匙
  54. 54.三个硬币问题:EM 的复盘与衔接
  55. 55.高斯混合模型:用隐变量解释双峰数据
  56. 56.隐马尔可夫模型
  57. 57.隐马尔可夫模型(2):前向算法与动态混合模型
  58. 58.隐马尔可夫模型在 NLP 中的运用
  59. 59.EM 算法:把「为什么收敛」推到底
  60. 60.HMM 在 NLP 中的运用:从分词到机器翻译
  61. 61.HMM 参数估计:Baum-Welch 的三块拉格朗日
  62. 62.高维下的高斯模型
  63. 63.主题模型:从词袋到隐含主题
  64. 64.Dirichlet 分布(1)
  65. 65.Dirichlet 分布(2)
  66. 66.统计学习内容回顾
  67. 67.K-means 算法
  68. 68.PCA 降维
  69. 69.SVD 降维
  70. 70.从聚类到流形
  71. 71.局部线性嵌入
  72. 72.随机邻域嵌入:SNE 与 t-SNE
  73. 73.无参模型:让数据自己说话
  74. 74.高斯过程:函数空间里的正态分布
  75. 75.高斯过程(2):噪声、正则化与核的线性组合
  76. 76.神经网络简介:从感知器到自编码器
  77. 77.反向传播:把误差一层层传回去
  78. 78.卷积神经网络(CNN):让特征自己学出来
  79. 79.循环神经网络(RNN):给网络装上记忆
  80. 80.深度学习回顾:静态一类,动态一类
  81. 81.增强学习(1):蒙特卡洛、树搜索与 Q-learning
  82. 82.强化学习(2):从乌鸦吃核桃到井字棋的 value 回传

牛顿方法

约 10 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · 机器学习算法精讲

上一节结尾埋了个彩蛋:类似梯度下降这种迭代方法,牛顿时代就有了——想法早就躺在那里,是计算把它唤醒的。本节就请出这位三百多年前的”正主”。讲师开篇就给牛顿方法定了位:它跟我们一路在讲的梯度下降非常类似,是又一个要掌握的数学方法。但它最初要解决的不是优化,而是一个更古老的问题——求方程的根:给定一个函数 f(x)f(x),当 f(x)=0f(x)=0 时,xx 该等于多少?

💡 核心导读

  • 没有公式怎么办:中学时代的 ax+bax+b、ax2+bx+cax^2+bx+c 都有现成解法;函数一旦复杂(对数套正弦、再平方、再除个 exe^x 这类形式),公式就没了——牛顿方法就是为此而生。
  • 切线切切切:从一个随机给定的初始点出发,不断作切线、找交点,一步步逼近方程的根;迭代公式从一个小三角形里推出来。
  • 亲手跑一遍:用代码看清 x0→x1→x2→⋯→x∗x_0 \to x_1 \to x_2 \to \cdots \to x^* 的逼近过程,体会”越切越准”的加速。
  • 从方程到代价函数:方程复杂了会有多个解——这正像代价函数定义不好时出现的局部最优(local minimum);讲师给出四条应对思路,外加线性回归的”定心丸”。
  • 收个大尾:为什么”优化”在机器学习里如此重要——假设函数与真实标签之间的差距,就是一切迭代方法要压小的那个量。

牛顿的问题:没有求根公式的方程怎么办

整个中学时代,我们其实一直在做一件事:解方程。形如 ax+b=0ax+b=0 的一次方程、ax2+bx+c=0ax^2+bx+c=0 的二次方程,都有固定的求解公式,套进去就能出答案。

牛顿思考的是更一般的问题:如果 f(x)f(x) 是个特别复杂的函数呢? 讲师举的例子——对数套着正弦、再平方、再比上一个 exe^x 这类形式。以前有固定求解公式的时候好办,没有公式的时候,该怎么求?

牛顿发明的方法,思想其实非常简单:一步到不了根,那就迭代逼近。在”从一个初始点出发、不断修正”这件事上,它跟梯度下降是同一族人——区别只在修正的依据:梯度下降看梯度,牛顿看切线。

切线切切切:迭代公式的几何推导

把场景画在脑子里:横轴是 xx,纵轴是 f(x)f(x),曲线就是函数本身。我们在横轴上随机给定一个初始点 x0x_0:

  1. 在 x0x_0 的上方,曲线走到的高度是 f(x0)f(x_0);
  2. 在点 (x0,f(x0))(x_0, f(x_0)) 处作曲线的切线,让切线一直伸下去与横轴相交,交点记作 x1x_1——x1x_1 就是 x0x_0 的一个更新状态;
  3. 换到 x1x_1:求出 f(x1)f(x_1),再在 (x1,f(x1))(x_1, f(x_1)) 处作切线,与横轴交于 x2x_2;
  4. 如此切切切,切线一段接一段,交点会越来越贴近曲线与横轴真正的交点——那个点记作 x∗x^*(讲师在板书上给它打了个叉),它就是方程的解。

公式从哪来?盯着第一步里那个直角三角形看。切线的斜率是 f′(x0)f'(x_0),而斜率等于”竖着的长度”比上”底下横着的长度”:

f′(x0)=f(x0)x0−x1f'(x_0) = \frac{f(x_0)}{x_0 - x_1}

竖着的正是函数值 f(x0)f(x_0);底下横着的是 xx 的变化量 Δx\Delta x,从图上看就是 x0−x1x_0 - x_1。把两项调换个位置:

x0−x1=f(x0)f′(x0)⟹x1=x0−f(x0)f′(x0)x_0 - x_1 = \frac{f(x_0)}{f'(x_0)} \qquad\Longrightarrow\qquad x_1 = x_0 - \frac{f(x_0)}{f'(x_0)}

有了 x0x_0 求 x1x_1 是这么来的;x2x_2 与 x1x_1 的关系一模一样,只是把下标都加一。写成一般形式,就是牛顿方法的迭代公式:

xt+1=xt−f(xt)f′(xt)x_{t+1} = x_t - \frac{f(x_t)}{f'(x_t)}

从最开始随机给定的 x0x_0 出发,不断套用这个公式迭代下去,就找到了方程的解。讲师的总结很有气势:从牛顿那时候开始,对任何一个复杂方程,我们都能求它的解了。(小注:公式分母是 f′(xt)f'(x_t),所以函数要可导,且迭代别正好踩在切线水平的点上——否则切线与横轴没有交点,更新无从谈起。)

讲师在视频结尾还补了一句:本节的所有推导他前一晚已经全部写好、放在发给大家的资料里了——对应到讲义,就是上面这个三角形,值得合上讲义亲手画一遍。

亲手跑一遍:切线如何步步逼近

挑一个够格的对手:f(x)=x3−2x−5f(x) = x^3 - 2x - 5。中学的求根公式只管到二次,三次往上就没有”套公式”的福气了——正好是牛顿方法的目标客户。从 x0=3x_0 = 3 出发:

# 演示:牛顿法求根——f(x) = x^3 - 2x - 5(三次方程,没有中学式的求根公式)
def f(x):
    return x**3 - 2*x - 5

def df(x):
    return 3*x**2 - 2           # 切线的斜率 f'(x)

x = 3.0                         # 随机给定的初始点 x0
print(f"x0 = {x:.6f}    f(x0) = {f(x):+.6f}")
for t in range(1, 6):
    x = x - f(x) / df(x)        # 切线与横轴的交点,成为新的估计
    print(f"x{t} = {x:.6f}    f(x{t}) = {f(x):+.6f}")
x0 = 3.000000    f(x0) = +16.000000
x1 = 2.360000    f(x1) = +3.424256
x2 = 2.127197    f(x2) = +0.371100
x3 = 2.095136    f(x3) = +0.006527
x4 = 2.094552    f(x4) = +0.000002
x5 = 2.094551    f(x5) = +0.000000

读这张表有两层味道:

  • 方向:每一行都是”算函数值 → 作切线 → 找交点”,xx 一步步挪向真根 ≈2.094551\approx 2.094551,函数值从 16 一路缩到机器零。
  • 速度:收敛是加速的——残差 16 → 3.4 → 0.37 → 0.0065 → 0.000002,越到后面一步跨得越大。直观原因是:越靠近根,切线与曲线贴得越紧,交点猜得越准。(数值分析里管这个现象叫二次收敛——下一步的误差大约是这一步误差的平方,延伸阅读,讲师课堂上未展开。)

从方程到代价函数:极值点也是一个”根”

那这门课为什么在梯度下降之后紧跟着讲牛顿?因为机器学习的核心任务——最小化代价函数 J(θ)J(\theta)——换一个角度看,也是个求根问题:函数取极小值的必要条件,是导数为零。也就是说,我们要找的极值点,恰好是方程 J′(θ)=0J'(\theta) = 0 的根。

把牛顿迭代直接用在 J′J' 上,就得到优化版的牛顿方法(一维情形):

θt+1=θt−J′(θt)J′′(θt)\theta_{t+1} = \theta_t - \frac{J'(\theta_t)}{J''(\theta_t)}

多维时,分母从二阶导数升级为 Hessian 矩阵——第 1 章见过的那个二阶偏导数矩阵。优化版牛顿法与梯度下降同族,区别在于:梯度下降只用一阶信息,知道”下山最陡的方向”;牛顿法多用了二阶信息,还知道”山弯得多厉害”,对落点的预估更准、往往收敛更快——代价是二阶导数的计算开销也更大。这一步延伸本课视频没有展开,第 8 章训练逻辑回归时我们仍以梯度下降为主线;先把求根这一步吃透,延伸就是水到渠成的事。

世界比公式复杂:多解、局部最优与四条对策

讲到这里,讲师泼了盆冷水:世界远比这个复杂。 方程特别复杂的时候,可能会出现两个解——或者更多。

这里藏着一个漂亮的类比(讲师亲口点破):方程的多个解,就像代价函数定义得不好时出现的局部最优(local minimum)——优化算法停在一个”附近最好”、却不是”全局最好”的坑里,心满意足地以为到站了。

真遇到了局部最优怎么办?讲师给了四条思路:

  1. 从源头抓起:构造 cost function 的时候,尽量让它不要有局部最优的形式——把问题本身设计好,是第一位的。
  2. 多采样、换起点:不断地采样,给定不同的随机初始值多跑几轮,总能撞上最好的那个最优点。
  3. 自适应步长:不断调整 α\alpha;特别复杂的情况下会用 adaptive 的 α\alpha(让步长跟着情形自适应调节),尽量跳出局部最优。
  4. 随机变异:像遗传算法这一类优化方式,让点发生随机”变异”,从局部最优点跳到别的地方去。

讲师随即收口:这些不是我们目前讲的重点,知道有这几条路就行。

最后给定心丸:我们目前构造的 linear regression 这种简单形式,是比较严格的凸函数——凸函数不存在局部最优,所以梯度下降总会找到比较好的结果。但生活不会像我们想象的这么简单:关键看你在构造 cost function(损失函数)的时候怎么构造——不同的构造,才分出了不同的复杂优化问题。这也是为什么后来很多人讲机器学习时,都把”优化”摆在如此重要的位置。

为什么”优化”在机器学习里如此重要

把镜头拉远看一遍全图。建一个深度神经网络时,整个网络里都是参数——很多不同的权重。我们最后想优化的,就是让网络的输出与已知训练数据之间的差别越来越小。这个差别有时是 square error(平方误差、残差式的——前面一直在用的那种),有时直接用 Softmax 一类的形式——量的是两个输出概率之间的距离(分类问题的常用损失,第 8 章逻辑回归正式登场)。

所谓误差,就是你从大脑里构想出来的 hypothesis——也就是 hθ(x)h_\theta(x)——与真实给定的对应值之间的差别。yy 是真实世界给定的标签;hθh_\theta 是我们构造出来的、对输入输出关系的猜想。猜想对不对,就要看它们之间的误差是否最小。数据一共有 i=1i = 1 到 NN 条:有时构造平方项,有时直接构造绝对值,有时看 xx 和 yy 之间的其他关系——形式不限,目标只有一个:让构造出来的假设函数,跟真实的有标签数据越接近越好。

所以讲师的收尾既是本节的、也是整条主线的:梯度下降也好,以后我们学的其他优化方法也好,总之都是 follow 类似的思想——构造一个好的损失函数,然后不断地 minimize 它。

📝 动手练一练

  1. 推导与条件:合上讲义,从那个直角三角形出发,推出牛顿迭代公式 xt+1=xt−f(xt)/f′(xt)x_{t+1} = x_t - f(x_t)/f'(x_t),并回答:① 斜率那一步,“竖着的长度”和”底下横着的长度”分别是什么?② 牛顿法对函数有什么基本要求?迭代在什么情况下会卡住?
👉 点击查看参考答案

① 竖着的是函数值 f(xt)f(x_t),底下横着的是 xx 的变化量 Δx=xt−xt+1\Delta x = x_t - x_{t+1};由斜率 f′(xt)=f(xt)/(xt−xt+1)f'(x_t) = f(x_t)/(x_t - x_{t+1}) 移项即得迭代公式。

② 函数要可导,且迭代过程中 f′(xt)≠0f'(x_t) \neq 0——分母为零意味着切线水平、与横轴没有交点,更新无从谈起;初始点选得太远时,迭代也可能来回震荡迟迟不收敛。这也是”多给几个随机初始值试试”的又一个理由。

  1. 求平方根:用牛顿法解方程 x2−2=0x^2 - 2 = 0(根为 2\sqrt{2}),从 x0=1x_0 = 1 出发。先手算前两步,再跑代码看完整轨迹,观察误差的变化规律。
👉 点击查看参考答案

手算:x1=1−12−22×1=1+12=1.5x_1 = 1 - \frac{1^2-2}{2\times 1} = 1 + \frac{1}{2} = 1.5;x2=1.5−1.52−22×1.5=1.5−0.253=1712≈1.4167x_2 = 1.5 - \frac{1.5^2-2}{2\times 1.5} = 1.5 - \frac{0.25}{3} = \frac{17}{12} \approx 1.4167。代码验证:

# 练习参考:牛顿法解 x² - 2 = 0,逼近 √2
def f(x):
    return x**2 - 2

def df(x):
    return 2*x

x = 1.0
for t in range(1, 5):
    x = x - f(x) / df(x)
    print(f"x{t} = {x:.8f}    误差 = {abs(x - 2**0.5):.2e}")
x1 = 1.50000000    误差 = 8.58e-02
x2 = 1.41666667    误差 = 2.45e-03
x3 = 1.41421569    误差 = 2.12e-06
x4 = 1.41421356    误差 = 1.59e-12

误差的规律一目了然:8.58×10−2→2.45×10−3→2.12×10−6→1.59×10−128.58\times 10^{-2} \to 2.45\times 10^{-3} \to 2.12\times 10^{-6} \to 1.59\times 10^{-12}——每一步的误差几乎是上一步的平方。四步之内从一位小数的粗猜打到浮点精度,这就是二次收敛的威力,对应正文那句”越靠近根、切线贴得越紧”。顺带一提:计算器和数学库开平方,用的往往正是这一族迭代。

本章小结

本节请出了牛顿方法:从”没有求根公式的复杂方程怎么办”出发,用切线与横轴的交点一步步逼近根,迭代公式 xt+1=xt−f(xt)/f′(xt)x_{t+1} = x_t - f(x_t)/f'(x_t) 由一个小三角形直接推出;代码实跑看到五步内 ff 值从 16 压到机器零、误差每步平方的加速逼近。把求根对象换成导函数,它就变成优化版的牛顿方法(分母升级为 Hessian)——与梯度下降同族、收敛常更快、二阶开销也更大。随后讲师把话锋引向现实:方程复杂会多解,代价函数构造不好会有局部最优——四条对策(设计好损失函数、多采样换起点、自适应 α\alpha、随机变异)是应对地图,线性回归的严格凸性是当前的定心丸。最后收拢到主线:无论梯度下降还是牛顿法,压小的都是同一个量——构想的假设 hθ(x)h_\theta(x) 与真实标签 yy 之间的误差。

📋 行动清单

学完本节,你可以立即:

  • 合上讲义推一遍:从直角三角形出发推出 xt+1=xt−f(xt)/f′(xt)x_{t+1} = x_t - f(x_t)/f'(x_t),讲给自己听懂”切线切切切”。
  • 换个函数再跑一遍:把演示代码换成 f(x)=ex−3f(x) = e^x - 3(导数还是 exe^x,根为 ln⁡3≈1.0986\ln 3 \approx 1.0986),观察迭代轨迹是否同样加速。
  • 复述四条对策:向同事解释局部最优是什么、为什么线性回归暂时不用担心它。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第4章课件:机器学习的数学基础 III
    下载
  • 第4章笔记:梯度下降
    下载