Transformer详解


参考 The Illustrated Transformer

Github模型库:

Tensor2Tensor:Attention is all you need中给出的开源代码,实际包含了很多其他模型,不太好看源码
The Annotated Transformer:OpenNMT的相关作者给出的PyTorch代码分析,适合PyTorch的同学阅读
Kyubyong/transformer:Tensorflow版的Transformer,代码比较简洁,star星数2.8k,适合Tensorflow的同学阅读

模型原理

参数分析

典型参数(base):encoder 6层,decoder 6层,隐层512维,forward2048,多头8个,KV矩阵维度64(512/8),drop0.1

训练参数
1、embedding
2、每个encoder:QKV矩阵的W和b,FFN两层W和b,2个LayerNorm的权重
3、每个decoder:QKV矩阵的W和b,Q矩阵的W和b,FFN两层W和b,3个LayerNorm的权重

模型整体

6层的encoder(每个参数独立学习),最上层encoder的输出的K和V,作为6个decoder(每个参数独立学习)的中间attention层输入。encoder和decoder之间都是512维的vector list,list的长度在训练阶段定好。
在这里插入图片描述
encoder的组成,self-attention层是注意力层,每个词和上下文进行QKV的计算。FFN层对每个word,进行计算,共享一个权重。FFN比较简单,2层DNN,第一层维度为2048,后面加上ReLU层。公式为FFN(x) = max(0, xW1 + b1 )W2 + b2。FFN可以并行计算。
在这里插入图片描述
decoder的组成,类似于encoder,多一个中间attention层,叫做encoder-decoder attention层
在这里插入图片描述
输出层是一个DNN+Softmax,维度为词典大小,decoder的每一个位置输出共享一个参数。原文中提到,we share the same weight matrix between the two embedding layers and the pre-softmax linear transformation,similar to [30]。即前后合用一个词典,DNN的权重为embedding weight,bias为0
在这里插入图片描述
encoder和decoder的输入都为word embedding + position embedding,word embedding为可训练的lookup table,乘以sqrt(64)?不知道为什么,position embedding固定函数产生(实验证明学习的和固定的效果差不多),可以scale到无限长的句子(?貌似作用不大,因为训练时最大长度已经设好,infer时不能增加,因为没有对应的QKV矩阵了)
在这里插入图片描述

注意力层

self-attention:
1、q、k、v为embedding或encoder/decoder输出与可学习参数WQ、WK、WV相乘得到,注意Kyubyong/transformer中用的是一层DNN,即包含bias;
2、q和序列的k内积,除以sqrt(64),取softmax,再与序列的v加权得到输出;
3、序列长度掩码mask,输入中后面的qk内积值设成无穷小;
4、MultiHead(Q, K, V ) = Concat(head1, …, headh)Wo,维数正好对上Wo省略
4、在decoder中,self-attention要对后续位置做掩码,位置掩码用下三角实现(感觉有了位置掩码就不用序列掩码了?)
在这里插入图片描述
在这里插入图片描述
encoder-decoder attention
与self-attention类似,一样的实现

Why Self-attention

未完待续~

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Transformer 是一种用于自然语言处理任务的深度学习模型,它是由 Google 在 2017 年提出的。相比于传统的循环神经网络和卷积神经网络,Transformer 采用了全新的 Encoder-Decoder 架构,使用了自注意力机制(Self-Attention Mechanism)来处理输入序列,从而在机器翻译、文本摘要、对话生成等任务上取得了很好的效果。 Transformer 本质上是一个 Encoder-Decoder 架构,其中 Encoder 和 Decoder 都是由多个相同的层堆叠而成。每个层都包含了两个子层,分别是 Multi-Head Attention 和 Feed Forward Neural Network。其中 Multi-Head Attention 是 Transformer 的核心,它使用了自注意力机制来计算输入序列中每个词与其他词之间的关系,从而更好地捕捉上下文信息。 Transformer 的训练过程分为两个阶段:第一阶段是无监督的预训练,使用大量的无标注数据来训练模型;第二阶段是有监督的微调,使用有标注的数据来微调模型,使其适应特定的任务。 下面是一个简单的 Transformer 模型的实现代码: ```python import torch import torch.nn as nn import torch.nn.functional as F class Transformer(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim, num_layers, num_heads, dropout): super().__init__() self.embedding = nn.Embedding(input_dim, hidden_dim) self.encoder_layers = nn.ModuleList([EncoderLayer(hidden_dim, num_heads, dropout) for _ in range(num_layers)]) self.decoder_layers = nn.ModuleList([DecoderLayer(hidden_dim, num_heads, dropout) for _ in range(num_layers)]) self.fc_out = nn.Linear(hidden_dim, output_dim) self.dropout = nn.Dropout(dropout) self.scale = torch.sqrt(torch.FloatTensor([hidden_dim])).to(device) def forward(self, src, trg, src_mask, trg_mask): src_len, batch_size = src.shape trg_len, batch_size = trg.shape src_pos = torch.arange(0, src_len).unsqueeze(1).repeat(1, batch_size).to(device) trg_pos = torch.arange(0, trg_len).unsqueeze(1).repeat(1, batch_size).to(device) src = self.dropout((self.embedding(src) * self.scale) + src_pos) trg = self.dropout((self.embedding(trg) * self.scale) + trg_pos) for layer in self.encoder_layers: src = layer(src, src_mask) for layer in self.decoder_layers: trg = layer(trg, src, trg_mask, src_mask) output = self.fc_out(trg) return output ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值