word2vec,是如何利用神经网络把一个onehot编码压缩成向量

Word2Vec 使用神经网络作为其核心组件来学习单词的向量表示。下面将介绍 Word2Vec 中的两种主要架构:CBOW(Continuous Bag-of-Words)和 Skip-Gram,并使用 CBOW 作为示例来说明这个过程。

CBOW 架构

CBOW 的目标是给定上下文中的单词来预测中心词。

步骤 1: One-Hot 编码

首先,每个单词被转换成一个 one-hot 编码的向量。假设我们有以下词汇表:

词汇表 = ["我", "爱", "北京", "是", "首都"]

每个单词的 one-hot 编码如下:

单词北京首都
编码1000001000001000001000001
步骤 2: 输入层和隐藏层

在 CBOW 模型中,上下文中多个单词的 one-hot 编码向量被平均,然后输入到一个隐藏层。隐藏层的大小定义了输出的向量大小。
假设隐藏层的大小为 3,那么平均后的输入向量是:

输入向量 = [0.2, 0.2, 0.4, 0.2, 0]
步骤 3: 权重矩阵

隐藏层和输出层之间有一个权重矩阵 W,其大小为 词汇表大小 x 隐藏层大小。这个矩阵包含了每个单词的向量表示。
假设权重矩阵 W 如下:

北京首都
10.10.20.30.40.5
20.60.70.80.91.0
31.11.21.31.41.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 是通过以下步骤更新的:

  1. 前向传播:使用输入的 one-hot 编码向量与权重矩阵相乘,并通过 Softmax 函数计算预测的输出概率分布。
  2. 计算损失:通常使用交叉熵损失来衡量预测概率分布与真实标签(即中心词的 one-hot 编码)之间的差异。
  3. 反向传播:计算损失相对于权重矩阵的梯度,并更新权重。
    这个过程重复多次,直到模型收敛,权重矩阵 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 编码压缩成低维的密集向量,同时保留了单词之间的语义关系。这些向量在自然语言处理任务中非常有用,例如文本分类、情感分析、机器翻译等。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨航 AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值