transformer 翻译模型
google 出品, 基于 encoder-decoder 架构的 seq2seq 自然语言翻译模型. paper 见参考[1].
创新之处是弃用 RNN,CNN 这样的结构, 采用 self-attention 与 positional-encoding 来简化结构, 加速训练, 并提升效果, 取得了 SOTA 成绩.
BLEU 评测指标
BLEU, BiLingual Evaluation Understudy , (译作双向语言评估替工) , 一种自动评测机器翻译的方法.
翻译讲究信达雅, 算是主观题. 之所以采用BLEU评估有两点考虑.
- 人力评估成本大.
- 便于多个翻译模型之间做对比.
BLEU∈(0,1)BLEU\in (0,1)BLEU∈(0,1), 越大表示翻译越精准. 基本思想是 预测结果的 n-gram 与 测试数据的 n-gram 作对比, n∈{1,2,3}n\in \{1,2,3\}n∈{1,2,3}. 看命中效果.
网络结构
self-attention
source 与 target 是两个sequence, self-attention 是指对同一sequence内, 各个token间的关联做计算.
论文中把提出的attention 叫 Scaled Dot-Product Attention.
引入三个共享参数矩阵, Query,Key,Value, 对 embedding 后的token做表达的学习.
所谓attention, 就是这么一个映射关系, output=f(query,{key_value})output=f(query, \{key\_value\} )output=f(query,{key_value}).
Attention(Q,K,V)=softmax(QKTdk)V(1)Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V \tag 1Attention(Q,K,V)=softmax(dk
图2. output=f(query,{key_value})output=f(query, \{key\_value\} )output=f(query,{key_value})的直观图示
MultiHead(Q,K,V)=Concat(head1,...,headh)WOMultiHead(Q,K,V)=Concat(head_1,...,head_h)W^OMultiHead(Q,K,V)=Concat(head1,...,headh)WO
where headi=Attention(QWiQ,KWiK,VWiV)head_i=Attention(QW_i^Q,KW_i^K,VW_i^V)headi=Attention(QWiQ,KWiK,VWiV), WO∈Rhdv×dmodelW^O\in \mathbb R^{hd_v\times d_{model}}WO∈Rhdv×dmodel
vanilla attention
除了 source_seq 与 target_seq 各自的 self_attrntion 之外, 还有二者之间的 vanilla_attention. 对应图1 transformer 架构图中, decoder内的第二个 sub-layer. 此时有 vanilla_attention(decoder_Q,encoder_memory_K, encoder_memory_V)
.
Positional Encoding
将token所在seq的位置信息加以编码表示. 可以是 {sin/cos三角函数, embedding中学习} 两种方案, ablation study 显示差异不大.
mask
- future mask
decoder中有个特别点就是masking, masking 的作用就是防止在训练的时候 使用未来时刻才输出的单词。比如训练时,第一个单词是不能参考第二个单词的生成结果的(但可以参考自己)。Masking就会把这个信息变成0,用来保证预测位置 i 的信息只能基于比 i 小的输出。
下面章节的tf实现部分, 会有 下三角矩阵的api说明.
feed-forward
是图片中 feed-forward 的超集, 也包含了 add&norm.
其中 add 残差的操作与时机可以参考
# feed-forward, add & normdef call(self, inputs, **kwargs):# Inner layer, ReLUoutputs = Dense(self.num_units[0], activation=tf.nn.leaky_relu)(inputs)# Outer layer, linearoutputs = Dense(self.num_units[1])(outputs)# Residual connectionoutputs += inputs# Normalizeoutputs = utils.modules.layer_norm(outputs)return outputs
train/predict 不同的 inference
train 阶段, 直接输出整体的 logits #shape=(N, T2, vocab_size)
, 与y_ = label_smoothing(tf.one_hot(y, depth=self.hp.vocab_size)) # (N, T2, vocab_size)
计算交叉熵.
在预测阶段, predicts y_hat auto-regressively. 即根据句子Source的中间语义表示C和之前已经生成的历史信息.
yi=g(C,y1,y2,...,yi−1)y_i=g(C,y_1,y2_,...,y_{i−1})yi=g(C,y1,y2,...,yi−1)
where CCC 为 source sentence 的语义编码.
tf 实现
官方基于tf, 又搞了 tensor2tensor 库, 内含transformer的实现. github 有人基于tf给出了实现, 见参考 [3].
- 数据集
Germany_2_English 翻译任务. 为了单机体验完整流程, 控制数据量. 训练集有 19万 样本, 验证集有 993 条样本. 英德的word加起来构成了 size=8000 的 vocabulary. - 超参
vocab_sizevocab\_sizevocab_size=32000, d_modeld\_modeld_model=512, max_len_source=100max\_len\_source=100max_len_source=100, max_len_target=100max\_len\_target=100max_len_target=100. - input/output
xs: tuple ofx: int32 tensor. (N, T1) . T1为当前batch样本的最长原文长度.x_seqlens: int32 tensor. (N,)sents1: str tensor. (N,)ys: tuple ofdecoder_input: int32 tensor. (N, T2). T2为当前batch样本的最长译文长度.y: int32 tensor. (N, T2)y_seqlen: int32 tensor. (N, )sents2: str tensor. (N,)
- 主干逻辑
def train(self, xs, ys):'''Returnsloss: scalar.train_op: training operationglobal_step: scalar.summaries: training summary node'''# forwardmemory, sents1 = self.encode(xs)logits, preds, y, sents2 = self.decode(ys, memory)# train schemey_ = label_smoothing(tf.one_hot(y, depth=self.hp.vocab_size))ce = tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=y_)nonpadding = tf.to_float(tf.not_equal(y, self.token2idx["<pad>"])) # 0: <pad>loss = tf.reduce_sum(ce * nonpadding) / (tf.reduce_sum(nonpadding) + 1e-7)
- future mask
diag_vals = tf.ones_like(inputs[0, :, :]) # (T_q, T_k)
# 详见, https://www.tensorflow.org/api_docs/python/tf/linalg/LinearOperatorLowerTriangular?version=stable, 对角线的元素被保留, 不置0.
# 但<=1.4 版本的tf, 是没有这个api的. 可以用 tf.matrix_band_part(input, -1, 0) 替代
tril = tf.linalg.LinearOperatorLowerTriangular(diag_vals).to_dense() # (T_q, T_k)
masks = tf.tile(tf.expand_dims(tril, 0), [tf.shape(inputs)[0], 1, 1]) # (N, T_q, T_k)paddings = tf.ones_like(masks) * padding_num
outputs = tf.where(tf.equal(masks, 0), paddings, inputs)
bert
基于双向transformer的预训练语言表达模型.
参考
1.transformer paper, Attention Is All You Need
2. blog, 机器翻译评价指标之BLEU详细计算过程
3. github 非官方实现, transformer
4. blog, 从Encoder-Decoder(Seq2Seq)理解Attention的本质
5. github, bert-use-demo
6. blog, Seq2Seq中的Attention和self-attention
7. my blog, residual connection, 残差链接
transformer 翻译模型相关推荐
- 基于Pytorch的Transformer翻译模型前期数据处理方法
基于Pytorch的Transformer翻译模型前期数据处理方法 Google于2017年6月在arxiv上发布了一篇非常经典的文章:Attention is all you need,提出了解决s ...
- Transformer翻译模型Decoder详解(Masking)
写这个博客的原因在于:大部分解释Transformer的文章都只注重讲解Encoder部分,在Encoder中又侧重讲解self-attention原理.为了读者更好地理解整个Transformer的 ...
- 基于Transformer的翻译模型(英->中)
基于Transformer的翻译模型(英->中) Transformer结构 数据格式 模型结构 Embedding 位置编码 1.固定编码. 2.动态训练. Position Encoding ...
- 对比学习还能这样用:字节推出真正的多到多翻译模型mRASP2
AI科技评论报道 作者 | 潘小小 编辑 | 陈大鑫 大家都知道目前研究界主流的多语言翻译模型主要在英语相关的语对上进行训练.这样的系统通常在英语相关的语向(有监督语向)上表现不错,而在非英语方向(零 ...
- 对比学习还能这样用:字节推出真正的多到多翻译模型mRASP2
作者 | 潘小小 编辑 | 陈大鑫 大家都知道目前研究界主流的多语言翻译模型主要在英语相关的语对上进行训练.这样的系统通常在英语相关的语向(有监督语向)上表现不错,而在非英语方向(零资源方向)的翻译效 ...
- Facebook开源了两个无监督翻译模型,只用单语就能训练双语
翻栗子 发自 凹非寺 量子位 出品 | 公众号 QbitAI 昨天,Yann LeCun大神发推宣布,Facebook的两个无监督翻译模型,开源了. 所谓无监督,便是不需要双语对照文本,只用单语 ...
- Transformer T5 模型慢慢读
Transformer T5 模型慢慢读(我也省略了很多细节,只是大体的阐述,具体,大家可以参看论文.....) 代码地址:https://github.com/google-research/tex ...
- 抱抱脸(hugging face)教程-中文翻译-模型概要
模型概要 这是一个总结的模型可在Transformers.假设您熟悉最初的Transformers模型.或者温柔的介绍,看看有注释的Transformers.在我们关注模特之间的高度差异之前.你可以在 ...
- TransRepair:自动测试及修复神经网络翻译模型的不一致性问题
⬆⬆⬆ 点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 机器翻译是计算语言学的一个分支,是人工智能的终极目标之一,具有重要的科学研究价值.同时,机器翻译又具有 ...
- Transformer——注意力模型分析及应用
一.概要 特点:Transformer注意力模型解决了RNN中的attention效率低.训练时变形的问题. 目的:机器翻译 二.基本组成 encoder和decoder是可叠加的. 解码器拿到编码器 ...
最新文章
- JDK踩坑: Smart LocalDate
- elasticsearch ik分词插件配置自定义分词词典
- .net core 基于Dapper 的分库分表开源框架(core-data)
- C/C++蓝桥杯1 备赛准备
- 图片照片展示html5模板
- ASP.NET——基础 12、Request
- ADB常用命令--不间断更新
- 车牌号专用键盘设计和正则验证
- Python 爬取 11 万 Java 程序员信息竟有这些重大发现!
- apache php 分离mysql_Apache、php、mysql单独安装配置
- pandas pivot 计算占比_pandas使用9:如何处理时间序列数据
- 嵌入式软件与设计 学习笔记总结一
- linux查看完整历史记录
- php压缩文件夹(整理最新版)
- scree VS tmux
- 高中计算机手抄报图片大全集,高中生手抄报版面图大全
- python画八卦_python编程也能八卦?
- 系统类毕业设计思路以及各种遇到问题的解决办法
- c语言期末考试-小题
- CS5801HDMI转eDP/DP转换芯片资料|CS5801规格书
热门文章
- 基于JAVA+SpringBoot+Mybatis+MYSQL的应急值班值守管理系统
- 静态网页HTML知识点归纳
- Python数学建模系列(九):回归
- 下载jaxen-1.1.1.jar 免费网址
- ResNet网络结构解析--Pytorch
- 【电气制图】AutoCad的常用操作(持续更新中...)
- UCOS操作系统——任务的挂起与恢复(四)
- 【Python古诗词鉴赏小程序】千古绝唱,精选中国最美古诗句,经典咏流传~
- 操作系统基础知识复习总结
- 画出psnr_计算图像的峰值信噪比PSNR以及均方根误差MSE