词向量空间中的“狮子”与“老虎”
在300维度的词向量空间,“狮子”这个词的词向量是这样的,“老虎”这个词的词向量这样的
http://vectors.nlpl.eu/explore/embeddings/en/MOD_enwiki_upos_skipgram_300_2_2021/tiger_NOUN/
http://vectors.nlpl.eu/explore/embeddings/en/MOD_enwiki_upos_skipgram_300_2_2021/lion_NOUN/
并且可以看到,这2个词在向量空间中靠得很近。

词向量的分量是如何计算出来的?
那问题来了,这个词向量的分量是如何计算出来的呢?
2013年一群Google大牛为了解决“电脑怎么理解词的意思”这个问题提出了Word2Vec框架,其中包括CBOW和Skip-gram模型。
Word2Vec提出之后就火了,下载量破亿,迅速成为开源界的明星。
今天我们就来讲讲Word2Vec中的CBOW模型。
CBOW 模型是什么?
CBOW全称Continuous Bag-of-Words,连续词袋模型。
它是一种无监督学习方法,用于从大规模文本语料中学习词的分布式向量表示(word embeddings)。
CBOW的目标是捕捉词的语义和语法关系,使得语义相似的词在向量空间中距离较近。
为什么叫 Continuous Bag-of-Words?
我们不如先看看“Bag-of-Words”的解释:
Bag of Words (BoW) is a technique for representing text by counting the frequency of words, ignoring grammar and word order, to make text usable for machine learning models and information retrieval systems.
它说词袋模型(BoW)是一种通过统计词频来表示文本的技术,该方法忽略语法和词序,从而使文本能够被机器学习模型和信息检索系统所利用。
而 “Continuous”指向量是连续的实数空间表示。
CBOW 的学习过程:从“乱猜”开始
那它是究竟是怎么进行学习的呢?
开始:一切从“乱猜”起步
首先,模型拿到你用于训练的语料库,通过分词技术列出所有可能的词(像“狮子”,“老虎”,“苹果”等等)。
然后给每个词一串随机数字。 [0.7, -0.1, 2.4, …] 。 为什么是随机数呢? 因为刚开始模型什么也不会!
这些数字会存在一个叫“嵌入矩阵”(embedding matrix)的大表格里。 表格的每一行就是一个词的向量。 你可以简单的把它想象成Excel表格: 第一行是“狮子”的词向量,第二行是“老虎”的词向量。
通过“猜词游戏”调整向量
学习:通过玩“猜词游戏”来调整数字
模型的脑子会看一大堆句子,然后玩一个游戏:猜猜这个词的“邻居”是谁?
为什么“邻居”?因为在语言里,词总是和附近的词“做朋友”。比如,“我爱吃苹果”,这里的“吃”和“苹果”就是邻居。所以,如果电脑能猜对邻居,就能学到词的“性格”。
在Word2Vec中有两种猜词游戏玩法, CBOW就是其中一种,CBOW是“从朋友猜主角”。
CBOW 的核心机制:滑动窗口
CBOW怎么玩:
当模型拿到语料库后,里面全是句子,比如:
“我看到一只猫在草地上玩。”
“猫喜欢吃鱼。”
这些句子是“原材料”,模型会一句一句读他们,然后从中“挖”出主角词和它的邻居词。 那它是如何知道谁是主角词谁又是邻居词的呢?
那就是:滑动窗口。
想象一下,当你读书时会拿着一支笔,在句子上画一个“框框”,这个框框就是“滑动窗口”。 电脑也是这么做的,它会设定一个滑动窗口大小,常见的是框住5个词或7个词, 然后把框框里的最中间的词定为主角词,主角旁边的词定为邻居词。
我们假设现在模型读到句子:“有一头狮子在草原上快乐的奔跑”。 这句话先被分词: [有 一头 狮子 在 草原 上 快乐 的 奔跑]
假设滑动窗口大小是5(那么中间是主角词,主角词左右各2个邻居词)。模型从句子开头开始“滑动”这个窗口:
当窗口框住“有 一头 狮子 在 草原”这些词,最中间的词是“狮子”,它做为主角词,所以邻居词就是“有 一头 在 草原”。
模型把主角词“狮子”藏起来,然后通过邻居词去猜主角词。
从平均向量到概率预测
猜的过程:从平均到概率输出
模型拿到邻居词之后,把邻居向量加起来取平均,就会得到一个“团队脸谱”(比如 [0.4, 0.2, 0.1, …])。
然后,用这个‘团队脸谱’去和词汇表里的词向量进行对比。
再转成概率:比如“猫”概率30%,“狮子”31%,“老虎” 35%(他们全部加起来等于100%)。
概率最高的那个就是主角词。
当然,如果我们的词汇表有10万个词,全部一一去对比,那会很费时间,所以电脑会采用负采样的方法来提升训练速度。
向量调整与试错学习
调整向量:试错炼金术
如果猜错了(比如模型把主角词猜成了“草原”,但实际主角词是“狮子”),他会挠挠头:“哎呀,我猜错了!”
发现猜错后,模型轻轻的修改词向量数字。
他会把“狮子”的数字往团队脸谱那边拉近点(比如加强狮子的“动物”特征)。
同时也会改改邻居词的向量:让“有、一头、在、草原”这些词整体更偏向“狮子味”。
这里很重要的一点是:修改的力度要小,就像用铅笔轻轻的描,而不能大动干戈。
这样改完,下次遇到类似谜题(比如另一个框有“一头、在、草原”),团队脸谱就会更加偏向“狮子”。
海量训练成就语义向量
重复炼成:海量语料是关键
模型依次滑动窗口来处理所有语料库(可能会有几百万到几十亿词),每个窗口猜一次,调整一次。
经过几百万次的训练后,向量从随机变有意义:“狮子”靠近“老虎”,而“鱼”就会远离“汽车”。
从而模型会捕捉到词语义、语法、以及上下文,并最终形成每个词的固定向量。
总结:CBOW 就像教小孩猜动物
简单来说,CBOW像教小孩猜动物:他会利用邻居词作为线索,经历乱猜,然后看答案,再调整档案,在经过海量的训练之后最终练成高手!
怎么样,你学会了吗?


