NLP入门:word2vec self-attention transformer diffusion的技术演变

news2024/12/28 4:05:20

这一段时间大模型的相关进展如火如荼,吸引了很多人的目光;本文从nlp领域入门的角度来总结相关的技术路线演变路线。

1、introduction

自然语言处理(Natural Language Processing),简称NLP。这个领域是通过统计学、数学模型、机器学习等相关技术研究人类语言的特征,对其进行数学的表示,并基于这种表示进行计算使其可以处理一些和人类语言相关的事务,模拟人类使用语言的状态。

在人类的思想领域中,针对于人的认识,一直以来都有两种截然相反的倾向。一种是认为人类的各种知识是天然具有逻辑的合理性的,因此在建构知识时,应当自顶向下的搭建逻辑的结构,才能获得对知识的把握;而另一种则认为人类的知识不是通过逻辑和理性把握的,而是通过在世界中的经验一点一点形成的,我们认为是逻辑和理性的认知,也不过是在经验中被我们归纳总结和确认的,因此人类的知识需要从大量的经验中去归纳总结,这是一个自底向上的过程。从哲学史的角度看来,这两者就是所谓的唯理论和经验论的区别。这两种倾向是认识事物的过程中不可避免的,因此被带入到具体学科领域中,就会得到两套相反的方法。

之所以要提到这个问题,是因为在自然语言处理领域,也曾有偏向规则的(唯理论的)和偏向统计的(经验论)的两种方法。基于规则和语法的自然语言处理算法曾经一度是NLP领域的主流,很多研究者都基于建构一个更合理的语言规则的思路来推进算法对于人类语言的处理能力。现如今,这一主流已经被基于统计学的方法所取代。目前较为流行的BERT、CLIP及类似算法本质上都是基于对大量语料的训练(实际上就是一种更高级的统计分析)得到的。这种基于神经网络训练的方法得到的模型已经具有了较强的人类语言处理能力。

2、词的向量化

在进入正文之前,我们先提出这样一个问题,一个文本,经过分词之后,送入某一个自然语言处理模型之前该如何表示?

例如,“人/如果/没用/梦想/,/跟/咸鱼/还有/什么/差别”,向机器学习模型直接输入字符串显然是不明智的,不便于模型进行计算和文本之间的比较。那么,我们需要一种方式来表示一个文本,这种文本表示方式要能够便于进行文本之间的比较,计算等。最容易想到的,就是对文本进行向量化的表示。例如,根据语料库的分词结果,建立一个词典,每个词用一个向量来表示,这样就可以将文本向量化了。词向量的思想就在这种环境下确立了。

2.1 one-hot的词向量模型

词袋模型把文本看成是一个装着词的袋子,对这个袋子中包含的所有此词汇采用One-Hot编码,每个词向量维度大小为整个词汇表的大小,对于每个具体的词汇表中的词,将对应的位置置为1。比如我们有下面的5个词组成的词汇表:

采用One-Hot编码方式来表示词向量非常简单,但缺点也是显而易见的。一方面我们实际使用的词汇表很大,经常是百万级以上,这么高维的数据处理起来会消耗大量的计算资源与时间。另一方面,One-Hot编码中所有词向量之间彼此正交,没有体现词与词之间语义之间的相似关系。

2.2 Word2vec 词向量模型

Word2Vec是google的Mikolov在2013年推出的一个NLP工具,由论文Exploiting Similarities among Languages for Machine Translation提出,之所以论文和工具的名称不一致是因为Google论文开源的Git代码仓库名字就叫做“Word2Vec“。它的特点是能够将单词转化为向量来表示,这样词与词之间就可以定量的去度量他们之间的关系,挖掘词之间的联系。
Word2Vec 的训练模型本质上是只具有一个隐含层的神经元网络,如下图所示:

它的输入是采用One-Hot编码的词汇表向量,它的输出也是One-Hot编码的词汇表向量。例如输入向量x1={1,0,0......0},在网络最终收敛之后,从输入层x到隐含层h的权重矩阵

W V ⋅ N W_{V\cdot N} WVN,便是每一个词的采用Distributed Representation的词向量。比如上图中 Xi 单词的Word embedding后的向量便是权重矩阵W的第i行的转置。这样我们就把原本维数为V的词向量变成了维数为N的词向量(一般而言N远小于V,V的大小就是词袋容量大小),并且词向量间保留了一定的相关关系。

Google在Word2Vec的论文中提出了CBOW和Skip-gram两种模型,CBOW适合于数据集较小的情况,而Skip-Gram在大型语料中表现更好。其中CBOW使用围绕目标单词的其他单词(语境)作为输入,在映射层做加权处理后输出目标单词。与CBOW根据语境预测目标单词不同,Skip-gram根据当前单词预测语境下其他单词。假如我们有一个句子“There is an apple on the table”作为训练数据,CBOW的输入为(is,an,on,the),输出为apple。而Skip-gram的输入为apple,输出为(is,an,on,the)。

2.2.1 Continuous Bag of Words(CBOW)
1、输入层:上下文单词的One-Hot编码词向量,V为词汇表单词个数,C为上下文单词个数。仍以“There is an apple on the table”为例,这里C=4,所以模型的输入是(is,an,on,the)4个单词的One-Hot编码词向量。

2、初始化一个权重矩阵 W V ⋅ N W_{V\cdot N} WVN ,然后用所有输入的One-Hot编码词向量左乘该矩阵,得到维数为N的向量 ( w 1 , w 2 , ⋅ ⋅ ⋅ w n ) \left (w _{1} , w _{2}, \cdot \cdot \cdot w _{n}\right ) (w1,w2,wn) ,这里的N由自己根据任务需要设置。

3、将所得的向量 ( w 1 , w 2 , ⋅ ⋅ ⋅ w n ) \left (w _{1} , w _{2}, \cdot \cdot \cdot w _{n}\right ) (w1,w2,wn) 相加求平均作为隐藏层向量h。

4、初始化另一个权重矩阵 W V ⋅ N ′ W^{'}_{V\cdot N} WVN,用隐藏层向量h左乘 ,再经激活函数处理得到V维的向量y,y的每一个元素代表相对应的每个单词的概率分布。

5、y中概率最大的元素所指示的单词为预测出的中间词(target word)与true label的One-Hot编码词向量做比较,误差越小越好(根据误差更新两个权重矩阵)

在训练前需要定义好损失函数(一般为交叉熵代价函数),采用梯度下降算法更新W和W’。训练完毕后,输入层的每个单词与矩阵W相乘得到的向量的就是我们想要的Distributed Representation表示的词向量,也叫做word embedding。因为One-Hot编码词向量中只有一个元素为1,其他都为0,所以第i个词向量乘以矩阵W得到的就是矩阵的第i行,所以这个矩阵也叫做look up table,有了look up table就可以免去训练过程,直接查表得到单词的词向量了。

2.2.2 Skip-gram
在前面的章节中,我们已经介绍过Skip-Gram是给定input word来预测上下文,其模型结构如上图所示。它的做法是,将一个词所在的上下文中的词作为输出,而那个词本身作为输入,也就是说,给出一个词,希望预测可能出现的上下文的词。通过在一个大的语料库训练,得到一个从输入层到隐含层的权重模型。“apple”的上下文词是(’there’,’is’,’an’,’on’,’the’,’table’).那么以apple的One-Hot词向量作为输入,输出则是(’there’,’is’,’an’,’on’,’the’,’table’)的One-Hot词向量。训练完成后,就得到了每个词到隐含层的每个维度的权重,就是每个词的向量(和CBOW中一样)。接下来具体介绍如何训练我们的神经网络。

1、首先我们选“There is an apple on the table”中间的一个词作为我们的输入词,例如我们选取“apple”作为input word;

2、有了input word以后,我们再定义一个叫做skip_window的参数,它代表着我们从当前input word的一侧(左边或右边)选取词的数量。如果我们设置skip_window=2,那么我们最终获得窗口中的词(包括input word在内)就是[‘is’,’an’,’apple’,’on’,’the’ ]。skip_window=2代表着选取左input word左侧2个词和右侧2个词进入我们的窗口,所以整个窗口大小span=2x2=4。另一个参数叫num_skips,它代表着我们从整个窗口中选取多少个不同的词作为我们的output word,当skip_window=2,num_skips=2时,我们将会得到两组 (input word, output word) 形式的训练数据,即 (‘apple’, ‘an’),(‘apple’, ‘one’)。

3、神经网络基于这些训练数据中每对单词出现的次数习得统计结果,并输出一个概率分布,这个概率分布代表着到我们词典中每个词有多大可能性跟input word同时出现。举个例子,如果我们向神经网络模型中输入一个单词“中国“,那么最终模型的输出概率中,像“英国”, ”俄罗斯“这种相关词的概率将远高于像”苹果“,”蝈蝈“非相关词的概率。因为”英国“,”俄罗斯“在文本中更大可能在”中国“的窗口中出现。我们将通过给神经网络输入文本中成对的单词来训练它完成上面所说的概率计算。

4、通过梯度下降和反向传播更新矩阵W

5、W中的行向量即为每个单词的Word embedding表示

2.2.3 算法改进

前面部分介绍的简化版Word2Vec过程实际上是为了便于大家理解而概括出来的。这个理想的模型当中存在一些无法回避的问题,比如输出的部分是一个50000维的One-Hot向量,因此数据经过网络后应该得到的也是一个50000维的向量,对这个输出向量进行Softmax计算所需的工作量将是一个天文数字。

Google论文里真实实现的Word2Vec对模型提出了两种改进思路,即Hierarchical Softmax模型和Negative Sampling模型。Hierarchical Softmax是用输出值的霍夫曼编码代替原本的One-Hot向量,用霍夫曼树替代Softmax的计算过程。Negative Sampling(简称NEG)使用随机采用替代Softmax计算概率,它是另一种更严谨的抽样模型NCE的简化版本。

3、多头注意力机制

多头注意力机制起源于Google的论文《Attention is all you need》,之前在李沐的论中阅读中有看过,但是第一次涉略似懂非懂,如今因为大模型的原因重新涉略,果然温故而知新,孔子诚不我欺。
在这里插入图片描述
图片的来源是论文原文,可以看出scaled-dot-product-attention到multi-head-attention最后才到transformer的结构,整体上层层递进还是非常明晰的。inputs经过word2vec之后就成为词向量;词在语句中是有位置顺序的,因此需要加上positional encoding部分,通过position encoding添加词语的位置信息。

根据沐神的讲解,原论文中的scaled-dot-product-attention的结构中作为输入层的Q K V其实就是input的输入向量,Query=Key=Value=input。在做计算的过程中,序列中的某一个词语以自身向量作为query,与整个序列其他语句的keys逐个进行点乘;点乘的结果可以用来反应query与keys之间的相似度,毫无疑问他会与自身的key点乘结果最大,这样的结果也是符合常识的。将query与整个序列的keys的点乘结果经过softmax转化为和为1的权重值,这些权重值可以用来表明这个词语与序列中其他词语的相关性关系;将此权重乘上序列的Values就得到最终的attention结果了。

计算过程可以参考:NLP学习—21.自注意力机制(Self-Attention)与Transformer详解,配置了较为精美的插图,便于理解具体的计算过程。

注意一下:
1、Q、K、V可以来自input embedding的线性变化,不一定就是原向量
2、multi-head self-attention 与self-attention 的区别在于可以有多组embedding的线性变化,从而习得多种多样的隐性空间的变换,获得尽可能全面的对于input内在规律的表征。

4、Diffusion

5、Stable Diffusion

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

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

相关文章

自学黑客(网络安全),一般人我劝你还是算了吧(自学网络安全学习路线--第十七章 网络安全技术下)【建议收藏】

文章目录 一、自学网络安全学习的误区和陷阱二、学习网络安全的一些前期准备三、自学网络安全学习路线一、扫描工具赏析1、扫描工具概述2、如何获取扫描工具3、常用扫描工具4、SATAN的分级5、SATAN的特点6、SNMP7、Nessus8、X-scan9、常用扫描工具比较10、其它扫描工具 二、扫描…

【azure】office 365邮箱auth2认证之spa的刷新令牌过期后如何处理

参考:https://learn.microsoft.com/zh-cn/azure/active-directory/develop/refresh-tokens 官方对令牌和刷新令牌生命周期的描述 已失效的刷新令牌如何获取新的令牌和刷新令牌 /*** office 365使用失效的刷新令牌和应用程序的相关信息来获取新的访问令牌和刷新令牌…

PyTorch安装配置(windows)

一、Anaconda安装与配置 Anaconda提供了conda机制用于管理Python数据分析时常用的工具库/包 官网下载最新的(翻墙):https://repo.anaconda.com/archive/ 清华大学Anaconda镜像站:https://mirrors4.tuna.tsinghua.edu.cn/help/an…

从研发赋能型PMO到产研管理型PMO的组织变革思考︱广联达产研管理部副总经理丰之恺

广联达科技股份有限公司产研管理部副总经理丰之恺先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾,演讲议题:从研发赋能型PMO到产研管理型PMO的组织变革思考。大会将于8月12-13日在北京举办,敬请关注! 议题简要&#x…

4G无线通信技术的单片机远程升级研究(学习)

介绍了一种基于4G无线通信技术的单片机远程在线升级系统及方法,由上位机、4G无线模块、嵌入式设备终端3部分组成。 结合EC20 R2.1 4G模块,介绍了4G无线网络的组建方法,借助4G网络实现远程无线升级。 通过验证测试,系统能够实现嵌入…

css内阴影

CSS内阴影及特定方向内阴影 基本参数: /* x 偏移量 | y 偏移量 | 阴影颜色 */ box-shadow: 60px -16px teal;/* x 偏移量 | y 偏移量 | 阴影模糊半径 | 阴影颜色 */ box-shadow: 10px 5px 5px black;/* x 偏移量 | y 偏移量 | 阴影模糊半径 | 阴影扩散半径 | 阴影…

Python GUI编程利器:初始Tkinker(1)

小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 和猫妹学Python,一起趣味学编程。 神兽归笼 最近天气炎热起来了,大家一定要注意防暑降温啊! 马上要放暑假了,你有什么计划没…

AI届老牌顶流!AI孙燕姿?AI配音?带你玩转语音合成!

热度与争议并存!AI孙燕姿成新晋顶流?随着AI孙燕姿的爆火,AI老牌顶流「语音合成」再度被炒热飞桨AI Studio也汇聚着众多“语音合成”深度玩家本期就来带大家快速上手 AI克隆歌手 该应用项目使用AI孙燕姿同源模型So-VITS-SVC 4.0,其…

Pyside6-QtCharts+psutil实战-绘制一个CPU监测工具

今天是实战篇章,我们结合可以快速提升我们开发效率的工具一起开实战一波实时读取系统CPU使用情况的折线图。 使用的开发工具Qt Designer来开发UI界面。 十分便捷。使用起来也算比较的简单了,虽然也存在不少的BUG。 ❝ 对所需要的控件进行拖拽式&#xff…

如何看待低级爬虫与高级爬虫?

爬虫之所以分为高级和低级,主要是基于其功能、复杂性和灵活性的差异。根据我总结大概有下面几点原因: 功能和复杂性:高级爬虫通常提供更多功能和扩展性,包括处理复杂页面结构、模拟用户操作、解析和清洗数据等。它们解决了开发者…

死神来了 | 印度火车,能靠点谱吗?

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 阿福 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩天津录音间 6月初,印度三列火车先后相撞,造成288人死亡、1175人受伤,被称为印度本世…

基于Echarts2.X的地图数据可视化指南

目录 前言 一、关于Echarts版本 1、为什么用Echarts2.2.7 2、文件目录说明 二、地图数据可视化 1、新建map.html 2、Echarts图表初始化 3、参数设置 三、源码展示分析 1、初始化阶段 2、timelineOption.js模拟数据 总结 前言 在前面的博文(数据会说话-从我国…

ebpf执行报错no BTF found for kernel

一、现象描述 采用cilium epbf框架开发的ebpf程序无法在系统上正常运行。 curtiscurtis-desktop:~$ cd work/ curtiscurtis-desktop:~/work$ ls kmodule vfs_write_moitor curtiscurtis-desktop:~/work$ curtiscurtis-desktop:~/work$ sudo ./vfs_write_moitor -filename/mn…

第九十天学习记录:C++核心:函数提高

函数默认参数 在C中,函数的形参列表中的形参是可以有默认值的。 语法:返回值类型 函数名 (参数默认值){} 问:C语言可以在函数的形参赋默认值吗? 答: 在C语言中&#xf…

Unity 之 抖音小游戏本地数据最新存储方法分享

Unity 之 抖音小游戏本地数据最新存储方法分享 一、抖音小游戏文件存储系统背景二、文件存储系统的使用方法2.1 初始化2.1 创建目录2.3 存储数据2.4 删除目录/文件2.5 其他相关操作 三,小结 抖音小游戏是一种基于抖音平台开发的小型游戏,与传统的 APP 不…

Java POI (2)—— Excel文件的上传与导出(实例演示)

一、单文件的上传功能 这里是一个demo的流程图,下面按照这个流程图做了一个简单的实现,有部分判断没有加上,实际操作中,可以根据自己的需求进行增加或者修改。并且此处还是在接受文件传入后将文件进行了下载,保存到本地…

哪个爬虫库用的最多?

在Python中,最常用的爬虫库是requests和BeautifulSoup。requests库用于发送HTTP请求和处理响应,而BeautifulSoup库用于解析HTML文档。这两个库通常结合使用,用于爬取网页内容并提取所需的数据。其他常用的爬虫库还包括Scrapy、Selenium等。 常…

我的创作纪念日(256)

目录 机缘 收获 日常 成就 憧憬 机缘 要说为什么我会选择IT这条路,我觉得是因为从小对电脑的兴趣,从小学2年级开始的电脑生涯,但是那时候也只是玩电脑游戏,而由于我接触电脑较早的缘故,开始有许多的朋友遇到问题…

vue+heatmapjs-vue实现热力图,点击/滑动可以监听并更新

实现效果如下: 点击的次数或者滑动越多,区域的颜色越深 1.下载最新版热力图插件 npm install heatmapjs-vue 2.main.js中全局引用 注意!!!只能全局引用,不能局部引用,局部引用就报错显示不出…

「2024」预备研究生mem-形式逻辑强化:入选名额

一、入选名额 从后往前推 二、课后题