浅谈Transformer 及Attention网络
1 Transformer 模型结构
处理自然语言序列的模型有 rnn, cnn(textcnn),但是现在介绍一种新的模型,transformer。与RNN不同的是,Transformer直接把一句话当做一个矩阵进行处理,要知道,RNN是把每一个字的Embedding Vector输入进行,隐层节点的信息传递来完成编码的工作。简而言之,Transformer 直接粗暴(后面Attention也就是矩阵的内积运算等)。
Attention 的编码,把一个输入序列(x1,...,xn) (x_1,...,x_n)(x
1
,...,x
n
)表示为连续序列z=(z1,...,zn) \mathbf {z} = (z_1,...,z_n)z=(z
1
,...,z
n
).给定z \mathbf {z}z, 解码生成一个输出序列 (y1,...,ym) (y_1,..., y_m)(y
1
,...,y
m
). 模型每一步都是自回归的(?),即假设之前生成的结果都是作为生成下一个符号的额外输入。
TransFormer 模型使用堆叠的自注意力
(self-attention)、逐点(point-wise)、全连接层(fully connected layers).
1.1 堆叠的编码和解码
编码:编码器由 N=6 个相同的层堆叠成,每层有两个减层(sub-layers)和标准化层。
解码: 有6个相同层堆叠而成,此外,在解码堆叠中,增加自注意力减层,防止 位置出现偏差。
1.2 Attention
NLP领域中,Attention网络基本成为了标配,是Seq2Seq的创新。Attention网络是为了解决编码器-解码器结构存在的长输入序列问题。
Attention功能可以被描述为将查询和一组键值对映射到输出,其中查询,键,值和输出都是向量。输出可以通过对查血的值加权来计算。
1.2.1 压缩的点乘注意力机制
输入:查询(query)、键(维度dk d_kd
k
)、值(维度 dv d_vd
v
).
查询矩阵Q、键矩阵K、值矩阵V
输出:
Attention(Q,K,V)=softmax(QKT(dk)√)V Attention(Q,K,V)= softmax(\frac{QK^T}{\sqrt{(d_k)}})VAttention(Q,K,V)=softmax(
(d
k
)
QK
T
)V
Attention与RNN/CNN不同,在于Attention,直接将xt x_tx
t
与原来的每个词进行比较,最后算出yt y_ty
t
;即
yt=f(xt,A,B) y_t = f(x_t, \Alpha, \Beta)y
t
=f(x
t
,A,B)
其中,A,B为另外一个序列或矩阵;如果A=B=X,那么称为 Self Attention.
举例:
embedding在进入到Attention之前,有3个分叉,那表示说从1个向量,变成了3个向量Q,K,V,它是通过定义一个WQ矩阵(这个矩阵随机初始化,通过前向反馈网络训练得到),将embedding和WQ矩阵做乘法,得到查询向量q,假设输入embedding是512维,在上图中我们用4个小方格表示,输出的查询向量是64维,上图中用3个小方格以示不同。然后类似地,定义WK和WV矩阵,将embedding和WK做矩阵乘法,得到键向量k;将embeding和WV做矩阵乘法,得到值向量v。对每一个embedding做同样的操作,那么每个输入就得到了3个向量,查询向量,键向量和值向量。需要注意的是,查询向量和键向量要有相同的维度,值向量的维度可以相同,也可以不同,但一般也是相同的。
至于将获得的Q,K,V矩阵具体操作,总的来说,就是以下这幅图。
获得的Z和目标值进行比较,获得的损失反向传播,优化的参数是,WQ,WK,WV W_Q, W_K, W_VW
Q
,W
K
,W
V
.
1.2.2 Multi-Head Attention
MultiHead(Q,K,V)=Concat(head1,...,headh) MultiHead(Q, K, V) = Concat(head_1,...,head_h)MultiHead(Q,K,V)=Concat(head
1
,...,head
h
)
多头注意力机制,只是多做几次同样的事,然后把结果拼接。
1.3 Position Embedding
Position Embedding,将每个位置编号,每个编号对应一个向量,这样,Attention可以分辨出不同位置的词了。
Position Embedding:
⎧⎩⎨⎪⎪PE2i(p)=sin(p/100002i/dpos),PE2i+1(p)=cos(p/100002i/dpos) \left\{\begin{array}{lr}PE_{2i}(p) = sin(p/10000^{2i/d_{pos}}), & \\PE_{2i+1}(p) = cos(p/10000^{2i/d_{pos}}) & \end{array}\right.{
PE
2i
(p)=sin(p/10000
2i/d
pos
),
PE
2i+1
(p)=cos(p/10000
2i/d
pos
)
p,代表位置; i,代表维度;
使用这个公式,在于这个能更好表示相对位置。
由
sin(α+β)=sinαcosβ+sinβcosα sin({\alpha} + {\beta}) = sin{\alpha} cos{\beta} + sin{\beta} cos{\alpha}sin(α+β)=sinαcosβ+sinβcosα ,
cos(α+β)=cosαcosβ−sinαsinβ cos(\alpha + \beta) = cos{\alpha}cos{\beta} - sin{\alpha}sin{\beta}cos(α+β)=cosαcosβ−sinαsinβ
位置可以由两个位置之间的线性变换得到。
2 实践
import numpy as np
encoder = np.transpose([[3,12,45], [59,2,5], [1,43,5], [4,3,45.3]])
decoder = np.array([0.5, 0.1, 2])
#Score Matrix
def score(encoder, decoder):
return np.dot(np.transpose(encoder),decoder)
scoreMatrix = score(encoder, decoder)
#softmax score matrix
def softmax(x):
# x = np.array(x, dtype = np.float128)
print(np.exp(x))
print(np.sum(np.exp(x)))
return np.exp(x)/np.sum(np.exp(x), axis = 0)
scoreSoftmax = softmax(scoreMatrix)
#multiply with encoder matrix
def multiply(x, weight):
return np.multiply(x, weight)
weightEncoder = multiply(encoder, scoreSoftmax)
#get Attention Vector
def attentionVec(x):
return np.sum(x, axis = 1)
att_vec = attentionVec(weightEncoder)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
reference:
Attention is all you need;
bojone Attentionn;
RNN 中的Attention;
attention kaggle;
公众号大数据文摘 transformer介绍;
英文blog,非常详细,5是其译文;
---------------------
作者:rosefun96
来源:CSDN
原文:https://blog.csdn.net/rosefun96/article/details/84930540
版权声明:本文为博主原创文章,转载请附上博文链接!
浅谈Transformer 及Attention网络的更多相关文章
- 浅谈OSI七层网络模型和TCP/IP四层模型
OSI七层网络模型 OSI(Open System Interconnection)开放系统互连参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系. OSI七层模型 功能 ...
- 浅谈K8S cni和网络方案
此文已由作者黄扬授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在早先的k8s版本中,kubelet代码里提供了networkPlugin,networkPlugin是一组接 ...
- 浅谈 Attention 机制的理解
什么是注意力机制? 注意力机制模仿了生物观察行为的内部过程,即一种将内部经验和外部感觉对齐从而增加部分区域的观察精细度的机制.例如人的视觉在处理一张图片时,会通过快速扫描全局图像,获得需要重点关注的目 ...
- 浅谈通信网络(三)——TCP/IP协议
简介 Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议.In ...
- Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理
Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理 转自:https://www.jianshu.com/p/2b71ea919d49 本系列文章首发于我的个人博 ...
- 浅谈JAVA中如何利用socket进行网络编程(二)
转自:http://developer.51cto.com/art/201106/268386.htm Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以 ...
- 浅谈分词算法(5)基于字的分词方法(bi-LSTM)
目录 前言 目录 循环神经网络 基于LSTM的分词 Embedding 数据预处理 模型 如何添加用户词典 前言 很早便规划的浅谈分词算法,总共分为了五个部分,想聊聊自己在各种场景中使用到的分词方法做 ...
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- iOS开发之浅谈MVVM的架构设计与团队协作
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
随机推荐
- 安装 Composer
参考百度经验:http://jingyan.baidu.com/article/4f34706ed04013e386b56d72.html Composer下载:https://getcomposer ...
- 几道面试题-考察JS的运用
1.定义一个方法,传入一个string类型的参数,然后将string的每个字符间加个空格返回,比如: spacify('hello world') // => 'h e l l o w o r ...
- font-family:黑体;导致css定义全部不起作用
css文件里font-family: "黑体";这句会导致后面的css定义全部不起作用了. 只要把font-family: "黑体"; 改成 font-fami ...
- 获得CSM(Certified Scrum Master)-价值驱动交付。
2019年越来越多的企业开始实行敏捷转型,紧随时代潮流,学习最先进的科学管理方法,找到正确的人(团队),为企业交付高价值的产品服务. 导师Ethan ,培训的课程让人收益匪浅,活到老学到老,丰富的知识 ...
- 部署 LAMP (CentOS 7.2)
摘自:https://help.aliyun.com/document_detail/50774.html 简介 LAMP指Linux+Apache+Mysql/MariaDB+Perl/PHP/Py ...
- 关于JSON的个人理解
1.比xml更易于解析的数据存储方式 2.主要是用键值对的方式进行存储 3.可以用来存储对象或者是对象数组 个人感觉W3C上给的教程很好
- 【SPOJ 220】 PHRASES - Relevant Phrases of Annihilation
[链接]h在这里写链接 [题意] 给你n(n<=10)个字符串. 每个字符串长度最大为1e4; 问你能不能找到一个子串. 使得这个子串,在每个字符串里面都不想交出 ...
- Python编码---转自金角大王
本节内容 编码回顾 编码转换 Python的bytes类型 编码回顾 在备编码相关的课件时,在知乎上看到一段关于Python编码的回答 这哥们的这段话说的太对了,搞Python不把编码彻底搞明白,总有 ...
- USACO93网络流入门Drainage Ditches 排水渠(DCOJ 5130)
题目描述 (传送门:http://poj.org/problem?id=1273翻译 by sxy(AFO的蒟蒻)) 每次约翰的农场下雨,Bessie的水池里的四叶草就会被弄破.这就意味着,这些四叶草 ...
- python系列之(4)豆瓣图书《平凡的世界》书评及情感分析
本篇主要是通过对豆瓣图书<平凡的世界>短评进行抓取并进行分析,并用snowNLP对其进行情感分析. 用到的模块有snowNLP,是一个python库,用来进行情感分析. 1.抓取数据 我们 ...