深入浅出Transformer

Transformer
Transformer是NLP的颠覆者,它创造性地用非序列模型来处理序列化的数据,而且还获得了大成功。更重要的是,NLP真的可以“深度”学习了,各种基于transformer的模型层出不穷,如BERT、GPT-2、T-NLG,而且模型参数量呈指数级增长。
Transformer之前,大家的思路都是在改进序列模型,从RNN到LSTM、GRU、Seq2Seq。如果你看过我之前写的深入浅出RNN就会知道,序列模型要靠遍历seq_len来处理data,效率低是显而易见的。不仅如此,深层网络很难收敛,因此,即使像google这样的大公司也只能堆叠10层左右的LSTM。
就在大家都认为“NLP本该如此”时,Transformer横空出世,它通过self-attention实现了对序列化数据的并行处理,不仅提高了计算效率,还打开深度学习的潘多拉魔盒,放出后“大魔王”BERT。从某种程度上说,Transformer的意义比BERT更重大。

Attention
self-attention是attention的进阶版,后者最早出现在机器翻译模型--Seq2Seq中。Figure 2是英文 to 德文的seq2seq模型,encoder和decoder都是RNN(LSTM或GRU),decoder主要是靠encoder提供的hidden state来生成output。
我们知道,RNN的hidden state会随着time step的递进而变化,一旦time step数量较多,也就是seq_len较大时,那么当前的hidden state -- \(h_t\)和早先的hidden state -- \(h_1\),它们的值可能会相差甚远甚至截然相反。这种情况称为记忆遗忘,LSTM虽然在一定程度上能够减轻这种遗忘,但这样还不够。

RNN的每个time step都会有一个output,但它们都没有被用到decoder的训练中。attention的作用就是为了能让这些output能够物尽其用。

如果将encoder的所有output一股脑儿丢给decoder,那效果肯定不好。最好的办法是能知道对于当前这个time step来说,哪些output有用哪些没用,然后取其精华去其糟粕。
attention的做法是给每个output一个权重,然后对所有的output做个加权求和,其计算结果--\(C_t\)将作为参数传给decoder。
Figure 3中最关键的地方就是\(a_t\)的计算,也就是如何为output添加权重。Effective Approaches to Attention-based Neural Machine Translation这篇paper给出了下面三条公式,其中任一条公式都能够用来计算权重,请你记住\(dot\ product\)这条公式,后面会用到。

Multi-Head Attention

Transformer的那篇论文--attention-is-all-you-need是用大白话来写的,没什么难度,如果你能它通读一遍,再搭配代码--The Annotated Transformer学习,那基本上你对它的理解就差不多了。因此,本文只分析它的核心模块--Multi-Head Attention,其他内容不再赘述。
如Figure 4所示,Multi-Head指的是将data均分成N份,再对每个sub-data分别做scaled dot-product attention,最后将所有的计算结果拼接起来。实验表明,multi-attention效果比single attention的效果要好。
\(dk\)是单个attention的隐层神经元数量,等于d_model / n_heads,而d_model是multi-head attention的总的隐层神经元数量,它不需要和hidden_size一致,可以通过linear layer来进行hidden_size和d_model之间的转换。
前面提过,attention layer的重点是为encoder的output添加权重。Scaled dot-product attention,顾名思义,就是以dot-product的方式来计算权重:\(h^T_th^-_s\)。既然Transformer是非序列模型,那就可以并行计算每个time step的attention权重,即:\(QK^T\)。
\(dk\)越大,dot-product的值就越大,而softmax的导数则会越小,这样不利于模型训练,因此,Transformer会将attention的权重不仅要乘以scale -- \(1/\sqrt {d_k}\)。
除了不能太大外,\(dk\)太小也不行。\(dk\)小了,就意味着head数量少了,这样一来,每个attention要处理的seq_len就会变长。实验表明,attention处理短seq_len的精度更高,因此,head数不宜过小。
Q、K、V虽然是三个不同数值的矩阵,但它们都是由同一个data(x或y)分别经过三个不同的Linear layer得到的,因此scaled dot-product attention也称为self-attention,不仅如此,它还可以应用于encoder中。

End
深入浅出Transformer的更多相关文章
- 深入浅出腾讯BERT推理模型--TurboTransformers
Overview TurboTransformers是腾讯最近开源的BERT推理模型,它的特点就是一个字,快.本人用BERT(huggingface/transformers)在V100上做了测试,测 ...
- 深入浅出 Jest 框架的实现原理
English Version | 中文版 深入浅出 Jest 框架的实现原理 https://github.com/Wscats/jest-tutorial 什么是 Jest Jest 是 Face ...
- 【深入浅出jQuery】源码浅析--整体架构
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- 【深入浅出jQuery】源码浅析2--奇技淫巧
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- 深入浅出Struts2+Spring+Hibernate框架
一.深入浅出Struts2 什么是Struts2? struts2是一种基于MVC的轻量级的WEB应用框架.有了这个框架我们就可以在这个框架的基础上做起,这样就大大的提高了我们的开发效率和质量,为公司 ...
- DOM 事件深入浅出(二)
在DOM事件深入浅出(一)中,我主要给大家讲解了不同DOM级别下的事件处理程序,同时介绍了事件冒泡和捕获的触发原理和方法.本文将继续介绍DOM事件中的知识点,主要侧重于DOM事件中Event对象的属性 ...
- DOM 事件深入浅出(一)
在项目开发时,我们时常需要考虑用户在使用产品时产生的各种各样的交互事件,比如鼠标点击事件.敲击键盘事件等.这样的事件行为都是前端DOM事件的组成部分,不同的DOM事件会有不同的触发条件和触发效果.本文 ...
- 深入浅出node(2) 模块机制
这部分主要总结深入浅出Node.js的第二章 一)CommonJs 1.1CommonJs模块定义 二)Node的模块实现 2.1模块分类 2.2 路径分析和文件定位 2.2.1 路径分析 2.2.2 ...
- IOS 网络-深入浅出(一 )-> 三方SDWebImage
首要我们以最为常用的UIImageView为例介绍实现原理: 1)UIImageView+WebCache: setImageWithURL:placeholderImage:options: 先显 ...
随机推荐
- 使用Docker发布blazor wasm
Blazor编译后的文件是静态文件,所以我们只需要一个支持静态页面的web server即可. 根据不同项目,会用不同的容器编排,本文已无网关的情况下为例,一步一步展示如何打包进docker 需求 H ...
- [PHP学习教程 - 系统]004.通过ini_set()来设置系统属性(ini_set Method)
PHP原意:ini_set — 为一个系统配置项设置值 基本信息: string ini_set ( string $varname , string $newvalue). (说明:设置指定配置选项 ...
- [转]什么是OpenSSH
定义 SSH是什么? 相关概念 OpenSSH安全吗?究竟安全在哪里呢? Telnet这么好的一个工具为什么还要用户手动开启呢? SSH账户类型 iPhone中修改密码的大致步骤 如何从电脑连接通过S ...
- shell日期格式化、加减运算
#!/bin/bash echo i love you输出:i love you =======================================反引号的作用============== ...
- Beta冲刺 ——5.27
这个作业属于哪个课程 软件工程 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.会议内容 1.组员一起学习Git分支管 ...
- (Java实现) 细胞
细胞 Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Submission(s ...
- Java实现 蓝桥杯VIP 算法训练 打印下述图形
算法训练 4-1打印下述图形 时间限制:1.0s 内存限制:256.0MB 问题描述 使用循环结构打印下述图形,打印行数n由用户输入.打印空格时使用"%s"格式,向printf函数 ...
- Java实现 LeetCode 289 生命游戏
289. 生命游戏 根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞.每个细胞具有 ...
- Java实现 蓝桥杯 生命游戏
标题:生命游戏 康威生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机. 这个游戏在一个无限大的2D网格上进行. 初始时,每个小方格中居住着一个活着或死了的细胞. 下一时刻每个细胞的状态 ...
- PAT 部分A+B
正整数A的“DA(为 1 位整数)部分”定义为由A中所有DA组成的新整数PA,例如:给定A=3862767,DA=6,则A的“6 部分”PA是 66,因为A中有 2 个 6. 现给定A,DA,B, ...