机器学习 课程笔记
绪论
机器学习的定义:
A computer program is said to learn from experience with respect to some task and some performance measure , if its performance on , as measured by , improves with experience . (Tom Mitchell, 1998)
机器学习 = 随着经验 的增加,完成任务 的表现 持续变好。
机器学习就是要寻找一个函数
我们希望从数据中学习一个映射:
其中:
- :输入空间(特征)
- :输出空间(标签)
训练集的数学表示:
其中,
:样本数量
每个样本由两部分组成:
- :第 个样本的特征
- :第 个样本的标签
训练的目标就是在训练集上学习一个函数:
机器学习的基本流程
机器学习整体流程非常固定,可分为三大步:
选择模型
选择一个模型(定义函数集合)等价于选择一个函数族:
例如:
线性回归:
神经网络:网络结构决定函数族的形状
SVM:决策边界的形式由模型选择决定
定义目标函数
即定义损失函数/似然函数/正则项,目标函数通常称为 或 。
下面按类别总结。
分类常用损失
- 0-1 损失(注:不可导,不用于训练,只用于评估。)
- 交叉熵损失(最常用),二分类:
回归常用损失
- 均方误差(MSE),光滑,可导,最常用。
- 平均绝对误差(MAE),抗离群点能力强。
- Huber 损失,结合 MSE 和 MAE 的优点。
概率推理相关损失
- KL 散度(常用于 VAEs)
- 最大似然(MLE)
目标是最大化似然:
等价于最小化负对数似然 NLL:
正则化(避免过拟合)
- L1 正则,使参数稀疏。
- L2 正则,使参数变小(权重衰减)。
- 范数约束
选择最优函数(训练 = 优化)
最常用方法:梯度下降。
其中:
- :学习率
- :目标函数
梯度下降是一个迭代求解最小值的过程。
随机梯度下降(SGD)每一步只使用一个样本或小批量样本:
优点:
- 更快
- 可以在线学习
- 适合大规模数据
机器学习的主要类型
监督学习(Supervised Learning)
利用带标签数据学习一个映射 。
任务:
- 分类
- 回归
关键点:
- 标签真实、明确
- 训练目标:拟合标签
半监督学习(Semi-supervised Learning)
结合少量标注 + 大量无标注数据。
两大基本假设:
聚类假设:同一聚类中的样本倾向于有相同的标签
流形假设:数据分布在低维流形上,局部相似 → 标签相似
无监督学习(Unsupervised Learning)
没有标签,从数据中发现结构。
任务:
- 聚类(k-means、层次聚类)
- 降维(PCA、LDA)
- 密度估计
强化学习(Reinforcement Learning)
Agent 与环境交互,通过累积奖励学习策略。
强化学习不是“靠标签”,而是凭 trial-and-error 学习。
| 类型 | 如何学习? |
|---|---|
| 监督学习 | 给定正确答案(指导) |
| 强化学习 | 给定奖励(好/坏),但没有对错标签 |
自监督学习(Self-supervised Learning)
从无标签数据中自动构造标签来训练模型。
例子:
- BERT:预测被 mask 的词
- GPT:预测下一个词
- SimCLR:预测不同视角的相似性
Yann LeCun:
如果人工智能是一块蛋糕,蛋糕的大部分是自监督学习,糖衣是监督学习,樱桃是强化学习。
- 意思:自监督学习未来最重要。
线性回归
监督学习概述
监督学习的任务类型:
- 回归(Regression):输出是连续值,如房价预测、温度预测。
- 分类(Classification):输出是离散类别,如图片识别、垃圾邮件分类。
监督学习的一般范式:
训练集形式:
- : 维特征
- :输出(回归时)或类别(分类时)
线性回归模型(Hypothesis)
给定 个特征,线性回归假设模型为:
是参数(权重),需要从数据中学习。
写成向量形式:
若将 扩展为:
则上式成立。
确定
我们需要一个 代价函数 (cost function)来衡量 与真实 的误差。
从样本数据推导损失函数:
- 原始误差表示:绝对误差(L1)
直观、可解释,但:
- 不可导(在 0 点不可导)
- 优化困难
- 更常用:平方误差(L2)
为了可导且数学简单,我们改为平方误差:
常见形式会加入 [1]:
线性模型的特点
- 形式简单
- 可解释性强( 的大小反映特征的重要性)
- 是许多非线性模型的基础
- 深度模型可以被看作线性模型的堆叠
模型训练前的特征规范化(Feature Normalization)
这部分很关键,如果不同特征量级差别巨大:
- 代价函数的等高线变得“狭长”
- 梯度下降效率极低
因此需要归一化:
解释:
- 减去均值:让数据居中
- 除以标准差:让尺度一致
作用:
让不同特征处于相近范围(通常是 到 之间),梯度下降会快很多。
最小二乘目标函数(Least Squares)
最终要优化的目标:
目标:找到能让模型预测接近真实 的参数 $\theta $。
线性回归的正规方程(Normal Equation)
如果不想用优化(如梯度下降),可以直接给出 的闭式解(closed-form solution)[2]。
构造矩阵 和向量
训练样本:
令:
用矩阵表示目标函数
首先:
因此:
平方和误差可以写成:
正规方程求解法
取导数:
令其 :
最终解为:
条件: 可逆(如果不可逆,则可以使用伪逆 )
梯度下降法求解
梯度下降法(Gradient Descent)是用来 最小化 一个目标函数 的最常用方法。
直觉上:
- 梯度(gradient)表示函数上升最快的方向
- 因此最陡下降方向是其反方向
所以我们更新参数的方法是:
其中:
- :学习率(step size)
- :梯度
如果不是要“下山”,而是要“爬山”(最大化):
梯度是指向上升最快方向的向量
- 要最大化 → 顺着梯度走
- 要最小化 → 逆着梯度走
梯度的数学意义
函数 的梯度是:
它代表在点 (x,y) 处函数上升最快的方向。
在参数一维情况下更新示例
假设只有一维参数 ,损失函数 :
- 如果导数为正 → 表示在右边函数变大 → 要往左(减小 )
- 如果导数为负 → 要往右(增大 )
线性回归的梯度推导
对于单个样本:
损失函数(单样本):
计算偏导:
因此更新规则(单样本):
这也叫 LMS(Least Mean Square)更新规则。
LMS 规则的性质如下:
更新量:
因此:误差越大,更新越快。
从单样本到多样本:BGD, SGD, Mini-Batch
- Batch Gradient Descent(批量梯度下降)
每次用所有样本的平均梯度:
特点:
- 每次更新很“准”,但速度慢
- 大数据集时很低效
- Stochastic Gradient Descent(随机梯度下降)
每次只用一个样本:
特点:
- 更新频繁 → 收敛快
- 会震荡 → 不会到精确最小值,但会接近它
- Mini-Batch Gradient Descent
折中方法:每次用 个样本(如32、64、128)。
优点:
- 稳定
- 高效
- GPU 适配
目前深度学习里最常用。
线性回归损失是凸函数
这部分证明线性回归的损失一定只有一个全局最优。
线性回归损失:
是一个 二次函数(quadratic function),对应一个“碗形”:
- 凸函数(convex function)
- 只有一个全局最小值,没有局部最小值
所以梯度下降一定能找到全局最优。
关于学习率 的讨论
如果 太小:
- 每一步走很慢,收敛慢
如果 太大:
- 跨过“山谷”,震荡甚至发散
解决方法:
现代优化算法使用动态学习率:
- Adagrad
- RMSProp
- Momentum
- Adam(RMSProp + Momentum)
Adam 最常用。
梯度下降和正规方程的对比
| 项目 | 梯度下降 | 正规方程 |
|---|---|---|
| 是否需要学习率 | 需要 | 不需要 |
| 是否需要迭代 | 是 | 否 |
| 是否需要特征归一化 | 需要 | 不需要 |
| 时间复杂度 | ,需要计算逆 | |
| 特征数量大时 | 可用 | 不可用 |
正规方程缺点:
- 需要矩阵 ,可能不可逆
- 特征维度大(如1万)时,求逆非常慢
所以实际工程中基本不用正规方程,深度学习完全都用梯度方法。
线性回归的概率解释(核心思想)
线性回归假设数据满足:
其中:
- 独立同分布
- 服从高斯分布
为什么服从高斯?中心极限定理:很多随机因素叠加会接近正态分布。
最小二乘 = 最大似然估计(MLE)
若误差为高斯分布,那么最大化似然就是最小化平方误差和,这是因为高斯分布概率密度:
要最大化似然,就是要最小化上式指数的负号部分:
这部分可以证明:
在高斯噪声假设下,最小二乘法是最大似然估计(MLE)得到的最优解。
即:
- 假设噪声 ~
- 写出似然函数
- 对数化
- 最大化似然
- 得到与最小二乘 完全等价
这个证明的意义是:
线性回归不仅仅是数学上的“平方误差最小”,而是统计意义上的 最优无偏估计。
这让线性回归有了非常强的理论基础。
线性回归的拓展
局部加权线性回归
普通线性回归给每个样本同等权重,而 局部加权线性回归(Locally Weighted Linear Regression, LWR)会根据预测点 的邻近程度,对样本赋予不同的权重 :
- 距离近 → 权重大
- 距离远 → 权重小
直观理解:我们希望“关注局部”,即预测时主要用邻近点的信息,而不是全局平均。
带权重的平方误差函数:
- :回归系数
- :样本 的权重
矩阵形式:
求解方法:
令偏导数为 0:
得到 加权正规方程:
求解参数:
与普通正规方程类似,只是加入了权重矩阵 。
权重选择
最常用的是 高斯核函数:
- :训练样本
- :预测点
- :控制“局部性”的参数
- 大 → 权重差异小 → 更像全局回归
- 小 → 权重差异大 → 只使用附近点
直观:预测点周围的点“更重要”,远的点几乎不参与。
非线性模型的多元回归
线性回归可以扩展到非线性特征,通过 特征变换:
- 可以是多项式、正弦、指数等函数
- 保留线性回归解法,只是特征被非线性映射
损失函数:
矩阵形式:
- 是映射后的特征矩阵
- 与普通线性回归求解方法相同
直观理解:线性回归“只对参数线性”,特征可以非线性 → 可拟合复杂关系。
机器学习中的若干讨论
样本离群点(Outliers)
极端值可能严重影响线性回归结果
对应方法:鲁棒回归(robust regression)、使用 L1 损失
欠拟合与过拟合
欠拟合(underfitting):模型太简单 → 对训练数据拟合不好
过拟合(overfitting):模型太复杂 → 对训练数据拟合好,但泛化差
直观理解:奥卡姆剃刀法则(Occam’s Razor):在多个可行模型中,选择最简单的能解释数据的模型
正则化(Regularization)
- L2 正则化(Ridge / 岭回归)
惩罚系数过大 → 参数更小 → 降低过拟合
- L1 正则化(LASSO 回归)
可以得到 稀疏解 → 自然完成特征选择
特征选择(Feature Selection)
选择重要特征,去掉冗余特征
LASSO 的稀疏解本质就是一种自动特征选择方法
逻辑回归
在线性回归中,目标变量 是连续的,而逻辑回归要解决 分类问题 (Classification):
- 输入:特征向量
- 输出:类别标签
最常见的是:
- 二分类
例如:
- 1:垃圾邮件,0:正常邮件
- 1:肿瘤恶性,0:肿瘤良性
- 1:人脸匹配成功,0:不匹配
- 多分类
一般多分类可以拆成多个二分类(如 One-vs-All 方法)。
从线性回归到分类器
为什么直接用线性回归不行?线性回归输出的是实数:
但分类需要输出:
- 明确类别标签
或
- 属于某一类的概率(更好)
线性回归有两个问题:
输出不是概率(可能 <0 或 >1),例如预测癌症概率不能得到 1.3 或 -0.8。
使用单位阶跃函数不可导,若我们强行使用“硬分类”:
这是 不连续 的,无法用梯度优化。
Sigmoid 函数(Logistic 函数)
逻辑回归的核心思想:
用线性函数得到一个值
再用 Sigmoid 将其变成一个概率
Sigmoid 函数:
关键性质:
时 → 1
时 → 0
输出永远在 之间
可导:
这正适合做 概率模型。
逻辑回归的假设函数:
解释:
- 输出 = 输入属于正类()的概率
概率视角 的表达
对于二分类:
可写成统一形式:
如果:
- → 保留前项
- → 保留后项
这为后面的似然函数打下基础。
Logit 几率比(odds ratio)
几率比:
例如:中彩票概率 0.1,则:
与逻辑回归的关系:
从模型:
推得:
再取对数(logit transform):
意义:
逻辑回归实际上在学习:
特征如何影响 log(几率比)
这是一种“线性解释的概率模型”。
用最大似然估计推导逻辑回归目标函数
“概率给事件,似然给参数”。
逻辑回归模型的似然:
因为样本独立同分布(i.i.d.),取对数 → 对数似然(便于推导):
这就是逻辑回归优化的目标。
使用梯度上升法优化参数
因为我们要最大化:
梯度上升更新规则:
注意可与线性回归做对比:
- 线性回归是梯度下降()
- 逻辑回归是梯度上升()
推导梯度
最终结论:
与线性回归几乎一样。
因此有,
随机梯度上升(SGD)更新:
Softmax 回归(多分类)
当类别:
Softmax 回归模型输出 个概率:
组合写法:
Softmax 是逻辑回归的多分类扩展:Sigmoid 是二分类概率归一化,Softmax 是 类概率归一化。
补充:Softmax 的目标函数是交叉熵,后面神经网络还会讲。
牛顿法(Newton Iteration)
牛顿法本质是:
利用一阶与二阶导数,通过“局部二次近似”求方程的根。
求方程 的牛顿公式:
目标求解:
牛顿迭代公式:
理解:
把 用泰勒展开近似成直线,然后找它的根。
函数根与最优化的联系
逻辑回归要做的是:
- 最大化对数似然函数
- 最大化等价于求一阶导数为 0 的点(极值点)
即:
把它看作方程:
将牛顿法用于逻辑回归
设:
牛顿更新变为:
Newton–Raphson 方法
适用于多维(向量)情况。
当 时:
- 一阶导 → 梯度向量
- 二阶导 → Hessian 矩阵
更新公式:
解释:
- 梯度:朝着最陡方向上升
- Hessian:告诉我们“弯曲程度”,调整步长避免震荡
- 本质:每次用二阶信息做“二次优化”
在逻辑回归中,这个方法叫 Fisher Scoring,
为什么?
- 逻辑回归中 Hessian 具有特定形式(负定),可写成期望形式
- 用期望替代 Hessian,就是 Fisher 信息矩阵
- 于是形成经典的 Fisher Scoring 更新:
这比梯度上升 更快收敛(通常只要几次迭代)。
牛顿法和梯度上升的比较:
| 方法 | 收敛速度 | 计算代价 | 适用场景 |
|---|---|---|---|
| 梯度上升 | 慢,一阶信息 | 低 | 高维参数、大数据 |
| 牛顿法 | 很快(二阶) | 需要计算 Hessian,代价高 | 参数维度较小的模型 |
逻辑回归一般维度不大,传统统计时代都用牛顿法求解。
模型评估方法与性能评价指标
逻辑回归属于分类模型,因此我们需要:
- 避免过拟合/欠拟合
- 正确划分数据集
- 正确评价模型性能
过拟合与欠拟合
过拟合:
模型过度学习训练集的细节+噪声 → 测试集表现变差
原因包括:
- 模型太复杂
- 特征太多
- 数据量太少
- 参数权重太大
解决:
- 正则化(L1/L2)
- 更多样本
- 降低特征维度
数据集划分
| 数据集 | 作用 | 比例 |
|---|---|---|
| 训练集 | 拟合模型 | 50%~80% |
| 验证集 | 调超参数 | 10%~20% |
| 测试集 | 最终评估,不能再调参 | 10%~30% |
常见划分方法:
留出法(Hold-out):一次性划分 训练 / 验证 / 测试。
- 缺点:容易受切分的随机性影响。
交叉验证(Cross-validation):将数据切成 折:
每次选择 折做验证
其他 折做训练
轮结果平均
最常用:
当 (样本数)时 → 留一法 LOOCV
自助法 Bootstrapping(有放回抽样):每次抽样 次(有放回),约有 样本落入测试集。
优点:
小数据集非常有用
Bagging 等集成学习强依赖该方法
分类性能指标
分类评价不仅仅是准确率。
混淆矩阵(Confusion Matrix)
| 预测正类 | 预测负类 | |
|---|---|---|
| 真实正类 | TP | FN |
| 真实负类 | FP | TN |
这是后面所有指标的基础。
准确率 Accuracy
适用于数据平衡的场景。
精确率 Precision(查准率)
预测为正的样本中,有多少是真正的正例。
用于:垃圾邮件、广告点击预测等 假正成本高 的任务。
召回率 Recall(查全率)
真实为正的样本中,有多少被找出来。
用于:疾病预测、地震预测、作弊检测等 漏报代价高 的任务。
F1 分数(调和平均)
当需要均衡 Precision 和 Recall 时使用。
平均每类准确率(Average Per-class Accuracy)
用于多分类:
比总体 Accuracy 更能体现多类任务中的表现。
ROC 曲线
横轴:FPR(假正例率)
纵轴:TPR(真正例率)= Recall
每个阈值对应一个 (FPR, TPR) 点,连接形成 ROC 曲线。
AUC
就是 ROC 曲线下的面积
- AUC = 1 → 完美分类器
- AUC = 0.5 → 随机猜测
- 越大越好
特点:
- 不受类别不平衡影响(非常重要)
- 光滑 ROC 曲线表明模型未过拟合
常用网络模型
卷积神经网络(CNN)
DNN(全连接网络)在图像上有一个致命问题:参数量爆炸:例如, 100×100 ×3 的彩色图片,如果用全连接层输入:
100 × 100 × 3 = 30,000 个输入节点
如果下一层是 1000 节点,则需要 3千万参数
非常容易过拟合。
而 CNN 利用图像特性,能够减少参数:
局部连接,图像的模式(边缘、纹理)一般都很局部,不需要覆盖全图,所以卷积只连接像素的一个小邻域(如 3×3)。
参数共享,同一模式会在不同区域出现,所以使用同一卷积核扫描整张图,参数量不随图像大小增长。
下采样不改变物体,所以池化层(Pooling)减少分辨率,但保留关键结构。
CNN 的典型结构
graph TD
A[Input Image] --> B[Convolution Layer]
B --> C[ReLU]
C --> D[Pooling Layer]
D --> E[Convolution Layer]
E --> F[ReLU]
F --> G[Pooling Layer]
G --> H[Flatten]
H --> I[Fully Connected Layers]
I --> J[Output]
Convolution Layer -> Pooling Layer 可以重复很多次。
| 操作 | 目的 | 效果 |
|---|---|---|
| Convolution | 找局部模式(边缘、纹理、形状) | 提取特征 |
| Parameter sharing | 同一卷积核扫全图 | 降低参数量 |
| Pooling | 降低分辨率 | 提高鲁棒性 |
| Multiple filters | 不同通道学不同特征 | 多层次特征提取 |
卷积层(Convolution Layer)
卷积核心思想:边界检测(edge detection)、特征提取。
卷积核是一个小矩阵,例如(Sobel 核):
1 | |
每个卷积核扫描整张图,得到一个 特征图(feature map)。
多通道输出:使用 个卷积核,就得到 个通道,通道数 = 卷积核数量。
卷积减少尺寸(不使用 padding 时):
如果输入大小为:
卷积核为
输出大小为
池化层(Pooling Layer)
池化层的作用有:
- 下采样 → 降低分辨率
- 保留关键特征,使模型对小变化具有稳定性(translation invariant)
- 降低参数量、计算量
常用池化方式:
最大池化 Max Pooling(最常用):选出区域中最大值
平均池化 Average Pooling
池化不会改变通道数:它只改变宽高,不改变通道数量。
常用参数:
窗口大小 2×2、步长 2
意味着区域不重叠,尺寸缩小一半
Flatten 层
Pooling 后的输出形状为:
1 | |
Flatten 会把每个样本摊平为一个向量:
1 | |
然后输入到全连接层(分类器)。
经典 CNN 架构
LeNet-5(1998)
- 用于手写数字(MNIST)识别
- 第一篇“实用性” CNN 论文(Yann LeCun)
LeNet 架构流程:
graph TD
A[Input 32x32 Image] --> B[Conv 5x5, 6 Channels]
B --> C[Avg Pool 2x2]
C --> D[Conv 5x5, 16 Channels]
D --> E[Avg Pool 2x2]
E --> F[Flatten]
F --> G[FC 120]
G --> H[FC 84]
H --> I[FC 10 Classes]
AlexNet(2012)
推动深度学习爆发的关键模型
- 更深层
- 使用 GPU 训练
- 使用 ReLU
- 使用 Dropout
- 在 ImageNet 取得显著突破
VGG(2014)
特点:
- 使用简单的结构:连续的 3×3 卷积堆叠
- 深度更大(16 或 19 层)
优点:结构规则,方便迁移学习
GoogLeNet(2014)
使用 Inception 模块(并行多尺度卷积)
ResNet(2015)
- 使用 残差结构(Residual block)
- 解决深度网络梯度消失问题
- 可训练上百层甚至上千层
ImageNet 数据集
ImageNet(李飞飞团队):
- 1500 万图像
- 22,000 个类别
- 大规模标注
推动深度学习的两大动力:
- 大数据(ImageNet)
- GPU 计算能力
之后才有 AlexNet、VGG、ResNet 等模型的发展。
循环神经网络(RNN)
序列建模的核心困难,需要让 RNN 解决。
以往的前馈网络(DNN/CNN)满足的结构是:
Input → Algorithm → Output
每个输入只对应一个输出,没有记忆能力。
但在许多任务中:
- 句子(文本)
- 声音(语音)
- 视频帧序列
- 行为序列、时间序列(金融预测)
当前时刻的输入必须依赖之前的上下文,没有记忆能力的模型无法完成。所以需要 RNN —— 能把之前的信息保存下来。
RNN 的核心思想:“隐状态(hidden state)是记忆,它跟随时间不断更新”
单步结构:
1 | |
数学表达:
- 隐状态更新
- 输出
隐状态 同时依赖当前输入 ,也依赖历史状态 ,这就是 RNN 可以“记住前文信息”的原因。
RNN 的时间展开(unrolling)
展开后的结构:
graph LR
S0((S0)) --> A1[Cell t=1]
A1 --> A2[Cell t=2]
A2 --> A3[Cell t=3]
A3 --> A4[Cell t=4]
X1 --> A1
X2 --> A2
X3 --> A3
X4 --> A4
A1 --> O1
A2 --> O2
A3 --> O3
A4 --> O4
输入顺序不同 → 隐状态传递不同 → 输出也不同,所以RNN 是顺序敏感的模型。
RNN 的变种结构
双向 RNN(Bi-RNN)
普通 RNN:
- 只能看到过去 → 不看未来
对于句子理解来说:
- 当前词意义通常依赖前文和后文
所以有:
← RNN (看未来)
→ RNN (看过去)
拼接两者输出:
graph LR
X1 --> F1[Forward RNN]
X2 --> F2[Forward RNN]
X3 --> F3[Forward RNN]
X1 --> B1[Backward RNN]
X2 --> B2[Backward RNN]
X3 --> B3[Backward RNN]
F1 --> C1[(Concat)]
B1 --> C1
F2 --> C2[(Concat)]
B2 --> C2
F3 --> C3[(Concat)]
B3 --> C3
Deep RNN(多层 RNN)
把多个 RNN 叠在一起:
RNN layer 1 → RNN layer 2 → …
提高模型表达能力。
RNN 的三个主要缺点
- 短期记忆问题
只能记住最近输入,无法处理长序列
因为每一步都对记忆进行“覆盖” - 训练困难
RNN 的时间展开非常长,梯度要跨时间回传 - 梯度消失和梯度爆炸
不适合学习长期依赖
这也是为什么要有 LSTM、GRU
LSTM:解决长期依赖问题
LSTM(1997)引入 记忆单元(cell state) + 三个门:
- 输入门
- 遗忘门
- 输出门
公式如下:
LSTM 核心机制
- 遗忘门决定忘多少历史
- 输入门决定写入多少新信息
- 输出门决定输出多少记忆
梯度可以沿着 长距离传播,不容易消失。
GRU:更轻量的 RNN
比 LSTM 少一个门,更简单、训练更快。
GRU 结构:
- 重置门
- 更新门
- 候选隐藏状态
GRU 和 LSTM 效果相似,但参数更少。
Attention 机制
心理学基础:注意力是“选择信息子集、集中关注”的过程。
在深度学习中:Attention = 根据重要性对输入序列加权,让模型专注于更相关的部分。
好处:
- 解决 RNN 的长距离依赖问题
- 更好的信噪比,提高性能
- 可以解释模型关注了哪里
- 是 Transformer、BERT、GPT 的基础
Seq2Seq with Attention
RNN Seq2Seq 的问题:
- 编码器要把整个句子压成一个向量(太难)
- 会丢失大量信息
- 长句效果差
注意力机制:
- 解码器的每一步都使用编码器所有隐藏状态按权重加权
- “动态取信息”,而不是用一个静态向量
Self-Attention(自注意力)
这是 Transformer 的核心。
Self-Attention 的输入是一个序列:
对每个 ,计算:
查询向量 (query)
键向量 (key)
值向量 (value)
对序列中的所有 pair 做 attention:
Softmax 归一化后,用这些权重加权 value:
这就是“自注意力”:每个位置都能看所有位置 → 并行计算 → 替代 RNN。
多头自注意力 Multi-Head Self Attention
一个头只能学习一种关系模式
例如:
- 语法依赖
- 主题相关
- 相邻词关系
- 长程依赖
多头注意力(Multi-Head Attention)让模型学多种模式。
做法:
- 把输入向量拆成多个子空间
- 每个子空间做一次 Self-Attention(称为一个“头”)
- 最后拼接(concat)各头的输出
- 再做线性变换
graph TD
A[Input Sequence] --> S1[Linear Q K V Projection for Head 1]
A --> S2[Linear Q K V Projection for Head 2]
A --> S3[Linear Q K V Projection for Head h]
S1 --> AT1[Self Attention Head 1]
S2 --> AT2[Self Attention Head 2]
S3 --> AT3[Self Attention Head h]
AT1 --> C[Concat]
AT2 --> C
AT3 --> C
C --> O[Linear Projection]
总结:
- 多头注意力 = 多种信息模式的组合
- Transformer 并行、高效、无序列依赖