Datawhale-零基础入门NLP-新闻文本分类Task06

之前已经用RNN和CNN进行文本分类,随着NLP的热门,又出现了大热的Attention,Bert,GPT等模型,接下来,就从理论进行相关学习吧。接下来,我们会经常听到“下游任务”等名词,下游任务就是NLP领域称之为利用预先训练的模型或组件的监督学习任务。

目录

1 学习路径

2 Seq2Seq

3 Attention

4 Transformer


1 学习路径

2 Seq2Seq

Seq2Seq全称是Sequence to Sequence,称之为序列到序列模型,是RNN的一个变体,常用于机器翻译、语音识别、自动对话等任务。其核心思想是通过深度神经网络将一个作为输入的序列映射为一个作为输出的序列,这一过程由编码输入到解码输出两个环节构成。编码器Encoder和解码器Decoder各由一个循环神经网络构成,两个网络是共同训练的。

                                     

Encoder-Decoder模型能有效地解决建模时输入序列和输出不等长的问题。Seq2Seq的编码器就是循环神经网络(RNN,LSTM,GRU),将句子输入至encoder中,生成一个Context vector,Context vector是Encoder的最后一个hidden state,即将输入句压缩成固定长度的context vector,再通过Decoder将context vector内的信息产生输出句。相关函数为:

                                                                 

其中,C为编码器函数,Y为解码器函数。

解码时采用集束搜索策略,会保存b个当前的较佳选择,然后解码时每一步根据保存的选择进行下一步扩展和排序,接着选择前b个进行保存,循环迭代直到找到最佳结果。

                                   

除此之外,堆叠RNN、增加Dropout机制、与编码器之间建立残差连接等均是常用的改进措施。但是在实际应用中,会发现随着输入序列的增长,模型的性能发生了显著的下降。因为编码时输入序列的全部信息压缩到了一个向量表示,随着序列增长,句子越前面的词的信息丢失就越严重。同时,Seq2Seq模型的输出序列中,会损失部分输入序列的信息,在解码时,当前词及对应的源语言词的上下文信息和位置信息丢失了。

3 Attention

为解决上述存在的问题(句子过长,效果不佳),引入了注意力机制(Attention Mechanism),改进点为:Seq2Seq编码之后有一个固定长度的context vector,Attention模型是生成N个(N个输入文字)固定长度的context vector,结构如图所示:

                                                                 

context vector是输入序列全部隐藏状态的一个加权和,即attention score乘以一个输入的隐状态,其计算为:

                                                                  

神经网络a将上一个输出序列隐状态s_{i-1}和输入序列隐状态h_{j}作为数据,计算得到e_{ij},然后归一化,得到\alpha _{ij}(此时存在一个softmax操作),用来衡量输入句中的每个文字对目标句中的每个文字所带来重要性的程度。其score计算为

                                                                

                                                                  

Attention模型的编码器是双向RNN(Bi-directional RNN),每一个训练序列向前和向后分别是两个循环神经网络(RNN),而且这两个都连接着一个输出层。这个结构提供给输出层输入序列中每一个点的完整的过去和未来的上下文信息。

                                                                      

Attention model虽然解决了输入句仅有一个contect vector的缺点,依然存在很多问题:

  • context vector计算的是输入句、目标句间的关联,却忽略了输入句中文字间的关联,和目标句中文字间的关联性
  • RNN的自身缺点就是无法平行化处理,导致模型训练的时间很长

4 Transformer

RNN是2017年,发表了“The transformer”模型,解决了传统的Attention model 无法平行化的缺点,主要概念有(1)self attention (2)Multi-head。The Transformer和Seq2Seq有一样的结构,Encoder和Decoder,Transformer的结构是有6个Encoder和6个Decoder,结构如下:

                                                  

细节结构展示:

               

(1)位置编码(Positional Encoding)

encoder的输入层和decoder的输入层是一样的结构,都是token embedding(词向量)+ positional embedding(位置向量),得到最终的输入向量。之所以引入positional embedding主要是解决单单使用token embedding(类似于词袋子),并没有词序的概念的问题。因为该模型并不包括任何的循环或卷积神经网络,所以模型添加了位置编码,为模型提供了关于单词再句子中相对位置的信息。这个向量能决定当前词的位置,或者说在一个句子中不同的词之间的距离。计算方法如下:

                                                     PE(pos,2i)=sin(\frac{pos}{10000^{\frac{2i}{d_{model}}}})

                                                   PE(pos,2i+1)=cos(\frac{pos}{10000^{\frac{2i}{d_{model}}}})

pos表示单词的位置,i是指单词的维度,偶数位置用正弦,奇数位置用余弦。

(2)编码器(Encoder)

Encoder的编码结构是一层self Attention,一层Feed Forward,self Attention是得到一个矩阵来最终Feed Forward的输入,在进行Feed Forward之前,还进行了残差连接和归一化操作。Feed Forward是前馈神经网络,常用的有DNN、CNN等。

a.自身注意力(self Attention)

self Attention结构里是分为Scaled-Dot-Product Attention 和Multi head Attention。

(一)Scaled-Dot-Product Attention

Scaled-Dot-Product Attention首先要计算Q(Query),K(Key),V(Value)矩阵,输入句中的每个文字是由一系列成对的<key,value>组成,而目标中的每个文件是Query,则如何用Q,K,V来重新表示context vector呢?

首先计算Query和各个key的相似性,得到每个key对应value的权重系数,即为attention score,value是对应的讯息,再对value进行加权求和得到最终的Attention。计算过程如下:

                      

Attention到self Attention的变化为:

                    ——>          Attention(Query,Source)=\sum_{i=1}^{L}_\\\alpha _{i}\cdot Value_{i}

             ——>             

                ——>          Similarity(Query,Key_{i})=Query\cdot Key_{i}

为避免内积过大,使得softmax之后的结果非1即0,在计算相似性的时候增加一个\sqrt{d_{k}},即变为

                                                             

Transformer是进行并行计算的,计算过程(忽略了\sqrt{d_{k}}的计算)如图所示:

                                                                             

(二)Multi-head Attention

只计算单个Attention很难捕捉输入句中所有空间的讯息,为了优化模型,论文提出了一个multi head的概念,把key,value,query线性映射到不同空间h次,但是在传入Scaled-Dot-Product Attention中时,需要固定的长度,因此再对head进行concat,结构如下:

                                  

Multi-head attention由四部分组成:

  • 用linear并分拆成Multi head(作者就将512维向量拆成8份,每64维得到一个向量);

  • 经过Scaled-Dot-Product Attention生成n(8)个B矩阵;

  • concat,新增一个权重系数,将b1,...,bn,合并成B传入下一层;

  • 再增加一层Linear Layer。

Multi Head Attention的过程如下(以两个head为例):

                  

按照论文,将有8个b向量,在通过权重矩阵计算,得到最终的B向量。

b.残差连接(Residual Connections)

在进行self attention和feed forward两个模块连接时,增加一个sub layer,主要进行residual connection和layer normalization。

深度学习常见的归一化有BN(Batch Normalization)、LN(Layer Normalization),Batch Normalization 的处理对象是对一批样本进行纵向处理, Layer Normalization 的处理对象是单个样本,禁止横向处理。Batch Normalization 是对这批样本的同一维度特征做归一化, Layer Normalization 是对这单个样本的所有维度特征做归一化。

为什么Transformer用LN,而不用BN?

1)layer normalization 有助于得到一个球体空间中符合0均值1方差高斯分布的 embedding, batch normalization不具备这个功能。

2) layer normalization可以对transformer学习过程中由于多词条embedding累加可能带来的“尺度”问题施加约束,相当于对表达每个词一词多义的空间施加了约束,有效降低模型方差。batch normalization也不具备这个功能。

LN用于RNN进行Normalization时,取得了比BN更好的效果。但用于CNN时,效果并不如BN。

只有一个编码器(Encoder)时的结构:

有多个编码器和解码器的结构:

c.前馈神经网络(Feed Forward)

模型里边是增加了两个dense层,就是普通的全连接层。

(3)解码器(Decoder)

解码器和编码器相比略有不同,在解码器中,只允许self Attention的输出序列中较早的位置,通过在self Attention计算的softmax步骤之前屏蔽未来位置(将它们设置为-inf)来完成的。

每个解码器层包括以下子层:

  • 遮挡的多头注意力(padding mask和sequence mask)
  • 多头注意力(用填充遮挡)。V(数值)和 K(主键)接收编码器输出作为输入。Q(请求)接收遮挡的多头注意力子层的输出
  • 点式前馈网络
  •  每个子层在其周围有一个残差连接,然后进行层归一化。

a、masked mutil-head attetion

 mask 表示掩码,它对某些值进行掩盖,使其在参数更新时不产生效果。Transformer 模型里面涉及两种 mask,分别是 padding mask 和 sequence mask。其中,padding mask 在所有的 scaled dot-product attention 里面都需要用到,而 sequence mask 只有在 decoder 的 self-attention 里面用到。

Masked是相当于盖住你当前关注的词的后面所有词,我只关心前面出现的词,而后面的词我不关注,因为我要生成后面的词(图是self Attention和Masked self Attention的区别)。

(4)线性层和softmax层( Linear and Softmax Layer)

在解码器(Decoder)之后有增加了一层Linear和Softmax,结构如下:

 

(5)常见面试题

a、多头机制为什么有效?

类似于CNN中通过多通道机制进行特征选择,Transformer中先通过切头(spilt)再分别进行Scaled Dot-Product Attention,可以使进行点积计算的维度d不大(防止梯度消失),同时缩小attention mask矩阵。

b、self-attention为什么要缩放,并选用\sqrt{d_{k}}?

缩放是为了防止梯度消失。

softmax把一些输入映射为0-1之间的实数,并且归一化保证和为1,公式为:softmax=\frac{e^{^{i}}}{\sum_{j=1}^{K}e^{j}}

基于Transformer的模型另开一篇博客,细节太多了。

参考:

https://jalammar.github.io/illustrated-transformer/

https://www.sohu.com/a/258474757_505915

https://tensorflow.google.cn/tutorials/text/transformer#创建_transformer

https://www.aboutyun.com/thread-27818-1-1.html

https://www.jianshu.com/p/367c456cc4cf

Transformer——李宏毅视频

https://www.zhihu.com/question/395811291/answer/1260290120

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

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

相关文章

Linux-C编程 / 多线程 / 如何终止某个线程?

示例 demo最简单的 demo&#xff1a;static void* thread1_func(void *arg) {int i 0;// able to be cancelpthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);for(i0; ; i) {printf("thread1 %d\n", i);…

PaddlePaddle入门——基本概念

最近报了百度的深度学习认证&#xff0c;需要使用Paddle进行编程实现&#xff0c;找了一些基础教程&#xff0c;特意记录下来&#xff0c;加深印象。思维导图如下&#xff1a; 一、Paddle的内部执行流程 二、内部详解 1.Variable&#xff08;变量&#xff09; &#xff08;1…

回答一个微信好友的创业问题

ps:很喜欢这种有烟火气息的照片— — 提问&#xff1a;我最近要创业&#xff0c;打算跟一个朋友合伙&#xff0c;但是我朋友不会技术&#xff0c;所以他只投入钱&#xff0c;也不会参与公司的管理。我们启动资金是10万&#xff0c;他打算投入7万&#xff0c;想占股65%。因为没有…

百度深度学习初级认证——已过

开头先放图&#xff0c;百度深度学习初级工程师认证已通过&#xff0c;记录一下备战和考试细节&#xff01;&#xff01;&#xff01; 1.报考 当时是通过百度的AI Studio看到深度学习的认证了&#xff0c;价格是800&#xff0c;然后阴差阳错从百度技术学院的链接看到深度学习…

哦,这是桶排序

漫画&#xff1a;什么是桶排序&#xff1f;要了解桶排序之前&#xff0c;可以先看看上面小灰的那篇文章&#xff0c;我觉得是比较不错的。桶排序也可以理解为分类排序&#xff0c;把不同的数据归类&#xff0c;归类之后再重新排序&#xff0c;每个桶里面的内容就是一类数据&…

如何防御光缆窃听

很多年前&#xff0c;人们就认识到采用铜缆传输信息很容易通过私搭电缆的方式被窃取。对于一个网络和安全管理人员来说&#xff0c;要么对铜缆采用更严格的安全防护措施&#xff0c;要么就使用光缆。因为很多人都认为光纤可以很好地防止***通过窃听手段截获网络数据。但是实际上…

Linux字符设备驱动实例

globalmem看 linux 设备驱动开发详解时&#xff0c;字符设备驱动一章&#xff0c;写的测试代码和应用程序&#xff0c;加上自己的操作&#xff0c;对初学者我觉得非常有帮助。写这篇文章的原因是因为我看了我之前发表的文章&#xff0c;还没有写过字符设备相关的&#xff0c;至…

8-[函数]-嵌套函数,匿名函数,高阶函数

1.嵌套函数 &#xff08;1&#xff09;多层函数套用 name "Alex"def change_name():name "Alex2"def change_name2():name "Alex3"print("第3层打印", name)change_name2() # 调用内层函数print("第2层打印", name)chan…

c语言画谢宾斯基三角形

谢宾斯基三角形是一个有意思的图形&#xff0c;&#xff08;英语&#xff1a;Sierpinski triangle&#xff09;是一种分形&#xff0c;由波兰数学家谢尔宾斯基在1915年提出,它是一种典型的自相似集。先画一个三角形&#xff0c;然后呢&#xff0c;取三角形的中点&#xff0c;组…

进程间的通信——无名管道

进程间的通信——无名管道 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、进程间的通信 &#xff08;1&#xff09;同主机进程间数据交互机制&#xff1a;无名管道&#xff08;PIPE&#xff09;&#xff0c;有名管道&#xff08;FIFO&#xff09;…

sklearn官网-多分类问题

sklearn实战-乳腺癌细胞数据挖掘&#xff08;博主亲自录制视频&#xff09; https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare 1.12.6. Multioutput classification Mult…

剖析C语言是如何画出这样的三角形的

哈哈&#xff0c;就是喜欢这些有意思的C语言上篇文章是这样写的c语言画谢宾斯基三角形那篇文章写的有点不直接&#xff0c;然后再查了下资料&#xff0c;看到了下面这些&#xff0c;我觉得解释更加好&#xff0c;这里主要是运用了光栅法&#xff0c;至于光栅法&#xff0c;可以…

NILMTK在Windows下的安装教程

近期&#xff0c;要进行负荷辨识&#xff0c;找到NILMTK安装包&#xff0c;特意将过程记录下来。 &#xff08;1&#xff09;Windows安装 本机已安装了Anaconda&#xff0c;环境是Python3&#xff0c;NILMTK包的项目地址为&#xff1a;https://github.com/nilmtk/nilm_metada…

修改cmdline 把内存改成512MB

#添加cmdline的方式— — 在BoardConfig.mk中修改device/mediateksample/aiv8167sm3_bsp/BoardConfig.mk BOARD_KERNEL_CMDLINE bootopt64S3,32N2,32N2 mem512MB— — 在dts 里面修改kernel-4.4\arch\arm\boot\dts\*.dts / {model "Atmel AT91SAM9M10G45-EK";compa…

NILMTK——经典数据集REDD介绍和使用

配置了NILMTK包的环境之后&#xff0c;想找数据测试一下&#xff0c;在NILMTK官网的API Docs里边发现dataset_converters模块中有内置的数据集处理函数&#xff0c;如图&#xff1a; 将数据转换成HDF文件&#xff0c;这些数据都是比较优秀的&#xff0c;其中&#xff0c;常用的…

上拉电阻的作用

1、介绍使用微控制器&#xff08;MCUs&#xff09; 或任何数字逻辑设备时&#xff0c;上拉电阻器非常常见。本教程将解释何时何地使用上拉电阻器&#xff0c;然后我们将做一个简单的计算&#xff0c;以显示为什么上拉很重要。2、上拉电阻是什么&#xff1f;假设您有一个将一个引…

NILMTK——深扒组合优化(CO)和FHMM细节

前面的博客讲了具体实现&#xff0c;现在深究算法代码实现细节&#xff01;&#xff01;&#xff01; 1.CO (1)关于train 从以下代码可知&#xff0c;CO首先是对各个电器的功率数据做了train&#xff0c;为了了解其原生实现对代码进行了深究&#xff1a; classifiers {CO:…

深圳工资指导价出炉!最高月薪6万!你拖同行后腿了吗?

2020 年只剩下不到一个月了&#xff0c;年初立的 flag 有没有实现呢&#xff1f;我想多数人面临的尴尬是升职、加薪、赢取白富美、走上人生巅峰可能一步都没实现~对比周围混得风生水起的小伙伴感觉自己也不差啥啊&#xff0c;怎么就莫名其妙被甩了八条街&#xff1f;想一探究竟…

NILMTK——因子隐马尔可夫之隐马尔可夫

因子隐马尔可夫(FHMM)由Ghahramani在1997年提出&#xff0c;是一种多链隐马尔可夫模型&#xff0c;适合动态过程时间序列的建模&#xff0c;并具有强大的时序模型的分类能力&#xff0c;特别适合非平稳、再现性差的序列的分析。 1. 马尔可夫链 随机过程的研究对象是随时间演变…

CodeForces 903D Almost Difference

题目描述 Lets denote a function You are given an array aa consisting of nn integers. You have to calculate the sum of d(a_{i},a_{j})d(ai​,aj​) over all pairs (i,j)(i,j) such that 1<i<j<n1<i<j<n . 输入输出格式 输入格式&#xff1a; The fi…