pytorch transformer 介绍

本文深入探讨Transformer模型中的位置编码机制,解释其如何弥补RNN在处理时间序列数据上的优势,通过使用sine和cosine函数直接计算或学习position embedding来加入相对位置信息,最终选择三角函数方法并阐述其两大优点。

http://pytorch123.com/FifthSection/Translation_S2S_Network/

https://zhuanlan.zhihu.com/p/44121378

1.3 Positional Encoding

除了主要的Encoder和Decoder,还有数据预处理的部分。Transformer抛弃了RNN,而RNN最大的优点就是在时间序列上对数据的抽象,所以文章中作者提出两种Positional Encoding的方法,将encoding后的数据与embedding数据求和,加入了相对位置信息。

这里作者提到了两种方法:

  1. 用不同频率的sine和cosine函数直接计算
  2. 学习出一份positional embedding(参考文献

经过实验发现两者的结果一样,所以最后选择了第一种方法,公式如下:

[å¬å¼]

[公式]

作者提到,方法1的好处有两点:

  1. 任意位置的 [公式] 都可以被 [公式] 的线性函数表示,三角函数特性复习下:

[公式]

[公式]

2. 如果是学习到的positional embedding,(个人认为,没看论文)会像词向量一样受限于词典大小。也就是只能学习到“位置2对应的向量是(1,1,1,2)”这样的表示。所以用三角公式明显不受序列长度的限制,也就是可以对 比所遇到序列的更长的序列 进行表示。

### PyTorchTransformer 的使用指南 #### 1. 安装依赖 为了在 PyTorch 中使用 Transformer 模型,首先需要安装 `transformers` 库。可以通过以下命令完成安装[^2]: ```bash pip install transformers ``` #### 2. 加载预训练模型 加载预训练的 Transformer 模型通常分为两步:初始化分词器(Tokenizer)和模型本身。以下是具体代码示例: ```python from transformers import AutoTokenizer, AutoModel # 初始化分词器 tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") # 初始化模型 model = AutoModel.from_pretrained("bert-base-uncased") ``` 此部分展示了如何通过 Hugging Face 提供的接口加载预训练模型及其对应的分词器[^2]。 #### 3. 输入数据准备 输入数据需经过分词器处理并转化为张量形式以便于模型接收。下面是一个简单的例子: ```python text = "Hello world!" inputs = tokenizer(text, return_tensors="pt") # 将文本转为 PyTorch Tensor print(inputs) ``` 这段代码说明了如何将字符串类型的文本转换成适合 Transformer 处理的形式。 #### 4. 前向传播计算 一旦准备好输入数据,就可以将其传递给模型执行前向传播操作: ```python outputs = model(**inputs) # 输出最后一层隐藏状态 last_hidden_states = outputs.last_hidden_state print(last_hidden_states.shape) # (batch_size, sequence_length, hidden_size) ``` 这里解释了如何获取模型输出的最后一层隐藏状态,并打印其形状以验证维度是否符合预期[(batch_size, seq_length, embed_dim)][^3]。 #### 5. 自定义 Transformer 层 如果想构建自己的 Transformer 架构而不是直接使用现有的预训练版本,则可以利用 PyTorch 提供的基础组件来实现自定义网络结构。例如创建一个多头注意力机制加前馈神经网络组成的单个 Transformer 编码器层如下所示: ```python import torch.nn as nn import torch class CustomTransformerEncoderLayer(nn.Module): def __init__(self, d_model=768, nhead=12, dim_feedforward=3072, dropout=0.1): super(CustomTransformerEncoderLayer, self).__init__() self.self_attn = nn.MultiheadAttention(d_model, nhead, dropout=dropout) self.linear1 = nn.Linear(d_model, dim_feedforward) self.dropout = nn.Dropout(dropout) self.linear2 = nn.Linear(dim_feedforward, d_model) def forward(self, src, src_mask=None, src_key_padding_mask=None): attn_output, _ = self.self_attn(src, src, src, attn_mask=src_mask, key_padding_mask=src_key_padding_mask) output = self.linear2(self.dropout(torch.relu(self.linear1(attn_output)))) return output ``` 该片段展示了一个简化版的自定义 Transformer 编码器层的设计思路[^3]。 #### 6. 参数初始化方法 对于某些特定场景下可能需要用到特殊的参数初始化策略比如 Xavier Uniform Initialization 来提升收敛速度或者改善泛化能力等效果。下面给出了一种常见的做法实例演示: ```python import torch.nn.init as init w = torch.empty(3, 5) init.xavier_uniform_(w) print(w) ``` 这是关于如何应用 Xavier Uniform Initialization 对权重矩阵进行初始化的一个简单案例[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值