L11注意力机制和Seq2seq模型
注意力机制
在“编码器—解码器(seq2seq)”⼀节⾥,解码器在各个时间步依赖相同的背景变量(context vector)来获取输⼊序列信息。当编码器为循环神经⽹络时,背景变量来⾃它最终时间步的隐藏状态。将源序列输入信息以循环单位状态编码,然后将其传递给解码器以生成目标序列。然而这种结构存在着问题,尤其是RNN机制实际中存在长程梯度消失的问题,对于较长的句子,我们很难寄希望于将输入的序列转化为定长的向量而保存所有的有效信息,所以随着所需翻译句子的长度的增加,这种结构的效果会显著下降。
与此同时,解码的目标词语可能只与原输入的部分词语有关,而并不是与所有的输入有关。例如,当把“Hello world”翻译成“Bonjour le monde”时,“Hello”映射成“Bonjour”,“world”映射成“monde”。在seq2seq模型中,解码器只能隐式地从编码器的最终状态中选择相应的信息。然而,注意力机制可以将这种选择过程显式地建模。
注意力机制框架
Attention 是一种通用的带权池化方法,输入由两部分构成:询问(query)和键值对(key-value pairs)。
ki∈Rdk,vi∈Rdvk_i \in R^ {d_k},v_i \in R ^{d_v}ki∈Rdk,vi∈Rdv
Query q∈Rdqq \in R ^{d_q}q∈Rdq
attention layer得到输出与value的维度一致
o∈Rdvo \in R ^{d_v}o∈Rdv
对于一个query来说,attention layer 会与每一个key计算注意力分数并进行权重的归一化,输出的向量ooo则是value的加权求和,而每个key计算的权重与value一一对应。
为了计算输出,我们首先假设有一个函数α\alphaα 用于计算query和key的相似性,然后可以计算所有的 attention scores a1,…,ana_1, \ldots, a_na1,…,an by
ai=α(q,ki).a_i = \alpha(\mathbf q, \mathbf k_i). ai=α(q,ki).
我们使用 softmax函数 获得注意力权重:
b1,…,bn=softmax(a1,…,an).b_1, \ldots, b_n = \textrm{softmax}(a_1, \ldots, a_n). b1,…,bn=softmax(a1,…,an).
最终的输出就是value的加权求和:
o=∑i=1nbivi.\mathbf o = \sum_{i=1}^n b_i \mathbf v_i. o=i=1∑nbivi.
不同的attetion layer的区别在于score函数的选择,在本节的其余部分,我们将讨论两个常用的注意层 Dot-product Attention 和 Multilayer Perceptron Attention;随后我们将实现一个引入attention的seq2seq模型并在英法翻译语料上进行训练与测试。
import math
import torch
import torch.nn as nn
import os
def file_name_walk(file_dir):for root, dirs, files in os.walk(file_dir):
# print("root", root) # 当前目录路径print("dirs", dirs) # 当前路径下所有子目录print("files", files) # 当前路径下所有非目录子文件file_name_walk("/home/kesci/input/fraeng6506")
dirs []
files ['_about.txt', 'fra.txt']
Softmax屏蔽
在深入研究实现之前,我们首先介绍softmax操作符的一个屏蔽操作。
def SequenceMask(X, X_len,value=-1e6):maxlen = X.size(1)#print(X.size(),torch.arange((maxlen),dtype=torch.float)[None, :],'\n',X_len[:, None] )mask = torch.arange((maxlen),dtype=torch.float)[None, :] >= X_len[:, None] #print(mask)X[mask]=valuereturn X
def masked_softmax(X, valid_length):# X: 3-D tensor, valid_length: 1-D or 2-D tensorsoftmax = nn.Softmax(dim=-1)if valid_length is None:return softmax(X)else:shape = X.shapeif valid_length.dim() == 1:try:valid_length = torch.FloatTensor(valid_length.numpy().repeat(shape[1], axis=0))#[2,2,3,3]except:valid_length = torch.FloatTensor(valid_length.cpu().numpy().repeat(shape[1], axis=0))#[2,2,3,3]else:valid_length = valid_length.reshape((-1,))# fill masked elements with a large negative, whose exp is 0X = SequenceMask(X.reshape((-1, shape[-1])), valid_length)return softmax(X).reshape(shape)
masked_softmax(torch.rand((2,2,4),dtype=torch.float), torch.FloatTensor([2,3]))
tensor([[[0.5423, 0.4577, 0.0000, 0.0000],[0.5290, 0.4710, 0.0000, 0.0000]],[[0.2969, 0.2966, 0.4065, 0.0000],[0.3607, 0.2203, 0.4190, 0.0000]]])
超出2维矩阵的乘法
XXX 和 YYY 是维度分别为(b,n,m)(b,n,m)(b,n,m) 和(b,m,k)(b, m, k)(b,m,k)的张量,进行 bbb 次二维矩阵乘法后得到 ZZZ, 维度为 (b,n,k)(b, n, k)(b,n,k)。
Z[i,:,:]=dot(X[i,:,:],Y[i,:,:])fori=1,…,n.Z[i,:,:] = dot(X[i,:,:], Y[i,:,:])\qquad for\ i= 1,…,n\ . Z[i,:,:]=dot(X[i,:,:],Y[i,:,:])fori=1,…,n.
torch.bmm(torch.ones((2,1,3), dtype = torch.float), torch.ones((2,3,2), dtype = torch.float))
tensor([[[3., 3.]],[[3., 3.]]])
点积注意力
The dot product 假设query和keys有相同的维度, 即 $\forall i, q,k_
L11注意力机制和Seq2seq模型相关推荐
- 可视化神经机器翻译模型(基于注意力机制的Seq2seq模型)
可视化神经机器翻译模型(基于注意力机制的Seq2seq模型) 序列到序列模型是深度学习模型,在机器翻译.文本摘要和图像字幕等任务中取得了很大的成功.谷歌翻译在2016年底开始在生产中使用这样的模型 ...
- seq2seq模型_具有注意力机制的seq2seq模型
在本文中,你将了解: 为什么我们需要seq2seq模型的注意力机制? Bahdanua的注意力机制是如何运作的? Luong的注意力机制是如何运作的? 什么是局部和全局注意力? Bahdanua和Lu ...
- AI实战:搭建带注意力机制的 seq2seq 模型来做数值预测
AI实战:搭建带注意力机制的 seq2seq 模型来做数值预测 seq2seq 框架图 环境依赖 Linux python3.6 tensorflow.keras 源码搭建模型及说明 依赖库 impo ...
- 基于注意力机制的seq2seq模型
目录 一.前言 二.模型搭建 2.1 编码器 2.2 注意力机制 2.3 解码器 2.4 Seq2Seq模型 三.模型的训练与评估 附录一.翻译效果比较 附录二.完整代码 一.前言 在此之前,我们实现 ...
- 循环神经网络、注意力机制、Seq2Seq、Transformer与卷积神经网络(打卡2)
一.过拟合和欠拟合 接下来,我们将探究模型训练中经常出现的两类典型问题: 一类是模型无法得到较低的训练误差,我们将这一现象称作欠拟合(underfitting): 另一类是模型的训练误差远小于它在测试 ...
- PyTorch 1.0 中文官方教程:基于注意力机制的 seq2seq 神经网络翻译
译者:mengfu188 作者: Sean Robertson 在这个项目中,我们将教一个把把法语翻译成英语的神经网络. [KEY: > input, = target, < output ...
- PyTorch中文教程 | (14) 基于注意力机制的seq2seq神经网络翻译
Github地址 在这个项目中,我们将编写一个把法语翻译成英语的神经网络. [KEY: > input, = target, < output]> il est en train d ...
- 注意力机制原理及其模型发展和应用
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 Attention机制在近几年来在图像,自然语言处理等领域中都取得 ...
- Attention使用注意力机制的seq2seq 动手学深度学习v2
1. Attention使用注意力机制的seq2seq 2. Attention使用注意力机制的seq2seq 代码实现 3. Q&A attention在搜索的时候,是在当前句子搜索. 一般 ...
最新文章
- python 绘图脚本系列简单记录
- python如何调用文件_如何调用另一个python文件中的代码
- 北京哪儿有卖tods豆豆鞋的?在线等答案、、、、(类似动物园、西单等地)_百度知道...
- Makefile_02:程序的编译和链接
- 使用session监听+spring MVC拦截器禁止用户重复登录
- PostgreSQL mysql 兼容性之 - 字符编码转换 CONVERT
- SAP CRM WebClient UI recent object的后台存储实现
- pricing data of Service order is copied from BP master data
- java运行python脚本_java调用python脚本,中文变成问号
- mysql数据库不存在_mysql 数据库不存在
- 硬件超车无法掩盖生态缺失,软实力构建任重而道远 | 中科曙光高性能计算专访...
- 软件设计师中级-数据流图(DFD)
- C语言实现单链表首尾相连
- 通过雷达图的面积进行总体对比分析是不可靠的!
- Springboot配置suffix指定mvc视图的后缀
- uefi开发环境搭建
- XCel 项目总结 - Electron 与 Vue 的性能优化
- 计算机取证volatility
- 51单片机数码管动态显示数字
- 域用户的管理之一次同时对多个用户进行管理