【深度学习入门基础】二、简单理解 Transformer
【深度学习入门基础】二、简单理解 Transformer
文章目录
- 【深度学习入门基础】二、简单理解 Transformer
- 自注意力层
- 多头注意力
- Transformer
- 输入(输出)嵌入
- 位置编码
- Add 和 Norm
- Feed Forward
- Linear
- Nx
- seq2seq 模型和 marked 注意力机制
- 训练
- 其他
这是“深度学习入门基础”系列的第二篇文章,事多更新慢,望见谅。前一篇文章(先导篇)见:
【深度学习入门基础】一、从线性代数和微积分的角度看神经网络
ResNet 和 Transformer 近五年来是影响最深远的两个网络结构,没有之一,bert 也是从 Transformer 发展而来。近年来,Transformer 更是从 NLP 领域走入了 CV 领域,似乎什么东西都可以 attention 一下,大有一统天下之势。
因为 Transformer 很火,所以网上的各式各样的讲解很多,我就不介绍(chao xi)了,意义不大。本文依然秉承先导篇的代数风格,我们对 Transformer 做一个简单的总结。为了方便入门,我将尽可能少地去引入一些新名词。
自注意力层
Transformer 的核心是 self-attention layer,所以,我们先介绍一下这是个什么东西。
它是一个变换,把一个输入序列,变成一个输出序列。如图所示,
它把 4 个向量 a1,a2,a3,a4a_1,a_2,a_3,a_4a1,a2,a3,a4 输入(习惯上,下面所有的向量一般都是指列向量),通过的一波瞎操作,变成了 4 个向量输出 b1,b2,b3,b4b_1,b_2,b_3,b_4b1,b2,b3,b4。那么,这一波瞎操作是什么呢?看过先导篇的直到,神经网络层无非是一些“矩阵乘向量”的函数表示,那么这一波瞎操作,无非就是一些代数运算,人们称之为 Self-Attention Layer。
下面我们开门见山地给出这一波瞎操作。假设输入是一组列向量 xi,i=1,⋯,nx_i,i=1,\cdots,nxi,i=1,⋯,n,输入也是一组列向量, yi,i=1,⋯,ny_i,i=1,\cdots,nyi,i=1,⋯,n,我们把输入输出按行排成一个矩阵,即
X=[x1,x2,⋯,xn]X = [x_1,x_2,\cdots,x_n]X=[x1,x2,⋯,xn]
Y=[x1,x2,⋯,xn]Y = [x_1,x_2,\cdots,x_n]Y=[x1,x2,⋯,xn]
那么,attention 做的事情无非就是,
A=WXA=WXA=WX
Y=WVAsoftmax((WKA)TWQAd)Y = W_VA\operatorname{softmax}\left(\frac{(W_KA)^TW_QA}{\sqrt d}\right)Y=WVAsoftmax(d
其中,softmax\operatorname{softmax}softmax 作用在矩阵上分别对每一列做 softmax\operatorname{softmax}softmax,
softmax(M)ij=eMij∑i=1NeMij\operatorname{softmax}(M)_{ij}=\frac{e^{M_{ij}}}{\sum_{i=1}^{N}e^{M_{ij}}} softmax(M)ij=∑i=1NeMijeMij
其中,W,WV,,WK,WQW,W_V,,W_K,W_QW,WV,,WK,WQ 都是一些参数矩阵,d=WK的行数=WQ的行数d = W_K 的行数 = W_Q 的行数d=WK的行数=WQ的行数。参数矩阵的大小要令等式 make sense 即可。令 WVA=V,WKA=k,WQA=QW_VA = V,W_KA = k,W_QA=QWVA=V,WKA=k,WQA=Q,那么上面的公式可以简记为:
Y=Vsoftmax(KTQd)Y = V \operatorname{softmax}\left(\frac{K^TQ}{\sqrt d}\right)Y=Vsoftmax(d
看公式总是可以接受,但是不太好形象地理解,有点莫名其妙。没关系,可以看看李宏毅老师的对 transformer 的宇宙最强解释,他的 PPT 做的我认为极好。
多头注意力
什么是 multi-head self-attention?假设我们有多组K,Q,VK,Q,VK,Q,V,那么就可以得到多组的 YYY,这些组的 YYY 可以揉成一个 YYY。多组 K,Q,VK,Q,VK,Q,V 的可以原始的一组“分裂”得到。多组的 YYY 揉成一个 YYY 可以通过在行方向上串联,再乘以一个系数矩阵得到。
细致地说,假设 Q,K,VQ,K,VQ,K,V 通过如下方式分裂成 hhh 个头,
Ki=WK,iK,i=1,⋯,hK_i = W_{K,i}K, \space i=1,\cdots,hKi=WK,iK,i=1,⋯,h
Qi=WQ,iQ,i=1,⋯,hQ_i = W_{Q,i}Q, \space i=1,\cdots,hQi=WQ,iQ,i=1,⋯,h
Vi=WV,iV,i=1,⋯,hV_i = W_{V,i}V, \space i=1,\cdots,hVi=WV,iV,i=1,⋯,h
那么,multi-head 就是
Y=WO(V1softmax(K1TQ1d1)V2softmax(K2TQ2d2)⋮Vhsoftmax(KhTQhdh))Y = W_O\left(\begin{array}{l} V_1 \operatorname{softmax}\left(\frac{K_1^TQ_1}{\sqrt {d_1}}\right) \\ V_2 \operatorname{softmax}\left(\frac{K_2^TQ_2}{\sqrt {d_2}}\right) \\ \vdots \\ V_h \operatorname{softmax}\left(\frac{K_h^TQ_h}{\sqrt {d_h}}\right) \end{array}\right) Y=WO⎝⎜⎜⎜⎜⎜⎜⎛V1softmax(d1
其中 WOW_OWO 是为了把结果降维的系数矩阵,did_idi 对应着 QiQ_iQi(or KiK_iKi)的行数。
Transformer
Attention 是 transformer 的核心,介绍了 attention-layer,下面就可以介绍 transformer 了。不同的神经网络层,无非就是把输入变成输出的不同的处理方式,如果不在乎细节的话,你甚至可以把某些层就当成黑箱。深度学习论文好阅读的地方就在于,我们看到它们给的神经网络架构图,如果操作就能大概猜个八九不离十了,不明白的地方再看看论文也就全部了解。我们一起来看看 原论文。
核心就一张图如下:
箭头就表示了数据的流向,这就不用多说了。下面我们再来解释一下,那些英文单词标注的层都是什么意思。
输入(输出)嵌入
Embedding 是什么呢?我们知道,输入需要时一组向量,那么 Input Embedding 就是想办法把输入点变成一个向量。比如说做翻译,我们需要找到每个词组对应的向量是什么,词组对应什么向量,怎么个对应法,我们暂时不用管,只要知道这是训练出来的结果即可。
位置编码
什么是 Positional Encoding?由上述过程,我们知道所有的输入是地位等价的、位置无关的,没有蕴含相对位置信息在里面,也就是说即使打乱顺序也不影响结果,这不符合输入序列有序的性质。那么,我们就需要对位置进行编码,即在上述的过程中,对 AAA 进行一个偏移,别的过程一样,
A=A+EA = A+EA=A+E
其中 EEE 是和 AAA 相同形状的矩阵。
Add 和 Norm
黄色框的 Add 顾名思义就是将前一步 Multi-Head Attention 的输出和输入加载一起。Norm 是 normalization 的缩写,他在这里表示的其实是 Layer Normalization,所谓的 normalization 也就是常说的 “减去均值,除以方差”。这里的 Layer Normalization 先不用管它是怎么个 Layer 法的,只要知道它无非是对数据做了某种“规范化”。感兴趣可以参考再 google search一下。
Feed Forward
这里的 Feed Forward 也就是最最最简单的前馈神经网络,也就是你能想到的你最开始学的那个神经网络。
Linear
顾名思义,这就是线性化处理。
Nx
表示图中框住的部分要跑 N 遍。
seq2seq 模型和 marked 注意力机制
我们注意到,Figure 1 还有一部分没有不明晰的。即右边那个图的输入 “Outputs” 是什么东西,是 “Output Probability” 的 “Output” 吗?另外,提到的 marked attention 又是什么?
要说清楚这个,就不得不介绍 seq2seq model,seq2seq 这不是指 sequence to sequence 的一类模型,这是一个模型,来自于某个作者在某篇论文中提出的。
简单地说,Figure 1 左边的一半编码器,右边的一半叫解码器,解码器可能会被循环多次。解码器的输入来自于解码器的已有输出(起始输入是一个“起始命令”,知道输出为“终止命令”不再循环解码器结束输出)。
听起来比较抽象,我们举个简单的例子,比如说翻译 “我爱中国”。将“我”、“爱”、“中国”三个词儿词嵌入编码后进行输入,通过左边的编码器,将他们编码成了 c 待用。然后,我们开始解码,解码器输入 bos,告诉解码器开始解码,如图 1 所示,在 Multi-Head Attention 层,将 c 和 到这一层之前的输出放一块,一起做 attention,再经过后面的一堆操作,最后得到了解码器的 Output——I。接着我们把这个 I 作为解码器的输入,一堆操作到了 Multi-Head Attention 层,依然和 c 一起做 attention,再经过几层得到了解码器的输出——Love。再一次,我们将 I 和 Love 作为解码器的输入,通过 Masked Multi-Head Attention 层做了 attention, Add & Norm 之后再次和 c 做 attention,再经过后面的几层输入得到了解码器新的输出——China。最后,我们依然将 I Love China 作为输入,通过加码器,得到结束翻译标志的输出 eos,表示翻译终止。
容易发现,在解码的这个过程中,解码器的输入是慢慢增加的,是已经翻译出来的一些词。所以,为了以示特别,下一层是对已经生成出来的信息做 attention,称为 Masked Multi-Head Attention。事实上,它就是普通的 Multi-Head Attention,我们不用专门去留意它。因为没有生成的信息,我们怎么拿他来做 attention 嘛,我们本来也只能拿已经有的已经翻译出来的词儿做 atten。
训练
到这我们基本上把 transformer 的框架讲清楚了,剩下的细节可以看论文了。比如说训练,依然以翻译举例,seq2seq 模型告诉我们,我们可以拿正确的翻译(标签)来矫正解码器的输入,也就是说,解码器的输入可能不太对,我们用相应的正确的输入把它替代掉。
其他
深度学习的论文,图即一切。《Attention Is All You Need 》还有几张图,我们来解释一下。
这张图是为了说明标准的 Self-Attention 和 Multi-Head Attention 的,前面已经解释过了。
上面的这三种图,是为了阐述 Multi-Head Attention 的必要性。一方面展示了 attention layer 对于语义理解的准确性,譬如代词 attention 的 words 恰是他表达的准确含义,就是这么神奇。另一方面,体现了不同的 head 代表了不同的功能和含义,譬如有的 head 抓住了 local 的信息,有的 head 更侧重于全局的性质。就这样简单地理解就可以,不必深究。
【深度学习入门基础】二、简单理解 Transformer相关推荐
- 【深度学习入门基础】一、从线性代数和微积分的角度看神经网络
[深度学习入门基础]从线性代数和微积分的角度看神经网络 这是深度学习入门系列文章,我们企图用最简洁的语言.最干净的表达,让读者快速获取到他所想要的.本系列文章持续更新.一些网上能查到的基础知识,诸如激 ...
- 深度学习入门(二十四)卷积神经网络——填充和步幅
深度学习入门(二十四)卷积神经网络--填充和步幅 前言 卷积神经网络--填充和步幅 课件 填充 步幅 总结 课本 1 填充 2 步幅 3 小结 前言 核心内容来自博客链接1博客连接2希望大家多多支持作 ...
- 【深度学习入门-1】透彻理解卷积的三层含义:从“卷积”、到“图像卷积操作”、再到“卷积神经网络”的含义(学习笔记)
一.写在前面 笔者在进行卷积神经网络入门的时候花了很多功夫,理解的也不够透彻,基础不牢,地动山摇.在查阅了很多资料后,发现了大佬up"王木头学科学"讲的卷积神经网络的理解,茅塞顿开 ...
- 计算机视觉研究院出品:深度学习入门基础全库(附链接下载)
关注并星标 从此不迷路 计算机视觉研究院 学习群|扫码在主页获取加入方式 计算机视觉研究院专栏 作者:Edison_G 今天我们"计算机视觉研究院"主要分享深度学习入门的基础书籍集 ...
- 人工智能:深度学习算法及应用——简单理解CNN卷积神经网络并python实现(带源码)
深度学习算法及应用 一. 实验目的 二. 实验要求 三. 实验的硬件.软件平台 四. 实验原理 1.1. 深度学习概述 1.2. 深度学习的常见结构 1.3. 卷积神经网络(CNN) **卷积** * ...
- 深度学习入门基础讲义
工作确定以后,闲暇时间做了如下一个PPT讲义,用于向实验室新生介绍深度学习.他们大部分在本科期间学习通信相关专业课程,基本没有接触过图像处理和机器学习. 对于一个研究生而言,自学应当是一个最基本也是最 ...
- 3D点云数据结合深度学习入门基础(目标篇)
最近,老师让我们研究深度学习与3D点云数据的研究方向,开始时,确实也不清楚何为3D点云,以及深度学习. 由于实验室师弟师妹全部是做深度学习识图相关横向研究工作的,所以很快的就掌握了,深度学习识图技术, ...
- 深度学习入门篇(二)Lenet网络在caffe+QtCreator上部署应用
一.部署流程 先参考上一篇博客,学会Lenet在caffe上训练 caffe+qt+lenet实现手写体识别源码下载地址. 把训练好的权重文件和深度神经网络部署到Qt上,实现手写体的识别. 环境要求( ...
- 深度学习入门基础CNN系列——卷积计算
卷积计算 卷积是数学分析中的一种积分变换的方法,在图像处理中采用的是卷积的离散形式.这里需要说明的是,在卷积神经网络中,卷积层的实现方式实际上是数学中定义的互相关 (cross-correlation ...
最新文章
- 线上服务 CPU 又 100% 啦?一键定位 so easy!
- 土壤生物和生化专业委员会暨土壤生物与土壤健康研讨会(杭州5月8-11)
- 解决在AX 2009中删除公司时提示:未授权用户##删除表“DEL_PBATRANSLATECONSISTOF”中的记录...
- 【数据挖掘】高斯混合模型 ( 与 K-Means 每个步骤对比 | 初始参数设置 | 计算概率 | 计算平均值参数 | 计算方差参数 | 计算高斯分布概率参数 | 算法终止条件 )
- 图像的稀疏表示——ScSPM和LLC的总结
- oracle主从表分离怎么实时更新数据_高可用数据库主从复制延时的解决方案
- flash跨域访问解决办法
- java.net.url 中文乱码,.Net获取URL中文参数值的乱码问题解决方法总结
- cf244D. Match amp; Catch 字符串hash (模板)或 后缀数组。。。
- Spring Boot 2 快速教程:WebFlux 集成 Thymeleaf(五)
- 好爸爸陪宝宝必做的50件小事儿
- 集群节点基于Hadoop集群的HBase集群的配置【2】
- Play framework 2.0 -应用程序全局设置(转)
- java自定义classloader_java自定义ClassLoader加载指定的class文件操作
- [CODEVS1911] 孤岛营救问题(分层图最短路)
- python 读grid 数据_如何将TextGrid文件的变量读入Python?
- Linux下gzip、bzip、zip、tar压缩命令的使用详解
- CentOS7 (精简操作指令)
- Druid基本概念及架构介绍
- SVG排版教程 | 样式背景属性详解与应用
热门文章
- python实时监控滚动日志,推送企业微信消息
- 一篇文章带你详解HTTP协议(1)
- 渲染行业需要什么,云渲染的优势是什么?
- java 解锁window屏幕,如何检测iPhone上的屏幕锁定/解锁事件?
- 最长回文子序列 java
- 这份软件工程师简历火了:手磨14nm咖啡,在微软传播性病,90%公司伸橄榄枝
- Shiro系列(三)--- Shiro身份验证和授权
- unicode编码 php,PHP解码unicode编码
- 微服务治理 高可用 HA (High Availability) 的一些理解
- 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引