Word2Vec 使用神经网络作为其核心组件来学习单词的向量表示。下面将介绍 Word2Vec 中的两种主要架构:CBOW(Continuous Bag-of-Words)和 Skip-Gram,并使用 CBOW 作为示例来说明这个过程。
CBOW 架构
CBOW 的目标是给定上下文中的单词来预测中心词。
步骤 1: One-Hot 编码
首先,每个单词被转换成一个 one-hot 编码的向量。假设我们有以下词汇表:
词汇表 = ["我", "爱", "北京", "是", "首都"]
每个单词的 one-hot 编码如下:
单词 | 我 | 爱 | 北京 | 是 | 首都 |
---|---|---|---|---|---|
编码 | 10000 | 01000 | 00100 | 00010 | 00001 |
步骤 2: 输入层和隐藏层
在 CBOW 模型中,上下文中多个单词的 one-hot 编码向量被平均,然后输入到一个隐藏层。隐藏层的大小定义了输出的向量大小。
假设隐藏层的大小为 3,那么平均后的输入向量是:
输入向量 = [0.2, 0.2, 0.4, 0.2, 0]
步骤 3: 权重矩阵
隐藏层和输出层之间有一个权重矩阵 W,其大小为 词汇表大小 x 隐藏层大小
。这个矩阵包含了每个单词的向量表示。
假设权重矩阵 W 如下:
我 | 爱 | 北京 | 是 | 首都 | |
---|---|---|---|---|---|
1 | 0.1 | 0.2 | 0.3 | 0.4 | 0.5 |
2 | 0.6 | 0.7 | 0.8 | 0.9 | 1.0 |
3 | 1.1 | 1.2 | 1.3 | 1.4 | 1.5 |
步骤 4: 矩阵乘法
输入向量与权重矩阵 W 进行矩阵乘法,得到输出层之前的向量。
输入向量 * W = [0.2, 0.2, 0.4, 0.2, 0] * W
= [0.2*0.1 + 0.2*0.2 + 0.4*0.3 + 0.2*0.4 + 0*0.5,
0.2*0.6 + 0.2*0.7 + 0.4*0.8 + 0.2*0.9 + 0*1.0,
0.2*1.1 + 0.2*1.2 + 0.4*1.3 + 0.2*1.4 + 0*1.5]
= [0.28, 0.54, 0.88]
步骤 5: 软件最大化 (Softmax)
最后,使用 Softmax 函数将输出向量转换为概率分布,预测中心词。
Python 示例
以下是使用 Python 进行权重矩阵乘法的示例:
import numpy as np
# 假设输入向量
input_vector = np.array([0.2, 0.2, 0.4, 0.2, 0])
# 假设权重矩阵
weight_matrix = np.array([
[0.1, 0.2, 0.3, 0.4, 0.5],
[0.6, 0.7, 0.8, 0.9, 1.0],
[1.1, 1.2, 1.3, 1.4, 1.5]
])
# 矩阵乘法
output_vector = np.dot(input_vector, weight_matrix)
print(output_vector)
向量压缩前后格式对比
下面是 one-hot 编码与 Word2Vec 压缩后的向量格式对比:
单词 | One-Hot 编码 | Word2Vec 压缩向量 |
---|---|---|
我 | [1, 0, 0, 0, 0] | [0.1, 0.2, 0.3] |
爱 | [0, 1, 0, 0, 0] | [0.4, 0.5, 0.6] |
北京 | [0, 0, 10, 0] | [0.7, 0.8, 0.9] |
是 | [0, 0, 0, 1, 0] | [0.10, 0.11, 0.12] |
首都 | [0, 0, 0, 0, 1] | [0.13, 0.14, 0.15] |
这里的 Word2Vec 压缩向量是假设的,实际上这些向量是通过训练过程学习得到的。
请注意,上面的 One-Hot 编码向量长度等于词汇表的大小,而 Word2Vec 压缩后的向量长度是固定的,通常远小于词汇表的大小,这就是所谓的“压缩”。
Word2Vec 训练过程的简化说明
在 Word2Vec 的训练过程中,权重矩阵 W 是通过以下步骤更新的:
- 前向传播:使用输入的 one-hot 编码向量与权重矩阵相乘,并通过 Softmax 函数计算预测的输出概率分布。
- 计算损失:通常使用交叉熵损失来衡量预测概率分布与真实标签(即中心词的 one-hot 编码)之间的差异。
- 反向传播:计算损失相对于权重矩阵的梯度,并更新权重。
这个过程重复多次,直到模型收敛,权重矩阵 W 中的每一行将代表词汇表中相应单词的向量表示。
Python 示例:Softmax 函数
下面是一个计算 Softmax 函数的 Python 示例:
import numpy as np
def softmax(vector):
exp_vector = np.exp(vector - np.max(vector)) # 减去最大值防止溢出
return exp_vector / exp_vector.sum()
# 假设输出向量
output_vector = np.array([0.28, 0.54, 0.88])
# 计算 Softmax
softmax_output = softmax(output_vector)
print(softmax_output)
输出将是一个概率分布,表示每个单词作为中心词的概率。
通过这种方式,Word2Vec 能够将高维的 one-hot 编码压缩成低维的密集向量,同时保留了单词之间的语义关系。这些向量在自然语言处理任务中非常有用,例如文本分类、情感分析、机器翻译等。