搞懂Transformer

文章目录

    • 1 内容简述
    • 2 seq2seq的常用模块
    • 3 Self-attention
    • 4 Multi-head Self-attention
    • 5 Positional Encoding
    • 6 Transformer
    • 参考资料

文为李弘毅老师【Transformer】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。

下文中用到的图片均来自于李宏毅老师的PPT,若有侵权,必定删除。

1 内容简述

抛开Transformer的内部结构,Transformer其实就是一个seq2seq的模型,其中用到了大量的self-attention layer。本文会试图讲明白什么是self-attention layer。

2 seq2seq的常用模块

之前使用最广泛的seq2seq的模块就是RNN。RNN可以分为单向的和双向的。如果是单向的RNN,输出中的每个time step会有一些信息丢失,比如单向的RNN在下图中产生b3b^3b3的时候就只考虑了[a1,a2,a3][a^1, a^2, a^3][a1,a2,a3]。而双向的RNN输出的每个time step都考虑了输入的所有信息,比如双向的RNN在下图中产生b3b^3b3的时候就考虑了[a1,a2,a3][a^1, a^2, a^3][a1,a2,a3][a3,a4][a^3, a^4][a3,a4]

但是RNN有一个不好的地方就是它的计算很难并行化,比如我要算b4b^4b4的时候,就要等前几个结果都出来了,才能算。为了解决这个问题,就有人提出了CNN来替换RNN。

1-D CNN的模块介绍可以参见这里。虽然CNN的计算可以并行处理,但是,CNN的kernel_size一般会比较小,输出的某个time step想要考虑到全局的信息,就要把CNN叠很多层。

然后本文的重点就由此引出了,self-attention可以同时解决这两个问题,也就是既可以让每个time step的输出考虑了全局的输入,又可以并行计算。
t1

左图为RNN,右图为CNN

3 Self-attention

self-attention最早出自google的这篇Attention Is All You Need,这篇文章比较难读懂,但它本身并不是那么神秘,一个非常直观的理解就是,self-attention是一个可以替代RNN的东西。下面就来剖析一下这个self-attention。我们的目的是输入一个序列aaa,得到一个序列bbb
t0

假设我们的输入是xxx,首先要对xxx进行一次embedding,让它变到我们需要的维度,我们记这个embedding的结果为aaa

a=Wxa=Wxa=Wx

然后,我们要让这个aaa再分别乘以三个矩阵,self-attention中最为重要的三个东西query, key和value。

q:query(tomatchothers)q=Wqak:key(tobematched)k=Wkav:value(informationtobeextracted)v=Wvaq: query (to\ match\ others)\\ q = W^qa\\ k: key (to\ be\ matched)\\ k = W^ka\\ v: value(information\ to\ be\ extracted)\\ v = W^va\\ q:query(to match others)q=Wqak:key(to be matched)k=Wkav:value(information to be extracted)v=Wva

然后,我们会把每一个q去对k做attention,所谓的attention就是塞两个向量进去,然后吐出来一个表示两个向量相关性的数值α\alphaα。attention的方法有很多种,在Attention Is All You Need中,所使用的叫做scaled dot-product attention。

α1,i=q1⋅ki/d\alpha_{1, i} = q^1 \cdot k^i / \sqrt{d} α1,i=q1ki/d

为什么要除以这个d\sqrt{d}d呢?因为当qqqkkk的维度很大时,它们内积的variance就会很大,所以要除以一个d\sqrt{d}d来scale一下。

最后还要对α\alphaα做一个softmax,得到α^\hat{\alpha}α^。大致的流程如下图所示。
t2
这个α^\hat{\alpha}α^其实就是每一个time step的value的重要性。用这个α^\hat{\alpha}α^对每个time step的value进行一个加权,就得到了self-attention的结果bbb。比如b1b^1b1就可以通过下式计算得到
b1=∑iα^1,ivib^1=\sum_i{\hat{\alpha}_{1, i}v^i} b1=iα^1,ivi

这样得到的bbb是考虑了所有的输入的,而且无视输入之间的远近,完全通过学习attention来获取需要的value,其示意图如下所示。
t3
更重要的是,以上的过程都是可以并行计算的。因为每个time step的计算都是独立的,我们可以把它们concat到一个大的矩阵里,然后一起计算,示意图如下所示。
t4

4 Multi-head Self-attention

self-attention是可以做成multi-head的,所谓multi-head,其实就是把qqqkkkvvv分裂成多个,然后每个分别在自己的head内做self-attention,然后把结果再concat起来,如果得到的结果维度不是我们想要的,那么再乘以一个矩阵就可以了。

做成Multi-head的目的是让不同的head去学到不同的东西,比如有的head学局部的信息,有的head学全局的信息。
t5

5 Positional Encoding

然而,从之前的整个流程可以看出来,self-attention是不会去关心输入的time step顺序的,任何一个输出,time step是111还是TTT,对self-attention来说都是一样的,李老师很形象地称之为“天涯若比邻”。

为了增加位置的信息,就会给aaa加上一个神奇的人为预先设定好的向量eee,有了这个eee之后,模型就可以知道输入的位置信息了。
t6
那为什么是e+ae+ae+a,这样不是把aaa的信息给搅乱了吗?会什么不是直接concat上去变成[e,a][e, a][e,a]呢?我们不妨来试试concat的话会如何,不过既然是位置信息,我们需要concat到xxx上。假设我们有一个和位置有关的向量pppppp是一个one-hot的向量,表示当前的xix^ixi是在第iii个time step上。那么在做embedding的时候,我们也需要把embedding的矩阵WWW变大,而WWW又可以拆成WiW^iWiWpW^pWp。根据矩阵的计算方法,其结果就相当于给aaa加了一个值,这个值也就是之前提到的eee的。可见,e+ae+ae+a和对xxx进行concat是等效的。
t7
这里有一个比较神奇的地方,就是这个eee是个什么东西,为啥这么灵?换成其他的灵不灵?这就不得而知了。

论文中的position encoding用的是

PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)PE_{(pos, 2i)} = sin(pos / 10000^{2i/d_{model}}) \\ PE_{(pos, 2i+1)} = cos(pos / 10000^{2i/d_{model}}) PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)

这是一个不用学习的参数,作者也试过让模型自己去学,但结果差不多。作者选择这个不用学习的版本是为了让模型可以处理比训练时遇到过的序列更长的序列。

也有人把这个可视化了,可以参见illustrated-transformer。

6 Transformer

从上文中可以看出,self-attention是可以替代RNN的,实际操作中,也就是把RNN替换成self-attention就结束了。

接下来让我们来看看下面这幅经典的Transformer的图,现在看起来应该是亲切了不少。这个图的左半个结构是Encoder,右半个结构是Decoder。把图中的Multi-Head Attention想象成RNN就可以了。Emmm…感觉也不需要额外的说明了。值得注意的是,这里的Masked Multi-Head Attention就是指是对已经产生的序列做attention,比如我们翻译的时候,是塞一个起始符进去,然后一个字一个字生成,直到遇到终止符。
t8

参考资料

[1] 李宏毅-transformer
[2] illustrated-transformer
[3] Attention Is All You Need

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

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

相关文章

excel计算二元线性回归_怎么看懂Excel线性回归参数

虽然之前用python做线性回归的时候看上去好像很简单,但是直到我在excel上实践了线性回归,发现有很多指标值得去参考,对于在python上实现有指导作用。打开excel2016,先找个数据我们这里直接选择做线性回归,在菜单栏选择…

冲刺阶段 day 6

项目进展:学生管理这部分已经进展的差不多了,调试了几遍,改了几个小Bug之后就没有什么问题了,基本完成,如若后续还有一些新的功能到时候再自行加入。明天开始教师部分。 存在问题:我觉得我们的项目还是比较课堂,比较中…

Chapter2-1_Voice Conversion(Feature Disentangle)

文章目录1 什么是Voice Conversion2 实际实现中的细节3 根据数据集分类4 Feature disentangle5 训练技巧本文为李弘毅老师【Voice Conversion - Feature Disentangle】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。 下文中用到的图片均…

1 0.99999的悖论_无限小数与芝诺悖论

问题昨天晚上,小学6年级的外甥女从数学课外辅导班补习回来,兴冲冲的对家里人说,哎,我发现了一个数学的大bug啊。你说1/3不是一个无限循环小数0.33333...,那么三个1/3加起来,不就是0.99999...吗?…

Mongoose 中使用 populate 实现关联查询

一、Mongoose populate 官方文档 https://mongoosejs.com/docs/populate.html 二、Mongoose populate 关联查询 1、定义 ref var ArticleSchema new Schema({ title:{type: String, unique: true},cid : {type: Schema.Types.ObjectId, ref:ArticleCate //model 的名称 }, …

FPGA开发全攻略——概念篇

原文链接: FPGA开发全攻略连载之一:FPGA为什么这么热? FPGA开发全攻略连载之二:为什么工程师要掌握FPGA开发知识? FPGA开发全攻略连载之三:FPGA基本知识与发展趋势(part1) FPGA开发全…

vue @input带参数_Vue 全家桶开发的一些小技巧和注意事项

前言用 vue 全家桶开发一年多了,踩过不少坑,也解决了很多的问题,把其中的一些点记录下来,希望能帮到大家。以下内容基于最新版的 vue vuex vue-router axios less elementUI,vue 脚手架是 vue-cli3。css 的 scope…

Chapter2-2_Voice Conversion(CycleGAN and StarGAN)

文章目录1 内容简述2 CycleGAN3 StarGAN本文为李弘毅老师【Voice Conversion - CycleGAN and StarGAN】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。 下文中用到的图片均来自于李宏毅老师的PPT,若有侵权,必定删…

cookie与session原理详解

一、 Cookie cookie:浏览器在电脑硬盘中开辟的一块空间,主要供服务器端存储数据。 cookie中的数据是以域名的形式进行区分的。cookie中的数据是有过期时间的,超过时间数据会被浏览器自动删除。cookie中的数据会随着请求被自动发送到服务器端。…

eclipse的servlet默认不执行index_MySQL之索引及执行计划分析

mysql官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构。索引的本质:索引是数据结构。索引就是排好序的快速查找数据结构一般来说索引本身也很大不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上平时所说的…

Chapter3-1_Speech Separation(Deep Clustering, PIT)

文章目录1 内容简述2 评价指标2.1 Signal-to-noise ratio (SNR)2.2 Scale invariant signal-to-distortion ratio (SI-SDR)2.3 其他的评价指标3 Permutation Issue4 Deep Clustering5 PIT本文为李弘毅老师【Speech Separation - Deep Clustering, PIT】的课程笔记,课…

Joi验证模块的使用

1. 安装 官网中文文档:https://joi.dev/api/?v12.1.0#validatevalue-schema-options-callback //下载14.3.1 npm install 14.3.1注意:下载14.3.1,在npm install joi的时候默认下载的是最新版本 joi17.1.1,对于一些API高版本会舍弃从而出现…

Chapter3-2_Speech Separation(TasNet)

文章目录1 TasNet总体架构2 Encoder和Decoder3 Separator4 TasNet回顾5 More5.1 Unknown number of speakers5.2 Multiple microphones5.3 Visual information本文为李弘毅老师【Speech Separation - TasNet】的课程笔记,课程视频youtube地址,点这里&…

Node 中的开发环境与生产环境 和 使用Morgan打印请求信息

一、什么是开发环境与生产环境 环境,就是指项目运行的地方,当项目处于开发阶段,项目运行在开发人员的电脑上,项目所处的环境就是开发环境。当项目开发完成以后,要将项目放到真实的网站服务器电脑中运行,项…

Chapter4-1_Speech_Synthesis(Tacotron)

文章目录1 TTS before End-to-end2 Tacotron2.1 Encoder2.2 Attention2.3 Decoder2.4 Post processing3 How good is Tacotron?本文为李弘毅老师【Speech Synthesis - Tacotron】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。 下文中…

第三方模块config的使用

作用:允许开发人员将不同运行环境下的应用配置信息抽离到单独的文件中,模块内部自动判断当前应用的运行环境, 并读取对应的配置信息,极大提供应用配置信息的维护成本,避免了当运行环境重复的多次切换时,手动…

Chapter4-2_Speech_Synthesis(More than Tacotron)

文章目录1 Mispronunciation2 More information for Encoder3 Attention4 Fast Speech and DurIAN5 Dual Learning5 Controllable TTSSpeaker EmbeddingGST-TacotronTwo-stage Training本文为李弘毅老师【Speech Synthesis - More than Tacotron】的课程笔记,课程视…

【代码笔记】iOS-清除图片缓存UIActionSheet

一,效果图。 二,代码。 RootViewController.m //点击任何处出现sheet -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {UIActionSheet * sheet [[UIActionSheet alloc] initWithTitle:"确定要清空图片缓存?" d…

Chapter5_Speaker_Verification

文章目录1 Task Introduction2 模型架构3 模型介绍3.1 i-vector3.2 d-vector3.3 x-vector3.4 more4 End to End本文为李弘毅老师【Speaker Verification】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。 下文中用到的图片均来自于李宏毅…

python如何读取字典的关键字_python提取字典key列表的方法

python提取字典key列表的方法 更新时间:2015年07月11日 12:04:48 作者:企鹅不笨 这篇文章主要介绍了python提取字典key列表的方法,涉及Python中keys方法的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了python提取字典key列表的方法…