第 27 章 · 番外

无监督与自监督学习

本书主线走的是监督学习(每条数据带标准答案)和强化学习(靠奖励试错)。 但第 0 章那张范式地图里还有一支我们一直没展开——无监督学习(unsupervised learning): 数据没有任何标签,模型要自己从中发现结构。这一章作为番外,把它讲清楚:这些方法到底有什么用, 以及聚类、降维(PCA)、自编码器、对比学习分别在什么场景下出场, 最后你会发现——其实这本书里,你早就见过它的身影

读前须知:这是主线外的加餐

这一章和主线关系不大,更像“开阔眼界”的一集番外,所以不要求你先读它——跳过完全不影响理解全书。 另外,和前面每章都对照 src/ 里真实实现不同,本章暂时还没有配套的 C++ 代码(聚类 / PCA / 自编码器仓库里都还没写)。 所以这一章会更偏原理和直觉,少几段“逐行读代码”;聚类 / PCA / 自编码器的 C++ 示例会在之后的版本里补进仓库。

读完这一章,你会明白

  • 无监督学习到底在解决什么问题,和监督学习差在哪;
  • 聚类、PCA、自编码器、t-SNE/UMAP、自监督分别有什么实际用途;
  • 聚类(以 K-means 为例):怎么把没有标签的数据自动分成几群;
  • 降维 / PCA:为什么能把高维数据“压扁”还不太失真,它在找什么方向;
  • 自编码器:用神经网络做“压缩—重建”,以及它和 PCA、大模型潜空间的关系;
  • t-SNE/UMAP 可视化、对比学习、自监督等高级主题的直觉;
  • 本书里哪些地方其实已经用到了无监督/自监督的思想。

1. 没有标签,能学什么?

监督学习像“有老师批改”:每条数据都配一个标准答案(这是猫、房价是 320 万)。 可现实里,绝大多数数据是没有标签的——你有一亿张图片、十亿条日志,但没人一条条标注过它们。 请人标注既慢又贵。那么问题来了:只有数据、没有答案,机器还能学到东西吗?

能。因为数据本身自带结构:相似的样本会挤在一起、很多维度其实高度相关、大部分信息可以用更少的“坐标”概括。 无监督学习干的就是把这些藏在数据里的结构挖出来,而不需要任何人工标签。它主要回答两类问题:

想干的事叫什么一句话典型方法
把数据分成几群聚类 clustering“物以类聚”——谁和谁像,就归一堆K-means、层次聚类、DBSCAN
把数据压到低维降维 dimensionality reduction用更少的坐标概括,还尽量不丢信息PCA、自编码器、t-SNE/UMAP

聚类关心“样本怎么分组”,降维关心“特征怎么压缩”——两条主线,下面各挑代表方法讲透。

和监督学习最本质的区别:没有“损失对答案”

监督学习的损失是“预测 vs 标准答案”的差距;无监督没有答案,那它拿什么当优化目标? 答案是——用数据自身的某种“合理性”当目标:聚类让“同群更紧、异群更远”,降维让“压扁再还原后丢的信息最少”。 目标变了,但“定义一个数、想办法让它变好”的套路没变。

1.1 先说用途:这些东西不是为了炫技

无监督/自监督的核心价值,不是“没有答案也能神奇预测答案”,而是在没人标注之前,先把数据整理出结构。 真实项目里,它们常常不是最终模型,而是数据分析、特征工程、预训练和排查问题的第一把刀:

方法它实际帮你做什么典型场景
聚类
自动分群
先不知道类别时,把相似样本聚成几堆,方便人给每堆起名字、制定不同策略 用户分层、商品分组、日志模式、客服问题归类
PCA / 降维
压缩和看结构
把几百上千维特征压小,去掉冗余维度,让训练更快、可视化更容易 高维表格特征、词向量/图像特征可视化、降噪、训练前预处理
自编码器
学表示 / 找异常
学会“正常样本怎么压缩再还原”;还原很差的样本,往往就是异常 工业故障检测、欺诈异常、图像去噪、生成模型潜空间
t-SNE / UMAP
把高维表示画出来
把 embedding 压成 2 维散点图,快速看类别是否分开、有没有脏数据和奇怪簇 检查 MNIST/文本/图像 embedding,展示模型学到的表示
对比学习 / 自监督
不用人工标签预训练
从原始数据里自动造题,先学通用表示,再拿少量标签微调 word2vec、语言模型预训练、CLIP、图文检索、大模型底座

一句话:聚类负责“分堆”,降维负责“压缩和看图”,自编码器负责“学表示和找异常”,自监督负责“用海量无标签数据预训练”。

项目里最常见的用法

拿到一堆没标签的数据时,常见顺序是: 先用 PCA / UMAP 画出来看看结构,再用聚类分群, 然后人工抽样给每群命名;如果后面要做分类/推荐/检索,再把聚类结果、低维表示或自监督 embedding 当成特征喂给下游模型。

2. 聚类:让数据自己“物以类聚”

聚类要解决的问题一句话:给一堆没有标签的点,自动把它们分成 K 群,让同群的尽量像、不同群的尽量不像。 比如把用户按行为分成几类、把新闻按主题归堆——事先谁都没告诉你“该分成哪几类”,是数据自己显出来的。

2.1 K-means:最经典的聚类

K-means 的思路朴素到你能自己想出来。先说好要分 K 群(比如 3 群),然后两步反复横跳直到稳定:

  1. 分配:每个点看离哪个“群中心”最近,就归到那一群;
  2. 更新:每一群把自己所有点的平均位置算出来,当作新的群中心;
  3. 回到第 1 步,直到中心不再挪动。
① 分配:各归最近的中心 每个点连到最近的 ✕ ② 更新:中心移到本群均值 ✦ = 新中心(该群所有点的平均)

K-means 就在“①分配 ②挪中心”之间反复,直到中心稳定。像磁铁和铁屑互相找平衡:点被最近的中心吸走,中心又被吸来的点拉向它们的重心。

它优化的“合理性”是一个能写出来的数——每个点到自己群中心的距离平方和(记作惯性 inertia),两步迭代每一轮都让它下降。 这其实和梯度下降精神一致:定义一个越小越好的目标,再一步步把它降下去,只是这里用的是“分配—平均”这种更直接的更新。

聚类到底有什么用?

聚类最有用的地方,是你还不知道类别长什么样的时候。比如电商里不知道用户有几种购买习惯, 先按浏览、加购、下单、价格敏感度聚成几群,再人工看每群画像:高频刚需、只看不买、低价敏感、一次性大单…… 后面运营策略、推荐策略、优惠券策略就能分开做。

它也常用于数据清理:某一小群样本离大家都很远,可能是异常用户、传感器故障、日志脏数据或攻击流量。 所以聚类不一定直接给最终答案,但很适合帮人快速看清“这堆数据里到底有几种东西”。

K-means 的三个坑

① K 要自己定:分几群没有标准答案,常用“手肘法”(看惯性随 K 下降的拐点)或轮廓系数来挑。
② 初始中心影响结果:随机初始可能收敛到差的局部解,实践里用 k-means++ 挑更分散的初始点,或多跑几次取最好。
③ 假设“圆形、大小相近”的群:它按距离硬分,遇到细长条、环形或密度差异大的分布会失灵——这时换 DBSCAN(按密度聚)、高斯混合(允许椭圆)等更合适。

3. 降维:把高维数据“压扁”还不太失真

很多数据维度高得吓人:一张 28×28 的图是 784 维,一个词向量几百维。 降维就是把它们压到很少的几维(比如 2 维好画图,或几十维喂给下游),同时尽量保住原来的信息。 为什么可能?因为高维数据往往“虚胖”——很多维度高度相关、真正有效的自由度远没那么多。

3.1 PCA:找到数据“最舒展的方向”

主成分分析(PCA)是最经典的降维。直觉:一团数据在高维空间里像一个橄榄球——它在某些方向上“铺得很开”(方差大、信息多),在另一些方向上“很扁”(方差小、几乎没信息)。 PCA 做的就是找出数据最舒展(方差最大)的那几个方向,把数据投影上去,扁的方向直接扔掉:

主方向 PC1(方差最大, 留) 次方向 PC2(方差小, 扔)

这团 2 维点其实“主要沿着 PC1 那条斜线铺开”。把每个点投影到 PC1 上,就用 1 个数(在这条线上的位置)近似了原来的 2 个数——降了一维,却几乎没丢信息,因为 PC2 方向本来就没多少变化。

把这个思路推广:PCA 找出一组互相垂直的主方向,按“数据在该方向上铺得多开”(方差)从大到小排序; 想降到 k 维,就留下k 个最舒展的方向,其余全扔。留下的这几个方向叫主成分。 比如把 784 维的手写数字压到 50 维,常常还能保住绝大部分“长相信息”。

PCA / 降维到底有什么用?

第一是看图:人最多直观看 2D/3D,但模型里的 embedding 动辄几百维。降到 2 维后, 你能快速看出“同类是否靠近、不同类是否分开、有没有明显脏数据”。这常用于检查一个表示到底学没学好。

第二是压缩:特征太多会让训练慢、存储大、噪声多。PCA 能把高度相关的维度合并成少数主成分, 既减少计算,也能缓解某些传统模型里“特征互相重复”的问题。

第三是降噪:如果小方差方向大多是测量误差或随机抖动,扔掉它们反而会让下游模型更稳。 但注意,PCA 只保留“方差大”的方向,不保证这些方向一定对业务标签最有用。

PCA 和你学过的东西的接口

PCA 本质是一次线性变换(矩阵乘法):把原始向量乘一个“投影矩阵”就得到低维坐标。 所以它只能抓线性结构——数据要是拧成一团麻花(非线性),PCA 就压不好了。想抓非线性,得请出下面的自编码器

4. 自编码器:用神经网络做“压缩—重建”

自编码器(autoencoder)是把降维交给神经网络来做,而且它是个绝妙的“无监督却用监督的办法训”的例子。结构像一个沙漏:

输入 x比如 784 维
编码器逐层压小
瓶颈 z比如 32 维
解码器逐层还原
重建 x′还是 784 维

自编码器:编码器把输入挤过一个又窄又细的“瓶颈”(低维 z),解码器再从 z 尽量还原出原图。中间那个 z,就是学到的低维表示。

它的训练目标特别巧:让输出 x′ 尽量等于输入 x 本身——损失就是“重建的图和原图差多少”(MSE)。 注意这里没有用到任何人工标签,答案就是输入自己——所以它是无监督的;但训练方法又完完全全是反向传播 + 梯度下降那一套。

为什么“照抄自己”能学到有用的东西?

关键在中间那个又窄的瓶颈:要把 784 维硬挤过 32 维、还能还原回去,网络就被逼着只保留最本质、最有信息量的特征,扔掉噪声和冗余。 如果瓶颈和输入一样宽,它可以偷懒直接“复制粘贴”,啥也学不到——正是“压缩”这个约束,逼出了有用的表示。 这个中间表示 z,就是我们要的降维结果,可以拿去聚类、可视化或喂给下游任务。

自编码器和 PCA 什么关系? 可以粗略地说:自编码器是 PCA 的“非线性升级版”。如果把编码器/解码器都限制成一层线性、不加激活,它学出来的其实和 PCA 几乎一样; 一旦加上多层和非线性激活,它就能抓 PCA 抓不到的弯曲结构。而“把输入压进一个低维潜空间(latent)再还原”这个思路,你在 第 20 章的 Stable Diffusion 里已经见过——它正是先用自编码器把图压进潜空间再去噪的。

自编码器到底有什么用?

异常检测是它最直观的用途:只拿正常机器声音、正常交易、正常图片训练自编码器。 上线后如果某条样本怎么也还原不好,说明它不像“正常样本”,就可以被标成可疑异常。

去噪和修复也是常见用法:输入带噪图片,目标仍是干净图片,模型会学到“哪些细节是结构、哪些只是噪声”。 这比简单滤波更灵活,因为网络能学非线性模式。

还有一个更深的用法是学潜空间:把复杂数据压成一个比较规整的 z, 后续生成模型、检索系统、聚类和可视化都可以在这个低维表示上工作。扩散模型把图片先压进潜空间再生成,就是这个思想的放大版。

5. 几个高级主题(建立个印象)

5.1 t-SNE / UMAP:专门为“看一眼”而生的降维

PCA 压到 2 维常常糊成一团,因为它只顾“保方差”、不擅长展示邻里关系t-SNEUMAP 是两种专为可视化设计的非线性降维:它们的目标不是还原,而是“原来挨得近的点,压到 2 维后还挨得近”。 你在很多论文里看到的“一团团漂亮的彩色散点图”(比如把 MNIST 压成 2 维,0–9 自动聚成十坨)基本都是它俩画的。

用它们看图别过度解读

t-SNE/UMAP 很擅长显示“谁和谁成团”,但图上团与团之间的距离、团的大小往往不可信(算法为了把局部邻里塞进 2 维,牺牲了全局尺度)。 所以它们是探索和展示的好工具,不能拿来当“距离测量仪”。

5.2 对比学习:不用标签,也能学出好表示

对比学习(contrastive learning)是近年最火的自监督表示学习思路,一句话:让“同一个东西的两个视角”在表示空间里靠近,让“不同东西”推远。 比如同一张猫图,随机裁剪/变色成两个版本,模型要学会“这俩其实是一个东西”(拉近),而与别的图(推远)。 全程不需要任何人工标签,却能学出非常通用的特征——你在 第 20 章文生图 里见到的 CLIP,正是用对比学习把“图和它的配文”拉近、把不配对的推远,从而把图文对齐到同一空间。

5.3 自监督:无监督和监督的“合体”

自监督(self-supervised)第 0 章提过的那个精妙变体:形式上没有人工标签(像无监督),却从数据里自动“抠”出答案来做监督式训练。 最典型的就是语言模型——把句子的下一个词盖住让模型猜,“被盖的词”就是免费的现成答案。

为什么自监督是大模型时代的主角

监督学习卡在“标注贵”,而自监督把无标注的海量数据变成了可训练的题库——这正是大模型预训练能吞下整个互联网的根本原因。 可以说:无监督/自监督思想,才是今天大模型规模的真正地基。严格分类上自监督常被看作无监督的一个分支,但因为它用的是监督式的训练机制,单独拎出来理解更清楚。

其实你早就见过它了

回头一看,无监督/自监督的影子在本书里到处都是:
· 第 15 章 word2vec——不用标签,靠“上下文共现”把词的语义学出来,是经典的自监督;
· 第 19 章 / 第 20 章预训练——遮词/预测下一个词,自监督的看家本领;
· 第 20 章 Stable Diffusion 的潜空间、CLIP——自编码器降维 + 对比学习对齐。
所以这一章与其说是“新知识”,不如说是给你散落各处的直觉起了个正式的名字、连成一张网

小结

  • 无监督学习:数据没有标签,靠“数据自身的合理性”当目标,挖出藏在里面的结构;两大任务是聚类和降维。
  • 聚类(K-means):定好 K 群,反复“分配到最近中心 → 中心移到群均值”;实际用途是用户分群、商品分组、日志模式发现和异常初筛。
  • 降维(PCA):找数据方差最大的几个正交主方向;实际用途是高维可视化、压缩、降噪和训练前预处理。
  • 自编码器:神经网络版降维,压过窄瓶颈再重建;实际用途是异常检测、去噪修复、学潜空间和给下游模型造表示。
  • 高级主题:t-SNE/UMAP 专为可视化(别过度解读全局距离);对比学习/自监督不用标签也能学好表示,是检索、图文对齐和大模型预训练的地基。
  • 本书的 word2vec、语言模型预训练、CLIP、Stable Diffusion 潜空间,处处是无监督/自监督的身影。

动手与思考

问题 1:无监督学习没有标签,那它拿什么当“损失/目标”?

拿数据自身的某种“合理性”当目标:K-means 最小化“每个点到自己群中心的距离平方和”;自编码器最小化“重建结果和原输入的差距”。目标不再是“预测 vs 人工答案”,而是“数据内部结构好不好”。

问题 2:自编码器明明在“照抄输入”,为什么还能学到有用的东西?

因为中间有个很窄的瓶颈。要把高维输入挤过低维瓶颈还能还原,网络被迫只保留最本质的信息、丢掉冗余和噪声——这个被压出来的低维表示就是有用的特征。如果瓶颈不窄,它会偷懒直接复制,什么也学不到。

问题 3:PCA 和自编码器有什么联系与区别?

都是降维。PCA 是线性变换,只能找“方差最大的直方向”,抓不了弯曲结构。自编码器用多层 + 非线性激活,能抓非线性结构——当它退化成单层线性、无激活时,学到的几乎就是 PCA。所以自编码器可视作 PCA 的非线性升级版。

问题 4:自监督为什么被说成“大模型的地基”?

因为它把海量无标注数据变成了可训练的题库(如“遮住下一个词让模型猜”,答案免费)。监督学习卡在标注昂贵,而自监督绕开了这道坎,才让大模型能拿整个互联网来预训练。

问题 5:拿到一堆没有标签的用户行为数据,想先看看用户大概分几类,该先用什么?

可以先用 PCA/UMAP 把高维行为特征压到 2 维看看结构,再用 K-means/DBSCAN 做聚类,最后人工抽样查看每群用户画像。聚类本身不负责给业务名字,它负责先把相似用户放到一起,方便人分析和制定策略。

下一章再看另一支主线之外的经典路线:在表格数据上至今仍是主力的决策树与随机森林