查看全课大纲(第 20 / 82 节)
- 1.函数与数据泛化
- 2.向量:从几何直觉到高维空间
- 3.矩阵与张量
- 4.特征值与特征向量:矩阵变换的不动方向
- 5.凸函数:从向量求导的矩阵记号到好优化的函数形状
- 6.概率与统计:机器学习的数学基础
- 7.独立性与随机变量:贝叶斯公式与二项分布
- 8.期望、方差与协方差:随机变量的数字画像
- 9.联合概率:当一条轴不够用的时候
- 10.概率分布(一):从伯努利到伽马函数
- 11.概率分布(二):贝塔、泊松、正态与两个贝叶斯故事
- 12.机器学习的模型:找输入与输出的关系
- 13.机器学习的应用
- 14.过拟合
- 15.机器学习的分类
- 16.有监督学习:从房价预测说起
- 17.损失函数
- 18.梯度下降(上):更新规则与学习速率
- 19.梯度下降(2)
- 20.牛顿方法
- 21.KNN简介
- 22.距离测算
- 23.朴素贝叶斯
- 24.朴素贝叶斯的实际应用
- 25.信息熵:决策树构建的度量基础
- 26.信息增益与决策树的构建
- 27.ID3算法
- 28.决策树节点的划分
- 29.CART树
- 30.Bagging
- 31.Boosting:自适应提升算法
- 32.Gradient Boosting
- 33.线性模型:回归与分类的同一副骨架
- 34.最小二乘:把最优参数直接解出来
- 35.最小二乘法的几何与概率视角
- 36.极大似然:给最小二乘一个概率出身
- 37.逻辑回归(1):把线性模型接到分类上
- 38.逻辑回归(2):损失函数与多分类
- 39.---- 手造数据: 5 个样本, 2 个特征; x2 几乎 = 2*x1 (偏差手工指定, 无随机) ----
- 40.讲师例: 向量 "23014" -- 三把范数尺子量同一个向量
- 41.优化方法(1):坐标下降与前向选择
- 42.优化方法(2):前向策略与最小角回归
- 43.拉格朗日乘子法(1):从无约束到等式约束
- 44.拉格朗日乘子法(2):等式约束下的平行条件与拉格朗日函数
- 45.拉格朗日乘子法(3):不等式约束与 KKT 条件
- 46.最大间隔:把分类问题变成优化问题
- 47.拉格朗日对偶问题:把 w 和 b 全部换成 α
- 48.支持向量:边界上的少数派
- 49.SVM 计算过程:一笔到底算完,再走进核方法
- 50.贝叶斯公式:概率即信念
- 51.隐含变量和概率模型:给看不见的原因建模
- 52.EM 算法:期望与最大化的迭代
- 53.琴生不等式:EM 的数学钥匙
- 54.三个硬币问题:EM 的复盘与衔接
- 55.高斯混合模型:用隐变量解释双峰数据
- 56.隐马尔可夫模型
- 57.隐马尔可夫模型(2):前向算法与动态混合模型
- 58.隐马尔可夫模型在 NLP 中的运用
- 59.EM 算法:把「为什么收敛」推到底
- 60.HMM 在 NLP 中的运用:从分词到机器翻译
- 61.HMM 参数估计:Baum-Welch 的三块拉格朗日
- 62.高维下的高斯模型
- 63.主题模型:从词袋到隐含主题
- 64.Dirichlet 分布(1)
- 65.Dirichlet 分布(2)
- 66.统计学习内容回顾
- 67.K-means 算法
- 68.PCA 降维
- 69.SVD 降维
- 70.从聚类到流形
- 71.局部线性嵌入
- 72.随机邻域嵌入:SNE 与 t-SNE
- 73.无参模型:让数据自己说话
- 74.高斯过程:函数空间里的正态分布
- 75.高斯过程(2):噪声、正则化与核的线性组合
- 76.神经网络简介:从感知器到自编码器
- 77.反向传播:把误差一层层传回去
- 78.卷积神经网络(CNN):让特征自己学出来
- 79.循环神经网络(RNN):给网络装上记忆
- 80.深度学习回顾:静态一类,动态一类
- 81.增强学习(1):蒙特卡洛、树搜索与 Q-learning
- 82.强化学习(2):从乌鸦吃核桃到井字棋的 value 回传
牛顿方法
约 10 分钟
小象实战讲义 · 机器学习算法精讲
上一节结尾埋了个彩蛋:类似梯度下降这种迭代方法,牛顿时代就有了——想法早就躺在那里,是计算把它唤醒的。本节就请出这位三百多年前的”正主”。讲师开篇就给牛顿方法定了位:它跟我们一路在讲的梯度下降非常类似,是又一个要掌握的数学方法。但它最初要解决的不是优化,而是一个更古老的问题——求方程的根:给定一个函数 ,当 时, 该等于多少?
💡 核心导读
- 没有公式怎么办:中学时代的 、 都有现成解法;函数一旦复杂(对数套正弦、再平方、再除个 这类形式),公式就没了——牛顿方法就是为此而生。
- 切线切切切:从一个随机给定的初始点出发,不断作切线、找交点,一步步逼近方程的根;迭代公式从一个小三角形里推出来。
- 亲手跑一遍:用代码看清 的逼近过程,体会”越切越准”的加速。
- 从方程到代价函数:方程复杂了会有多个解——这正像代价函数定义不好时出现的局部最优(local minimum);讲师给出四条应对思路,外加线性回归的”定心丸”。
- 收个大尾:为什么”优化”在机器学习里如此重要——假设函数与真实标签之间的差距,就是一切迭代方法要压小的那个量。
牛顿的问题:没有求根公式的方程怎么办
整个中学时代,我们其实一直在做一件事:解方程。形如 的一次方程、 的二次方程,都有固定的求解公式,套进去就能出答案。
牛顿思考的是更一般的问题:如果 是个特别复杂的函数呢? 讲师举的例子——对数套着正弦、再平方、再比上一个 这类形式。以前有固定求解公式的时候好办,没有公式的时候,该怎么求?
牛顿发明的方法,思想其实非常简单:一步到不了根,那就迭代逼近。在”从一个初始点出发、不断修正”这件事上,它跟梯度下降是同一族人——区别只在修正的依据:梯度下降看梯度,牛顿看切线。
切线切切切:迭代公式的几何推导
把场景画在脑子里:横轴是 ,纵轴是 ,曲线就是函数本身。我们在横轴上随机给定一个初始点 :
- 在 的上方,曲线走到的高度是 ;
- 在点 处作曲线的切线,让切线一直伸下去与横轴相交,交点记作 —— 就是 的一个更新状态;
- 换到 :求出 ,再在 处作切线,与横轴交于 ;
- 如此切切切,切线一段接一段,交点会越来越贴近曲线与横轴真正的交点——那个点记作 (讲师在板书上给它打了个叉),它就是方程的解。
公式从哪来?盯着第一步里那个直角三角形看。切线的斜率是 ,而斜率等于”竖着的长度”比上”底下横着的长度”:
竖着的正是函数值 ;底下横着的是 的变化量 ,从图上看就是 。把两项调换个位置:
有了 求 是这么来的; 与 的关系一模一样,只是把下标都加一。写成一般形式,就是牛顿方法的迭代公式:
从最开始随机给定的 出发,不断套用这个公式迭代下去,就找到了方程的解。讲师的总结很有气势:从牛顿那时候开始,对任何一个复杂方程,我们都能求它的解了。(小注:公式分母是 ,所以函数要可导,且迭代别正好踩在切线水平的点上——否则切线与横轴没有交点,更新无从谈起。)
讲师在视频结尾还补了一句:本节的所有推导他前一晚已经全部写好、放在发给大家的资料里了——对应到讲义,就是上面这个三角形,值得合上讲义亲手画一遍。
亲手跑一遍:切线如何步步逼近
挑一个够格的对手:。中学的求根公式只管到二次,三次往上就没有”套公式”的福气了——正好是牛顿方法的目标客户。从 出发:
# 演示:牛顿法求根——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读这张表有两层味道:
- 方向:每一行都是”算函数值 → 作切线 → 找交点”, 一步步挪向真根 ,函数值从 16 一路缩到机器零。
- 速度:收敛是加速的——残差 16 → 3.4 → 0.37 → 0.0065 → 0.000002,越到后面一步跨得越大。直观原因是:越靠近根,切线与曲线贴得越紧,交点猜得越准。(数值分析里管这个现象叫二次收敛——下一步的误差大约是这一步误差的平方,延伸阅读,讲师课堂上未展开。)
从方程到代价函数:极值点也是一个”根”
那这门课为什么在梯度下降之后紧跟着讲牛顿?因为机器学习的核心任务——最小化代价函数 ——换一个角度看,也是个求根问题:函数取极小值的必要条件,是导数为零。也就是说,我们要找的极值点,恰好是方程 的根。
把牛顿迭代直接用在 上,就得到优化版的牛顿方法(一维情形):
多维时,分母从二阶导数升级为 Hessian 矩阵——第 1 章见过的那个二阶偏导数矩阵。优化版牛顿法与梯度下降同族,区别在于:梯度下降只用一阶信息,知道”下山最陡的方向”;牛顿法多用了二阶信息,还知道”山弯得多厉害”,对落点的预估更准、往往收敛更快——代价是二阶导数的计算开销也更大。这一步延伸本课视频没有展开,第 8 章训练逻辑回归时我们仍以梯度下降为主线;先把求根这一步吃透,延伸就是水到渠成的事。
世界比公式复杂:多解、局部最优与四条对策
讲到这里,讲师泼了盆冷水:世界远比这个复杂。 方程特别复杂的时候,可能会出现两个解——或者更多。
这里藏着一个漂亮的类比(讲师亲口点破):方程的多个解,就像代价函数定义得不好时出现的局部最优(local minimum)——优化算法停在一个”附近最好”、却不是”全局最好”的坑里,心满意足地以为到站了。
真遇到了局部最优怎么办?讲师给了四条思路:
- 从源头抓起:构造 cost function 的时候,尽量让它不要有局部最优的形式——把问题本身设计好,是第一位的。
- 多采样、换起点:不断地采样,给定不同的随机初始值多跑几轮,总能撞上最好的那个最优点。
- 自适应步长:不断调整 ;特别复杂的情况下会用 adaptive 的 (让步长跟着情形自适应调节),尽量跳出局部最优。
- 随机变异:像遗传算法这一类优化方式,让点发生随机”变异”,从局部最优点跳到别的地方去。
讲师随即收口:这些不是我们目前讲的重点,知道有这几条路就行。
最后给定心丸:我们目前构造的 linear regression 这种简单形式,是比较严格的凸函数——凸函数不存在局部最优,所以梯度下降总会找到比较好的结果。但生活不会像我们想象的这么简单:关键看你在构造 cost function(损失函数)的时候怎么构造——不同的构造,才分出了不同的复杂优化问题。这也是为什么后来很多人讲机器学习时,都把”优化”摆在如此重要的位置。
为什么”优化”在机器学习里如此重要
把镜头拉远看一遍全图。建一个深度神经网络时,整个网络里都是参数——很多不同的权重。我们最后想优化的,就是让网络的输出与已知训练数据之间的差别越来越小。这个差别有时是 square error(平方误差、残差式的——前面一直在用的那种),有时直接用 Softmax 一类的形式——量的是两个输出概率之间的距离(分类问题的常用损失,第 8 章逻辑回归正式登场)。
所谓误差,就是你从大脑里构想出来的 hypothesis——也就是 ——与真实给定的对应值之间的差别。 是真实世界给定的标签; 是我们构造出来的、对输入输出关系的猜想。猜想对不对,就要看它们之间的误差是否最小。数据一共有 到 条:有时构造平方项,有时直接构造绝对值,有时看 和 之间的其他关系——形式不限,目标只有一个:让构造出来的假设函数,跟真实的有标签数据越接近越好。
所以讲师的收尾既是本节的、也是整条主线的:梯度下降也好,以后我们学的其他优化方法也好,总之都是 follow 类似的思想——构造一个好的损失函数,然后不断地 minimize 它。
📝 动手练一练
- 推导与条件:合上讲义,从那个直角三角形出发,推出牛顿迭代公式 ,并回答:① 斜率那一步,“竖着的长度”和”底下横着的长度”分别是什么?② 牛顿法对函数有什么基本要求?迭代在什么情况下会卡住?
👉 点击查看参考答案
① 竖着的是函数值 ,底下横着的是 的变化量 ;由斜率 移项即得迭代公式。
② 函数要可导,且迭代过程中 ——分母为零意味着切线水平、与横轴没有交点,更新无从谈起;初始点选得太远时,迭代也可能来回震荡迟迟不收敛。这也是”多给几个随机初始值试试”的又一个理由。
- 求平方根:用牛顿法解方程 (根为 ),从 出发。先手算前两步,再跑代码看完整轨迹,观察误差的变化规律。
👉 点击查看参考答案
手算:;。代码验证:
# 练习参考:牛顿法解 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误差的规律一目了然:——每一步的误差几乎是上一步的平方。四步之内从一位小数的粗猜打到浮点精度,这就是二次收敛的威力,对应正文那句”越靠近根、切线贴得越紧”。顺带一提:计算器和数学库开平方,用的往往正是这一族迭代。
本章小结
本节请出了牛顿方法:从”没有求根公式的复杂方程怎么办”出发,用切线与横轴的交点一步步逼近根,迭代公式 由一个小三角形直接推出;代码实跑看到五步内 值从 16 压到机器零、误差每步平方的加速逼近。把求根对象换成导函数,它就变成优化版的牛顿方法(分母升级为 Hessian)——与梯度下降同族、收敛常更快、二阶开销也更大。随后讲师把话锋引向现实:方程复杂会多解,代价函数构造不好会有局部最优——四条对策(设计好损失函数、多采样换起点、自适应 、随机变异)是应对地图,线性回归的严格凸性是当前的定心丸。最后收拢到主线:无论梯度下降还是牛顿法,压小的都是同一个量——构想的假设 与真实标签 之间的误差。
📋 行动清单
学完本节,你可以立即:
- 合上讲义推一遍:从直角三角形出发推出 ,讲给自己听懂”切线切切切”。
- 换个函数再跑一遍:把演示代码换成 (导数还是 ,根为 ),观察迭代轨迹是否同样加速。
- 复述四条对策:向同事解释局部最优是什么、为什么线性回归暂时不用担心它。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。