深度学习基础入门篇[10]:序列模型-词表示{One-Hot编码、Word Embedding、Word2Vec、词向量的一些有趣应用}

news2025/1/12 12:27:46

在这里插入图片描述
【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等

在这里插入图片描述
专栏详细介绍:【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等

本专栏主要方便入门同学快速掌握相关知识。声明:部分项目为网络经典项目方便大家快速学习,后续会不断增添实战环节(比赛、论文、现实应用等)

专栏订阅:深度学习入门到进阶专栏

深度学习基础入门篇[10]:序列模型-词表示{One-Hot编码、Word Embedding、Word2Vec、词向量的一些有趣应用}

在NLP领域,自然语言通常是指以文本的形式存在,但是计算无法对这些文本数据进行计算,通常需要将这些文本数据转换为一系列的数值进行计算。那么具体怎么做的呢?这里就用到词向量的概念。

一般情况下,当我们拿到文本数据的时候,会先对文本进行分词,然后将每个单词映射为相应的词向量,最后基于这些词向量进行计算,达到预设任务的效果,下边我们分如下几节展开介绍词向量相关的知识。

1.One-Hot编码: 一种简单的单词编码方式

在NLP领域,如何将单词数值化呢,One-Hot编码就是一种很简单的方式。假设我们现在有单词数量为 N N N的词表,那可以生成一个长度为 N N N的向量来表示一个单词,在这个向量中该单词对应的位置数值为1,其余单词对应的位置数值全部为0。举例如下:

词典: [queen, king, man, woman, boy, girl ]

图1 one-hot 编码图

假设当前词典中有以上6个单词,图1展示了其中4个单词的one-hot编码表示。这个表示是不是挺简单的,但是这种表示方式也有一些不太合适的地方。

首先,在实际应用中词表中单词的数量往往比较多,高达几十万,甚至百万。这种情况下使用one-hot编码的方式表示一个单词,向量维度过长,同时向量会极其稀疏。

其次,从图1我们也可以看出向量之间是正交的,向量之间的点积为0,因此无法直接通过向量计算的方式来得出单词之间的关系。直观上我们希望语义相近的单词之间的距离比较近。比如,我们知道,“香蕉”和“橘子”更加相似,而“香蕉”和“句子”就没有那么相似,同时,“香蕉”和“食物”,“水果”的相似程度,可能介于“橘子”和“句子之间”。

2.Word Embedding: 一种分布式单词表示方式

前边我们谈到了one-hot编码的缺陷,这一节我们来聊另一种分布式的表示方式:Word Embedding,看他是怎么解决这些问题的。

假设每个单词都可以用 n n n个特征进行表示,即可以使用这 n n n个特征来刻画每个单词,如图2所示,我们使用图2中的这5个特征来刻画”狗”、”蜈蚣”、”君子兰”和”填空”这几个词。

图2 单词表示样例

显然,有了这些特征去构建词向量,我们能够根据这些特征比较容易地去划分单词的类别,比如”狗”和”蜈蚣”均是动物,在这个角度上说是一类的,他们之间的距离应该要比”狗”和”君子兰”近。

我们在回到词向量上来,按照同样的想法,可以使用这 n n n个特征来刻画每个单词,并且这 n n n个特征是浮点类型的,这样可以拓宽表示范围。当我们将视角切换到 n n n维空间,那么每个词向量其实就相当于是该 n n n维空间的一个点,相当于是将该单词嵌入到该空间中,这也是Word Embedding的原始意义。

当然我们通常是无法穷举具体的特征类别的,所以在NLP领域一般直接将模型表示为长度为 n n n的向量让模型去训练(只是每个向量维度具体代表什么含义是不好去解释的)。但好消息是通过合适的词向量学习算法,是可以比较好的学习到单词的语义信息的,语义相近的单词之间的距离会比较近,语义不同的单词之间距离会比较远。

图3 词向量示意图

图3展示了关于词向量的一些例子,当我们将词向量训练好之后,我们可以看到France, England, Italy等国家之间比较近,并形成一个小簇;dog, dogs,cat,cats形成一个小簇。簇内的单词距离一般会比较近,不同簇的单词距离会比较远。

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

前边我们貌似提出了一个对词向量比较好的期望,但是如何去学习这些词向量,达到这种效果呢?这就是本节讨论的话题,本节将通过Word2Vec为大家讲解词向量的训练方法。

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

Word2Vec本身就是在建模这个单词预测任务,当这个单词预测任务训练完成之后,那每个单词对应的词向量也就训练好了。下边我们来具体看看吧。

3.1 Word2Vec概述

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

图4 CBOW和Skip-gram的对比

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

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

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

3.2 Skip-gram训练词向量原理

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

图5 Skip-gram原理图

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

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

3.3 Skip-gram网络结构

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

图6 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个问题,那怎么解决呢?直观的想法是我们不要去生成这么多的类别,所以采用了一个负采样的策略,将海量分类转化成了二分类,来缓解这个问题,下我们来看看它具体是怎么做的。

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

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

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

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

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

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

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

  1. 获取中心词spiked的正负样本(正负样本是目标词),这里一般会设定个固定的窗口,比如中心词前后3个词算是中心词的上下文(即正样本);

  2. 获取对应词的词向量,其中中心词从黄色的向量矩阵中获取词向量,目标词从灰色的向量矩阵中获取词向量。

  3. 将中心词和目标词的词向量进行点积并经过sigmoid函数,我们知道sigmoid是可以用于2分类的函数,通过这种方式来预测中心词和目标词是否具有上下文关系。

  4. 将预测的结果和标签使用交叉熵计算损失值,并计算梯度进行反向迭代,优化参数。

经过这个训练的方式,我们就可以训练出我们想要的词向量,但图7中包含两个词向量矩阵(黄色的和灰色的),一般是将中心词对应的词向量矩阵(黄色的)作为正式训练出的词向量。看到这里我想你已经明白Skip-gram大致是如何训练词向量了。

4. 关于词向量的一些有趣应用

前边几节我们提到,对词向量的期望是具有相同语义的词之间的距离比较近,不同语义的词之间的距离比较远。那么在词向量训练完成之后,我们可以基于这个期望去实验一些有趣的应用,也相当于是验证词向量学习的好坏。

4.1 相似度计算

我们可以去挖掘某个单词的同义词,即将一个单词的词向量和其他所有单词词向量进行距离计算,距离最小的那些词就是和该单词语义相近的,例如:

  • nice: good, great, wonderful

  • dog: dogs, puppy

4.2词聚类

根据各个单词的词向量,可以执行词聚类的算法,这样可以挖掘出一批语义相近的单词,例如:

  • Beijing, Washington, Paris, Berlin

  • slow, slowser, slowest

4.3 词关系推理

这是比较有趣的一个应用,通过词语义上的一些关系来进行推理一些词,例如下面几个例子。

  • King - Man + Woman = Queen

  • China - Beijing + Washington = America

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

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

相关文章

机器学习神经网络——Adaboost分离器算法

系列文章目录 机器学习之SVM分类器介绍——核函数、SVM分类器的使用 机器学习的一些常见算法介绍【线性回归,岭回归,套索回归,弹性网络】 机器学习相关概念思维导图 文章目录 系列文章目录 前言 Adaboost算法的简单介绍 Adaboost算法相…

Unity之使用Photon PUN开发多人游戏教程

前言 Photon是一个网络引擎和多人游戏平台,可以处理其服务器上的所有请求,我们可以在 Unity(或其他游戏引擎)中使用它,并快速把游戏接入Photon的网络中,而我们就可以专注于在项目中添加逻辑,专注于游戏玩法和功能了。 PUN(Photon Unity Networking)是一种开箱即用的解…

Linux服务器安装启动卸载宝塔面板

宝塔面板简介 宝塔面板是提升运维效率的服务器管理软件,支持一键LAMP/LNMP/集群/监控/网站/FTP/数据库/JAVA等100多项服务器管理功能,支持Windows和Linux系统,服务器可以通过网络轻松管理,提高运维效率。例如:创建和管…

极米H6搭载光学变焦打造无损4K,带来更沉浸观影体验

近年来,科技飞速发展,我国涌现出很多新兴科技企业,如家用智能投影、无人机、扫地机器人等行业发展迅速,国际竞争力逐年增强。其中,家用智能投影行业成长快速,正展现出蓬勃的发展生机。根据IDC自2015到2022年…

rollup打包vue组件并发布到npm

个人认为rollup在打包组件的实现方式比用webpack方便,webpack应该是比较适合打包大型的工程项目,而rollup适合打包一些平时在项目中的组件 rollup中文文档:简介 | rollup.js 中文文档 | rollup.js中文网 (rollupjs.com) 这次打包一个滚动加…

python操作mysql

Python 中使用什么第三方库来操作 MySQL ?如何安 装? 使用第三方库为: pymysql 安装: pip install pymysql如何获取链接对象? • from pymysql import Connection 导包 • Connection( 主机 , 端口 , 账户 , 密码 ) 即…

Java基础面试题突击系列4

👩🏻 作者:一只IT攻城狮 ,关注我不迷路 ❤️《java面试核心知识》突击系列,持续更新… 💐 面试必知必会学习路线:Java技术栈面试系列SpringCloud项目实战学习路线 📝再小的收获x365天…

Docker Compose 和 ChatGpt 私有部署

1. 下载 Docker Compose 的二进制文件: Docker Compose 的Github下载链接地址是: Releases docker/compose GitHub 注:这里没有讲解docker的安装,因为已经写好了,在这里可以去看一下,先安装好docker在其弄…

京东购物车如何提升30%性能 | 京东云技术团队

1、背景 购物车面临的挑战: 1)新业务:随着业务形态的丰富,购物车在不断支持各种新业务,依赖的外部接口也随之增加; 2)下沉:一些前端调用的接口下沉到购物车中台; 3&am…

Linux systemd

这里写目录标题 一:配置文件内容二:配置文件位置三:开机启动配置四:systemctl使用 一:配置文件内容 systemd服务配置文件存放在/usr/lib/systemd目录下,有系统system和用户user之分,需要开机不登录就能运行的程序,放在/usr/lib/systemd/syst…

项目跟踪的好处有哪些?项目经理必须了解

项目跟踪要跟踪什么呢?主要针对计划、任务和项目成员三个方面,是为了了解项目的实际进展情况而进行。 在跟踪过程中我们会发现项目计划的不当之处,促使我们去改进和完善计划;发现项目风险,及时解决问题;了…

软件设计之UML用例图大白话教程

1、为什么要使用UML用例图? 对一个复杂问题或者现象的分析,好的方式方法往往能带来事半功倍的效果。比如在软件开发领域,参与的人员角色各种各样,比如软件开发工程师、产品经理、客户、运营人员、老板、用户、B端客户等等&#x…

chatgpt赋能Python-python_kargs

Python中的*kargs:详解 在Python编程中,经常需要为函数传递参数。除了常规的参数传递,Python还支持通过关键字参数传递参数。这种方法比较灵活,可以快速地修改函数的输入参数。其中,kargs是Python中非常常见的一个参数…

管理git项目:003

首先我们得创建一个git管理仓库 进入桌面路径,待会创建的文件可以在桌面找到 cd ..【创建git管理仓库】:创建一个.git 管理仓库, 这个文件被创建后是一个隐藏文件。这个.git文件的作用是:指定当前文件夹作为git管理仓库 git init …

今天,我问了ChatGPT一个难以启齿的问题,内容实录

文 / 高扬(微信公众号:量子论) 七个月前,我是一个害怕失业的漂泊上海的小青年,每天在合租房里刷着LeetCode。 现在我已经在一家人工智能公司从事着自己喜欢的关于机器深度学习的研发工作。 你想知道我的生活发生了什么…

学习git

文章目录 02-为什么要学习Git软件?03 概念:版本控制04 概念:版本控制软件基础功能05 概念:集中式、分布式版本控制系统、多人协作开发5.1 文件冲突问题5.2集中式版本控制(CVS,SVN)5.3 分布式版本…

Word控件Aspose.Words教程:使用 Aspose.在 Java 中对条码使用 ECI 编码

Aspose.Words是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。 Aspose API支持流行文件格式处理,并…

LabVIEWCompactRIO 开发指南30 目标间通信

LabVIEWCompactRIO 开发指南30 目标间通信 可以从两种方法选择在FPGA VI和实时处理机上运行的VI之间传输数据的方法:前面板控制和指示器或DMAFIFO。可以使用前面板控件和指示器来传输最新值或标签以及DMA FIFO,以流式传输数据或发送消息和命令。这两种…

数据存储应用与原理剖析

存储引擎 存储引擎就是存放和读取用户数据的地方,对于持久化的存储引擎而言,数据的归宿是非易失性的存储介质(通俗意义上来说就是磁盘)所以该以什么形式组织和存储数据,这就是存储引擎设计的艺术所在这一块涉及到和操…

【历史上的今天】5 月 23 日:Java 正式发布;晶体管的共同发明者出生

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2023 年 5 月 23 日,在 2007 年的今天,盛大宣布出售所持有新浪公司股票,累计获利 7650 万美元。盛大曾于 2005 年 2 月通过公开市场…