跳到主要内容

降维 II — 主题、瑞士卷与 t-SNE

这一章讲三件事: LDA 怎么把一篇文本读成「几个主题的配方」; 瑞士卷数据为什么压扁不行、摊平才行(LLE);t-SNE 凭什么把手写数字的 64 维摊成清清楚楚的 10 团。 上一章的 PCA 假设「数据是平的」;这一章的两个算法,专门处理「数据是弯的」和「数据是文本」。

1. LDA:每篇文本,都是一份主题配方

一篇新闻可能只有一个主题,也可能体育、教育混着来。LDA 的全名是「隐含狄利克雷分布」——分布,指的是数据落在各取值上的可能性表——它把文本中的单词当输入,给每篇文本分配多个主题

这类从文本里自动找出主题的活计,行话叫主题建模1

两个关键设定先立住:

  • 主题 = 单词的概率分布:「体育主题」不是一个人工标签,而是一袋按概率排队的词——「比赛 0.08、球队 0.06、赛季 0.05……」;
  • 文本 = 主题的概率分布(主题分布):一篇文本是「体育 70% + 教育 30%」的配方2

主走查:5 句英文,拧出「学校」和「运动」两个主题

原书用 5 句英文例句演示,规定主题数为 23:

输入:
① We go to school on weekdays.
② I like playing sports.
③ They enjoyed playing sports in school.
④ Did she go there after school?
⑤ He read the sports columns yesterday.

第一轮:给每个单词乱分配主题(纯随机)
主题A: school, they, go…
主题B: sports, read, like…

逐词重分配(多轮):对每个词问——
「本句的主题倾向 × 该词在各主题下的流行度」哪个组合更可能?
①④ 的 school 们 → 越来越倾向主题A
②③⑤ 的 sports 们 → 越来越倾向主题B

收敛后(原书结果):
主题A 的代表词:school 主题B 的代表词:sports
每句话也拿到了配方:③ = A 与 B 的混合
(①③④ 都含 school → 偏 A;②⑤ 偏 B)

学习过程是循环的五步:随机分配 → 数每篇文本的主题占比 → 数每个主题的词分布 → 按两个概率的乘积重新分配每个词 → 重复到不再变化4。妙处在于它自己给自己正反馈:同一句里的词趋向同一主题,而同一主题的词又反过来更容易吸引同类词——转着转着,主题就从随机噪声里「结晶」出来了5

真实语料上:能读的主题与不能读的主题

原书用 20 Newsgroups(20 个主题的新闻组文本集合)跑真数据,主题数为 206。看主题的代表词就能人肉验收:

主题高概率词人肉判读
主题 16game team year games season play hockey…体育 ✓
主题 18windows drive card scsi disk… pc计算机 ✓
主题 400 10 25 15 12 11 16 20…全是数字,读不出主题
主题 6people said know did don didn just…全是口水词,读不出主题

后两种病,药方是停用词——为了提高精度而预先排除在外的单词(数字、口水话这类没有区分力的词)7

验收的最后一环:拿一篇真实文本的主题分布反着读。某文本主题 18 的成分最高,于是断定它是计算机文本——查真实标签,正是 comp.sys.mac.hardware,苹果 Mac 相关的帖子8。原书总结:LDA 的价值在于「只用单词描述文本很难直观理解,但用主题就能描述文本的特征」9——降维换来的新坐标,这次每个坐标都有人话名字

2. LLE:数据是卷的,别压,摊

瑞士卷:压扁 ≠ 展开

LLE 的全名直译是「局部线性嵌入」——嵌入,指的是把数据安放到一个新空间——它属于流形学习(处理非线性结构的降维方法)10。它的招牌教材叫瑞士卷:一张二维长方形「卷」进了三维空间,像一块卷起来的蛋糕胚11

瑞士卷数据(三维)与两种降维:

卷起来的蛋糕胚 PCA「压扁」 LLE「摊开」
╭────────╮ ████████ ← 两层颜色 ██▓▓████
╱ ○○○○ ╱│ ████████ 混在一起 一条干净的
╱ ○○○○ ╱ │ (不相邻的点叠 色带
╲______╱ │ 在同一位置)
(色带是卷面上「原来第几行」的颜色)

图说:PCA 把整个卷沿一个方向砸扁,卷面上下两层叠在一起,
原来不相邻的点挤成一团;LLE 把卷展开,色带还原成平面色带。
(图形示意;结论出自原书图 3-25 的对照[^12])

PCA 对此无能为力:它擅长处理「变量相关」的平摊数据,对「卷起来」的非线性结构只会整体压扁,把不同层的点压到一起。原书的判词:瑞士卷这类数据,更适合 LLE 这样的方法12

主走查:三个坐标,两枚权重,一次可验算的展开

LLE 的世界观只有一句话:每个点都能用它附近的几个点「调配」出来,而且这个配方在低维世界里照样好使。原书给了完整数字,我们可以当场验算13:

高维世界(三维):
目标点 x1 = (1, 1, 1)
邻居 x2 = (−1, 0, −1), x3 = (2, 3, 2)
权重 w12 = −1/3, w13 = 1/3

验算:w12·x2 + w13·x3
= (−1/3)×(−1,0,−1) + (1/3)×(2,3,2)
= (1/3, 0, 1/3) + (2/3, 1, 2/3)
= (1, 1, 1) = x1 ✓ 分毫不差

低维世界(二维):把三个点挪到平面上(不许扭转三者的关系),
x1 的新坐标 y1 仍用同一对权重 w12=−1/3、w13=1/3 从 y2、y3 调配。

LLE 的三步正好对应这段验算:找 k 个近邻 → 求出「能调配出 xi」的权重(权重只落在近邻身上,且每个点的权重加起来等于 1)14把权重原样冻住不动,在低维空间里给每个点找新座位,仍按原配方满足「邻居调配出我」15。权重记录的是「局部关系」——求出之后就原样冻住不动——而原书点明其成立的前提:近邻点之间的小片区域是不弯曲的——卷面再卷,拿放大镜看每一小片都是平的16

「流形」这个词由此可以解释清了:原书给的口径是,流形就是「从局部来看是低维空间的结构被埋藏在高维空间里」;地球是球,但给街区画平面地图没问题——局部看,地球是平的17

近邻数:太疏太密都翻车

近邻数量 k 是 LLE 最敏感的超参数18:k=5 时取到的邻居太小气,展开后所有点挤在狭窄区域,看不出结构;k=50 时邻居又太多,把「隔着山谷」的点也当近邻,不同颜色的点在二维图上混到一起——局部结构被吃掉了。原书的告诫:必须慎重设置19

3. t-SNE:为可视化而生的「团块分离器」

t-SNE 的全名直译是「t 分布随机邻域嵌入」——嵌入,指的是把数据安放到一个新空间——它把高维复杂数据降到二维或三维,专门用于可视化20。它和 LLE 同属流形学习,但技艺更狠。

机制:两张「相似度表」,逼右边像左边

t-SNE 不直接搬坐标,它搬的是关系。相似度不用距离量,用概率分布量:离得越近的两个点,相似度越高21。流程四步22:

① 在高维空间,用高斯分布(中间高、两边低的钟形概率曲线)算出所有点对的相似度表 pij
(谁跟谁近,记成一张 6×6 的表)
② 在低维平面随机撒下同样多的点,用 t 分布算它们的相似度表 qij
③ 挪动低维的点,让 qij 越来越像 pij
④ 重复 ③,直到不再变化

图说:t-SNE 的目标一句话——
「低维世界里点与点的亲疏,必须复现高维世界里的亲疏」。

关键在 ② 里那个 t 分布。它是「重尾」的钟形曲线——尾巴比高斯分布(第 ① 步用的那条钟形曲线)更肥。效果(原书原话):高维原本很近的结构,在低维变得更近;原本较远的,变更远23。挪点时,让 qij 一格格去贴 pij,近的 pair 互相吸附、远的 pair 互相排斥——团块之间被硬生生推开。原书展示了瑞士卷数据在第 250、500 次更新时逐渐分化的过程24

主走查:64 维手写数字的「摊牌」

原书的三算法对比用的是手写数字:8×8=64 维,10 种数字就是 64 维空间里的 10 种结构25:

同一份手写数字数据,三种降维到二维:
PCA → 大致按数字归类,但每团里混着别的数字(64 维摊平
的方向只有一个「最摊开」的,顾不了类别之间的间隔)
LLE → 不理想:手写数字不像瑞士卷那样点挨着点卷成一片,
局部关系搭不起来
t-SNE → 10 团,团团分明,按数字干净归类 ✓

图说:结论出自原书图 3-34 的对照解说[^26]。

代价与纪律

t 分布的重尾也标了价格:t-SNE 只适合降到 2~3 维——原书解释,高维空间里重尾导致远离中心的区域占主导、局部信息保不住,降到四维以上就不行了26。另外,「t-SNE 图上两团离得远」不等于「高维世界里这两类距离远」——它为了分开团块可以任意伸缩全局距离,这点原书没有明说,但读者极易读歪,特此补上(补充:不在书里,来自通用知识;这是 2016 年后可视化社区反复强调的使用纪律)。

4. 作者的判断与证据

说法性质依据
主题 A 代表词 school、B 代表词 sports书内给出推测结果书内示例3
重复计算使主题概率自增强作者的机制解说书内讲解5
主题 16/18 可读、4/6 不可读书内给出真实输出词表对照6
x1 可由 w12=−1/3、w13=1/3 调配书内给出坐标,可验算(我们验算通过)书内数字13
近邻数 5 太疏、50 太密书内图示对照图示19
t 分布使近者更近远者更远作者的机制描述,图形直觉、无证明书内陈述23
t-SNE 只能降 2~3 维作者给出理由(重尾→局部信息丢失)书内陈述26

5. 边界与局限

  • LDA 的主题数是人为定的超参数;原书例子里「规定主题数为 2」是外部给定,没有给选主题数的方法。
  • LDA 产出的主题仍需要人来命名——算法给你一袋词,「这是体育主题」这个判断始终是人做的(原书的 16/18 判读本身就是人肉)。
  • LLE 与 t-SNE 都是「可视化工具」多于「建模工具」:它们给出新坐标,但新数据来了该放到哪儿,没有现成答案(PCA 有)——原书未提此差异(补充:不在书里,来自通用知识)。
  • t-SNE 每次运行结果不同(随机初始化),且对它的几个调节旋钮敏感——原书未提(补充:不在书里,来自通用知识)。
  • 版本提示:LatentDirichletAllocation(n_components=20)LocallyLinearEmbedding(n_neighbors=12, n_components=2)TSNE(n_components=2);瑞士卷数据用 make_swiss_roll(n_samples=1500) 生成27。t-SNE 的出处论文是 van der Maaten 与 Hinton 2008 年发表的可视化论文28

6. 可带走的

  1. LDA 的世界观:主题=一袋按概率排队的词,文本=主题的配方;
  2. 主题是「拧」出来的:随机分配起步,靠「句内一致性 × 词-主题流行度」反复重分配,自增强直到收敛;
  3. 验收主题靠人肉读代表词;读不出主题的(数字、口水词)用停用词清理;
  4. 瑞士卷教训:对卷起来的数据,压扁(PCA)和展开(LLE)是两种不同操作;
  5. LLE 的全部信仰:局部能调配、配方冻不动——近邻小片永远不弯;
  6. 近邻数是 LLE 的命门:太疏丢结构,太密吃掉局部;
  7. t-SNE 搬的是关系不是坐标:两张相似度表逐格贴合,团块自动分离;
  8. t 分布的重尾是双刃剑:团块分得开,但只肯降到 2~3 维,且团间距离不可当真;
  9. 降维选型口诀:变量相关选 PCA,要主题选 LDA,卷起来的选 LLE/t-SNE,做图选 t-SNE。

7. 原文地图

主题原书章原文位置
LDA 定义、多主题3.4 算法13:LDAtext/18-ch03-04-3-4-13-lda.txt:6(搜「为其分配多个主题」)
主题=单词概率分布3.4 算法13:LDAtext/18-ch03-04-3-4-13-lda.txt:23(搜「主题看作单词的概率分布」)
5 例句、主题数 23.4 算法13:LDAtext/18-ch03-04-3-4-13-lda.txt:15(搜「主题数为 2」) · text/18-ch03-04-3-4-13-lda.txt:24(搜「sports 是主题 B 的代表性单词」)
生成模型3.4 算法13:LDAtext/18-ch03-04-3-4-13-lda.txt:46(搜「就能得到生成文本的模型」)
学习五步、自增强3.4 算法13:LDAtext/18-ch03-04-3-4-13-lda.txt:60(搜「随机分配主题」) · text/18-ch03-04-3-4-13-lda.txt:67(搜「某些主题被选中的可能性较大」) · text/18-ch03-04-3-4-13-lda.txt:64(搜「直到收敛」)
20 Newsgroups3.4 算法13:LDAtext/18-ch03-04-3-4-13-lda.txt:73(搜「20 个主题的新闻组文本」)
主题 16/18/4/63.4 算法13:LDAtext/18-ch03-04-3-4-13-lda.txt:143(搜「game team year games season」) · text/18-ch03-04-3-4-13-lda.txt:147(搜「windows drive card scsi disk」) · text/18-ch03-04-3-4-13-lda.txt:156(搜「00 10 25 15 12 11」) · text/18-ch03-04-3-4-13-lda.txt:152(搜「为了提高精度而排除在外的单词」)
Mac 文本判定3.4 算法13:LDAtext/18-ch03-04-3-4-13-lda.txt:161(搜「可以断定这是关于计算机的文本」)
用主题描述文本3.4 算法13:LDAtext/18-ch03-04-3-4-13-lda.txt:165(搜「很难直观地理解」)
流形学习、瑞士卷3.7 算法16:LLEtext/21-ch03-07-3-7-16-lle.txt:10(搜「流形学习」) · text/21-ch03-07-3-7-16-lle.txt:13(搜「被卷曲后埋藏在三维空间」)
LLE 取出、PCA 压扁3.7 算法16:LLEtext/21-ch03-07-3-7-16-lle.txt:15(搜「将原始数据压扁的方式进行降维」)
主走查:三个点两枚权重3.7 算法16:LLEtext/21-ch03-07-3-7-16-lle.txt:27(搜「的线性组合来表示它」) · text/21-ch03-07-3-7-16-lle.txt:28(搜「w13 = 1/3」) · text/21-ch03-07-3-7-16-lle.txt:29(搜「在不扭转三维空间的 3 个点之间的关系」)
局部不弯曲3.7 算法16:LLEtext/21-ch03-07-3-7-16-lle.txt:32(搜「近邻点之间是不弯曲的空间」)
三步、约束3.7 算法16:LLEtext/21-ch03-07-3-7-16-lle.txt:49(搜「近邻点(k 个)」) · text/21-ch03-07-3-7-16-lle.txt:81(搜「约束条件」)
流形定义、地球地图3.7 算法16:LLEtext/21-ch03-07-3-7-16-lle.txt:128(搜「从局部来看是低维空间的结构被埋藏在高维空间里」) · text/21-ch03-07-3-7-16-lle.txt:126(搜「绘制平面地」)
近邻数 5/503.7 算法16:LLEtext/21-ch03-07-3-7-16-lle.txt:136(搜「聚集在一个狭窄的区域」) · text/21-ch03-07-3-7-16-lle.txt:137(搜「无法把握」) · text/21-ch03-07-3-7-16-lle.txt:138(搜「必须慎重设置」)
t-SNE 定义3.8 算法17:t-SNEtext/22-ch03-08-3-8-17-t-sne.txt:5(搜「用于低维空间的可视化」)
t 分布效果3.8 算法17:t-SNEtext/22-ch03-08-3-8-17-t-sne.txt:21(搜「很近的结构在低维空间中变得更近」)
四步流程3.8 算法17:t-SNEtext/22-ch03-08-3-8-17-t-sne.txt:27(搜「使用高斯分布来表示」) · text/22-ch03-08-3-8-17-t-sne.txt:30(搜「尽可能相似」)
相似度用概率分布3.8 算法17:t-SNEtext/22-ch03-08-3-8-17-t-sne.txt:34(搜「概率分布来衡量的」)
pij 与 qij 对齐3.8 算法17:t-SNEtext/22-ch03-08-3-8-17-t-sne.txt:73(搜「再现高维空间中各」)
只能 2~3 维3.8 算法17:t-SNEtext/22-ch03-08-3-8-17-t-sne.txt:85(搜「局部信息将无法保留」)
更新 250/500 次3.8 算法17:t-SNEtext/22-ch03-08-3-8-17-t-sne.txt:77(搜「随着更新次数的增加」)
手写数字 64 维、三算法对比3.8 算法17:t-SNEtext/22-ch03-08-3-8-17-t-sne.txt:122(搜「10 种不同结构的 8 × 8」) · text/22-ch03-08-3-8-17-t-sne.txt:133(搜「很好地对结构完成了分类」)
代码与论文出处3.8 算法17:t-SNEtext/22-ch03-08-3-8-17-t-sne.txt:97(搜「TSNE(n_components=n_components)」) · text/22-ch03-08-3-8-17-t-sne.txt:136(搜「Visualizing data using t-SNE」)
LLE 代码3.7 算法16:LLEtext/21-ch03-07-3-7-16-lle.txt:101(搜「make_swiss_roll」)

Footnotes

  1. 出处:「3.4 算法13:LDA」第 6 段(text/18-ch03-04-3-4-13-lda.txt:6,搜「为其分配多个主题」)。「主题建模」这个名字来自第 72 段(text/18-ch03-04-3-4-13-lda.txt:72,搜「主题模型的创建」)。

  2. 出处:「3.4 算法13:LDA」第 23 段(text/18-ch03-04-3-4-13-lda.txt:23,搜「主题看作单词的概率分布」)与第 25 段(text/18-ch03-04-3-4-13-lda.txt:25,搜「主题的概率分布(主题分布)描述各文本」)。

  3. 出处:「3.4 算法13:LDA」第 15 段(text/18-ch03-04-3-4-13-lda.txt:15,搜「主题数为 2」);5 个例句在第 17~21 段;结果在第 24 段(text/18-ch03-04-3-4-13-lda.txt:24,搜「sports 是主题 B 的代表性单词」)。 2

  4. 出处:「3.4 算法13:LDA」第 60~64 段(text/18-ch03-04-3-4-13-lda.txt:60,搜「随机分配主题」;text/18-ch03-04-3-4-13-lda.txt:64,搜「直到收敛」)。

  5. 出处:「3.4 算法13:LDA」第 66~69 段(text/18-ch03-04-3-4-13-lda.txt:67,搜「某些主题被选中的可能性较大」)与第 68 段(搜「文本分配到特定主题的概率就会增加」)。 2

  6. 出处:「3.4 算法13:LDA」第 73 段(text/18-ch03-04-3-4-13-lda.txt:73,搜「20 个主题的新闻组文本」);主题词表在第 142~158 段(text/18-ch03-04-3-4-13-lda.txt:143,搜「game team year games season」;text/18-ch03-04-3-4-13-lda.txt:147,搜「windows drive card scsi disk」;text/18-ch03-04-3-4-13-lda.txt:156,搜「00 10 25 15 12 11」)。 2

  7. 出处:「3.4 算法13:LDA」第 152 段(text/18-ch03-04-3-4-13-lda.txt:152,搜「为了提高精度而排除在外的单词」)。

  8. 出处:「3.4 算法13:LDA」第 161~162 段(text/18-ch03-04-3-4-13-lda.txt:161,搜「可以断定这是关于计算机的文本」)。

  9. 出处:「3.4 算法13:LDA」第 165~166 段(text/18-ch03-04-3-4-13-lda.txt:165,搜「很难直观地理解」)。

  10. 出处:「3.7 算法16:LLE」第 10 段(text/21-ch03-07-3-7-16-lle.txt:10,搜「流形学习」)。

  11. 出处:「3.7 算法16:LLE」第 13 段(text/21-ch03-07-3-7-16-lle.txt:13,搜「被卷曲后埋藏在三维空间」)。

  12. 出处:「3.7 算法16:LLE」第 1415 段(text/21-ch03-07-3-7-16-lle.txt:15,搜「将原始数据压扁的方式进行降维」)与第 1617 段(搜「更适合采用 LLE」)。

  13. 出处:「3.7 算法16:LLE」第 27~29 段(text/21-ch03-07-3-7-16-lle.txt:27,搜「的线性组合来表示它」;text/21-ch03-07-3-7-16-lle.txt:28,搜「w13 = 1/3」;text/21-ch03-07-3-7-16-lle.txt:29,搜「在不扭转三维空间的 3 个点之间的关系」)。验算的逐步展开是我们补的,原书数字全部照录。 2

  14. 出处:「3.7 算法16:LLE」第 49~53 段(text/21-ch03-07-3-7-16-lle.txt:49,搜「近邻点(k 个)」)与第 81 段(text/21-ch03-07-3-7-16-lle.txt:81,搜「约束条件」;权重和为 1)。

  15. 出处:「3.7 算法16:LLE」第 59 段(text/21-ch03-07-3-7-16-lle.txt:59,搜「低维(d 维)的」)与第 84~92 段(搜「这种关系在低维空间中也得以」)。

  16. 出处:「3.7 算法16:LLE」第 32 段(text/21-ch03-07-3-7-16-lle.txt:32,搜「近邻点之间是不弯曲的空间」)。

  17. 出处:「3.7 算法16:LLE」第 125~128 段(text/21-ch03-07-3-7-16-lle.txt:128,搜「从局部来看是低维空间的结构被埋藏在高维空间里」;text/21-ch03-07-3-7-16-lle.txt:126,搜「绘制平面地」)。

  18. 出处:「3.7 算法16:LLE」第 133 段(text/21-ch03-07-3-7-16-lle.txt:133,搜「定义为超参数」)。

  19. 出处:「3.7 算法16:LLE」第 134~138 段(text/21-ch03-07-3-7-16-lle.txt:136,搜「聚集在一个狭窄的区域」;text/21-ch03-07-3-7-16-lle.txt:137,搜「无法把握」)。 2

  20. 出处:「3.8 算法17:t-SNE」第 5 段(text/22-ch03-08-3-8-17-t-sne.txt:5,搜「用于低维空间的可视化」)。

  21. 出处:「3.8 算法17:t-SNE」第 33~34 段(text/22-ch03-08-3-8-17-t-sne.txt:34,搜「概率分布来衡量的」)。

  22. 出处:「3.8 算法17:t-SNE」第 27~31 段(text/22-ch03-08-3-8-17-t-sne.txt:27,搜「使用高斯分布来表示」;text/22-ch03-08-3-8-17-t-sne.txt:30,搜「尽可能相似」)。

  23. 出处:「3.8 算法17:t-SNE」第 20~21 段(text/22-ch03-08-3-8-17-t-sne.txt:21,搜「很近的结构在低维空间中变得更近」)。 2

  24. 出处:「3.8 算法17:t-SNE」第 76~81 段(text/22-ch03-08-3-8-17-t-sne.txt:77,搜「随着更新次数的增加」)。

  25. 出处:「3.8 算法17:t-SNE」第 122 段(text/22-ch03-08-3-8-17-t-sne.txt:122,搜「10 种不同结构的 8 × 8」)。

  26. 出处:「3.8 算法17:t-SNE」第 84~86 段(text/22-ch03-08-3-8-17-t-sne.txt:85,搜「局部信息将无法保留」)。 2

  27. 出处:「3.7 算法16:LLE」第 101 段(text/21-ch03-07-3-7-16-lle.txt:101,搜「make_swiss_roll」);t-SNE 代码在「3.8 算法17:t-SNE」第 97 段(text/22-ch03-08-3-8-17-t-sne.txt:97,搜「TSNE(n_components=n_components)」)。

  28. 出处:「3.8 算法17:t-SNE」第 136 段(text/22-ch03-08-3-8-17-t-sne.txt:136,搜「Visualizing data using t-SNE」)。van der Maaten 与 Hinton,2008 年。