| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 【Transformer论文模型细致讲解】 -> 正文阅读 |
|
[人工智能]【Transformer论文模型细致讲解】 |
Transformer是谷歌在2017年6月提出,发表在NIPS2017上。论文地址 Attention Is All You Need。 Transformer主体框架是一个encoder-decoder结构,去掉了RNN序列结构,完全基于attention和全连接。在WMT2014英语翻译德语任务上,bleu值达到了28.4,达到当时的SOTA。其总体结构如下所示 1.首先是Encoder 1.1.Embedding,又分为两个部分,token embedding和positional encoding 关键点1:Transformer的随机初始化
我是这样理解的,因为其实后面我们会讲到每一个encoder的输入都来自于上个encoder的输出,所以Q=K=V(不过这里的QKV是相当于第一个Input的X,而Q‘,K‘,V’才是真正新的QKV),那么我们认为Q就是保存了原来的信息,后面会计算Q@K’,这个时候我们就是计算不同的K对于同一个q(Q中的元素)的影响,也就是上下文的对于这个元素q的影响(包括自己),一般来说应该是计算相似性,然后经过防止太大然后还有softmax进行归一化,最后再乘以V来得到输出,也就是加权求和,所以V才是我们真正需要提炼的信息,不过实际上还是给网络自己来训练得到,其实和卷积挺像的,W类似于kernel。 1.1.2Positional encoding Transformer的方法这个比较神奇,我们先把图挂上去: 虽然我知道有线性,整个位置成为一个级数,说是很容易让模型通过相对位置学习参加,但但实际上我也还是不太理解什么意思。 1.2Encodeing layer 是不是很眼熟,这就是我们上面纯口述的Embedding随机初始化训练的操作。但是实际上这个是self-attention的操作, QKV矩阵怎么得到我们上面已经说过了,这里我们就来根据图像讲解一下具体怎么运算的,计算过程: Q.shape=[m,dk] K^T .shape=[dk,m] V.shape=[m,dv] A=QK^T,shape=[m,m] A=A/sqrt(dk) B=softmax(A,dim=0), 按列计算softmax, shape=[m,m] B.shape=[m,m],每一行相当于是某一个querry对所有K的attention比例。 out = B *V ,shape=[m,dv] 可以看到这里我们的dk必须相同,即QK维度需要相同,因为要做矩阵运算,但是dv可以完全随机的,但是为了方便我们还是用的一个维度的。这是为了防止在使用大dk时,A矩阵数值上过大,使得经过softmax变成B以后,梯度太小。 然后就是最关键的Mult-head attention layer 我们可以看到,如果是h头,那么拿Q举例子,就被分割成h个512/h维的向量,因为这里的QKV就是上一层encoder的输出,或者是第一层的embedding转化得到的。其实我们第一层的QKV就是随机初始化得到的矩阵,通过Wiqkv矩阵映射,然后我们后面训练Wiqkv就可以得到好的结果了,在经历我们上面讲的sclaed attention层之后,因为是h块,所以我们要通过concat连接,随后再通过一个线性连接输出,这里说的是因为要兼容不相等,这个也是一个疑问点。 在encoder里,每一个self-attention sub-layer的Q,K,V都是上一个encode layer的输出。 1.2.2Add&Norm 1.2.3Feed Forward 2.Decoder 可以发现,我们decoder的第一个子层有一个mask,虽然我们也想这一层的decoder可以处理上一层的所有信息,但是我们作为解码器其实不应该是知道输出后面的信息的,为了符合逻辑防止信息穿越,我们就要把后面的信息设置掩码,所以第i行只能看到第i列为止的信息。所以我们设置mask处的值为负无穷,这样softmax之后值就趋近于0,没有影响。 2.2输入问题 剩下的就都讲过了,和encoder一样。 3.参数共享及输出 因为这三个地方的参数维度都是一样的,所以可以共享,并且有工作指出,直接利用embd里训练出来的相似性,可以提高softmax的表现 这个共享参数是本质上还是decoder输出的用户向量与所有词向量的内积,即代表了当前output与所有词向量的“距离”,或者说关系程度。其实我也还是不太理解… 至此,Transformer就讲完了 但是小规模数据集或者太大的文本长度都不太好,所以还有其他工作或者变式有所补充。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 4:00:01- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |