Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊聊Embedding(嵌入向量)

聊聊Embedding(嵌入向量)

作者头像
Ryan_OVO
发布于 2023-10-19 11:54:32
发布于 2023-10-19 11:54:32
1.7K0
举报
文章被收录于专栏:程序随笔程序随笔

摘要自《深入浅出Embedding》一问。具体详细内容请移步该书。

概述

简单来说,嵌入是用向量表示一个物体,这个物体可以是一个单词、一条语句、一个序列、一件商品、一个动作、一本书、一部电影等,可以说嵌入(Embedding)涉及机器学习深度学习的绝大部分对象。这些对象是机器学习和深度学习中最基本、最常用、最重要的对象,正因如此,如何有效表示、学习这些对象就显得非常重要。 Embedding本身也在不断更新,由最初表现单一的静态向表现更丰富的动态延伸和拓展。具体表现为由静态的Word Embedding、Item Embedding、Graph Embedding、Categorical variables Embedding向ELMo、Transformer、GPT、BERT、XLNet、ALBERT等动态的预训练模型延伸。

Word Embedding

因机器无法直接接收单词、词语、字符等标识符(token),所以可以采用整型数字标识或编码来处理,目前常用独热编码(One-Hot Encoding)来表示。这种编码方法虽然方便,但非常稀疏,属于硬编码,且无法重载更多信息。此后,人们想到用数值向量或标识符嵌入(Token Embedding)来表示,即通常说的词嵌入(Word Embedding),又称为分布式表示。 不过Word Embedding方法真正流行起来,还要归功于Google的word2vec,word2vec,是一群用来产生词向量的相关模型。

word2vec

从文本、标识符、独热编码到向量表示的整个过程,如下:

word2vec有两种模型:

  • CBOW模型
  • Skip-gram模型

两种模型的区别如下:

CBOW 模型是从上下文的多个单词预测中间的单词(目标词);而 skip-gram 模型则从中间的单词(目标词)预测上下文的多个单词。 具体可参考:深入浅出理解word2vec模型 (理论与源码分析)

预训练流程

预训练模型(如ELMo、BERT等)的一般流程如图所示,其中微调是一个重要环节:

ELMo

word2vec实现了从独热编码到Word Embedding的一大进步,通过word2vec转换后,一个单词对应一个向量,单词的表现更丰富了,甚至一些相近的词在空间上也有明显的表现。 但word2vec还没有解决一词多义的问题,更不用说解决单词随环境变化而变化的问题。 多义词是自然语言中经常出现的现象,也是语言灵活性和高效性的一种体现。比如“Don't trouble trouble”,可翻译为“别烦恼了”,其中trouble这个词就属于一词多义。如果用word2vec模型训练后,trouble只对应一个向量,显然无法区别这个trouble的两个含义。而一词多义,不论是在英语、中文还是在其他语言中,都是普遍存在的问题。ELMo的提出意味着我们从词嵌入(Word Embedding)时代进入了语境词嵌入(Contextualized Word-Embedding)时代! ELMo的核心思想主要体现在深度上下文(Deep Contextualized)上。与静态的词嵌入不同,ELMo除提供临时词嵌入之外,还提供生成这些词嵌入的预训练模型,所以在实际使用时,EMLo可以基于预训练模型,根据实际上下文场景动态调整单词的Word Embedding表示,这样经过调整后的Word Embedding更能表达在这个上下文中的具体含义,自然也就解决了多义词的问题。所以ELMo实现了一个由静态到动态的飞跃。 EMLo的实现主要涉及语言模型(Language Model),当然,它使用的语言模型有点特别,因为它首先把输入转换为字符级别的Embedding,根据字符级别的Embedding来生成上下文无关的Word Embedding,然后使用双向语言模型(如Bi-LSTM)生成上下文相关的Word Embedding。 ELMo整体模型结构如下:

ELMo的优点:

  • 实现从单纯的词嵌入(Word Embedding)到情景词嵌入(Contextualized Word Embedding)的转变;
  • 实现预训练模型从静态到动态的转变。

ELMo的缺点: ELMo模型可以根据上下文更新词的特征表示,实现了词向量由静态向动态的转变。不过因ELMo依赖LSTM的架构,导致其训练只能按部就班,严格遵守从左到右或从右到左的次序进行训练,所以在面对特大语料库时将非常耗时。此外,LSTM虽然也有记忆功能,但其长期记忆的效果并不理想。 具体可参考《深入浅出Embedding》一书第6章。

BERT

BERT预训练模型很好的解决了并发以及大规模训练语料库下的性能问题。BERT的整体架构如图所示,它采用了Transformer中的Encoder部分。

Trm指Transformer的Encoder模块,如下所示:

BERT更擅长处理自然语言理解任务(NLU),使用上下文预测单词。

GPT

GPT预训练的方式和传统的语言模型一样,通过上文,预测下一个单词。它使用了Transformer的Decoder部分。GPT的整体架构如下:

其中Trm表示Decoder模块,在同一水平线上的Trm表示在同一个单元,E i表示词嵌入,那些复杂的连线表示词与词之间的依赖关系,显然,GPT要预测的词只依赖上文。GPT的Decoder模块如下:

GPT模型采用了传统的语言模型进行训练,即使用单词的上文预测单词。因此,GPT更擅长处理自然语言生成任务(NLG)。

小结

基于Transformer的Encoder模块得到BERT预训练模型,基于Transformer的Decoder得到GPT系列预训练模型。BERT采用MLM,而GPT系列采用LM,它们各有优势,都在很多领域取得很好的效果。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C语言之精华——指针详解(下)
2、指向数组元素的指针 支持 递增 递减 运算。(实质上所有指针都支持递增递减 运算 ,但只有在数组中使用才是有意义的)
C语言中文社区
2022/05/30
5990
C语言之精华——指针详解(下)
【C语言】⒉万字带你玩转高阶指针『0»1』
🚀write in front🚀 ---- 🔎大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 🏅2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星Top100~阿里云专家^星级博主~掘金 || InfoQ创作者~周榜34»总榜2815🏅 🆔本文由 謓泽 原创 CSDN首发🙉如需转载还请通知⚠ 📝个人主页:打打酱油desuCSDN博客💬 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏:【C】系列_打打酱油desu-CSDN博客[〇~①]🎓
謓泽
2022/12/12
6160
【C语言】⒉万字带你玩转高阶指针『0»1』
C语言---深入指针(4)
对于qsort函数来说,我们只需要额外构建一个比较函数就能利用qsort进行快速排列
Undoom
2024/09/23
1030
【期末复习】⚡考试月来临!C语言复习,这一篇带你逃离挂科区!(完结)
注意:函数就是功能。每一个函数用来实现一个特定的功能。函数的名字应反映出它代表的功能,这样代码的可读性会大大提升
小丞同学
2021/08/16
9450
C语言指针深度解剖
指针是C语言的灵魂,深入理解指针,是学好学会C语言的重要前提。因此,本文将重点讲解C语言指针的深度内容。
二肥是只大懒蓝猫
2023/03/30
4940
C语言指针深度解剖
C语言学习——指针精华(1)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170990.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/23
2480
C语言学习——指针精华(1)
再谈C语言——C指针详解
还有一点:C语言中的一切函数调用中,实参传递给形参的机理都是“按值传递(pass by value)”,如果我们要在函数中修改被传递过来的对象,就必须通过这个对象的指针来完成。
xxpcb
2024/07/12
1230
再谈C语言——C指针详解
【C语言篇】深入理解指针4(模拟实现qsort函数)
如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数时,被调⽤的函数就是回调函数。
半截诗
2024/10/09
910
【C语言篇】深入理解指针4(模拟实现qsort函数)
指针02
结果是10 匪夷所思 明明把a传进去了 为什么没有用??因为main函数的a和addnumber函数的a不是一个a
用户7272142
2023/10/11
1420
指针02
轻松拿捏C语言——【保姆级·指针讲解】期末C语言<指针>急救包,全是干货,诚意满满!
有一栋楼,里有200个房间,假如我们要去某个房间找某个人,然后他说他在C304,我们就能通过门牌号C304快速找到他所在房间。
用户11162265
2024/06/14
1310
轻松拿捏C语言——【保姆级·指针讲解】期末C语言<指针>急救包,全是干货,诚意满满!
C语言进阶(八) - 指针进阶
使用typedef对函数指针void (*)(int)类型进行重命名,简化上面的函数声明:
怠惰的未禾
2023/04/27
6520
C语言进阶(八) - 指针进阶
C语言学习系列-->看淡指针(1)
在大学的宿舍里,每个宿舍都有属于自己的编号(比如:222),每一栋楼也有属于自己名字或者编号(比如:慧苑,B05)。通过这些编号,我们在点外卖的时候,直接将宿舍楼和宿舍号写在地址上,外卖小哥就会将你所点的食物送到对应的宿舍。如果,没有这些编号,你该怎么直接描述地址呢?让小哥一个一个找吗?效率低。
南桥
2024/01/26
1230
C语言学习系列-->看淡指针(1)
C语言:深入理解指针(4)
      函数指针是将函数的地址取出来,再通过函数地址去调用,那为什么不直接用函数名调用呢??原因是因为函数指针可以用来实现回调函数,而回调函数有自己的应用场景。
小陈在拼命
2024/02/17
1390
C语言:深入理解指针(4)
C语言——指针(五)
在上一篇文章中,我们提到了函数指针,函数指针是用来存放函数地址的指针,这篇文章,我们还将继续探究函数与指针。
用户11029137
2024/03/19
980
C语言——指针(五)
结构体知识------址传递和值传递
相关知识 1. 普通变量(char a):a是变量名,对应内存空间的大小是sizeof(char),对应地址假设是0x001,也就是地址0x001存放的是变量a的值,存放的数据类型是字符型。 2. 指针变量(char *p):指针变量的本质还是一个变量,只不过存放的数据类型是地址。p是变量名,对应的内存空间的大小是sizeof(char *),对应的地址假设是0x002,也就是地址0x002中存放的是变量p的值,存放的数据类型是指针:int a = 1; a在内存中的地址假设是0x001。 3. 形参是函数定义的时候用的,实参是调用函数的时候用的。 函数的参数都是形参,只有在函数调用的时候系统才会为形参分配空间和地址,形参和实参不会是同一个内存地址。 例如:
跋扈洋
2021/02/02
6180
C语言指针详解(文末有福利)
假如我们定义了 char a=’A’ ,当需要使用 ‘A’ 时,除了直接调用变量 a ,还可以定义 char *p=&a ,调用 a 的地址,即指向 a 的指针 p ,变量 a( char 类型)只占了一个字节,指针本身的大小由可寻址的字长来决定,指针 p 占用 4 个字节。
C语言与CPP编程
2020/12/02
5450
C语言指针详解(文末有福利)
熬夜整理的万字C/C++总结(二),值得收藏
假如我们定义了 char a=’A’ ,当需要使用 ‘A’ 时,除了直接调用变量 a ,还可以定义 char *p=&a ,调用 a 的地址,即指向 a 的指针 p ,变量 a( char 类型)只占了一个字节,指针本身的大小由可寻址的字长来决定,指针 p 占用 4 个字节。
C语言与CPP编程
2021/08/03
1.3K0
熬夜整理的万字C/C++总结(二),值得收藏
C语言——I /深入理解指针(一)
⽣活中我们把门牌号也叫地址,在计算机中我们把内存单元的编号也称为地址。C语言中给地址起了新的名字叫:指针。 所以我们可以理解为:内存单元的编号 == 地址 == 指针
用户11015888
2024/03/11
1470
C语言——I /深入理解指针(一)
【C语言基础】:深入理解指针(二)
指针的基本运算有三种,分别是: 1. 指针 ± 整数 2. 指针 - 指针 3. 指针的关系运算
爱喝兽奶的熊孩子
2024/04/10
1580
【C语言基础】:深入理解指针(二)
函数(二)(函数的调用与值传递)
程序执行到一个函数调用另一个函数的语句时,程序的执行流程从发生函数调用的位置离开主调函数,转移到被调函数开始执行。被调函数中执行到return语句或执行完最后一条语句时,程序执行流程重新回到主调函数的离开位置,继续执行主调函数后面的语句或表达式。
pigeon
2022/04/11
9330
函数(二)(函数的调用与值传递)
相关推荐
C语言之精华——指针详解(下)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档