Word2Vec解读

news2025/3/9 22:34:24

Word2Vec: 一种词向量的训练方法

简单地讲,Word2Vec是建模了一个单词预测的任务,通过这个任务来学习词向量。假设有这样一句话Pineapples are spiked and yellow,现在假设spiked这个单词被删掉了,现在要预测这个位置原本的单词是什么。

Word2Vec本身就是在建模这个单词预测任务,当这个单词预测任务训练完成之后,那每个单词对应的词向量也就训练好了。

1. Word2Vec概述

在正式介绍之前,我们先来科普一下Word2Vec,Word2vec是2013年被Mikolov提出来的词向量训练算法,在论文中作者提到了两种word2vec的具体实现方式:连续词袋模型CBOWSkip-gram,如图1所示。
在这里插入图片描述

图1 CBOW和Skip-gram的对比

图1中使用了这句话作为例子:Pineapples are spiked and yellow,在这句话中假设中心词是spiked,这个单词的上下文是其他单词:Pineapples are and yellow。

连续词袋模型CBOW的建模方式是使用上下文单词来预测spiked这个单词,当然图片上展示的是spikey,相当于是预测错了。Skip-gram正好反过来,它是通过中心词来预测上下文。

一般来说,CBOWSkip-garm训练快且更加稳定一些,然而,Skip-garm不会刻意地回避生僻词(即出现频率比较低的词),比CBOW能够更好地处理生僻词。在本节呢,我们将以Skip-garm的方式讨论词向量的训练过程。

2. Skip-gram训练词向量原理

前边我们说到,Skip-gram是通过中心词来预测上下文。我们还是以Pineapples are spiked and yellow为例进行讲解,如图2所示,中心词是spiked,上下文是Pineapples are and yellow,在Skip-gram中,上下文是我们要预测的词,因此这些词也叫目标词。

在这里插入图片描述

图2 Skip-gram原理图

Skip-garm具体是怎么工作的, 首先skip-gram是使用中心词来预测上下文,即利用spiked这个单词来预测 pineapples are and yellow这4个单词,但是训练过程中,这个预测结果很有可能并不是这4个单词,但是没关系,我们会使用这4个单词和预测的单词进行计算损失,通过损失的方式将正确的这4个单词的信息,使用梯度信息反向传播中心词spiked,这样在spiked单词在下次预测的时候,就会更准确一点。

总结一下,在训练过程中通过梯度的方式,将上下文单词的语义传入到了中心词的表示中,即使用了spiked的上下文来训练了spiked的词向量。但是我们来看spiked,和prickly这两个单词,他们的意思都是有刺,多刺的意思,那么真实的文本语料中,他们的上下文大概率也是差不多的,这样通过差不多的上下文去训练这个中心词,那么自然具有相同语义的词的词向量距离会比较近。

3. Skip-gram网络结构

前边我们提到,Word2Vec是建模了一个单词预测的任务,通过这个任务来学习词向量。同时呢,Skip-gram是一种以中心词预测上下文的方式进行的,那我们来看看它的网络结构长什么样子,如图3所示。

在这里插入图片描述

图3 Skip-gram网络结构

Skip-gram的网络结构共包含三层:输入层,隐藏层和输出层。它的处理步骤是这样的:

  1. 输入层接收shape为 [ 1 , V ] [1,V] [1,V]的one-hot向量 x x x,其中 V V V代表词表中单词的数量,这个one-hot向量就是上边提到的中心词。

  2. 隐藏层包含一个shape为 [ V , N ] [V,N] [V,N]的参数矩阵 W 1 W_1 W1,其中这个 N N N代表词向量的维度, W 1 W_1 W1就是word embedding 矩阵,即我们要学习的词向量。将输入的one-hot向量 x x x W 1 W_1 W1相乘,便可得到一个shape为 [ 1 , N ] [1, N] [1,N]的向量,即该输入单词对应的词向量 e e e

  3. 输出层包含一个shape为 [ N , V ] [N,V] [N,V]的参数矩阵 W 2 W_2 W2,将隐藏层输出的 e e e W 2 W_2 W2相乘,便可以得到shape为 [ 1 , V ] [1,V] [1,V]的向量 r r r,内部的数值分别代表每个候选词的打分,使用softmax函数,对这些打分进行归一化,即得到中心词的预测各个单词的概率。

这是一种比较理想的实现方式,但是这里有两个问题:

  1. 这个输入向量是个one-hot编码的方式,只有一个元素为1,其他全是0,是个极其稀疏的向量,假设它第2个位置为1,它和word embedding相乘,便可获得word embedding矩阵的第二行的数据。那么我们知道这个规律,直接通过访存的方式直接获取就可以了,不需要进行矩阵相乘。

  2. 在获取了输入单词对应的词向量 e e e后,它是一个 [ 1 , N ] [1,N] [1,N]向量。接下来,会使用这个向量和另外一个大的矩阵 W 2 W_2 W2进行相乘,最终会获得一个1*V的向量,然后对这个向量进行softmax,可以看到这个向量具有词表的长度,对这么长的向量进行softmax本身也是一个极其消耗资源的事情。

第1个问题解决起来比较简单,我们主要来看第2个问题,那怎么解决呢?直观的想法是我们不要去生成这么多的类别,所以采用了一个负采样的策略,将海量分类转化成了二分类,来缓解这个问题,下我们来看看它具体是怎么做的。

4. 负采样解决大规模分类问题

在这里插入图片描述

图4 使用负采样策略训练Skip-gram模型

还是以Pineapples are spiked and yellow为例进行讲解,如图4所示,其中中心词是spiked和上下文词是正样本Pineapples are and yellow,这里这个正样本代表该词是中心词的上下文。

以正样本单词Pineapples为例,之前的做法是在使用softmax学习时,需要最大化Pineapples的推理概率,同时最小化其他词表中词的推理概率。之所以计算缓慢,是因为需要对词表中的所有词都计算一遍。然而我们还可以使用另一种方法,就是随机从词表中选择几个代表词,通过最小化这几个代表词的概率,去近似最小化整体的预测概率。

例如,先指定一个中心词(spiked)和一个目标词正样本(Pineapples),再随机在词表中采样几个目标词负样本(如”dog,house”等)。

有了这些正负样本,我们的skip-gram模型就变成了一个二分类任务。对于目标词正样本,我们需要最大化它的预测概率;对于目标词负样本,我们需要最小化它的预测概率。通过这种方式,我们就可以完成计算加速。这个做法就是负采样

再回到图4看一看整体的训练流程是怎么样的。图7中相当于有两个词向量矩阵:黄色的和灰色的,他们的shape都是一样的。整体的流程大概是这样的。

  1. 获取中心词spiked的正负样本(正负样本是目标词),这里一般会设定个固定的窗口,比如中心词前后3个词算是中心词的上下文(即正样本);
  2. 获取对应词的词向量,其中中心词从黄色的向量矩阵中获取词向量,目标词从灰色的向量矩阵中获取词向量。
  3. 将中心词和目标词的词向量进行点积并经过sigmoid函数,我们知道sigmoid是可以用于2分类的函数,通过这种方式来预测中心词和目标词是否具有上下文关系。
  4. 将预测的结果和标签使用交叉熵计算损失值,并计算梯度进行反向迭代,优化参数。

经过这个训练的方式,我们就可以训练出我们想要的词向量,但图4中包含两个词向量矩阵(黄色的和灰色的),一般是将中心词对应的词向量矩阵(黄色的)作为正式训练出的词向量。

恭喜,看到这里我想你已经明白Skip-gram大致是如何训练词向量了。

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

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

相关文章

STM32F1学习——编码器接口

一、编码器接口 编码器接口可以接收正交编码器的信号,根据编码器旋转产生的正交信号脉冲,通过硬件自动控制CNT值的自增或自减,从而指出编码器的位置、旋转方向和旋转速度。 每个高级定时器和通用定时器都有一个编码器接口,他们会占…

什么是网关路由

1.认识网关 网关(Gateway)和路由(Router)是两个相关但不同的概念。 一、网关(Gateway) 定义 网关是一个网络节点,它充当了不同网络之间的连接点。可以将其看作是一个网络的 “大门”&#xf…

S32K144 UDSdoCAN 升级刷写实现笔记

文章目录 1. 摘要2. 开发环境搭建2.1 开发板2.2 IDE 安装2.3 更新扩展包2.4 烧录仿真测试2.4.1 新建工程2.4.2 导入已有工程2.4.3 编译工程2.4.4 硬件连接2.4.5 Debug2.4.6 添加 .c .h 文件2.5 串口配置2.5.1 时钟2.5.2 GPIO2.5.3 定时器2.5.4 uart 工程2.5.5 烧录验证3. 升级原…

第十八周:Faster R-CNN论文阅读

Faster R-CNN论文阅读 摘要Abstract文章简介1. 引言2. Faster R-CNN 框架2.1 RPN2.2 损失函数2.3 RPN的训练细节 3. Faster R-CNN的训练4. 优缺点分析总结 摘要 本篇博客介绍了 Faster R-CNN,这是一种双阶段的目标检测网络,是对 Fast R-CNN 的改进。为了…

Day28下 - 大模型微调:酒店评论情感分析

一、前置准备 1. 下载 LLaMA Factory https://github.com/hiyouga/LLaMA-Factory.git 搭建过程详见:https://blog.csdn.net/CSBLOG/article/details/144584581 2. 选择 预训练模型 和 prompt指令模型 预训练阶段在实际工作中,一般是用不上的&#xff…

【网络安全 | 漏洞挖掘】JS Review + GraphQL滥用实现管理面板访问

未经许可,不得转载。 正文 在映射目标范围后,我发现了一个用于管理的控制台界面,但没有注册功能。 于是我开始尝试: 1、模糊测试注册端点 -> 失败 2、在请求中将登录替换为注册 -> 再次失败 尝试均未奏效后,我决定冷静下来,重新思考方法并利用技术手段。 我观察…

数据库管理-第278期 开年综艺,第七届中国PG数据库生态大会有感(20250105)

数据库管理278期 20245-01-05 数据库管理-第278期 开年综艺,第七届中国PG数据库生态大会有感(20250105)1 走后门的可观测性2 社区VS商业3 从O来到PG去4 现场集锦5 IF CLUB社区总结 数据库管理-第278期 开年综艺,第七届中国PG数据库…

Docker 安装Elasticsearch搜索引擎 搜索优化 词库挂载 拼音分词 插件安装

介绍 允许用户快速索引和搜索大量的文本数据。通过使用倒排索引,它能够在海量数据中高效检索相关信息。提供灵活的查询语言,可以做全文搜索、模糊搜索、数据统计等,用来代替MYSQL的模糊搜索,MYSQL的模糊搜索不支持使用索引从而导…

NVR小程序接入平台EasyNVR使用FFmpeg取流时提示错误是什么原因呢?

在视频监控系统中,FFmpeg常用于从各种源(如摄像头、文件、网络流等)获取流媒体数据,这个过程通常称为“取流”。 在EasyNVR平台中,使用FFmpeg取流是一种常见的操作。FFmpeg作为一款强大的开源多媒体处理工具&#xff…

【电源专题】为什么测试电源的SW波形上冲振荡之前的0V电位要先来个小的下降

在同步电源的开关节点SW波形测试中,你可能会发现周期性的SW波形在上升前的一小段时间时间内会有一个小小的下跌,这个下跌会低于0V。那么这个下跌是怎么来的呢? 如下所示为某降压转换器的SW开关节点波形: 其展开后可以看到在上升之前有20ns左右的时间,SW电压是下跌…

基于EB和S32DS3.5建立基础工程

本文参考: https://blog.csdn.net/weixin_41660366/article/details/141949690 https://blog.csdn.net/zhoujingCSDN/article/details/142284796 0、简介 本文基于S32K312 介绍新建工程并引入EB,环境如下: MCU:NXP S32k312 RT…

如何申请LabVIEW软件著作权?

申请 软件著作权 时,若你的单位开发的应用是基于 LabVIEW 的图形化编程语言,你需要将 LabVIEW 程序中的图形化设计转换为源代码形式,以符合软件著作权申请的要求。由于LabVIEW本身是图形化编程语言,而不是传统的文本编程语言&…

C/C++中new/delete与malloc/free的区别及对象管理

C/C++中new/delete与malloc/free的区别及对象管理 在C/C++编程中,动态内存管理是一个核心且复杂的话题,其中new、delete、malloc和free是四个经常用于此目的的工具。尽管它们都涉及到内存的分配和释放,但它们在处理对象时的方式和效果却大相径庭。本文将通过示例来说明这些工…

GitHub 图像修复开源项目推荐【持续更新】

GFPGAN 介绍:GFPGAN(Generative Facial Prior-GAN)是由腾讯ARC(Applied Research Center)开发的一种实用的真实世界人脸修复算法。它专门设计用于人脸图像的生成和优化,尤其在低质量人脸图像的超分辨率恢复…

JWT认证实战

JWT(JSON Web Token)是一种轻量级的、基于 JSON 的开放标准(RFC 7519),用于在各方之间安全地传递信息。JWT 的特点是结构简单、轻量化和跨平台支持,适用于用户身份验证、信息加密以及无状态的 API 访问控制…

【无标题】优秀回答统计

在Class-Aware Pseudo-Labeling (CAP) 方法中,类感知阈值(Class-Aware Thresholds)的动态调整是通过以下步骤实现的: 初始化阈值: 在训练开始时,为每个类别设置初始阈值。这些阈值可以基于先验知识、数据分…

arcgis模版空库怎么用(一)

这里以某个项目的数据为例: 可以看到,属性表中全部只有列标题,无数据内容 可能有些人会认为空库是用来往里面加入信息的,其实不是,正确的用法如下: 一、下图是我演示用的数据,我们可以看到其中…

基于深度学习的视觉检测小项目(六) 项目的信号和变量的规划

• 关于前后端分离 当前流行的一种常见的前后端分离模式是vueflask,vueflask模式的前端和后端之间进行数据的传递通常是借助 API(应用程序编程接口)来完成的。vue通过调用后端提供的 API 来获取或提交数据。例如,前端可能通过发送…

edeg插件/扩展推荐:助力生活工作

WeTab 此插件在我看来有2个作用 1.改变edeg的主页布局和样式,使其更加精简,无广告 2.提供付费webtab Ai(底层是chatGpt) 沉浸式翻译 此插件可翻译网页的内容 假设我们浏览github 翻译前 翻译后 Better Ruler 可以对网页的距离进行测量 适合写前端的小伙伴 用法示例:

k8s基础(4)—Kubernetes-Service

Service概述 抽象层 ‌k8s的Service是一种抽象层,用于为一组具有相同功能的Pod提供一个统一的入口地址,并通过负载均衡将网络流量分发到这些Pod上。‌ Service解决了Pod动态变化的问题,例如Pod的IP地址和端口可能会发生变化,通过…