目录
一、Word2Vec 是什么
你是否想过,计算机是如何理解人类语言的呢?当我们看到 “苹果” 这个词,脑海中会立刻浮现出红彤彤、酸甜可口的水果形象。但对于计算机来说,“苹果” 只是一串字符,那它如何理解这个词背后的含义,以及和其他词之间的关系呢?这就轮到 Word2Vec 登场啦!
Word2Vec 是 Google 在 2013 年开源的一款将单词转为向量表示的工具 ,简单来说,它能把人类语言中的单词转化成计算机能够理解的数学向量。在自然语言处理(NLP)这个大舞台上,Word2Vec 可是一位举足轻重的 “明星”,为众多 NLP 任务,如文本分类、情感分析、机器翻译等,打下了坚实的基础,让计算机处理人类语言变得更加得心应手。
二、为什么需要 Word2Vec
在 Word2Vec 闪亮登场之前,传统的文本表示方法中,One - Hot Encoder(独热编码)算是 “老资格” 了 。比如,在一个包含 “苹果”“香蕉”“橘子” 的简单词汇表中,“苹果” 可能被表示为 [1, 0, 0],“香蕉” 为 [0, 1, 0] ,“橘子” 为 [0, 0, 1] 。这种表示方法虽然简单直接,计算机也容易理解,但却存在着诸多致命的缺陷。
维度灾难:想象一下,如果词汇表非常大,包含成千上万甚至上百万个单词,那每个单词对应的 One - Hot 向量维度也会变得极其庞大。这不仅会占用大量的存储空间,在计算时也会耗费巨大的资源,让计算机不堪重负。例如,一个拥有 10 万个单词的词汇表,每个单词的 One - Hot 向量维度就是 10 万,这是一个多么恐怖的数字!
无法体现语义关系:从 One - Hot 向量中,我们完全看不出单词之间的语义联系。“国王” 和 “王后” 虽然语义相近,但它们的 One - Hot 向量之间的距离和其他任意两个单词的向量距离是一样的,无法体现出它们之间特殊的语义关联 。这就好比把所有单词都看作是孤立的个体,而忽略了它们在语义世界中的紧密联系。
数据稀疏:由于 One - Hot 向量中只有一个元素是 1,其余全是 0,这就导致向量非常稀疏。稀疏的数据在很多计算和模型训练中都不太友好,会影响模型的性能和效果。
而 Word2Vec 的出现,就像是一道光照进了黑暗的房间,完美地解决了这些问题。它将单词映射到一个低维的连续向量空间中,大大降低了向量的维度,减轻了维度灾难和数据稀疏的问题 。同时,在这个向量空间里,语义相近的单词会被映射到相近的位置,比如 “汽车”“轿车”“车辆” 这些词的向量会彼此靠近,通过计算向量之间的距离,就能衡量单词之间的语义相似度,让计算机能够理解单词之间的语义关系 。这使得 Word2Vec 在自然语言处理任务中如鱼得水,为后续的文本分析、理解和生成等任务奠定了坚实的基础。
三、Word2Vec 的基本原理与模型结构
(一)核心思想
Word2Vec 的核心思想建立在 “分布假设” 之上,即一个词的语义可以由它周围的上下文来推断。简单来说,就是认为经常出现在相似上下文环境中的单词,其语义也相近。例如,在 “我喜欢吃苹果” 和 “我喜欢吃香蕉” 这两个句子中,“苹果” 和 “香蕉” 都出现在 “我喜欢吃” 这个相似的上下文里,那么它们在语义上就具有一定的相似性,通过 Word2Vec 学习得到的向量表示也会比较接近。
为了实现这一思想,Word2Vec 采用了两种主要的模型架构:连续词袋模型(CBOW)和跳字模型(Skip - gram) 。CBOW 模型是根据上下文单词来预测中心单词,而 Skip - gram 模型则是通过中心单词来预测上下文单词 。这两种模型就像是一对 “孪生兄弟”,虽然预测方向不同,但都致力于通过对大量文本数据的学习,挖掘出单词之间丰富的语义和语法关系,将单词映射到一个低维稠密的向量空间中,在这个空间里,语义相近的单词在位置上也更加靠近 。
(二)CBOW 模型
1. 模型架构
CBOW 模型的结构相对简洁明了,就像一个精心搭建的信息处理管道。它主要包含输入层、隐藏层和输出层这三个关键部分 。
-
输入层:当我们有一个句子 “我 喜欢 自然语言处理”,假设我们设定的上下文窗口大小为 2,对于中心词 “喜欢”,其上下文单词就是 “我” 和 “自然语言处理”。输入层会将这些上下文单词转化为对应的向量表示,通常使用独热编码(One - Hot Encoding)将单词映射为高维稀疏向量,然后再通过一个嵌入矩阵(Embedding Matrix)将其转换为低维稠密向量 。简单来说,就是把每个上下文单词都用一个独特的向量来表示,这些向量包含了单词的初始信息 。
-
隐藏层:这一层的主要任务是对输入层传来的上下文单词向量进行整合。它会将所有上下文单词向量进行求和或平均操作,得到一个综合的上下文向量表示 。比如,将 “我” 和 “自然语言处理” 的向量相加后再求平均,这样就把上下文的信息浓缩到了一个向量中 ,这个向量可以看作是对整个上下文语义的一种概括 。
-
输出层:它以隐藏层输出的上下文向量为输入,通过与一个权重矩阵相乘,再经过 Softmax 函数的处理,得到一个概率分布,这个概率分布表示了词汇表中每个单词作为中心词的可能性 。在这个例子中,输出层会计算出 “我”“喜欢”“自然语言处理” 等词汇表中所有单词成为中心词的概率,我们期望概率最高的那个单词就是实际的中心词 “喜欢” 。
2. 训练过程
我们以句子 “鸟儿在天空中飞翔” 为例,假设窗口大小为 2,现在我们要根据上下文预测中心词 “天空”。
准备输入:确定上下文单词为 “在”“中”,将这两个单词通过嵌入矩阵转化为对应的低维向量,假设 “在” 的向量为 [0.1, 0.2, 0.3],“中” 的向量为 [0.4, 0.5, 0.6] 。
隐藏层计算:对这两个上下文单词向量进行平均操作,得到隐藏层向量 [(0.1 + 0.4) / 2, (0.2 + 0.5) / 2, (0.3 + 0.6) / 2 ] = [0.25, 0.35, 0.45] 。
输出层预测:隐藏层向量与输出层权重矩阵相乘,得到一个得分向量,再经过 Softmax 函数转化为概率分布 。假设经过计算,“天空” 对应的概率为 0.8,其他单词的概率总和为 0.2 。
计算损失与更新权重:将预测结果与真实标签(这里 “天空” 的真实标签为 1,其他单词为 0)进行对比,使用交叉熵损失函数计算损失 。根据损失值,通过反向传播算法计算梯度,更新嵌入矩阵和输出层权重矩阵的参数 ,使得模型在下次预测时能够更加准确 。这个过程就像是一个不断调整自己学习策略的学生,通过一次次的练习(训练),逐渐掌握知识(提高预测准确性) 。