transformer详解

在这里插入图片描述

https://www.cnblogs.com/gogoSandy/p/14386998.html

新感悟:

  1. transformer的mask主要有两种,一种使padding_mask, 一种使future_mask. padding_mask是将实际不存在的内容mask掉,future_mask是让时序推理的时候让在预测T+1的token时只会用到T及T以前的信息

  2. positional embedding, 对输入的位置顺序有要求的时候需要用到,比如文本理解,如果对于位置顺序要求不高的任务,positional embedding可以不用。另外positonal embedding需要满足以下要求:
    举个🌰
    句1: Dog sit on chair
    句2: Cat is sleeping on floor
    要想全面的表达位置信息,transformer需要满足以下4个条件

  3. 相对距离: on和chair,on和floor, sit 和on, sleeping和on的相对距离都是1,它们之间的相对距离相同,且和绝对位置以及句子长度无关

  4. 绝对位置:dog和cat都是句子的第一个词,它们的绝对位置相同, encoding需要一致

  5. 句子长度:encoding需要能够generalize到训练样本中unseen的句子长度
    在这里插入图片描述
    在这里插入图片描述

为什么这么设计呢?

positional encoding是直接加在word embedding上作为输出,之后会在计算attention的过程中在两两向量内积时被使用,可能会表达类似相对距离越近attention权重越高之类的信息。因此这里表达位置和距离是依赖encoding做向量乘法,而使用sin/cos的好处在于位移和绝对位置无关

https://timodenk.com/blog/linear-relationships-in-the-transformers-positional-encoding/
在这里插入图片描述

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、付费专栏及课程。

余额充值