NLP - word2vec详解

Word2Vec是一种用于将词汇映射到高维向量空间的自然语言处理技术。由Google在2013年提出,它利用浅层神经网络模型来学习词汇的分布式表示。Word2Vec有两种主要模型:CBOW(Continuous Bag of Words)和Skip-gram。

1. 模型介绍

Continuous Bag of Words (CBOW)

CBOW模型的目标是通过上下文预测中心词。给定一个上下文窗口中的多个词,CBOW模型尝试预测中心词。这种方法适用于大数据集,因为它更容易并行化。

例如,给定一个句子 “The quick brown fox jumps over the lazy dog”,假设我们选取 “jumps” 作为中心词,那么上下文词可以是 [“The”, “quick”, “brown”, “fox”, “over”, “the”, “lazy”, “dog”]。CBOW模型尝试通过这些上下文词来预测 “jumps”。

Skip-gram

Skip-gram模型的目标是通过中心词预测上下文词。与CBOW相反,Skip-gram模型给定一个中心词,尝试预测它的上下文词。Skip-gram模型在小数据集上表现更好,尤其适用于罕见词汇的表示学习。

例如,给定中心词 “jumps”,Skip-gram模型尝试预测上下文词 [“The”, “quick”, “brown”, “fox”, “over”, “the”, “lazy”, “dog”]。

2. CBOW模型详解

为了详细演示Continuous Bag of Words (CBOW)模型的整个过程,下面将分步骤介绍模型训练的主要流程,并包含每一步的公式和向量的计算过程。我们将用一个简化的示例来说明。

示例

假设我们有一个小语料库:

"The quick brown fox jumps over the lazy dog"

我们将使用一个窗口大小为2的CBOW模型来预测中心词。假设我们选择中心词 “jumps”,它的上下文词是 [“quick”, “brown”, “fox”, “over”]。

步骤1:预处理数据

将句子分词:

["The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]

构建词汇表并为每个词汇分配唯一的ID:

{"the": 0, "quick": 1, "brown": 2, "fox": 3, "jumps": 4, "over": 5, "lazy": 6, "dog": 7}

步骤2:构建训练样本

对于中心词 “jumps”,上下文词是 [“quick”, “brown”, “fox”, “over”]。我们用这些上下文词来预测中心词 “jumps”。

步骤3:定义模型

CBOW模型使用一个浅层神经网络,包含输入层、隐藏层和输出层。

  • 输入层:每个上下文词用one-hot向量表示。例如,“quick” 的 one-hot 表示是 [0, 1, 0, 0, 0, 0, 0, 0]。
  • 隐藏层:将输入层的向量通过权重矩阵 ( W ) 转换到隐藏层,得到词向量。
  • 输出层:将隐藏层的向量通过另一个权重矩阵 ( W’ ) 转换到输出层,计算预测概率。
输入向量

上下文词的one-hot表示如下:

  • “quick”:[0, 1, 0, 0, 0, 0, 0, 0]
  • “brown”:[0, 0, 1, 0, 0, 0, 0, 0]
  • “fox”:[0, 0, 0, 1, 0, 0, 0, 0]
  • “over”:[0, 0, 0, 0, 0, 1, 0, 0]
权重矩阵

假设隐藏层维度为3,初始化权重矩阵 ( W ) 和 ( W’ ):

  • ( W ) 是 ( 8 \times 3 ) 的矩阵(8是词汇表的大小,3是隐藏层的维度)
  • ( W’ ) 是 ( 3 \times 8 ) 的矩阵

初始化权重矩阵(随机初始化):

W = [[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],[1.6, 1.7, 1.8],[1.9, 2.0, 2.1],[2.2, 2.3, 2.4]]W' = [[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, 1.6],[1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4]]

步骤4:前向传播

1. 隐藏层计算

计算每个上下文词的隐藏层表示:

  • “quick”:[0, 1, 0, 0, 0, 0, 0, 0]
  • “brown”:[0, 0, 1, 0, 0, 0, 0, 0]
  • “fox”:[0, 0, 0, 1, 0, 0, 0, 0]
  • “over”:[0, 0, 0, 0, 0, 1, 0, 0]

根据之前初始化的权重矩阵 ( W ):

W = [[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],[1.6, 1.7, 1.8],[1.9, 2.0, 2.1],[2.2, 2.3, 2.4]]

计算:

x_quick = [0, 1, 0, 0, 0, 0, 0, 0]
W^T * x_quick = [0.4, 0.5, 0.6]x_brown = [0, 0, 1, 0, 0, 0, 0, 0]
W^T * x_brown = [0.7, 0.8, 0.9]x_fox = [0, 0, 0, 1, 0, 0, 0, 0]
W^T * x_fox = [1.0, 1.1, 1.2]x_over = [0, 0, 0, 0, 0, 1, 0, 0]
W^T * x_over = [1.6, 1.7, 1.8]h = ([0.4, 0.5, 0.6] + [0.7, 0.8, 0.9] + [1.0, 1.1, 1.2] + [1.6, 1.7, 1.8]) / 4
h = [3.7, 4.1, 4.5] / 4
h = [0.925, 1.025, 1.125]
2. 输出层计算

根据之前初始化的权重矩阵 ( W’ ):

W' = [[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, 1.6],[1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4]]

计算:

u = W' * h
u = [[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, 1.6],[1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4]] * [0.925, 1.025, 1.125]u_0 = 0.1*0.925 + 0.2*1.025 + 0.3*1.125= 0.0925 + 0.205 + 0.3375= 0.635u_1 = 0.2*0.925 + 0.3*1.025 + 0.4*1.125= 0.185 + 0.3075 + 0.45= 0.9425u_2 = 0.3*0.925 + 0.4*1.025 + 0.5*1.125= 0.2775 + 0.41 + 0.5625= 1.25u_3 = 0.4*0.925 + 0.5*1.025 + 0.6*1.125= 0.37 + 0.5125 + 0.675= 1.5575u_4 = 0.5*0.925 + 0.6*1.025 + 0.7*1.125= 0.4625 + 0.615 + 0.7875= 1.865u_5 = 0.6*0.925 + 0.7*1.025 + 0.8*1.125= 0.555 + 0.7175 + 0.9= 2.1725u_6 = 0.7*0.925 + 0.8*1.025 + 0.9*1.125= 0.6475 + 0.82 + 1.0125= 2.48u_7 = 0.8*0.925 + 0.9*1.025 + 1.0*1.125= 0.74 + 0.9225 + 1.125= 2.7875u = [0.635, 0.9425, 1.25, 1.5575, 1.865, 2.1725, 2.48, 2.7875]

计算softmax概率:

y_hat = softmax(u)

softmax函数定义为:

softmax(z_i) = exp(z_i) / sum(exp(z_j))

计算每个值的指数:

exp(0.635) ≈ 1.887
exp(0.9425) ≈ 2.566
exp(1.25) ≈ 3.490
exp(1.5575) ≈ 4.745
exp(1.865) ≈ 6.457
exp(2.1725) ≈ 8.788
exp(2.48) ≈ 11.932
exp(2.7875) ≈ 16.235

计算softmax概率:

sum_exp = 1.887 + 2.566 + 3.490 + 4.745 + 6.457 + 8.788 + 11.932 + 16.235 = 56.1y_hat = [1.887/56.1, 2.566/56.1, 3.490/56.1, 4.745/56.1, 6.457/56.1, 8.788/56.1, 11.932/56.1, 16.235/56.1]≈ [0.0336, 0.0458, 0.0622, 0.0846, 0.1152, 0.1566, 0.2127, 0.2893]

步骤5:计算损失

使用交叉熵损失计算真实标签和预测标签之间的误差:

假设 “jumps” 的 one-hot 表示是 [0, 0, 0, 0, 1, 0, 0, 0],则损失函数计算为:

L = -log(y_hat[4])= -log(0.1152)≈ 2.160

步骤6:反向传播和更新权重

1. 计算梯度

对权重矩阵 ( W’ ) 计算梯度:

dL/du_i = y_hat[i] - y_i

其中 ( y_i ) 是真实的one-hot标签。例如,对于中心词 “jumps”,( y_i = 0 ) 对于 ( i ≠ 4 ),而 ( y_4 = 1 )。

dL/du = [0.0336, 0.0458, 0.0622, 0.0846, -0.8848, 0.1566, 0.2127, 0.2893]

计算 ( W’ ) 的梯度:

dL/dW' = h * (dL/du)

( W ) 计算梯度:

dL/dh = W'^T * (dL/du)
2. 更新权重

使用梯度下降法更新权重:

W' = W' - learning_rate * (dL/dW')
W = W - learning_rate * (dL/dh)

假设学习率 ( learning_rate = 0.01 ):

更新 ( W’ ):

dL/dW' = h * (dL/du)= [0.925, 1.025, 1.125] * [0.0336, 0.0458, 0.0622, 0.0846, -0.8848, 0.1566, 0.2127, 0.2893]dL/dW'_0 = [0.925, 1.025, 1.125] * 0.0336 = [0.0311, 0.0345, 0.0378]
...
dL/dW'_4 = [0.925, 1.025, 1.125] * -0.8848 = [-0.8185, -0.9074, -0.9960]W'_0 = W'_0 - learning_rate * dL/dW'_0= [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8] - 0.01 * [0.0311, 0.0345, 0.0378, ...]W' 更新后的值将逐个元素计算。

更新 ( W ):

dL/dh = W'^T * (dL/du)= [[0.1, 0.9, 1.7], [0.2, 1.0, 1.8], ...] * [0.0336, 0.0458, 0.0622, 0.0846, -0.8848, 0.1566, 0.2127, 0.2893]dh = [0.1*0.0336 + 0.9*0.0458 + 1.7*0.0622 + 0.2*0.0846 + ... , 1.0*0.0336 + 1.8*0.0458 + ...]dL/dW = 输入层的平均值 * dL/dh

权重矩阵 ( W ) 和 ( W’ ) 会逐步更新,直到损失函数收敛。

步骤七:迭代

通过对整个语料库的多次迭代,模型会逐步优化权重矩阵,获得高质量的词向量表示。

3. 模型训练

训练Word2Vec模型涉及以下几个步骤:

  1. 预处理数据:对文本进行分词、去停用词、词干提取等预处理操作。
  2. 构建词汇表:将所有唯一词汇构建成一个词汇表,每个词汇分配一个唯一的ID。
  3. 建立训练样本:根据选择的模型(CBOW或Skip-gram),创建训练样本。对于CBOW模型,训练样本是上下文词和中心词的对;对于Skip-gram模型,训练样本是中心词和上下文词的对。
  4. 定义和训练模型:使用浅层神经网络模型(通常是一个隐藏层的前馈神经网络)来学习词汇的向量表示。通过最小化预测误差(如交叉熵损失),模型调整权重以提高预测准确性。
  5. 生成词向量:一旦模型训练完成,词汇的向量表示可以从模型的权重中提取出来。这些向量表示可以用于各种NLP任务,如词汇相似度计算、文本分类、聚类等。

3. 应用和优势

Word2Vec模型学习到的词向量具有以下几个优点:

  • 捕捉词汇语义:词向量可以捕捉到词汇的语义相似性。例如,“king” - “man” + “woman” ≈ “queen”。
  • 高效训练:相比于传统的统计模型(如共现矩阵、LSA),Word2Vec模型训练效率更高,可以处理大规模语料。
  • 易于扩展:词向量可以作为其他NLP模型(如RNN、LSTM、Transformer等)的输入,提升模型性能。

4. 实践示例

以下是使用Gensim库训练Word2Vec模型的Python示例代码:

from gensim.models import Word2Vec
from nltk.tokenize import word_tokenize# 示例文本数据
sentences = ["The quick brown fox jumps over the lazy dog","I love natural language processing","Word2Vec is a great tool for NLP"
]# 分词
tokenized_sentences = [word_tokenize(sentence.lower()) for sentence in sentences]# 训练Word2Vec模型
model = Word2Vec(sentences=tokenized_sentences, vector_size=100, window=5, min_count=1, workers=4)# 获取词向量
word_vector = model.wv['word2vec']# 查看相似词
similar_words = model.wv.most_similar('word2vec', topn=5)
print(similar_words)

5. 总结

Word2Vec的优点

优点描述
高效性使用浅层神经网络进行训练,计算效率高,能够在大规模语料库上快速训练
捕捉语义信息有效捕捉词汇的语义相似性,例如“king - man + woman ≈ queen”
低维表示相比词袋模型和TF-IDF,词向量维度较低,减少计算复杂度和存储需求
广泛适用生成的词向量可用于多种NLP任务,如文本分类、聚类、信息检索和机器翻译

Word2Vec的缺点

缺点描述
对词序敏感不考虑词的顺序,可能导致在某些任务中丢失重要的顺序信息
静态词向量同一个词在不同的上下文中具有相同的向量表示,无法捕捉词汇的多义性
数据依赖模型性能高度依赖于训练语料的质量和规模,若训练数据不足或质量不高,词向量质量可能会受到影响

Word2Vec的特点

特点描述
分布式表示每个词汇用一个固定长度的向量表示,向量的每个维度表示某种语义特征
浅层神经网络使用一个隐藏层的前馈神经网络训练模型,包含CBOW和Skip-gram两种方法
基于上下文通过上下文词预测中心词(CBOW)或通过中心词预测上下文词(Skip-gram)

Word2Vec的应用场景

应用场景描述
文本分类使用词向量作为特征,提高文本分类模型的性能
信息检索通过词向量计算词汇相似度,改进信息检索系统效果
聚类分析使用词向量作为特征,更好地发现文本的主题和结构
机器翻译词向量帮助捕捉源语言和目标语言之间的语义关系
情感分析改进情感分析模型的效果,准确识别文本中的情感倾向

Word2Vec的发展趋势

发展趋势描述
动态词向量ELMo和BERT等模型能够根据上下文动态生成词向量,解决词汇多义性问题
预训练模型基于Transformer的预训练模型(如GPT和BERT)在各种NLP任务中取得显著成果
多模态表示词向量在多模态任务(如图像、文本、音频的联合表示)中发挥重要作用
更高效的训练算法新的训练算法和优化技术提高词向量训练的效率和效果,如负采样和分层Softmax
应用扩展词向量技术在推荐系统、知识图谱、对话系统等领域展现出潜力

更多问题咨询

Cos机器人

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/27767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】数据库介绍|数据库分类|MySQL的基本结构|MySQL初步认识|SQL分类

目录 数据库介绍 什么是数据库 数据库分类 1.关系型数据库(RDBMS): 2.非关系型数据库: MySQL要学啥 MySQL初步认识 SQL分类 💡推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风…

59.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露(7)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:58.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露(6) 关于御剑…

QStateMachine 笔记

QStateMachine 是 Qt 框架中用于实现状态机的类。状态机是一种模型,它由一系列状态组成,每个状态对应于系统的一个特定行为模式。状态机可以根据外部事件或内部条件在不同的状态之间转换。 基本概念: 状态(State)‌&…

改进rust代码的35种具体方法-类型(二十三)-避免通配符导入

上一篇文章-改进rust代码的35种具体方法-类型(二十二)-最小化可见度 Rust的use语句从另一个板条箱或模块中提取命名项目,并使该名称无需条件即可在本地模块的代码中使用。表单的通配符导入(或glob导入)use somecrate::module::*表示&#xff…

【TB作品】STM32F102C8T6单片机,PWM发生器

硬件: STM32F102C8T6核心板,按键,0.96 OLED显示屏。 软件: 1、硬件启动触发单片机输出PWM,未触发之前PWM输出为低电平。 2、按键修改PWM的变化模式、变化时间长度、占空比上下限。 3、输出的PWM是固定的10kHZ的。 4、变…

【万方数据库爬虫简单开发(自用)】

万方数据库爬虫简单开发(自用)(一) 使用Python爬虫实现万方数据库论文的搜索并获取信息1.获取url2.输入关键词3.使用BeautifulSoup解析4.获取文章标题信息 使用Python爬虫实现万方数据库论文的搜索并获取信息 后续会逐步探索更新…

洗地机哪款好?洗地机十大名牌排行榜

随着科技的发展,各种家居清洁工具层出不穷,为我们的生活带来了诸多便利。在众多清洁工具中,洗地机的清洁效果更受大家喜爱,它能够完美解决了扫地机无法做到的干湿垃圾“一遍清洁”效果,而且几乎能解决日常生活中所有的…

k8s 小技巧: 查看 Pod 上运行的容器

目录 1. 示例 Pod 的定义文件2. kubectl describe pod(推荐)3. kubectl get pod3.1 json 格式3.2 yaml 格式 4. 其他操作 1. 示例 Pod 的定义文件 # 文章中所用 pod 的 yaml 定义文件, multi-container.yaml apiVersion: v1 kind: Pod metad…

Vector的底层结构剖析

vector的介绍: 1.Vector实现了List接口的集合。 2.Vector的底层也是一个数组,protected Object[] elementData; 3.Vector 是线程同步的,即线程安全,Vector类的操作方法带有Synchronized. 4.在开发中,需要线程同步时&#xff0…

flutter EventBus

#配置文件中 先 引入 event_bus: ^2.0.0 1.封装一个类 便于直接调用 import package:event_bus/event_bus.dart; class EvenBlueUtil{static EventBus eventBus EventBus();static EventBus eventBusUpdate EventBus();}class UserLoggedInEvent {var user;UserLoggedInEve…

加州大学系统有几所分校?它们怎么样?

The University of California (UC) system 中文版 加州大学系统(University of California, UC)是美国加利福尼亚州的一个著名公立大学系统,共有十所分校。以下是每所分校的简介和它们的特点: 1. 加州大学伯克利分校&#xff…

btstack协议栈实战篇--Performance - Stream Data over SPP (Server)

btstack协议栈---总目录_bt stack是什么-CSDN博客 目录 1.Track throughput 2.Packet Handler 3.btstack_main 4.log信息 RFCOMM连接打开后,请求RFCOMM EVENT CAN SEND NOW,通过rfcomm request can send now event()。 当我们得到RFCOMM EVENT CAN SEND NOW…

笔记 | 软件工程06-1:软件设计-软件设计基础

1 软件设计概述 1.1 为什么要软件设计 1.2 何为软件设计 何为软件系统的解决方案? 软件设计关注与软件需求的实现问题软件设计是需求分析和软件实现间的桥梁 1.3 软件设计的质量要求 1.4 软件设计的过程 1.4.1 软件体系结构设计 1.4.2 用户界面设计 1.4.3 软件详细…

如何轻松利用人工智能深度学习,提升半导体制造过程中的良率预测?

背景 这个项目涉及半导体制造过程的监测领域。在半导体制造中,不断收集来自传感器或过程测量点的信号是常态。然而,并非所有这些信号在特定的监测系统中都同等重要。这些信号包括了有用的信息、无关的信息以及噪声。通常情况下,工程师获得的…

将Jar用三种方式生成Windows的安装程序

无论是WEB(spring boot)的JAR,还是JavaFX以及swing的Jar,要生成windows方式。 打包成Windows可执行文件(.exe),你可以使用以下三种方法: ### 方法1:使用Inno Setup 1. **构建JavaFX应用程序**: 使用M…

2779. 数组的最大美丽值

简单翻译一下题目意思: 对于每个 nums[i] 都可以被替换成 [nums[i]-k, nums[i]k] 区间中的任何数,区间左右是闭的。在每个数字可以替换的前提下,返回数组中最多的重复数字的数量。 第一想法是用一个哈希表,Key 是可以被替换的数…

Kotlin 语言基础学习

什么是Kotlin ? Kotiln翻译为中文是:靠他灵。它是由JetBrains 这家公司开发的,JetBrains 是一家编译器软件起家的,例如常用的WebStorm、IntelliJ IDEA等软件。 Kotlin官网 JetBrains 官网 Kotlin 语言目前的现状: 目前Android 已将Kotlin 作为官方开发语言。 Spring 框…

硬件SPI读写W25Q64

硬件SPI读写W25Q64 接线图(和软件SPI一样) 使用SPI1,SCK,接PA5;MISO,接PA6;MOSI,接PA7;NSS,可接PA4。 接线图对应:PA5接CLK引脚,PA6…

【数据结构】第十六弹---C语言实现希尔排序

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、希尔排序( 缩小增量排序 ) 1.1、预排序实现 1.2、希尔排序代码实现 1.3、代码测试 1.4、时空复杂度分析 1.5、性能比较 总结 上一弹我们…

Cheat Engine.exe修改植物大战僵尸阳光与冷却

Cheat Engine.exe修改植物大战僵尸阳光与冷却 打开Cheat Engine.exe和植物大战僵尸,点CE中文件下面红框位置,选择植物大战僵尸,点击打开 修改冷却: 等冷却完毕,首次扫描0安放植物,再次扫描变动值等冷却完…