机器学习基础
整个深度学习笔记(包括机器学习的部分)重要参考了以下资料:
- Brandeis CS149: Machine Learning by Prof. Pengyu Hong, 2025 Spring
- UCB CS 189/290A: Intro to Machine Learning 2025 Fall (https://eecs189.org/fa25/)
- CMU 16-831 by Prof. Guanya Shi
什么是机器学习
简单来说,通过数据来提升学新能力的软件系统就是机器学习:
- Use examples data to teach (fit) a model.
- Use the model to make decisions.
传统任务如垃圾邮件识别、人脸识别等,都是很容易描述但是却很难定义(垃圾邮件)或者program(人脸识别)的。
如今,机器学习也常被人们称为人工智能,这是因为当今人工智能背后最核心的工具和技术就是机器学习。可以这么认为:我们的最终目标依然是人工智能,只不过当下最有效的工具是机器学习。人工智能的终极目标是让计算系统学会人类智能并处理learning, reasoning, problem-solving, perception, decision-making等事情。

一般来看,机器学习分为下面几种类别:
(1)Supervised Learning 监督学习:
-
Classification: 根据分类型输入X,预测输出Y
-
图像识别:根据突破猜测标签
- ChatGPT:根据Prompt预测下一个单词
-
Regression: 根据连续的历史数据X,预测未来数据Y
-
股票预测
- Image, Video Generation
(2)Unsupervised Learning 非监督学习:
- Clustering & Density Estimation
- Dimensionality Reduction
(3)Reinforcement Learning
一般强化学习单独学习,我们的课程中主要内容是监督学习和非监督学习。
ML的历史脉络:

ML Lifecycle:

数据
机器学习中数据是最为重要的,所有的model都开始于一些数据,结束于一些数据。如果你的数据不好,就会导致“垃圾进,垃圾出”的问题。因此,处理数据和展示数据(visualization)是非常重要的。
一般常用如下数据工具进行ML学习:
- pandas: for tabular data
- Matplotlib: traditional data visualization
- Plotly: modern style data visualization and support interaction
- Weights and Biases: UCB's suggested visualization platform
函数逼近
ML的本质是函数逼近
无论机器学习的任务看起来是多么复杂,其中心思想都可以被认为是寻找一个未知的目标函数,这个函数可以将你的输入数据映射到你想要的输出结果。换句话说,机器学习的本质就是函数逼近(Function Approximation)。

以上图为例,无论是图片识别、文本识别还是表格数据,能够识别它的函数就是机器学习模型(Machine Learning Model)。
为了能让计算机处理这些现实世界的数据,我们必须首先将各类型的数据转换为统一的、机器可读的格式——数值向量(vector)。

上图中的例子中:
- 图片被转换成一个由像素值组成的长向量x。
- 文本被转换成一个由词语组成的向量x。
- 表格被转换为由各项特征组成的向量x。
那么我们想要得到的机器学习模型,就是能够处理上述数据的函数逼近。即,机器学习模型本质上就是在学习一个函数:
- 找到一个函数f,使得f(图片向量)="dog".
- 找到一个函数g,使得g(文本向量)="spam".
- 找到一个函数h,使得h(房屋特征向量)="$1200000".
模型训练的过程,本质上就是在不断调整模型内部的参数,使其尽可能地逼近这个理想的、但未知的目标函数(即上面所说的f, g, h)。
一般来说,对于一个经典的监督学习机器学习模型(Supervised Learning Model),有两个函数至关重要:
- 预测函数(Prediction Function): 也就是上面提到的f(x), g(x), h(x). 这个函数就是我们常说的模型本身,它负责接收输入数据x,然后给出一个预测结果y。这个函数里面一般包含很多可以调节的参数,比如权重w和偏置b。我们用θ(theta)来代表所有的这些参数的集合。因此一般我们把预测函数写成f(x;θ).
- 损失函数(Loss Function / Cost Function): 这是一个用来评估模型好坏的函数。它会比较模型的预测结果f(x;θ)和真实标签y之间的差距。差距越大,损失函数的值就越高,说明模型越差;差距越小,损失函数的值就越低,说明模型越好。
换句话说,机器学习模型训练的过程的本质就是:通过不断调整预测函数f(x;θ)中的参数θ,来让损失函数L(θ)的值变得最小(即找到最优值)。这个寻找最小值的过程,就是优化(Optimization)。
总结来说,机器学习的本质是为问题定义一个恰当的目标函数。在绝大多数监督学习中,我们选择的的目标函数就是损失函数,而我们的任务是寻找一组能让这个损失函数值尽可能最小化的模型参数。当然,我们之前也提到过,作为机器学习三大分支之一的强化学习,其目标函数是奖励函数,任务则是想办法让奖励函数最大化。
为了完成上述目标,我们需要掌握以下数学工具:
- 线性代数:用于处理向量和数据
- 多元微积分:用于优化模型、寻找函数的最佳参数
- 概率论:用于处理不确定性
数学工具相关的内容,参见我的深度学习笔记的
线性代数角度
vector

当我们直接看到一个问题,比如图片识别时,直接找到一个f函数实在是无从下手。那么不如从最简单的函数入手:线性函数。一个作用于向量的线性函数,可以用矩阵乘法来表示:
- dog = f(x) = Ax
- spam = g(x) = Bx
- $1200000 = h(x) = Cx
这样,一个抽象的问题就被具体化并且简化为寻找一个具体的矩阵A的问题。这是从机器学习概念到线性代数模型的关键一步。
那么我们如何分析f(x) = Ax这个函数呢?我们先来回顾一下数学中关于函数的一般性质:

- Injective 单射:每个input对应一个独一无二的output
- Surjective 满射:每个可能的output都至少有一个input与之对应
- bijective 双射:input和output之间完美一一对应
这里要注意,如果一个input对应多个output,那么这就不是一个valid function。
dimensions
一般对于分类任务、回归任务,我们可以认为这是一种降维任务,因为我们输入的信息总是非常庞大、复杂、高维的,而获得的信息则是简单的。以图像识别任务为例,我们希望无论图片有多少张,其对应的结果都是有限的,因此最理想的结果显然是一个surjective满射。
当然,假如 我们的任务是升维的,比如你输入一句话(prompt),然后生成一个图片,这显然不能是surjective满射。从任务的角度来看,我们输入的一个内容,就是一个随机种子,其结果对应的总是一个独一无二的图片,那么这显然就是injective单射。
当然,还有bijective双射的情况,比如我们输入100x100的图片,输出也是100x100的图片,并且可逆,那么就满足双射。
在这里,我们把输入的维度叫做D,把输出的维度叫做K,则:
- 降维任务:D > K,surjective 满射
- 升维任务:K > D,injective 单射
- 维度不变:D = K,bijective 双射

对于矩阵f(x)=Ax,A是一个固定的变换规则,x是我们的输入向量,f(x)=y是我们的输出向量。当我们把不同的x输入进来后,就得到了不同的y。所有的y构成了一个集合,这个集合叫做range(值域)或者column space(列空间)。对于这个集合,其维度(dimension)就叫做rank。
比方说:
对于这个矩阵,第三行是第一行的两倍,因此这个矩阵包含冗余信息。故而,这个矩阵的实际维度只有2,即rank(A) = 2. 而这个矩阵的列数为3,即D=3。我们可以用Gaussian Elimination高斯消元法来求出一个矩阵的rank。
图中展示了线性代数的如下性质:
| f | A | rank(A) |
|---|---|---|
| f is injective | A is full column rank | rank(A) = D |
| f is surjective | A is full row rank | rank(A) = K |
| f is bijective | A is full rank/invertible | rank(A) = D = K |
鸢尾花示例
那么我们如何运用上述知识呢?以经典的鸢尾花分类为例:鸢尾花有三种不同的品种(Setosa, Versicolor, Virginica)。我们测量了每朵花的四个特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度。目标是构建一个模型,只要输入这四个测量值,它就能自动判断出这朵花属于哪个品种。
在开始写代码或选择模型之前,我们先在概念上定义我们要做什么。
- 我们正在寻找一个 函数 ,我们给它起个名字叫
f。 - 这个函数
f的输入x应该是一个包含4个数字的向量(4个花朵测量值)。所以x存在于一个4维空间ℝ⁴中 (D=4)。 - 这个函数
f的输出y应该告诉我们它属于3个品种中的哪一个。一个常见的做法是让输出是一个3维的向量,每个位置代表属于某个品种的概率。例如[0.9, 0.1, 0.0]可能代表它有90%的概率是Setosa。所以y存在于一个3维空间ℝ³中 (K=3)。
我们的抽象目标 :找到一个完美的函数 f,使得 f(花的4个测量值) = 属于3个品种的概率。
接下来,寻找一个任意的、完美的 f 太难了。我们决定做一个简化,我们假设这个未知的 f 可以用一个线性函数来很好地 近似 。
- 我们的具体模型 :
f(x) = Ax - A是什么? :
A就是实现这个线性函数的 矩阵 。 - 因为输入
x是4维 (D=4),输出y是3维 (K=3),所以A必须是一个3 x 4的矩阵。 - 建模之初的
A: 在我们开始训练之前,A只是一个由12个随机数填充的3x4矩阵。它什么都不知道,完全是个“傻瓜”。
现在的目标 :我们的任务从“寻找抽象的 f”具体化为“ 为矩阵 A找到12个最合适的数字 ”。
而这个寻找最佳的A的过程,也是机器学习的核心步骤:
- 准备数据 : 我们拿出大量的鸢尾花数据,这些数据都有已知的4个测量值(
x)和它们对应的正确品种(y_true)。 - 开始循环:
- 从数据集中取出一朵花的数据
x。 - 把它喂给我们当前的矩阵
A,进行一次乘法运算,得到一个预测结果:y_pred = Ax。 - 比较我们的预测
y_pred和真实答案y_true有多大差距。这个“差距”由损失函数 (Loss Function) 来计算。 - 使用一个 优化器 (Optimizer) (比如梯度下降),根据这个差距,微调一下矩阵
A中的12个数字,让A的参数朝着能使损失变小的方向更新一点点。 - 重复 : 我们对数据集里的成千上万朵花重复上述过程。矩阵
A中的12个数字就会被迭代地、一点一点地优化,直到损失变得足够小。
训练结束后的 A 不再是随机数了。它变成了一个“专家”,里面包含了从数据中学到的模式。
现在,矩阵 A 的第一行 [-0.5, 1.2, -2.1, -1.0] 就是一个学成的“Setosa品种打分器”配方。它学到了,比如,花瓣长度(第三个特征)越长,是Setosa的可能性就越低(因为系数-2.1是负的)。
到这里,我们的训练就结束了。我们可以用我们训练好的矩阵,来预测一朵新的、未知的鸢尾花属于哪一类:
- 测量 : 我们测量出它的4个特征,得到一个新的向量
x_new。 - 计算 : 我们执行一次简单的矩阵乘法:
y_new = A_trained * x_new。 - 得到结果 : 我们得到了一个3维的输出向量,比如
y_new = [0.85, 0.10, 0.05]。 - 解读 : 这个结果告诉我们,这朵新花有85%的可能是Setosa品种。我们成功地完成了预测任务。
总结一下:
f: 是我们对“ 一个能识别鸢尾花的智能系统 ”的抽象构想。A: 是我们选择用来实现这个构想的 具体工具(一个3x4的矩阵) 。- 训练 : 是我们通过数据,反复打磨、校准这个工具( 寻找
A中最佳的12个数字 )的过程。 - 预测 : 就是使用打磨好的工具( 用训练好的
A去做乘法 )来解决新问题的过程。
微积分角度
Sensitivity of Function
多元微积分(Multivariate Calculus)在机器学习中也是重要的工具。我们回到一开始的ML as Function Approximation中来。
对于机器学习模型y=f(x),我们如何优化或者训练这个函数呢?为了回答这个问题,我们必须先理解函数的行为。
想象一下我们的函数 f(x) 是一个房价预测模型:
- 输入
x是一个包含房屋各种特征的向量,比如x₁=面积(平方米),x₂=卧室数量,x₃=离市中心的距离... - 输出
y是预测的房屋价格。
那么,上面的问题就变成了:
- 房价(输出y)对房屋面积(输入x₁)有多敏感?
- 如果我们把房屋面积增加一平方米,房价大概会涨多少钱?
这两个问题概括一下就是:
- How sensitive is my output to my input variables?
- How will my output change if I change my input by a small amount?
回答了这个问题,我们就能理解模型是如何做决策的,以及如何调整它。

从上图中可以看到,我们有一个输入向量x,包含D个特征。我们还有一个输出y,是一个实数,也就是我们要预测的那个值(比如房价)。
现在,我们聚焦于那个具体的问题:“如果我把第一个输入变量 (x₁) 改变一个很小的量 ( Δx₁ ),我的输出 y 会改变多少呢?”
衡量这个微小变化的工具,就是偏导数(Partial Derivative):
让我们来解读这个公式:
Δy: 代表输出y的变化量(比如房价的增额)。Δx₁: 代表输入x₁的微小变化量(比如增加的1平方米面积)。≈: 这个符号是“约等于”。因为这个公式是一个线性近似,当Δx₁非常小时,这个近似就非常精确。∂f/∂x₁: 这就是 偏导数 (Partial Derivative) 。
偏导数是用来衡量函数敏感度的核心工具。
它的直观意义是:在保持所有其他输入变量 (x₂, x₃, ...) 都固定不变的情况下,输出 y 相对于输入 x₁ 的变化率。
回到房价的例子:
∂f/∂x₁ (其中 x₁ 是面积) 就代表着,在卧室数量、地理位置等其他所有条件都不变的前提下, 面积每增加一个单位,房价会变化多少 。
如果计算出来 ∂f/∂x₁ = 5000,那就意味着,在其他条件不变时,房屋面积每增加1平方米,房价大约会上涨5000元。这个 5000 就是房价对面积的“敏感度”。
总结来说,如果我们想直到input x和output y之间的变化关系,我们就需要知道函数对于变化的反应(敏感度),而偏导数就是衡量这种敏感度的数学工具。偏导数可以告诉我们,当我们稍微调整某一个输入的时候,输出会作出何种反应。
这为什么对机器学习至关重要? 因为“训练”模型的过程,本质上就是不断计算损失函数(衡量预测有多不准的函数)对模型内部参数的偏导数。通过这些偏导数,我们能知道应该如何微调每一个参数,才能让模型的预测结果变得更准。这个过程就是著名的梯度下降(Gradient Descent)算法的核心。
Chain Rule

想象一下,直接从一张充满像素点的图片(输入 x)判断出里面是“狗”(输出 y)是非常困难的。模型需要跨越一个巨大的认知鸿沟。
所以,这一页提出,我们可以把这个复杂的任务分解成两个更简单的接力任务:
第一步 (由 f₁, g₁, h₁ 完成): 特征提取 (Feature Extraction)
- 目标 :将原始的、杂乱的、难以理解的数据,转化为有意义的、结构化的“特征”。这一步是整个过程中最关键、最神奇的地方。
- 例子 :
-
图片 (Image) : 输入的是一大堆像素值。
f₁的工作不是直接看像素,而是从像素中“学习”识别出一些关键的 图像特征 (Image Features) ,比如: -
边缘和轮廓
- 物体的纹理(比如毛茸茸的感觉)
- 特定的形状(比如狗耳朵、猫鼻子)
-
文本 (Text) : 输入的是一串单词。
g₁的工作是从中提取 文本特征 (Text Features) ,比如: -
是否包含“紧急”、“金钱”、“中奖”等关键词
- 句子的语气是否命令或恳求
- 是否有不寻常的大写字母或拼写错误
-
表格 (Tabular) : 输入的是独立的几列数字。
h₁可以学习将这些数字组合成更有意义的 表格特征 (Tabular Features) ,比如: -
“每平方米的价格”(由总价除以面积得到)
- “卧室与浴室的比例”
- 将“伯克利”这个地理位置转化为一个特定的风险或价值指数
第二步 (由 f₂, g₂, h₂ 完成): 基于特征做决策 (Decision Making)
- 目标 :现在,第二步的函数接收的是第一步处理好的、高质量的“特征”,它的任务就变得简单多了。
- 例子 :
- 图片 (Image) :
f₂不再看原始像素,而是看f₁传给它的特征。当它看到“毛茸茸的纹理”、“下垂的耳朵”、“湿漉漉的鼻子”这些特征时,它就很容易地判断出结果是“dog”。 - 文本 (Text) :
g₂接收到“包含金钱字眼”、“语气紧急”等特征,就能高概率地判断出这是“spam”(垃圾邮件)。 - 表格 (Tabular) :
h₂根据h₁算出的各种组合特征,最后用一个相对简单的模型(比如线性回归)就能计算出最终价格“$1,200,000”。
这种分而治之的核心思想,在传统机器学习中,往往由人类专家(数据科学家)来手动完成,这个过程叫做“特征工程”。而这张幻灯片上 f₁, g₁, h₁ 旁边的问号,暗示了在现代深度学习中, 模型可以自动地、从数据中“学习”到哪些特征是最有用的 。我们不需要告诉模型要去寻找耳朵和鼻子,它会在训练中自己发现这些是区分狗和猫的关键特征。
这个 y = f₂(f₁(x)) 的结构,其实就是最简单的神经网络模型。f₁ 可以看作是神经网络的前几层(负责提取特征),f₂ 可以看作是最后一层(负责分类或回归)。一个“深度”神经网络就是把 f₁ 再拆分成更多层,学习从低级(边缘)到高级(物体部位)的越来越复杂的特征。
在了解上述思想后,我们把所有的分开的不同阶段的函数统合起来,整体性地来看其敏感性。在数学中,我们可以用Chain Rule 链式法则完成这一目标。
链式法则的本质就是:总的敏感度 = 第一阶段的敏感度 x 第二阶段的敏感度
对于复合函数:
我们可以得到:
我们来拆解这个公式:
Δx₁:还是我们最开始对输入x₁做的那个微小的改动。Δy:是最终输出y产生的变化。
中间的两个偏导数相乘,就是我们说的“两阶段的敏感度”:
-
∂f₁/∂x₁: 第一阶段的敏感度 。 -
它衡量的是:中间特征
f₁对原始输入x₁有多敏感? - 例子:在图片识别中,如果把某个像素点
x₁调亮一点,那么“识别出的狗耳朵”这个特征f₁会变得多明显? -
∂f₂/∂f₁: 第二阶段的敏感度 。 -
它衡量的是:最终输出
y对中间特征f₁有多敏感? - 例子:如果“狗耳朵”这个特征
f₁变得更明显一点,我们模型最终判定它是“dog”的概率y会增加多少?
把这两个敏感度乘起来,我们就得到了 y 对 x₁ 的总敏感度。
现代机器学习中最重要的深度学习,本质上就是由非常多个阶段组成的一个目标函数。每个阶段就是神经网络的一个层,其本质上就是一个非常非常长的复合函数:y = f_n(...f₂(f₁(x))...)。
当我们训练网络时,我们会发现模型的预测结果有误差。为了减小这个误差,我们需要微调网络中成千上万个参数。但我们怎么知道该调哪个、调多少呢?
答案就是利用链式法则。一个被称为反向传播 (Backpropagation) 的算法,其核心就是应用链式法则,从最后一层开始,一层一层地反向计算出误差对于每一层参数的偏导数(敏感度)。
- 这个偏导数告诉我们:“如果你把这个参数稍微调大一点,最终的误差就会减小/增多多少。”
- 有了这个信息,模型就知道该如何调整自己所有的参数,以便下一次做出更好的预测。
所以, 链式法则是驱动整个深度学习模型进行学习和优化的数学引擎 。
刚才我们讨论的是乘起来的单线y = f₂(f₁(x));对于多线汇合任务,我们也可以用加起来的方式运用链式法则:
概率论角度
贝叶斯定理
许多机器学习(ML)问题都可以被看作是概率问题,而贝叶斯定理(Bayes' Theorem)是解决这些问题的强大工具。
贝叶斯定理的核心公式是:
拆解一下每一项的含义:
-
\(P(Y = k \mid X = x)\): 后验概率 (Posterior Probability) 。这是我们最想知道的结果。它的意思是:“在观察到数据特征\(X=x\)的条件下,我们想预测的标签\(Y\)是类别\(k\)的概率是多少?”
-
例如:在看到一封邮件内容(\(X=x\))后,这封邮件是垃圾邮件(\(Y=spam\))的概率是多少?
-
\(P(X = x \mid Y = k)\): 似然 (Likelihood) 。它的意思是:“如果标签 Y 确定是类别 k,那么我们观察到数据特征为 X=x 的概率是多少?”
-
例如:在一封确认为垃圾邮件(\(Y=spam\))的邮件中,看到“尼日利亚”、“急需用钱”这些词(\(X=x\))的概率是多少?这个概率通常比直接计算后验概率要容易。
-
\(P(Y = k)\): 先验概率 (Prior Probability) 。这是在没有任何观察数据的情况下,我们对标签 Y 是类别 k 的一个初始判断或信念。
-
例如:根据历史数据,我们知道所有邮件中大约有30%是垃圾邮件,那么\(P(Y=spam)=0.3\)。
- \(P(X = x)\): 证据 (Evidence) 。这是观察到特征 X=x 的总概率,不管它的标签是什么。
也即:
简单来讲,假如我们用“根据天阴来判断是否会下雨”,那么:
- Posterior Probability 后验概率:现在你看到天阴了,然后重新判断今天会下雨的可能性
- Likelihood 似然:如果真的要下雨,那么天色变阴的可能性有多大
- Prior Probability 先验概率:看到天色之前,凭经验来看这一天下雨的可能性
- Evidence 证据:无论下不下雨,今天天色变阴这件事本身发生的可能性有多大
由于直接计算后验概率 \(P(Y=k \mid X=x)\)比较困难,但是在大多数情况下,估算Likelihood似然\(P(X=x \mid Y=k)\)和先验概率\(P(Y=y)\)则要容易得多。
那现在还差一个证据。证据我们通常通过全概率公式获得:
Law of total probability 全概率公式:
在很多时候,比如判断一封电子邮件是否是spam,我们比较的是\(P(Y=spam \mid X=x)\)和\(P(Y = not_spam \mid X = x)\)的大小时,它们的分母都是同一个值\(P(X=x)\)。因此我们只需要比较分子的大小即可,哪个分子的计算年纪俄国更大,那个对应类别的后验概率就更高。这就是为什么在很多分类算法(比如朴素贝叶斯)的实现中,程序的核心是计算并比较(似然 x 先验概率),而忽略了证据。
当然,如果你需要一个精确的值,比如“这封邮件是垃圾邮件的概率是98.3%”,那么你必须用全概率公式计算出证据并完成除法。
监督学习
下面是学习机器人学习的时候整理的一些机器学习基础知识。
Pipeline
机器学习主要分为监督学习、非监督学习和强化学习。
监督学习的核心思想非常质朴:我们相信输入和输出之间存在一个潜在的规律(也就是真实函数\(F\)),我们想通过一堆例子(训练数据),来找到一个模型(近似函数\(f\)),来模仿和逼近这个未知的规律。即:监督学习的本质就是函数逼近:
- 函数逼近: 从一个输入空间 \(X\) (观测集) 学习一个函数 \(f: X \to Y\) 到一个输出空间 \(Y\) (目标集),这需要使用一组带标签的训练样本 \(D_{\text{train}} = \{(x_1, y_1), \dots, (x_N, y_N)\}\)。
- 泛化:理想情况下,学习到的函数 \(f\) 在那些未包含在训练集 \(D\) 中的测试数据上也能表现良好。
- 示例:图像分类。
以房价预测为例:

(1)数据集 dataset:
- 训练数据 \(D_{train}\),图中的蓝点,用于学习模型
- 测试数据\(D_{test}\),图中的绿点,用于评估模型的泛化能力
(2)模型 model:
我们的目标是拟合一条直线来描述面积和租金的关系:
- 模型函数:\(f(\mathbf{x}|\mathbf{w}) = \mathbf{w}^{\mathbf{T}} \mathbf{x}\)
- \(\mathbf{x}\)是输入特征向量
- \(\mathbf{w}\)是权重向量,也就是我们需要学习的对象
(3)学习过程:Loss Function 损失函数
- 训练目标:对于训练集中的每一个数据点\((x_i, y_i)\),我们希望模型的预测值\(f(x_i | \mathbf{w})\)尽可能地接近真实值\(y_i\)
- 为了衡量单次预测的好坏,我们使用平方损失(squared loss)来计算真实值和预测值之间的差异的平方:\(L(y, y') = (y - y')^2\)
对于整个数据集,我们可以求出数据集中所有的样本的平方损失的平均值:
(4)学习目标 Learning Objective:
我们的目标是找到一组最佳的权重,使得模型在整个训练集上的总损失最小。我们把这个目标以优化问题的方式写下来就是:
上式是通用的损失函数L的模板,含义是:寻找能让所有训练样本的损失之和最小化的权重向量\(\mathbf{w}\)。即输入第i个样本的真实值\(y_i\),得到模型对第i个样本给出的预测值\(f(\mathbf{x}_i \mid \mathbf{w})\),然后比较这两个输入的差异,并输出一个数值来表示损失或误差的大小。放到上面的例子中,就是:
代入损失函数,得到:
换句话说,我们的学习目标就是让模型在整个训练集上的总体表现最好。这通常通过最小化 总平方损失(Sum of Squared Errors, SSE)来实现,这在数学上等价于最小化均方误差(Mean Squared Error, MSE) 。
(5)优化方法 Optimization:
为了实现学习目标,我们可以通过不同的方式来找到这一组损失最小化的向量,一般有以下方法:
- 解析解 Closed-form Solution
- 梯度下降 GD
- 随机梯度下降 SGD
同时还有一些技术对优化器进行了优化:(这部分内容详见深度学习笔记)
- Adaptive Gradient
- Momentum
- Learning Rate
- Regularization
(6)泛化 generalization:
我们训练模型的目的是让模型能够在未见过的数据上表现良好,不然没有意义。换句话说,模型应当在测试集上的总损失也很小。如果在训练集上表现良好,但是在测试集上表现很差,即测试误差>>训练误差,那么就是过拟合(overfitting);如果模型在训练集和测试集上表现都很差,那么就是欠拟合(underfitting)。
在泛化中会面临Interpolation 内插 vs. Extrapolation 外推、Domain Shift 域偏移等挑战。
如果我们从理论上来分析机器学习模型的泛化误差,我们一般将之分为三个主要部分:
- Bias 偏差,模型的平均预测和真实值之间的差距;高Bias意味着模型的基本假设就是错的,它甚至无法拟合数据的基本规律,因而无论继续追加多少数据都是无济于事的
- Variance 方差,当我们用不同的训练数据集时,模型的预测结果会产生多大的波动;高Variance意味着模型对训练数据非常敏感,如果训练数据有微小的变化,模型就会产生剧烈的改变,即模型学到了太多训练数据中的噪声和细节
- Noise / Irreducible Error 噪声/不可避免的误差,即数据本身固有的噪声导致的误差,这是任何模型都无法消除的误差下限
一般来说,Underfitting的原因是因为High Bias,即模型复杂度太低,无法捕捉数据中潜在的复杂规律;Overfitting的原因是High Variance,即模型的复杂度太高,不仅仅学习了数据的规律,还把训练数据中的噪声也当做规律来学习了。因此,我们的目标一般是找到一个平衡点,使得偏差和方差整体最小。在传统机器学习模型中,一般可以通过让(偏差的平方+方差)最小,就能找到这个平衡点;但是这种现象在现代的大模型中不再成立——这就是双下降现象。双下降挑战了我们对于过拟合的传统理解,揭示了为什么今天那些参数量远超训练样本数的巨型模型依然能够表现出色,即在这个新的机制中,更大、更复杂的模型反而更好,体现出了更强的泛化能力。
(7)评估 evaluation:
不同的机器学习任务需要用不同的指标来评估。
回归任务 Regression - 预测连续数值:
- MAE(Mean Absolute Error,平均绝对误差),预测值与真实值之间绝对误差的平均值
- MSE(Mean Squared Error,均方误差),预测值和真实值之间误差平方的平均值,它会放大较大误差的影响,对离群点更敏感
- RMSE(Root Mean Squared Error,均方根误差),即MSE的平方根,这是最常用的回归指标
- \(R^2\)(R-squared,R方),表示模型的预测能在多大程度上解释真实数据的变化。值域在0到1之间,越接近1说明模型的拟合效果越好。
分类任务 Classification - 预测离散类别:
- Confusion Matrix 混淆矩阵,即用预测为正/负、实际为正/负组成一个四格矩阵,以下的指标都通过该混淆矩阵计算得出:
- 准确率 Accuracy,注意这个指标在数据不平衡时(比如99%的邮件都不是垃圾邮件)具有极大的误导性
- 精确率 Precision,在假阳性代价很高时很重要,比如垃圾邮件过滤中我们不希望把重要邮件错误地判断为垃圾邮件
- 召回率 Recall / Sensitivity,当假阴性代价很高时很重要,比如癌症诊断中我们不希望漏掉任何一个真正的病人
- F1-Score,精确率和召回率的平均数,只有当两者都很高时F1分数才会很高
- AUC:ROC曲线下面积,衡量模型排序能力的指标,在很多场景下AUC是比准确率更稳定的模型性能衡量标准
交叉验证 Cross-Validation, CV:
- 如果数据集较小,训练-验证-测试可能会因为偶然性导致评估结果不稳定
- CV即把训练数据分成K份,轮流将其中的K-1份作为训练集,剩下的1份作为验证集。重复K次后,将K次的评估指标取平均值,即可得到一个更稳健、更可靠的模型性能估计
(8)损失函数选择的理论依据(工程实践不需要)
上面我们自然而然地使用了一根直线来逼近房价预测模型,然后使用MSE来计算数据集中所有的样本的平方损失的平均值,从而作为衡量损失有多大的度量衡,也即损失函数。在这里,针对线性回归选择MSE作为损失函数,这一操作并非是拍脑袋想出来的,而是有理论依据的。这个理论依据就是概率论方法和最大似然估计。
首先,我们必须要承认一个事实,即任何模型都不可能完美预测现实世界。即使我们用一条直线\(f(\mathbf{x}|\mathbf{w})\)去预测房价,真实值\(y\)和预测值\(f(\mathbf{x}|\mathbf{w})\)之间总会存在一个误差\(\epsilon\),即真实值\(y=f(\mathbf{x}|\mathbf{w})+\epsilon\)。
现在,我们来做一个关键的假设:我们假设这个误差\(\epsilon\)不是完全随机的、毫无规律的,而是服从一个均值为0的正态分布(这是一个非常合理的假设,因为这个假设在现实世界中非常普遍),那么我们就可以从概率的角度重新描述我们的模型:
对于一个给定的输入\(\mathbf{x}\),输出\(y\)的概率分布是一个以直线预测值\(f(\mathbf{x}|\mathbf{w})\)为均值的正态分布。
现在,我们手上有了一堆训练数据\((x_1,y_1),(x_2,y_2),...\),这时,我们就可以运用最大似然估计(MLE):
我们应该选择一条怎样的直线(即怎样的参数w),才能让我们观测到手中这堆真实的概率变得最大?换句话说,最好的那条直线,一定是最能解释我们现有数据的那条。
现在根据正态分布的假设,观测到单个数据点\(y_i\)的概率是:
根据MLE原则,我们要最大化观测到所有数据点的总概率,这个总概率(似然函数)是所有单个概率的乘积:
为了方便计算,我们最大化对数似然(Log-Likelihood),这和最大化原始似然得到的最优w是完全一样的。取对数后,连乘变成了连加:
这就是单个样本的对数似然的简化形式,我们的学习目标是最大化整个数据集的对数似然,所以我们要把所有样本的结果加起来,并把求和符号分配到每一项:
由于我们的目标是找到让上述表达式取最大值的权重w,因而上式左半边和我们的结果没有关系,对于寻找最优w来说这是一个常数项。右半边的系数是一个正常的常数,而平方数又是一个正数,因此我们相当于把优化目标转换为:
这个目标完全等价于:
至此,我们通过概率方法和最大似然估计,在数学上证明了线性回归最优损失函数就是最小化总平方损失MSE。
逻辑回归
上面我们介绍了线性回归的核心概念,现在我们来快速过一下逻辑回归(Logistic Regression)。逻辑回归是一个分类算法,并不是回归算法。所有的预测结果会被分类为一个二元分类,比如+1和-1。
逻辑回归的思路非常巧妙:
- 使用线性回归模型来计算一个分数
- 这个分数越高,模型就越倾向于认为样本属于+1类;分数越低,模型越倾向于认为样本属于-1类。若分数为0,则表示模型犹豫不决,在决策边界上。
- 我们用Sigmoid函数(也叫做Logistic函数)来把这个任意大小的分数压扁到(0,1)的区间内,这样它才能成为一个合法的概率值:

上图就是Sigmoid函数和图像。
Softmax
如果我们用Softmax替代Sigmoid,那么就可以得到多类别逻辑回归:
上述公式可以将一个实数向量\([a_1, a_2, \ldots, a_K]\)映射为一个概率分布:
其特点是每个输出值都在(0,1)区间内,所有输出值之和为1等。常用于分类模型、多分类神经网络的输出层。
更多关于监督学习的模型可以参考机器学习笔记。
应用
我们来看一下监督学习在机器人领域的应用:
-
训练数据集 (Training Dataset)
-
公式: \(D_{train} = \{(x_1, y_1), \cdots, (x_N, y_N)\}\)
- \(x\) (输入): 机器人的传感器数据(如图像)或自身状态(如关节角度)。
- \(y\) (输出/标签): 机器人要学习的“正确答案”。
-
\(y\) 的不同含义
-
动力学 (Dynamics): \(y\) 代表行为的“结果”(如机器人的下一个状态)。这对于基于模型的控制 (model-based control) 和强化学习 (RL) 很重要。
- 行为 (Action): \(y\) 代表“应该执行的正确动作”。这是模仿学习 (imitation learning) 的核心。
-
核心挑战
-
如何产生高质量的训练数据 (\(y\))。
- 学习后如何有效应用到机器人控制中。
机器人的监督学习任务的核心是,将一个复杂的系统分解为一个已知部分和一个未知部分,然后用机器学习来逼近这个未知部分:
- \(\dot{x}\): 系统状态的变化率(例如,速度和角速度)。
- \(f_n(x, u)\): 已知的、理想的物理模型 (Nominal Model)。例如,在无风、无阻力环境下的动力学。
- \(f(x, c(t))\): 未知的、难以建模的“残差项” (Residual Term)。例如,风、水流阻力、摩擦力等。
通过监督学习,训练一个模型来准确预测这个未知的残差项 \(f(x, c(t))\)。
- 输入 (\(x_{train}\)): 机器人当前的状态 \(x\)。
- 输出 (\(y_{train}\)): 在真实世界中测量到的残差,即: \(y = \dot{x}_{\text{real}} - f_n(x, u)\)
例1:无人机在有风情况下穿环
- 挑战: 风力 \(f(x, c(t))\) 是一个未知的干扰,会使无人机偏离预定轨道。
- 解决方案:
- 无人机有一个基于已知模型 \(f_n\) 的基础控制器。
- 通过在有风环境中飞行收集数据,学习到一个“风力预测模型”来估计 \(f\)。
- 最终的控制器结合了已知模型 \(f_n\) 和学习到的残差模型 \(f\),能够主动补偿风力,实现精准控制。
例2:机械臂在水下抓取物体
- 挑战: 水的浮力和粘滞阻力 \(f(x, c(t))\) 是在空气中模型 \(f_n\) 未考虑到的未知因素。
- 解决方案:
- 在水下收集数据,计算出由水流作用引起的“残差力” \(f\)。
- 训练一个神经网络来学习这个残差力模型。
- 部署时,控制器会利用已知模型 \(f_n\),并加上学习到的模型 \(f\) 所预测的补偿力,以抵消水下环境的影响,实现精确抓取。