目录
二、Sequence-to-sequence(Seq2Seq)
摘要
本周,我学习了一种强大的深度学习模型,名为Transformer。可以把Transformer看作是一种“翻译机”,它能够读取一种语言的文本(例如英文),然后用另一种语言(例如中文)生成相同的含义。
Transformer的核心理念是“注意力机制”。像我们人类阅读文本时更关注某些词语,Transformer也会对输入数据中的重要部分给予更多关注。这使得模型能够更好地理解上下文关系,从而生成更准确的输出。
让Transformer更特殊的是其“自注意力”(Self-Attention)机制。这指的是模型可以考虑输入的所有部分来决定每个部分的重要性,而不仅仅是当前正在处理的部分。
ABSTRACT
This week, I studied a powerful deep learning model called the Transformer. The Transformer can be likened to a "translation machine" that can read text in one language (such as English) and then generate the same meaning in another language (such as Chinese).
The core concept of the Transformer is the "attention mechanism". Just as we humans pay more attention to certain words when we read text, the Transformer also gives more attention to important parts of the input data. This allows the model to better understand the context, thereby generating more accurate output.
What makes the Transformer unique is its "self-attention" mechanism. This refers to the model's ability to consider all parts of the input to determine the importance of each part, not just the part it is currently processing.
一、什么是Transformer
Transformer 是一种神经网络架构,用于处理序列数据。它在自然语言处理(NLP)领域中非常流行,特别是在如机器翻译、文本摘要、情感分析等任务中。
Transformer中的一些重要概念如下:
1.自注意力机制(Self-Attention Mechanism):自注意力机制使得模型在生成每个元素的表示时,能够考虑到输入序列中的所有元素,并根据其重要性进行加权。这种机制有助于捕获序列中的长距离依赖。
2.位置编码(Positional Encoding):由于 Transformer 模型不像 RNN 那样具有内在的序列顺序概念,因此需要通过添加位置编码来提供序列中的位置信息。位置编码可以是基于正弦和余弦函数的函数,也可以是学习得到的。
3.编码器与解码器(Encoder and Decoder):Transformer 模型由编码器和解码器组成。编码器接收输入序列,并生成一组连续的表示。解码器则使用这些表示来生成输出序列。每个编码器和解码器都由多个自注意力层和全连接层组成。
4.多头注意力(Multi-Head Attention):在 Transformer 中,通常会同时进行多次自注意力计算,这被称为多头注意力。不同的注意力“头”会学习到输入数据的不同方面。
二、Sequence-to-sequence(Seq2Seq)
输入一个序列,输出一个序列,但是输出的长度由机器来自己来决定。Sequence-to-Sequence (Seq2Seq) 是一种神经网络架构,它把一个序列从一个域(例如,源语言中的句子)转换成另一个域的序列(例如,目标语言中的句子)。 基本的 Seq2Seq 模型由两部分组成:编码器(Encoder)和解码器(Decoder)。
它的工作流程是这样的:
编码器接收输入序列(如一句英文句子),每次处理序列中的一个元素(如一个单词或一个字),并输出一个向量(通常称为隐藏状态)。当所有输入元素都被处理后,编码器输出的最后一个隐藏状态被称为上下文向量。这个上下文向量被认为是输入序列的压缩表示,包含了整个序列的信息。
解码器接收上述上下文向量,并逐步生成输出序列。每一步,解码器都会生成输出序列的一个元素(如一个单词或一个字),并更新其隐藏状态。隐藏状态和生成的元素都作为下一步的输入。这个过程持续进行,直到生成一个特殊的结束符号,或者达到预设的最大长度。
Eg:
1、输入一段声音讯号,经过语音识别,输出N个字符,但是无法得知具体输出的字符个数,所以只能由机器来自主决定输出多少字符。
2、另外一个例子是机器翻译,输入某一种语言的一句话,经过翻译输出另一种语言的句子,但是输出的字符数是认为确定不了的,这种情况下只能通过机器自主决定。
一、Encoder
这部分主要工作就是给一排向量,输出另外一排向量。但是这样子的工作很多模型都可以做到,比如self-attention(自注意力),RNN,CNN。Transform里面用的就是self-attention(自注意力)。Encoder结构如下图:
1. 在inputs的地方加上了positional encoding,之前有讲过如果你只用self-attention,没有未知的资讯,所以需要加上positional的information。
2. Multi-Head Attention:这里就是self-attention的block,然后专门强调说它是Multi-Head的self-attention。
3. Add&Norm:residual加上layer normalization
4. Feed Forward: 是FC的feed forward network
5. N×:block会重复N次。
现在的encoder里面会分成很多的block,每个block都是输入一排向量输出一排向量。
但是每个block并不是neural network的一层(layer),是因为一个block里面是好几个layer在做事情。
现在的transform里面block的结构:
每个block里面的工作:
输入一排向量-->经过self-attention处理-->输出一排向量-->在将输出的每个向量丢到fully connected的feed forward network里面在outout另外一排vector。如下图:
二、Decoder
decoder其实有两种,下面介绍Autoregressive de decoder(AT),是通过语音辨识来详细了解它得运作过程。
首先,输入一个声音讯号,经过encoder输出一组vector, 然后将这个输出当作decoder得输入,最后产生语音辨识得结果。
如果要处理NLP的问题,每一个token都可以把他用一个ONe-Hot的Vector(其中一维是1,其他都是0)来表示,所以begin也是用ONe-Hot Vector来表示。然后decoder吐出一个向量,这个vector的长度非常长,跟vocabulary的size是一样的。
Vocabulary:首先知道decoder输出的单位是什么? 假设是中文的语音辨识,那这里vocabulary的size可能就是中文的方块字的数目。要是英文的话,用字母数量会很少,用单词数量又会太多,所以可以用Subword当作英文的单位,即单词的字首字根的组合,数量适中。
然后输出的向量中的每一个中文的字都会对应一个数值,数值最高的那一个中文字就是最终的输出。
(因为在产生这个向量之前,通常会跑出一个Softmax,就跟做分类一样,做分类得到最终的输出前通常会跑一个Softmax, 所以这一个向量里面的分数,它是一个Distribution,也就是向量对应的值总和为1.)
然后把”机”当作是decoder新的input, 原来只有bengin一个输入,现在在加上“机”,“机”也可表示成一个ONe-Hot的Vector作为decoder的输入,所以现在有两个输入,然后就得到一个输出向量,在根据这个向量里面给出的每一个中文字的分数得到分值最高的输出,后面依次循环。Encoder的输出也会参与到这个过程中来。
这个过程有些问题:当decoder在产生一个句子的时候,它其实有可能看到错误的东西,因为它是将自己的输出作为产生下一个字符的输入,而那个输出有可能是错误的。这里就会产生一个疑问:让decoder看到自己产生出来的错误的输入,再被decoder自己吃进去会不会造成Error Propagation(一步错,步步错)的问题呢?
Decoder和Encoder的不同:
(1)Decoder最后会做一个softmax,使得它的输出变成一个几率。
(2)加了一个Masked。
这是原来的self-attention,如上图,输入一排vector,输出一排vector,这个vector的每一个输出都要看过完整的input之后才做决定,其实输出b1的时候其实是根据a1到a4所有的资讯去输出b1。
如上图,当self-attention转成Masked Attention的时候,他的不同点是,现在我们不能再看右边的部分,也就是我们产生b1的时候只能考虑a1的资讯,不能去看a2、a3、a4,产生b2的时候只能考虑a1、a2的资讯,不能考虑a3、a4的资讯,后面类似,最后产生b4时可以考虑所有的资讯。这就是Masked的self-attention。
一开始decoder的运作方式它是一个一个输出的,是先有a1,再有a2,然后是a3、a4,所以当计算b2时是没有a3和a4的,所以没办法将后面的考虑进来。
这跟原来的Self-Attention不一样,原来的Self-Attention中a1到a4是一次整个输入到Model里面的。
Decoder自己决定输出的长度,但是到底输出的sequence的长度应该是多少呢?也就是机器如何决定该何时停下来。这里没办法决定,输出多少输出多少是非常复杂的,我们其实是期望机器可以自己学到。
如上图。更具体点,当产生b2时,只拿第二个位置a2的Query去跟第一个位置的Key和第二个位置的Key去计算Attention,第三个位置和第四个位置不用去管它。
三、Cross attention
圈起来的那部分叫做Cross attention,它是连接Encoder跟Decoder之间的桥梁,从图中可以看出,这个模块的输入部分,有两个箭头来自encoder,一个来自decoder。
Cross attention实际运作过程:
如上图,decoder就是产生一个q,去encoder那边抽取资讯出来当作接下来decoder里面的Fully-Connected 的Network的Input。具体来说就是,q和k1、k2、k3去计算分数,然后在和v1、v2、v3做Weighted Sum做加权,加起来得到v’,然后交给Fully-Connected处理。
如上图,输入一段声音讯号,第一个而应该要输出的中文字是机,所以当我们把begin丢给decoder的时候,它的第一个输出要跟机越接近越好,即“机”这个字会被表示成一个One-Hot的Vector,在这个vector里面只有机对应的那个维度为1,而decoder的输出是一个Distribution是一个几率的分布,我们希望这个几率的分布跟One-Hot的Vector越接近越好。所以去计算Ground truth和distribution之间的Cross Entropy,希望这个Cross Entropy的值越小越好。
四、Transformer公式推导
总结
本周学习了transformer相关的知识,了解了其实transformer就是自注意力机制。通过sequence-to-sequence模型中的RNN存在问题——不能并行计算,CNN替换可以解决一部分问题,但也存在缺陷。由CNN缺陷引入了Self-Attention Layer来替代RNN的sequence-to-sequence模型——Transformer。