终于有人把Embedding讲明白了

article/2025/4/27 20:45:59

导读:如果要总结深度学习大获成功的原因,那至少有两样东西必须入选:一样当然是很“深”的神经网络模型,这也是深度学习的“深度”的由来,另一样就是Embedding。

在深度学习中,Embedding是个很重要的概念,甚至可以说,如果要总结深度学习大获成功的原因,那至少有两样东西必须入选:一样当然是很“深”的神经网络模型,这也是深度学习的“深度”的由来,另一样就是这个Embedding。

所以我非常期待,Embedding的专著当然有必要读一读。可是,为什么市面上专门写Embedding的书这么稀缺呢?我想,这是因为要清楚介绍Embedding,刚动笔就会遇到一个很大的问题。

我们说深度学习模型效果拔群,但是缺点和优点同样突出:坏就坏在可解释性差。很多地方光知道用深度学习模型就能效果拔群,但很难解释为什么拔群,这就是深度学习一直深受学术界诟病的黑箱问题。要害部门不敢用深度学习,就是因为在原理上说不清楚。

那Embedding有什么问题呢?Embedding的问题是让黑箱问题雪上加霜。

对深度学习来说,Embedding很像一种催化剂,在两个方面将深度学习推向极致:效果更好,但同时也更为解释不清。我自问没有作者这般的本事,更不可能用一篇小文就说清楚Embedding是什么,不过我想,经验我还是有一些的,可以把来龙去脉给大家捋一捋,也许能有助于理解。

01

词嵌入

Embedding是英文,这是废话,但它的准确中译应该是什么呢?Embedding直译为“嵌入”,但是它的应用领域很广,直接叫“嵌入”会很拗口,而且意思也不清楚,容易让人摸不着头脑。倒是在Embedding的龙兴之地NLP(自然语言处理),让Embedding经过积年累月,终于固定了一个中译名称,叫词嵌入。

词嵌入也是个非常重要的概念,特别是在NLP领域。了解深度学习的同学应该已经很熟悉:现在用深度学习模型做NLP,肯定离不开这个词嵌入,基本上NLP工作的第一步,就是花式得到词嵌入。

那么,词嵌入是什么意思呢?

早些的时候,也就是词嵌入还没成为标配的时候,NLP就已经是深度学习甚至更广一点的用机器学习最重要的问题领域之一。但是大家也都知道:甭管深度学习还是机器学习,模型本身是不认字的,也就是不能把字符直接输入进去。模型只认数字。甭管是中文汉字还是英文字符,你都得想办法先转成数字才能输进模型里面去,这叫“向量化”。

那具体怎么办呢?方法不是唯一的,在深度学习这边用的比较多的叫One-Hot编码,有人翻译为“独热编码”,具体实现也简单,假设语料里面有n个词,那么就搞个n维的向量,每一个词都用单独的一维来表示,有这个词对应的维度就置1,否则为0。

譬如说我们的语料就是“Hello World”,这里有“Hello”和“World”两个词,那么要输入“Hello”就可以用[1,0]来表示,而输入“World”则可以用[0,1]来表示。那要输入的就是“Hello World”呢?既然两个词都有,都置为1就行了,也就是[1,1]。

有一点要注意的是:英文本身就是一个词一个词地组成句子和文章,词与词之间天然有空格等分割符分开,所以直接就可以进行One-Hot编码。但是中文不行,中文虽然也有“词”,但是并没有天然的分隔符,所以中文做NLP多了一个“分词”阶段,也分成一个个带空格的词,然后才能进行One-Hot编码。

One-Hot编码方法简单,而且文本经过编码处理后,就能毫无障碍地输进模型,是一种很常用的文本向量化方法。但缺点也很明显,那就是太稀疏了。

“稀疏”和“稠密”是深度学习经常使用的两个术语,什么叫“稀疏”呢?说人话就是有非常多的0,譬如说上千维的向量,只有十来个是1,其它都是0。

这一点很好理解,汉语和英语的常用词大概都在2000到3000这个范围之内,一般规模大点的语料集都会包含大部分的常用词,按照One-Hot编码一个词一个维度的办法,那向量肯定就得有两、三千个维度,但是一条句子了不起也就二十来个词,就算都没有重复,那能置位为1的也就二十来个,剩下的全都是0,当然就稀疏了。

稀疏坏处很多,占空间大不说,处理难度还高,更重要的是,大部分的内容纯粹就是有了没用但没了又不行,没啥实际信息量,很多有用的信息反而又没包含进去。所以,大家肯定就想把这些稀疏的词向量变得更加稠密,那么词嵌入就是其中取得成功的一条路子。

02

表示学习

词嵌入同样也是向量,不过和One-Hot编码不同的是,One-Hot编码得到诸如[0,0,0,1,0,1,1,00,0,00,0,0]这样的向量,而词嵌入更为“稠密”,也就是相比之下维度更低,同时每个维度基本都是非0取值,譬如[-0.517,2.1869,1.0442]。

得到词嵌入的方法有很多,但是核心目标可以归结为两个字:表示。

什么叫“表示”呢?前面我们说,文本是没法直接输进模型的,首先得向量化,把文本变成数字。不过,这只是起步,最终的目标是向量化后得到的数字,能够完好地保持了文本所包含的信息。用我们的话说,也就是希望得到的文本特征向量,能够表示文本的“意思”。

“你懂我意思吧?”对,就是那个说不清道不明,但是又能让人秒懂的那个“意思”。我们就是希望得到的词嵌入能表示这个意思,表示就是这么来的。这个过程被称为表示学习。

表示的英文是representation,也有译作“表征”,如果你在文献里看到表示学习或者表征学习, 不要疑惑,这俩就是一回事。具体是怎么回事呢?简单来说就是通过表示学习,得到上面所说的,能够表示文本“语义”的词嵌入。

可是,语义到底是什么?

譬如说上面写了这么多字,“语义”到底是什么?有标准答案吗?关键是,能量化成向量吗?现在大家应该都懂为什么前面说Embedding这个话题不好写,就是因为意思就是那个意思,但究竟是什么意思呢?不好意思,不知道是什么意思。

所以理所当然,词嵌入绝不是一条未敢设想的道路,相反,学界早有无数的人在脑海里闪现过类似的火花,可是这条路注定铺满荆棘,就连人类智能在考试都尚且要分客观题和主观题,更何况人工智能呢?在我们普通人的认知里,语义和可量化应该是这个世界上距离最远的两个词,直到Word2Vec横空出世。

03

Word2Vec

谈Embedding,谈词嵌入,就不可能不谈Word2Vec,Word2Vec是词嵌入的一块当之无愧的里程碑。Word2Vec不仅仅只是提出一种技术,而是开创了一种全新的可能,令深度学习模型在NLP上面有了无限的遐想空间,一切都要从下面这条不可能的等式说起:皇帝-男人=皇后-女人

这条等式太不可思议了,我用文字读一次:皇帝减去男人等于皇后减去女人。

毫无疑问,从数学的角度看,这是一段极为简单的四则运算式,但是含义一点也不简单。皇帝减去男人是什么意思?不知道,说不清楚。那皇后减去女人又是什么意思?不知道,也说不清楚。但是你说皇帝减去男人等于皇后减去女人,一想好像也确实符合常识。

Word2Vec还更进了一步,提出了语义空间的概念。在语义空间里面,皇帝和男人的距离,应该就等于皇后和女人的距离。把抽象的语义,变成了可以度量的具体空间。

这样处理有很多好处。不但把抽象的概念具象化了,更重要的是,许多现成的数学工具就能马上派上用场,估计发明这些数学工具的作者,无论如何也想不到能在语义上派上用场。

Word2Vec对机器学习也带来许多好处。许多传统的机器学习模型,譬如说聚类模型,本来很难蹭进NLP的圈子里的,One-Hot编码出来的结果虽然也叫“向量化”了,但特别不适合做聚类,不过现在有了Word2Vec,马上枯木逢春,也能有了用武之地。

前面说Word2Vec是一块里程碑,我感觉更像一扇门,或者叫“脑洞”也不无不可,一旦打开了,后面玩法就喷涌而出。这倒不是之前的人们缺乏想象力,而是缺乏好用的文本向量化工具,最后没法得到有意义的效果。而现在有了Word2Vec,就等于有了效果倍增器,很多模型做出了可用的结果,深度学习做NLP真的就是如虎添翼。

Word2Vec效果很好,学术界当然也得包装一下,至少得建立一个符合人们日常直觉的概念解释这件事。既然我们假设语义是有个“语义空间”这么个玩意,而最终得到的结果又是条向量,那么我们是不是可以这样理解:这条Word2Vec用来表示某个词的向量,实际上是这个词的意思,“嵌入”进了语义空间。嵌入英文就是Embedding,这就是Embedding的由来,而得到的向量也称作Word Embedding,也就是我们一直在说的词嵌入。

好了,以下是真心话大冒险的时间。如果你读完上面这段话觉得完全不知所云,不要怀疑自己,错的一定不是你。学术界对于Embedding确实就是上面这段话,也读过很多版本的解释,但始终有种挥之不去的“你懂我意思吧”的感觉。

我觉得Embedding针对的就是那种解释不清的、很抽象的“感觉”的问题,原理自然没法清楚解释,虽然学界给出了一个“你懂我意思吧”的解释,但我是真的没懂,也许学界也是似懂非懂,只不过看在Embedding效果确实不错的份上,大家也都默认罢了。

04

Embedding

Word2Vec疗效显著,也让Embedding这个概念大放异彩,很多领域其实都存在“你懂我意思吧”的需求,譬如说推荐算法。以前我介绍推荐算法,说推荐算的核心就是“以此类推”四个字,你喜欢物品A,那你大概率也会喜欢和物品A很类似的物品B,所以推荐算法有个很重要的环节,叫相似度计算。

但是有一个问题,怎么知道物品A和物品B很类似呢?这个问题这个简单,物品A和物品B是同一类东西,所以说类似。但是,这里的“东西”究竟是个什么东西?和前面的意思一样,都很抽象,或者干脆只能说是一种很微妙的感觉。但是要进行计算,就必须量化。

是不是觉得这个需求似曾相识?没错,这正是表示学习研究的领域,不过已经不是NLP领域了,叫Word Embedding肯定不合适,那好,干脆直接就叫Embedding。

不过还有个问题。这里还是Embedding,解释逻辑也还是前面的“嵌入空间”,可是“语义空间”可没法照搬?怎么办呢?学界这里发挥了极强的创造力:前面我们不是说Word2Vec还有个语义空间的概念吗?空间是好东西,可是继续叫“语义”不合适,那我们就换个一劳永逸的名字,叫“隐空间”(Latent Space)。

别小看隐空间,这可是个伟大的发明,现在深度学习凡是解释不通的东西,统统都丢进隐空间里面去了,连看似八竿子打不着的GAN都用了这个概念。至此,Embedding也完成了概念的抽象化,彻底摆脱了NLP的背景,从一项技术,变成了一条道路,Embedding和表示学习,或者叫表征学习,成为了深度学习的主线剧情。

Embedding的内容还有很多,得到Embedding的方法也一直在没有止息地演进,当初的Word2Vec已经成了明日黄花,3年前演化出来的Transformer已经成为NLP领域无可撼动的霸主,最近正展现出一统江湖的野心。想了解这些内容,推荐阅读《深入浅出Embedding》。

 

关于作者

莫凡 ,网名木羊同学。娱乐向机器学习解说选手,《机器学习算法的数学解析与Python实现》作者,前沿技术发展观潮者,擅长高冷技术的“白菜化”解说,微信公众号“睡前机器学习”,个人知乎号“木羊”。

扫码关注作者

 

RECOMMEND

推荐阅读

01

《深入浅出Embedding:原理解析与应用实践》

推荐理由:全面讲解Embedding原理和方法,重点剖析Embedding 6大应用场景。北京智源人工智能研究院院长黄铁军、微软中国首席技术官韦青、亚马逊云计算上海AI研究院院长张峥、中国计算机学会副理事长周明联袂推荐!配代码、数据、实战营、作者答疑群!

 

 

02

《Python深度学习:基于PyTorch》

推荐理由:业内公认的深度学习入门实战好书!资深AI专家20余年工作经验总结,从工具、技术、算法、实战4个维度全面讲解深度学习,重点突出、循序渐进、用图说话,配全套代码、数据和学习PPT、作者答疑群!

 

 

读书实战营

14天掌握深度学习领域爆火的Embedding、Transformer, bert,word2vec!社区领读10天+5个作业+4天实战!

与志同道合的小伙伴一起学习讨论,克服拖延症!还可获得书籍作者的面对面点评!

 


扫码关注【华章计算机】视频号

每天来听华章哥讲书

更多精彩回顾

书讯 | 9月书讯 | 秋天的第一本书,来了

资讯 | 什么是Serverless?有哪些应用?终于有人讲明白了

书单 | 10本书,帮你看清未来的科技趋势

干货 | Linux30岁生日:Linux 成功的真正原因

收藏 | 终于有人把Scrapy爬虫框架讲明白了

上新 | 【新书速递】“帆船书”——数据库领域殿堂级作品,全新升级第7版!

赠书 | 【第71期】破案了!库里为何会花18万美元买一个猴子头像?

点击阅读全文优惠选书


http://chatgpt.dhexx.cn/article/cZNd7dFi.shtml

相关文章

计算机网络(二) | 网络编程基础、Socket套接字、UDP和TCP套接字编程

目录 一、网络编程基础1.1 为什么需要网络编程1.2 什么是网络编程1.3 网络编程中的基本概念 二、Socket套接字2.1 概念2.2 分类2.3 Java数据报套接字通信模型2.4 Java流套接字通信模型2.5 UDP数据包套接字编程2.6 TCP流套接字编程 一、网络编程基础 1.1 为什么需要网络编程 丰…

C#编程并实现网络UDP套接字

文章目录 一、UDP介绍二、C#命令行/控制台hello world程序(一)创建项目(二)客户端程序(三)服务端程序(四)使用wireshark抓包 三、C#Form窗口程序(一)创建项目…

Linux C语言高级

一、软件包管理及shell命令 1.流行的两种软件包管理机制 1.Deb软件包:由Debian Linux首先提出的软件包管理机制 2.RPM软件包:由Redhat Linux推出的软件包管理机制 2.Debian Linux开发了APT软件包管理器 1.检查和修复软件包依赖关系 2.利用Internet网络帮…

精心收集了60个C语言项目源码,分享给大家

C语言文章更新目录 C/C学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C语言基础-第一个C程序 C语言基础-简单程序分析 VS2019编写简单…

python基于c语言开发_C高级编程:基于模块化设计思想的C语言开发 PDF 超清版

给大家带来的一篇关于C语言相关的电子书资源,介绍了关于C高级编程、模块化、设计思想、C语言开发方面的内容,本书是由机械工业出版社出版,格式为PDF,资源大小80 MB,吉星编写,目前豆瓣、亚马逊、当当、京东等…

【Linux】网络基础+UDP网络套接字编程

只做自己喜欢做的事情,不被社会和时代裹挟着前进,是一件很奢侈的事。 文章目录 一、 网络基础1.局域网和广域网2.协议初识和网络协议分层(TCP/IP四层模型)3.MAC地址和IP地址(子网掩码,路由表,I…

C#使用TCP/UDP协议通信并用Wireshark抓包分析数据

目录 一、Wireshark抓包软件下载安装二、控制台程序使用 UDP 通信1)创建新项目2)编写代码3)编译结果4)抓包分析数据 三、Form窗口程序使用 TCP 通信1)创建新项目2)设计图形界面3)编写代码4&…

SimpleFOC之ESP32(九)—— WIFI、UDP和TCP

目录 说明一、网络通信1.1、准备工作1.2、UDP通信1.3、TCP通信 二、硬件准备三、代码参考四、代码演示4.1、WIFI_AP模式UDP通信4.2、WIFI_STA模式TCP client通信 五、UDP通信控制电机5.1、硬件准备5.2、代码演示5.2.1、串口通信更改为UDP通信5.2.2、笔记本连接AP5.2.3、UDP发送…

如何进行网络编程(代码利用UDP socket实现)

目录 一、什么是网络编程? 二、那么在Java中能调用C语言的函数吗? 三、操作系统提供的socket API主要有两类(实际上不止两类) 1.流套接字(底层使用TCP协议) TCP协议的特点: 2.数据报套接字…

北斗系统学习—JT808协议用C语言解析

前言: 本人从事于Linux应用开发(音视频应用方向),现在主要是负者AI摄像头的开发,在学音视频的途中,虽然是个小白,但是更愿意把自己所学音视频的一些知识分享给大家,以后每周都会更新哦! 本期介绍…

TCP/IP协议(一、自己动手实现udp)

对TCP/IP协议都只是听过,没有仔细研究过,一些知识体系也比较零散,什么三次握手,四次挥手,滑动窗口,零拷贝技术等等,都是知识有这么个东西,而不知道具体是啥,这几天还是根…

【Linux】传输层协议:UDP和TCP

但人不能永远浪漫下去,那会走向自我毁灭的。浪漫都是水字旁,会把人淹死的。人最终还是要进入一个规则体系,所谓,随心所欲不逾矩嘛 文章目录 一、UDP协议1.端口号2.理解UDP报头3.UDP的特点(面向数据报,全双…

Linux网络:UDP协议 | TCP协议

文章目录 前言端口号netstat -- pidof UDP协议TCP协议三次握手 四次挥手确认应答(ACK)机制超时重传机制连接管理机制理解TIME_WAIT状态理解 CLOSE_WAIT 状态 滑动窗口流量控制拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常情况TCP小结 基于TCP 和 UDP 的应用层协议TCP/UD…

C语言SOCKET编程指南

转载自:http://blog.sina.com.cn/s/blog_79b01f66010163q3.html 这篇文章完全可以作为c语言socket编程指南,无论在任何系统下。感谢作者fenglovel! C语言SOCKET编程指南 1、介绍 Socket 编程让你沮丧吗?从man pages中很难得到有…

【socket】从计算机网络基础到socket编程——Windows Linux C语言 + Python实现(TCP+UDP)

一、部分基础知识1.1 计算机网络的体系结构1.11 互联网简介1.12 计算机网络的分类1.13 协议与网络的分层体系结构▶ 协议▶ 网络的分层体系结构 1.14 OSI 七层模型(重要)▶ OSI 模型的结构▶ OSI 模型各层的功能 1.15 TCP/IP 的体系结构(重要…

C语言 C语言基础

C语言 C语言基础 一、简述 对于C语言基础相关方面的表面理解,简单介绍。 二、二进制 生活中常用的是十进制,基数0,1,2,3,4,5,6,7,8,9,。满10进1。 时钟60进制。基数0,1,2...57,58,59。满60进1。60秒为1分钟,60分钟为1小时。 计算机二进制&a…

炼一项专业技能c语言,C语言程序设计_安徽新华电脑专修学院

C语言程序设计,安徽新华电脑专修学院,2013年3月,在安徽省315国际消费者权益日纪念大会暨省消协四届三次理事会会议上,安徽新华电脑专修学院被省消费者协会授予“诚信单位”。 C语言程序设计, 并用c语言进行测试。还有b…

C++中使用UDP Socket发送字节数据

文章目录 参考代码结果展示 参考 这篇文章给的代码也能用 https://blog.csdn.net/qq_36437446/article/details/106446172 CRC代码来自https://blog.csdn.net/huijunma2010/article/details/124151471 在线计算CRC http://www.ip33.com/crc.html 代码 这里的byte是unsigned…

本机UDP收发性能测试

测试内容 测试单机版的UPD客户端和服务端之间的性能,UDP客户端发送数据到UDP服务端,并等待服务端返回,计算出UDP的性能 测试方法 客户端和服务端部署在同一台虚拟机器上,客户端启动多个线程,同时向服务端发送指定数量…

2020复旦大学计算机夏令营机试题

2020复旦大学计算机夏令营机试题 这个是开卷编程,不计入成绩,但是面试会问你做的情况。