transformers学习日记1

transformers原理学习

深度学习做NLP的方法,基本上都是先将句子分词,然后每个词转化为对应的词向量序列。这样一来,每个句子都对应的是一个矩阵 X = ( x 1 , x 2 , … , x t ) X=(x_1,x_2,…,x_t) X=(x1,x2,,xt),其中xi都代表着第i个词的词向量(行向量),维度为d维,故 X ∈ R n × d X∈R^{n×d} XRn×d

  • 第一个基本的思路是RNN层,递归式进行
  • 第二个思路是CNN层,其实CNN的方案也是很自然的,窗口式遍历
  • Google的大作提供了第三个思路:纯Attention!单靠注意力就可以!RNN要逐步递归才能获得全局信息,因此一般要双向RNN才比较好;CNN事实上只能获取局部信息,是通过层叠来增大感受野;Attention的思路最为粗暴,它一步到位获取了全局信息

背景

2017 年,Google 提出了 Transformer 模型,用 Self-Attention 的结构,取代了以往 NLP 任务中的 RNN 网络结构。2018 年 10 月,Google 发出一篇论文《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》, BERT 模型横空出世,并横扫 NLP 领域 11 项任务的最佳成绩!在 WMT 2014 Englishto-German 和 WMT 2014 English-to-French两个机器翻译任务上,基于Transformers的模型都取得了当时 SOTA 的效果。【SOTA result指state-of-the-art result,在该项研究任务中,目前最好的模型的结果/性能/表现】

**这个模型优点1,就是使得模型训练过程能够并行计算,比RNN好。**在 RNN 中,每一个 time step 的计算都依赖于上一个 time step 的输出,这就使得所有的 time step 必须串行化,无法并行计算。优点2:在分析预测更长的文本时, 捕捉间隔较长的语义关联效果更好。

Transformer就是一个Sequence-to-sequence的model。

**Transformer 依赖于 Self Attention 的知识。**Attention 是一种在深度学习中广泛使用的方法,Attention的思想提升了机器翻译的效果。

attention架构

NLP常用于生成任务的seq2seq结构。seq2seq模型结构在很多任务上都取得了成功,如:机器翻译、文本摘要、图像描述生成。谷歌翻译在 2016 年年末开始使用这种模型。有2篇开创性的论文:Sutskever等2014年发表的Sequence to Sequence Learning
with Neural Networks
Cho等2014年发表的Learning Phrase Representations using RNN Encoder–Decoder
for Statistical Machine Translation
都对这些模型进行了解释。

**【然而】**想要充分理解模型并实现它,需要拆解一系列概念,而这些概念是层层递进的。如果能够把这些概念进行可视化,会更加容易理解。

seq2seq模型是由**编码器(Encoder)和解码器(Decoder)**组成的。其中,编码器会处理输入序列中的每个元素,把这些信息转换为一个向量(称为上下文(context))。当我们处理完整个输入序列后,编码器把上下文发送给解码器,解码器开始逐项生成输出序列中的元素。

这种机制,同样适用于机器翻译。在机器翻译任务中,上下文是一个向量(基本上是一个数字数组)。编码器和解码器在Transformer出现之前一般采用的是循环神经网络RNN。关于循环神经网络,建议阅读 Luis Serrano写的一篇关于循环神经网络的精彩介绍.

事实证明,上下文context向量是这类模型【RNN模型】的瓶颈。这使得模型在处理长文本时面临非常大的挑战。在 Bahdanau等2014发布的Neural Machine Translation by Jointly Learning to Align and Translate 和 Luong等2015年发布的[Effective Approaches to Attention-based Neural Machine Translation

](https://arxiv.org/abs/1508.04025)两篇论文中,提出了一种解决方法。这 2 篇论文提出并改进了一种叫做注意力attention的技术,它极大地提高了机器翻译的质量。注意力使得模型可以根据需要,关注到输入序列的相关部分

Self-Attention过程

Self-Attention的Input,它就是一串Vector,这个Vector可能是整个Network的Input,也可能是某个Hidden Layer的Output

image-20210404202435331

我们用a来表示它,代表它有可能是前面已经做过一些处理,它是某个Hidden Layer的Output,那Input一排a这个向量以后,Self-Attention要Output另外一排b这个向量,所以每一个b都是考虑了所有的a以后才生成出来的。

那具体是怎么产生 b 1 b^1 b1这个向量的呢?这里有一个特别的机制,这个机制是根据 a 1 a^1 a1这个向量,找出整个很长的sequence裡面,到底哪些部分是重要的?哪些部分跟判断 a 1 a^1 a1是哪一个label的问题是有关係的?哪些部分是我们要决定 a 1 a^1 a1的class,决定 a 1 a^1 a1的regression数值的时候,所需要用到的信息?

用一个数值叫α来表示每一个向量跟 a 1 a^1 a1的关联的程度

在这里插入图片描述

计算这个α的数值有不同的做法:

  • 比较常见的做法是用dot product【一般用这个】
    • 输入的这两个向量分别乘上两个不同的矩阵,左边这个向量乘上 W q W^q Wq这个矩阵得到矩阵 q q q,右边这个向量乘上这个矩阵 W k W^k Wk得到矩阵k。
    • 再做dot product,就是做element-wise 的相乘,再全部加起来以后就得到一个 scalar ,即α。
  • 有另外一个叫做Additive的计算方式,计算过程略。。
深度学习attention机制中的Q K V分别咋来的?

注意力机制说白了:就是要通过训练得到一个加权,自注意力机制就是要通过权重矩阵来自发地找到词与词之间的关系。因此肯定需要给每个input定义tensor,然后通过tensor间的乘法来得到各个input之间的关系

那这么说是不是给每个input定义1个tensor就够了呢?不够啊!如果每个input只有一个相应的q,那么q1和q2之间做乘法求取了a1和a2的关系之后,这个结果怎么存放怎么使用呢?而且a1和a2之间的关系是对偶的吗?如果a1找a2和a2找a1有区别怎么办?只定义一个这模型是不是有点太简单了!

一个不够就定义两个,于是有了q和k。q你可以理解为代表自己用的,用q去和别的输入找关系;k理解为给别人用的,专门对付来跟你找关系的输入。这样子,用自己的q去和别人的k(当然和自己的k也行)做乘法,就可以得到找出的关系:权重 α \alpha α了。

**仅定义q和k两个够吗?可能也还是不够的。找出来的关系是要用的,不用等于白找。**权重 α \alpha α是要对输入信息做加权,才能体现找到的关系的价值的。那跟输入直接加权行吗?这么做也不是不行,就是显得直接和生硬了点。所以又定义了个v。要知道,v和q、k一样,都是通过系数矩阵对输入a做乘法得到的。所以定义了个v大概等价于又对a加了一层可以学习的参数,然后对经过参数调整后的a再去做加权、把通过注意力机制学到的关系给用上。所以,通过 α \alpha α和v的乘法进行加权操作,最终得到输出o

不理解的话,重新回去看看。

在这里插入图片描述

从整体宏观来理解 Transformer

首先,我们将整个模型视为黑盒。在机器翻译任务中,接收一种语言的句子作为输入,然后将其翻译成其他语言输出。“黑盒”可以拆分为2个部分:左边是编码部分,右边是解码部分。其中编码部分是多层的编码器(Encoder)组成(Transformer 的论文中使用了 6 层编码器,这里的层数 6 并不是固定的,你也可以根据实验效果来修改层数)。同理,解码部分也是由多层的解码器(Decoder)组成(论文里也使用了 6 层的解码器)。

Encoder由多层编码器组成,每层编码器在结构上都是一样的,但不同层编码器的权重参数是不同的。每层编码器里面,主要由以下两部分组成

  • Self-Attention Layer
  • Feed Forward Neural Network(前馈神经网络,缩写为 FFNN)

单层transformer encoder

图:单层transformer encoder

输入编码器的文本数据,首先会经过一个 Self Attention 层这个层处理一个词的时候,不仅会使用这个词本身的信息,也会使用句子中其他词的信息(你可以类比为:当我们翻译一个词的时候,不仅会只关注当前的词,也会关注这个词的上下文的其他词的信息)。本文后面将会详细介绍 Self Attention 的内部结构。

接下来,Self Attention 层的输出会经过前馈神经网络。

同理,解码器也具有这两层,但是这两层中间还插入了一个 Encoder-Decoder Attention 层,这个层能帮助解码器聚焦于输入句子的相关部分(类似于 seq2seq 模型中的 Attention)。

在这里插入图片描述

从细节来理解 Transformer

上面,我们从宏观理解了 Transformer 的主要部分。下面,我们来看输入的张量数据,在 Transformer 中运算最终得到输出的过程。

Transformer 的输入

和通常的 NLP 任务一样,我们首先会使用词嵌入算法(embedding algorithm),将每个词转换为一个词向量。实际中向量一般是 256 或者 512 维。为了简化起见,这里将每个词的转换为一个 4 维的词向量。

那么整个输入的句子是一个向量列表,其中有 3 个词向量。在实际中,每个句子的长度不一样,我们会取一个适当的值,作为向量列表的长度。如果一个句子达不到这个长度,那么就填充全为 0 的词向量;如果句子超出这个长度,则做截断。句子长度是一个超参数,通常是训练集中的句子的最大长度,你可以尝试不同长度的效果。

参考资料

1、苏剑林的博客 https://spaces.ac.cn/archives/4765

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值