MIT深度学习课程第六讲:Standalone Embeddings 与 GloVe
本节课继续 natural language processing 单元。
上一节课介绍了:
Bag of Wordsone-hot encodingTextVectorization- 基于歌词的 genre classification
本节课进入:
embeddings更准确地说,本节讲的是:
standalone embeddings也就是不随上下文变化的词向量。
老师说明,本节内容会为后面的:
contextual embeddings做铺垫,而 contextual embeddings 正是 transformer 真正发挥作用的地方。
一、本节课目标
本节课要解决的问题是:
如何用更紧凑、可学习、并且包含语义信息的 vectors 表示 words?
课程主线包括:
- 回顾
STIE与one-hot vectors。 - 分析
one-hot vectors的计算问题和语义问题。 - 说明好的 word vectors 应该具备什么几何性质。
- 引入
standalone embeddings与contextual embeddings的区别。 - 用
co-occurrence matrix解释GloVe如何学习 embeddings。 - 说明 embedding dimensions、bias、loss、gradient descent 等训练细节。
- 在
Keras中使用TextVectorization与Embeddinglayer。 - 用预训练
GloVe、fine-tunedGloVe和从零训练 embeddings 做歌词分类。
二、回顾 STIE 与 One-Hot Text Encoding
老师先回顾上一节课的文本处理流程。
对于一个输入 phrase,系统会执行:
S-T-I-E即:
standardizationtokenizationindexingencoding
具体过程是:
- 先对文本做 standardization。
- 再按 whitespace 切分成 individual words。
- 给每个 word 分配 integer。
- 把每个 integer 转换成对应的 one-hot vector。
三、Keras 默认 Standardization 的提醒
老师特别提醒,历史上 standardization 往往包括:
- stripping punctuation
- lowercasing
- removing stop words
- stemming
但现代实践中,很多人只做一部分。
在 Keras 中,默认 standardization 通常只做:
- lowercasing
- punctuation stripping
它默认不会做:
- stemming
- stop-word removal
因此,课堂示例 vocabulary 中仍然会出现 the 这样的 stop word,因为本例没有把 a、and、the 这类词删除。
老师提到,这个细节可能对 homework 2 有帮助。
四、One-Hot 后可以做 Multi-Hot 或 Count Encoding
对于每个 word,one-hot vector 的长度等于 vocabulary size。
如果要把多个 words 聚合成一个文本级别的 vector,可以:
- 把 one-hot vectors 相加,得到
count encoding。 - 对每一列做 OR,只关心是否出现过,得到
multi-hot encoding。
这是上一节 Bag of Words 的基本表示。
老师指出,这种方法对简单问题很有效,但有严重局限。
五、One-Hot Vectors 的第一个问题:计算成本高
如果 vocabulary 很长,每个 token 的 one-hot vector 也会非常长。
例如,vocabulary 中有:
500,000 words那么每个 word 都会变成长度:
500,000的 vector。
这会带来几个问题:
- 表示极其稀疏。
- 计算资源浪费。
- 模型第一层参数数量增加。
- 需要更多 compute。
- 需要更多 data。
- 更容易过拟合。
可以通过只保留最常见 words 缓解,但并不能从根本上解决问题。
六、One-Hot Vectors 的第二个问题:没有语义距离
学生首先指出,one-hot encoding 无法表达相似词之间的关系。
例如:
this house is great
this house is awesomegreat 和 awesome 意义相近,但 one-hot vector 会把它们表示成完全不同的位置。
老师总结,理想的词向量应当满足:
- 意义相近的 words 对应 vectors 应该接近。
- 意义差异大的 words 对应 vectors 应该远离。
one-hot vectors 不具备这个性质。
七、Movie 与 Film 的距离示例
老师用 movie 和 film 举例。
假设 vocabulary size 是:
100,000那么:
movie的 one-hot vector 在movie对应位置为1,其他位置为0。film的 one-hot vector 在film对应位置为1,其他位置为0。
如果用 Euclidean distance 计算两者距离:
- 两个
1不在同一位置。 - 相减后会出现两个差值为
1的位置。 - 平方并求和得到
2。 - 开根号得到:
sqrt(2)因此,movie 与 film 的 one-hot 距离是:
sqrt(2)八、Good 与 Bad 的距离也是 sqrt(2)
老师接着问:
good和bad意义相反,它们的 one-hot distance 是多少?
答案仍然是:
sqrt(2)原因相同:
- 两个 words 的
1出现在不同位置。 - 所有其他位置都是
0。 - Euclidean distance 仍然是
sqrt(2)。
更一般地说:
vocabulary 中任意两个不同 words 的 one-hot distance 都是
sqrt(2)。
这意味着 one-hot vectors 几乎没有真正的 semantic distance 概念。
九、One-Hot 的核心缺陷总结
老师总结 one-hot vectors 有两个主要问题:
- 计算问题:vocabulary 长时,vector 过长,参数、compute 和 data 需求都很高。
- 语义问题:vector 与 word meaning 没有联系,任意不同 words 的距离都一样。
因此,需要一种新表示:
让 vector geometry 与 word semantics 发生联系。
十、好的 Word Vectors 应该具备什么性质
老师提出理想情况:
movie和film这样的 synonyms 应该靠近。apple和banana这类相关词也应靠近。- 意义差异很大的词应相距较远。
但老师强调,关系不仅是距离。
更好的要求是:
word vectors 之间的 geometric relationship 应该反映 words 之间的 semantic relationship。
这里的 geometric relationship 包括:
- distance
- direction
十一、二维可视化直觉:词义簇
老师用一个二维 cartoon 说明。
假设有一组已经具有语义信息的 vectors,并取前两个 dimensions 做 scatter plot。
图中会出现一些 cluster:
factory、home、building聚在一起,表示 building 相关概念。bicycle、truck、car聚在一起,表示 transportation 或 automobile 相关概念。- fruit 相关 words 聚在一起。
- sports balls 相关 words 聚在一起。
如果要放入 apple,它应该落在 fruit cluster 中。
这个例子说明,好的 embeddings 应该能把相关概念放在相近区域。
十二、语义关系不仅是距离:Puppy、Dog、Calf、Cow
老师接着用:
puppydogcalfcow
说明 direction 的意义。
课堂中先有学生选择了图中的 C 位置,随后另一位学生解释,calf 是幼年动物,cow 是成年动物;类似地,puppy 到 dog 也是从幼年到成年。
因此,可以把这个关系理解成:
puppy : dog = calf : cow在几何上:
- 一个方向表示从 baby animal 到 grown-up animal。
- 另一个方向可能表示不同 animal species 之间的变化。
老师强调:
semantic relationship 对应的不只是距离,也包括方向。
十三、Word Embeddings 的目标
word embeddings 是为了满足这些要求而设计的 word vectors。
它们希望解决:
- one-hot vectors 过长且稀疏的问题。
- one-hot vectors 无法表达 word meaning 的问题。
与 one-hot vectors 相比,embeddings 通常是:
- dense
- low-dimensional
- learned from data
- 与词义关系有一定几何对应
十四、Standalone Embeddings 仍然不能解决 Context 问题
老师随后问:
如果 embeddings 已经能表达词义,是否就解决了所有问题?
学生回答:
context老师确认这是关键问题。
许多 words 有多个 meanings,必须根据 surrounding context 判断。
十五、Bank 的多义性
老师用 bank 举例。
bank 可以表示:
- financial institution
- river bank
- airplane banking in one direction
- banking on something,表示指望某事
如果没有上下文,很难判断具体含义。
standalone word embedding 只能给出某种平均意义。
对于只表示一种含义的 words,这可能还可以;但对 polysemous words,就会变得不够好。
十六、Contextual Embeddings 与 Transformers
要解决上下文问题,需要:
让 word embeddings contextual。
也就是在计算某个 word 的 vector 时,考虑 sentence 中其他 words。
老师指出:
contextual word embeddings能同时表达 semantic geometry 和 context。- 计算 contextual word embeddings 的关键机制是
transformer。 - 这也是 transformers 重要且出名的原因。
本节课只讲:
standalone / uncontextual word embeddings从下一讲开始,会用 transformers 将这些 embeddings 变成 contextual embeddings。
十七、为什么不手工设计 Embeddings
老师提出一个朴素想法:
人工收集 synonyms、antonyms、related words,然后手工分配 embedding vectors。
但这会是:
- very long
- painful
- never quite complete
因此,作为 machine learning practitioners,更合理的问题是:
能否从 data 中学习 embeddings?
十八、John Firth 的核心洞见
老师引用 linguist John Firth 的一句话:
You shall know a word by the company it keeps.核心意思是:
可以通过一个词经常与哪些词处在同一上下文中,推断这个词的含义。
这句话是 standalone embeddings 的重要直觉来源。
十九、填空示例:The acting in the ___ was superb
老师用句子:
the acting in the ___ was superb让学生判断哪些 words 可能填入空格。
合理候选包括:
playmovieshowmusicalfilm
不合理候选可以有很多。
老师特别举了:
the acting of the banana was superb来说明 banana 在这里不合适。
老师也提到自己喜欢 tensor 这个词,所以也把它作为不合适的候选之一。
二十、Context 的基本直觉
如果两个 words 经常出现在相同或相似 context 中,它们很可能相关。
也就是说:
related words appear in related contexts。
即使不直接知道某个 word 的定义,也可以通过它“住在什么语境里”推断它与哪些词相似。
老师强调,这是一个非常巧妙的想法。
二十一、本节课中 Context 的定义
context 可以有很多定义。
本节课采用一个简单定义:
如果两个 words 经常出现在同一句 sentence 中,就认为它们共享 context。
因此,本节的 context 是:
sentence这个定义不要求两个 words 相邻。
老师强调,即使一个 word 在句子末尾,句首的 word 也可能影响它的含义,因此本节直接以整句作为 context。
二十二、Co-Occurrence Matrix
老师接着定义:
co-occurrence matrix构造方式是:
- 取一个很大的 corpus,例如 all of Wikipedia。
- 将文本拆成 sentences。
- 找出 corpus 中所有 distinct words。
- 对每个 word pair,统计它们出现在同一句 sentence 中的次数。
如果 deep 和 learning 在 Wikipedia 中有:
3025个 sentences 同时出现,就在对应 cell 中写入:
3025这个矩阵的每个 cell 表示:
row word 和 column word 在同一句 sentence 中共同出现的次数。
二十三、Co-Occurrence Matrix 的规模
如果 Wikipedia 中有:
500,000 distinct words那么 co-occurrence matrix 的规模是:
500,000 x 500,000rows 和 columns 都是 words。
许多 word pairs 不太可能共同出现在同一句中,因此矩阵中很多 entries 是:
0老师指出,这个矩阵以紧凑、优雅的方式体现了可以使用的 context information。
二十四、GloVe 与 Word2Vec
老师说明,本节课描述的 standalone embeddings 计算方法叫:
GloVe早期 NLP deep learning 中,standalone embeddings 主要有两条路线:
word2vecGloVe
它们机制略有不同,但效果相近。
本节课选择讲 GloVe,因为它更容易解释,并且同样有效。
二十五、GloVe 的核心目标
GloVe 的目标是:
学到一组 embedding vectors,使它们能够近似重建 co-occurrence matrix。
如果 embeddings 能够很好地重建真实 co-occurrence matrix,就说明这些 embeddings 捕捉到了 words 的上下文结构。
老师举例:
- 如果真实矩阵中
deep与learning的值是3000。 extreme与learning的值是50。- embedding model 预测出
3002和48。
那么这些 predictions 与真实值接近,说明 embeddings 可能确实捕捉了 meaningful structure。
二十六、如何判断 Embeddings 好不好
一种简单但不系统的方法是:
- 看
movie和film是否靠近。 - 看
movie和tensor是否远离。
但这种人工检查无法穷尽所有 word pairs。
更系统的方法是:
用 embeddings 尝试重建 co-occurrence matrix,并检查重建结果是否接近真实矩阵。
如果能接近,就说明 embeddings 学到了原矩阵中的 context patterns。
二十七、把 Embeddings 看作 Regression Weights
老师把 GloVe 解释成一种接近 linear regression 的模型。
可以认为:
- co-occurrence matrix 是 data。
- embedding vectors 是要学习的 weights。
- 模型要用这些 weights 近似 co-occurrence counts。
老师强调,哪怕已经学过更复杂的 machine learning,linear regression 的思想仍然有用。
二十八、Notation:Xij、wi 与 bi
老师引入符号:
Xij表示 word i 和 word j 的 co-occurrence count。
它是:
data不是要学习的变量。
对每个 word,还要学习:
wi其中 wi 是 word i 的 embedding vector。
此外,每个 word 还有一个 bias:
bi用来表示该 word 的 inherent popularity 或 natural frequency。
例如:
the自然会出现得很多。movie与flick出现频率可能不同。the与tensor出现频率差异也很大。
二十九、为什么需要 Bias
co-occurrence count 不只取决于两个 words 是否语义相关,也取决于它们各自是否常见。
因此,老师希望 embeddings 捕捉:
co-occurrence patterns independent of natural word frequency。
为此,模型为每个 word 添加一个 bias term。
可以直观理解为:
co-occurrence = word i popularity + word j popularity + relationship between i and j其中 relationship 由两个 embedding vectors 的 dot product 表示。
三十、GloVe 模型的直觉公式
老师用自然语言描述了模型:
- 取 word
i的 bias。 - 取 word
j的 bias。 - 取 word
i与 wordj的 embedding vectors。 - 对两个 vectors 做 dot product。
- 将这些量相加,预测 co-occurrence count。
核心形式可以理解为:
prediction = bi + bj + dot(wi, wj)但实际模型会对 count 做 logarithmic transformation。
三十一、为什么对 Count 取 Log
co-occurrence counts 是非负数,且可能范围很大。
老师用 net worth 建模类比:
- 大多数人集中在较低区间。
- 少数如 Elon、Jeff 等人的 net worth 形成很长的 right tail。
- 对这种长尾变量取 logarithm,可以压缩范围,让 regression 更 well-behaved。
co-occurrence counts 也类似:
- 大量 entries 是
0。 - 少数 counts 可能非常高。
因此,对 counts 取 log 可以让模型更稳定。
三十二、Log(0) 的处理
由于:
log(0)没有定义,而 co-occurrence matrix 中有很多 0,所以可以给 counts 加 1。
概念上就是:
log(Xij + 1)这样可以避免技术性的 arithmetic problem。
三十三、Loss:Mean Squared Error
给定模型和数据后,要找到最好的 b 和 w。
学生指出,“最好”意味着:
lowest error。
老师说明,可以使用最简单的:
mean squared error也就是:
- 取真实值。
- 取预测值。
- 二者相减。
- 平方。
- 对所有 word pairs 求和或平均。
- 最小化这个误差。
如果模型能完全预测 co-occurrence matrix,每个误差项都会接近 0。
三十四、Context 如何进入 Co-Occurrence Matrix
学生问:如果同一个词在不同 context 中含义不同,例如 banana 可以是 fruit,也可以出现在 going bananas 中,模型如何区分?
老师解释,co-occurrence matrix 中每一行不是只看某一个 pair,而是看一个 word 与所有 vocabulary words 的共同出现模式。
例如:
apple对所有 words 有一整行 co-occurrence counts。banana也有一整行 co-occurrence counts。
如果 apple 和 banana 在很多 context 中可互换,它们的 row vectors 会非常相似。
因此:
context 通过整行 co-occurrence pattern 进入模型。
words which are similar will “zig and zag together” through the co-occurrence matrix。
三十五、Co-Occurrence Matrix 的对角线
学生问:
co-occurrence matrix 的 diagonal 是什么?例如 apple 出现两次怎么办?
老师回答:
通常可以忽略 diagonal。
因为主要信息在 off-diagonal entries 中。
三十六、相关词、无关词与反义词的 Row Patterns
老师进一步说明:
- 相关 words 的 row vectors 会有相似 patterns。
- 无关 words 的 row vectors 相关性可能接近
0。 - 某些 never show up in the same place 的 antonyms 可能呈现较强负相关,接近
-1。
如果 embeddings 能重建这些 row patterns,就说明它们捕捉了 underlying word-word correlational structure。
三十七、Polysemy 的限制
学生继续追问,banana 在 fruit 意义和 going bananas 意义下如何处理。
老师回答,这属于:
polysemy即同一个 word form 可以有多种含义。
standalone embedding 会把多种用法压成某种 average representation。
老师强调,对这个 average 表示并不满意,后面会用 contextual embeddings 解决。
三十八、Embeddings 是要学习的 Coefficients
有学生问,mean squared error 中的 embeddings 从哪里来。
老师解释:
- embeddings 还没有被计算出来。
- 它们就像 regression 中的 beta coefficients。
Xij是 data。wi、wj和 biases 是要通过优化求出来的 coefficients。
可以先随机初始化这些 weights,再不断调整以降低 error。
三十九、Pseudo-Random Numbers
学生问,随机初始化中的 random 是谁产生的,既然 computer 是 deterministic,随机是否真的随机。
老师回答,这是一个很深的问题。
计算机中的随机数通常是:
pseudorandom numbers它们来自 deterministic processes,但有专门的数学领域研究如何让这些数字“足够随机”。
在实际机器学习中,系统内置 random number generators,通常直接使用。
四十、Gradient Descent 再次登场
老师问学生,什么算法可以从 random starting point 出发,不断降低 error。
学生回答:
gradient descent老师确认,并进一步说可以使用:
stochastic gradient descent重要点是:
gradient descent 不要求模型一定是 neural network。
只要函数 differentiable,并且能计算 good gradients,就可以使用 gradient descent。
在这里,GloVe 不是一个 neural network per se,但仍然可以用 gradient descent 训练。
训练完成后:
- embeddings 会被保留。
- biases 可以丢弃。
因为最终关心的是 embeddings 之间的关系。
四十一、是否在预测 Co-Occurrence Matrix
学生问:
regression 是否在预测 co-occurrence matrix?
老师回答:
Exactly.模型通过 embeddings 和 biases 预测每个 Xij 的 transformed count。
四十二、Deep Learning 的数值例子
老师用 deep learning 举一个手算例子。
假设:
- word 1 是
deep。 - word 2 是
learning。 - embedding vector 只有
2dimensions。 - 需要学习
b1和b2。 - co-occurrence count 是:
104模型把:
log(104)作为 actual value。
prediction 由:
b1b2- 两个 2D embedding vectors 的 dot product
共同组成。
然后对:
actual - prediction求平方。
对所有 word pairs 都做同样计算,再用 gradient descent minimize。
四十三、Embedding Dimension 是人为选择的
老师说明,前面使用 2 dimensions 只是为了手算方便。
一般情况下,embedding vector 的长度由建模者选择。
embedding dimension 越长:
- 模型越灵活。
- 越能重建复杂 co-occurrence structure。
- 参数越多。
- 过拟合风险也越高。
因此,embedding dimension 是一个需要选择的 hyperparameter。
四十四、数据量与参数量问题
学生问:是否会出现 parameters 比 data points 更多的问题?
老师用简单例子说明,在 co-occurrence matrix 场景下不一定如此。
假设:
10个 words。- 每个 word 有
2维 embedding。
参数包括:
10 * 2 = 20个 embedding parameters。10个 biases。- 总计约
30个 parameters。
但 co-occurrence matrix 有:
10 x 10 = 100个 entries。
因此在这个例子中,data entries 比 parameters 多。
老师补充,在其他 neural network 场景中,传统 data/parameter/overfitting 假设有时会被挑战。如果感兴趣,可以搜索:
double descent四十五、Embeddings 与 One-Hot 的对比
one-hot vectors:
- 长度等于 vocabulary size。
- 大部分位置是
0。 - 只有一个位置是
1。 - 不能表达语义关系。
word embeddings:
- dense。
- low-dimensional。
- numbers 是从 data 中学习的。
- 每个 dimension 不一定可解释。
老师举例,某个 dimension 可能混合了:
- brightness
- speed
- animalness
但人类通常不知道具体含义。
只要它能重建 co-occurrence matrix,就说明它学到了某种结构。
四十六、t-SNE 可视化
训练出 embeddings 后,可以将它们可视化。
老师说明,图中不是直接取前两个 dimensions,而是使用:
t-SNEt-SNE 可以把长 vectors 投影到 2D space 以便 visualization。
在可视化中,可以看到一些概念聚集:
brothernephewunclesisternieceauntmanwomansirmadamheiressheirdukeemperorking
相似概念聚在相近空间区域,这说明 embeddings 捕捉到了一些语义结构。
四十七、Word Vector Algebra
老师强调,embedding 的方向也有意义。
例如,从 man 到 brother 的 arrow 可能表示:
person → sibling如果把同样的 arrow 从 woman 出发,期望得到:
sister这类关系叫:
word vector algebra或:
embedding algebra老师给出的典型关系是:
brother - man + woman = sister这不是人工告诉模型的,而是从 co-occurrence patterns 中自然学出来的。
四十八、Synonyms 不是因为直接同句出现
学生问:synonyms 不是通常不会在同一句中互相替换出现吗?模型如何通过 context 找到它们?
老师回答,关键不在于 synonyms 是否互相出现在同一句中。
关键是:
它们与其他 words 的 co-occurrence patterns 相似。
即使两个词不直接共现,只要它们在相似 contexts 中与相似的其他词共现,它们的 row patterns 就会相似。
四十九、二维图只是 Visualization
学生问,如何在 2D matrix 中捕捉多种方向和关系。
老师解释:
图只是 visualization。
真实 GloVe embeddings 可以有很多 dimensions,例如 100 维。
图中只是把高维 embeddings 投影到 2D space 以观察结构。
五十、Bias in Embeddings
学生问:如果 co-occurrence matrix 的 input data 有 bias,模型是否会 amplify bias?
老师回答:
Yes.任何从 internet scrape 的 data 都会带有生产这些数据时的社会和文化 bias。
模型会 faithfully learn those biases。
如果不小心,它还会 perpetuate them。
老师指出,这是非常重要的话题,但课程因为时间限制不会展开。
五十一、Embedding Dimension 如何选择
学生问如何思考 embedding dimensionality。
老师回答:
把它当作 hyperparameter。
选择方式类似 hidden layer units:
- start small。
- 如果能解决任务,就保持简单。
- 如果不够,再增加 dimension。
- 当表现开始 flatten 或出现 overfitting,就停止。
五十二、Regularization 与 Penalized Regression
学生问,是否可以用 penalized regression 或类似方法,让 embeddings 更 sparse 或降低 magnitude。
老师回答,可以。
在估计这些 numbers 的过程中,可以使用很多 regularization 技术。
本节课只是使用最简单版本。
五十三、为什么 Embedding 也要担心 Overfitting
学生问:如果 embedding 不是为了 out-of-sample prediction,为什么还担心 overfitting?是否应该高维度捕捉所有 unique relationships?
老师回答,即使不直接做 out-of-sample prediction,也希望模型捕捉:
signal而不是:
noise如果 embeddings 学到了 noise,那么基于 embeddings 得到的 insights 也可能有问题。
因此,overfitting 仍然需要关注。
五十四、何时使用 Pre-Trained GloVe Embeddings
老师总结 GloVe 等 pre-trained embeddings 的优点。
如果没有足够数据学习 task-specific embeddings,可以使用预训练 embeddings。
理由是:
language 中很多基础规律是通用的。
例如 English 的基本语义和词义关系,不必让每个小任务都从头学习。
可以:
- 在大规模语料上学习通用 embeddings。
- 在具体 use case 中 piggyback on them。
- 根据任务 fine tune 或 adapt。
这种做法在任务数据较少时尤其有用。
五十五、Pre-Trained Embeddings 的缺点
预训练 embeddings 的缺点是:
它们不一定适合你的 data。
例如:
- medical use case 有大量 medical jargon。
- legal use case 有大量 legal jargon。
如果 embeddings 是在 Wikipedia 上训练的,它们可能无法准确捕捉这些 domain-specific terms。
此时可以:
- 先使用 pre-trained embeddings。
- 再用 domain-specific dataset fine tune。
- 或者直接从 scratch 学习 embeddings。
本节 Colab 会展示这些选项。
五十六、Keras 中 STIE 的职责划分
在 Keras 中使用 embeddings 时,老师重新划分了 STIE。
此前:
TextVectorization直接输出multi-hot或其他 encoding。
现在:
TextVectorization只做S、T、I。Embeddinglayer 负责E,也就是从 integer 到 vector。
因此,TextVectorization 的输出不再是 multi-hot vector,而是 integer sequence。
五十七、TextVectorization 输出 int
在 TextVectorization 中设置:
output_mode = "int"含义是:
做完 standardization、tokenization 和 indexing 后,直接返回 integers。
这样就停止在 STI 阶段,把 encoding 留给 Embedding layer。
五十八、Padding 与 Truncation
输入 sentences 长度不同,但 neural network 需要统一长度。
做法是设定:
max length如果 sentence 正好等于 max length,就直接使用。
老师举例:
cat sat on the mat如果 max length 是 5,这句话刚好适配。
如果 sentence 更短,例如:
I love you只有 3 个 tokens,就用:
pad token补齐。
如果 sentence 更长,就 truncate,只保留前 max length 个 tokens。
五十九、PAD 与 UNK
老师说明,在 Keras 中 padding 通常使用:
0作为 pad token 的 index。
后面在 Colab 中会看到:
- index
0是pad。 - index
1是unk。
这与上一节 multi-hot 场景不同。
上一节中 UNK 是 index 0;本节因为需要 padding,所以 pad 占据 index 0,UNK 变成 index 1。
六十、Embedding Layer 的本质
Embedding layer 本质上是一张 lookup table。
如果 vocabulary 有:
5000 tokens并且 embedding dimension 是:
d那么 embedding layer 可以看成:
5000 x d的矩阵。
每一行对应一个 token 的 embedding vector。
在 Keras 中可以使用:
keras.layers.Embedding并指定:
max_tokens:vocabulary size,也就是行数。- embedding dimension:每个 vector 的长度,也就是列数。
六十一、Embedding Lookup Flow
当一个 input sentence 到来时:
TextVectorization执行STI。- 句子被 padding 或 truncation 到固定长度。
- 得到一串 token integers。
Embeddinglayer 根据 integers 查表。- 每个 integer 被替换成对应 embedding vector。
例如,如果 max length 是 5,某句话被表示成:
23, 9, 5, 0, 0那么 embedding layer 会查出 index 23、9、5、0、0 对应的 vectors。
输出是:
5 embedding vectors也就是一张 table。
六十二、Embedding Table 如何变成一个 Vector
例如:
I love you经过 embedding lookup 后,会得到一个 table,而不是单个 vector。
但普通 dense neural network 需要 vector input。
可以有几种处理方式:
- concatenate 所有 embeddings,形成一个长 vector。
- sum embeddings。
- average embeddings。
本节课采用最简单的:
average六十三、GlobalAveragePooling1D
在 Keras 中,平均 embedding table 可以使用:
GlobalAveragePooling1D它会对每个 dimension 分别求平均。
例如:
- 对第
1个 embedding dimension 求平均。 - 对第
2个 embedding dimension 求平均。 - 依此类推。
结果是一个 fixed-length vector,可以送入后续 hidden layers。
六十四、Embedding Model 的整体 Flow
本节模型 flow 可以概括为:
- phrase 输入。
TextVectorization做STI。- 对 sequence 做 padding 或 truncation。
Embeddinglayer lookup embedding vectors。GlobalAveragePooling1D将 table 平均成 vector。- 将 vector 送入 dense layers。
- 输出 classification result。
老师说明,Colab 会完全对应这个流程。
六十五、Colab 数据与准备
进入 Colab 后,老师做常规准备:
- import required packages。
- 引入前面 Colabs 中绘制 loss 和 accuracy curves 的 functions。
- 使用上一节课同一个 songs dataset。
- 数据中约有:
49,000 examples- labels 会做 one-hot encoding。
六十六、下载并查看 GloVe Vectors
老师使用了已经下载好的 GloVe vectors。
这些 vectors 来自一个 URL,下载需要几分钟,老师课前已经下载并解压。
老师后面提到,这些 GloVe weights 是别人投入大量成本训练出来的,并特别提到 Stanford。
本节使用的是:
100-dimensional GloVe vectors数据规模是:
400,000 word vectors每个 vector 长度是:
100这些 vectors 是用前面讲的模型和 gradient descent 从 Wikipedia 计算出来的。
老师展示了 movie 的 vector,并说明虽然不知道每个 dimension 具体含义,但这些 numbers 中显然捕捉到了某种结构。
六十七、Max Length = 300
老师设置 songs/lyrics 的 max sequence length 为:
300原因是数据中约:
90%的 songs 长度小于或等于 300 words。
如果取最大长度,可能会有极少数 songs 达到 3000 words。
为了这些少数长文本而把所有 inputs 都 padding 到 3000 会浪费大量 capacity。
因此,老师选择 300 是一个 pragmatic choice。
六十八、Vocabulary Size = 5000
和上一节类似,老师让 Keras 只使用训练语料中最常见的:
5000 words也就是:
max_tokens = 5000同时设置:
output_mode = "int"这样 TextVectorization 会返回整数序列,而不是 multi-hot vector。
六十九、Adapt 后的 PAD 与 UNK
老师用所有 lyrics 对 TextVectorization layer 做 adapt。
随后查看 vocabulary 前几项时强调:
- index
0是 padding / empty string。 - index
1是UNK。
这和上一节不同。
老师测试:
HODL you're the bestHODL 不在 vocabulary 或 GloVe vectors 中,因此显示为 unknown,对应 index:
1后面直到长度 300 的剩余位置都会用:
0padding。
七十、Embedding Matrix 为什么是 5000 x 100
虽然下载了:
400,000个 GloVe vectors,但本模型的 embedding matrix 只有:
5000 x 100原因是:
TextVectorization只保留 lyrics corpus 中最常见的5000个 tokens。- 模型只需要这
5000个 tokens 的 embeddings。 - 每个 GloVe vector 长度是
100。
因此,只抽取这 5000 个 tokens 对应的 GloVe vectors,构成 embedding matrix。
前两行是 zeros,因为:
- row
0是pad。 - row
1是unk。
GloVe 本身没有这两个 token 的语义向量。
七十一、用 GloVe 初始化 Embedding Layer
构建 Embedding layer 时:
- 行数是
max_tokens,即5000。 - embedding dimension 是
100。 - weights 使用前面构造的
GloVeembedding matrix。
也就是告诉 Keras:
直接用下载好的
GloVevectors 作为 embedding layer 的 weights。
七十二、Frozen GloVe
老师首先设置:
trainable = False含义是:
backpropagation 时不要更新 GloVe embeddings。
老师解释,GloVe embeddings 是别人花了大量成本训练出来的,因此先把它们 freeze,只按原样使用。
他还提到 mask_zero,但说会稍后再回到这个细节,本节此处先不展开。
七十三、Frozen GloVe 模型结构
模型结构是:
Keras Input- input length:
300 Embeddinglayer- embedding output:
300 x 100 GlobalAveragePooling1D- pooled vector:
100 - dense layer:
8个ReLUneurons - output layer:
3-way softmax
输出类别仍然是:
hip hoprockpop
七十四、Frozen GloVe 的参数数量
model summary 显示:
total parameters = 500,835但 trainable parameters 只有:
835原因是:
5000 x 100 = 500,000个 embedding parameters 来自 GloVe。- 这些 embedding weights 被 freeze。
- 只有后面新增的 dense/output layers 可训练。
七十五、Global Average Pooling 是否会丢失意义
学生问:对 apple 和 learning 等不同 words 的 embeddings 做 average,会不会丢失 embedding 已经捕捉到的意义?
老师回答:
会丢失很多 nuance。
任何 averaging 都会丢失细节。
关键问题是:
尽管丢失细节,它是否足够好?
很多时候它确实够用。
但 contextual embeddings 会提供更好的方式,只是需要更大的模型和更强的计算能力。
七十六、为什么不一起优化 Embeddings
学生问:既然整体优化通常更好,为什么不让 embeddings 也参与训练?
老师回答:
可以,而且下一步就会这样做。
先 freeze embeddings 的原因是:
- 更快。
- 先展示不训练 embeddings 也可以使用。
- 再比较 trainable embeddings 是否更好。
老师还说,后面也会展示从 scratch 训练自己的 embeddings;如果时间不够,会放到 Monday。
七十七、model.layers 检查 Weights
老师提到一个 Keras 小技巧:
model.layers会返回模型中所有 layers 的 list。
可以取出任意 layer,并查看它的 weights。
老师用它查看 embedding layer 的前几行,看到前两行是 zeros,对应 pad 和 unk。
七十八、Frozen GloVe 的训练设置
编译和训练设置与前面类似:
- optimizer:
Adam - loss:
cross-entropy - metric:
accuracy
然后调用 fit。
老师预告,在这个具体任务中,pre-trained embeddings 不会帮太多。
可能原因包括:
GlobalAveragePooling1D平均了很多 embeddings,损失信息。GloVe在 Wikipedia 等 corpus 上训练,而 song lyrics 的语言分布不同。- 当前任务有约
50,000examples,数据量并不小。
七十九、为什么小数据更适合 Pre-Trained Models
老师总结经验:
当 data 很小时,应优先尝试 pre-trained model。
因为可以 piggyback on 大语料或大模型已经学到的东西。
他类比上一节 handbags vs shoes:
- 只有约
100个 handbags 和 shoes examples。 - 使用
ResNet后达到100%accuracy。
同样逻辑也适用于 text embeddings。
八十、Frozen GloVe 的结果
训练曲线表现比较 well-behaved。
loss 曲线没有 massive overfitting,training 和 validation 大致同步。
但最终 accuracy 约为:
63%老师指出,这不如上一节用全部约 50,000 examples 从 scratch 训练的简单模型。
原因是当前数据量较大,pre-trained embeddings 的优势不明显。
八十一、Fine-Tuning GloVe
接下来老师按照学生提出的思路,让 embeddings 也参与训练。
关键变化是:
trainable = True其他结构基本不变。
这样 backpropagation 会更新 GloVe embedding weights。
老师提醒:
- 不确定一定会更好。
- 可能会 overfit。
- 必须 empirically check。
八十二、训练更久是否还有提升
学生观察第一张曲线中 training accuracy 仍在上升,问是否可以继续训练。
老师回答:
- training accuracy 通常会随着训练继续提高。
- 关键是 validation 是否也继续提高。
- 如果 validation 继续提高,说明还有提升空间。
- 如果 validation flatten,甚至下降,就应该停止或回退。
八十三、100 维 GloVe 向量是什么意思
学生问:
max_tokens = 5000限制了 vocabulary,那么 embedding width100是什么?
老师回答:
100是 GloVe vector 的长度。
它不表示只能关联 100 个其他 words。
它表示:
每个 word 的 intrinsic meaning 被表示为一个
100-dimensional vector。
每个 dimension 可能代表某种 latent factor,但人类不知道具体含义。
老师举例:
- dimension 1 可能与 color 有关。
- dimension 2 可能与 location 有关。
- dimension 3 可能与 time of year 有关。
但这只是直觉,人类并不知道真实含义。
甚至创建 GloVe 的人也不知道每个 dimension 的具体语义。
他们只知道这些 100-long vectors 能较好地重建 co-occurrence matrix,并在 man/woman/sister/brother 等可视化中呈现合理结构。
八十四、Embedding Dimensions 与 CNN Filters 的类比
学生问,embedding dimension 是否类似 CNN 中 filter/kernel 数量。
老师认为这是一个很好的类比。
在 CNN 中:
- 可以决定有多少 filters。
- filters 越多,能学习的 patterns 越多。
在 embeddings 中:
- 可以决定 embedding dimension 有多长。
- dimension 越多,能容纳的 latent factors 越多。
但两者都不能无限增加。
如果太大,可能开始学习 noise。
八十五、为什么不用 Co-Occurrence Matrix Rows 直接表示 Words
学生问:
为什么不用 co-occurrence / correlation matrix 的 row vector 直接表示 word,而要学习 embeddings?
老师给出两个直接原因。
85.1 Row 太长
如果 vocabulary 有:
500,000个 words,那么每一行就是长度:
500,000的 vector。
这太长。
embeddings 提供更 compact、dense 的表示。
85.2 原始 counts 不可直接比较
co-occurrence rows 受 Wikipedia corpus 的 raw counts 影响。
需要 normalization,否则不同 rows 的 dot product 可能不可比较。
老师说,这些问题理论上可以处理;过去也有人常这样做。
但实践中,现代 embedding learning 方法通常更有效。
八十六、Embeddings 是关系的紧凑表示
学生总结:
这个过程创建了一个 n-dimensional、难以解释的 matrix,本质上捕捉了这些关系的 summarized version。
老师确认:
它是 relationships 的 compact representation,而且不受 vocabulary size 直接支配。
老师还举例,新词如 selfie 出现后,corpus 会变化;compact embeddings 通常有更长的 shelf life。
八十七、Fine-Tuned GloVe 的结果
fine-tuning GloVe 后,模型效果从约:
63%提升到接近:
68% - 69%老师指出:
训练 GloVe embeddings 本身确实有帮助。
这引出下一步:
如果 fine-tuning 有帮助,是否可以完全不用 GloVe,从 scratch 训练自己的 embeddings?
八十八、从零训练 Task-Specific Embeddings
老师接着构建从 scratch 训练的 embedding model。
这一次不使用 GloVe。
原因是当前任务有明确 objective:
predict song genre而 GloVe 没有 genre prediction 这类下游任务目标;它通过重建 co-occurrence structure 学到通用 embeddings。
对于当前任务,可能更需要:
task-specific embeddings八十九、从零训练时的 Embedding Dimension
从零训练时,老师任意选择 embedding dimension 为:
64而不是 GloVe 的 100。
原因之一是:
64 维会跑得更快。
模型结构仍然类似:
EmbeddinglayerGlobalAveragePooling1D- dense layer
3-way softmax
九十、Pre-Trained GloVe 有哪些维度版本
学生问,使用 GloVe 时是否可以重新定义 embedding 长度,例如改成 10 或 100。
老师回答:
GloVe文件本身已经预先打包成固定长度。
本节使用的是 100 维版本。
老师记得 GloVe 也可能有:
200维300维
等版本。
用户可以从可用版本中选择,但不能任意把一个已训练好的 100 维 GloVe vector 直接“重定义”为 10 维。
九十一、是否应通过训练 Embeddings 获得真正性能变化
学生将 embeddings 与 CNN filters 类比,问:
如果想要 genuine performance improvement,是否应进入 retraining embeddings 的层面?
老师回答,当前实验看到:
- 使用 frozen GloVe:可以,但效果一般。
- 使用 GloVe 并让它 trainable:帮助明显。
- 放弃 GloVe,从 scratch 训练 task-specific embeddings:值得尝试。
老师总结:
GloVe 是 general-purpose tool。数据少时,它是很好的 starting point;数据多时,应尝试训练自己的 task-specific embeddings,看是否更好。
九十二、从零训练 Embeddings 的结果
从 scratch 训练 embeddings 后,模型最终达到约:
72%老师指出,因为有约 50,000 examples,可以训练自己的 embeddings,并得到更好的结果。
这个结果与上一节 simple Bag of Words 模型的结果相近,也优于 frozen GloVe 和 fine-tuned GloVe 的本节示例。
九十三、本节课三种 Embedding 使用方式对比
本节 Colab 展示了三种方式:
- 使用 frozen pre-trained
GloVeembeddings。 - 使用 pre-trained
GloVeinitialization,但设置trainable=True进行 fine-tuning。 - 不使用
GloVe,从 scratch 学习 task-specific embeddings。
结果大致为:
- frozen
GloVe:约63%accuracy。 - fine-tuned
GloVe:约68%到69%accuracy。 - scratch task-specific embeddings:约
72%accuracy。
老师强调,这不是普遍结论,而是本数据集上的结果。
选择哪种方式要看:
- 数据量大小。
- 预训练 corpus 与任务 corpus 是否匹配。
- 是否容易 overfit。
- 是否需要 domain-specific semantics。
九十四、本节课核心总结
本节课的知识链条可以概括为:
one-hot vectors简单有效,但 vector 长度等于 vocabulary size,计算成本高。- 任意两个不同 one-hot vectors 的 Euclidean distance 都是
sqrt(2),无法表达 word meaning。 - 好的 word vectors 应该让 semantic relationship 对应 geometric relationship。
word embeddings是 dense、low-dimensional、learned vectors。- standalone embeddings 可以表达平均词义,但不能处理强上下文依赖。
bank、banana等多义词说明 context 是必要的。- contextual embeddings 会在后续通过
transformers计算。 John Firth的思想是:通过一个词所处的 context 理解这个词。- 本节把 context 简化定义为 same sentence。
co-occurrence matrix统计 word pairs 在同一句中共同出现的次数。GloVe通过学习 embeddings 来近似重建 co-occurrence matrix。Xij是 co-occurrence data,wi是 word embedding,bi是 word bias。- 对 counts 取 log 可以缓解长尾分布问题,
log(0)可通过加1避免。 - 使用 mean squared error 和 gradient descent 可以学习 embeddings。
- embedding dimension 是 hyperparameter,越大越灵活,也越可能 overfit。
t-SNE可用于将高维 embeddings 投影到 2D 进行 visualization。- word vector algebra 显示 direction 也有语义,例如
brother - man + woman = sister。 - 互联网数据 bias 会被 embeddings 学到并可能延续。
Keras TextVectorization在 embedding pipeline 中只做S、T、I,Embeddinglayer 负责E。output_mode="int"返回 integer sequence。- padding 使用 index
0,UNK使用 index1。 GlobalAveragePooling1D可以把 embedding table 平均成一个 vector。- 预训练
GloVe在小数据任务上可能很有用;数据较多时,fine-tuning 或从零训练 task-specific embeddings 可能更好。
最核心的思想是:
Embeddings 将 words 从稀疏、无语义距离的 one-hot indicators,变成可学习的 dense vectors;这些 vectors 通过 co-occurrence patterns 获得语义结构,但 standalone embeddings 仍然只是平均意义,真正处理上下文需要后续的 transformers。