开始使用免费开始使用

创建位置编码

对标记进行嵌入只是第一步,但这些嵌入仍然缺少关于每个标记在序列中位置的信息。为了解决这个问题,Transformer 架构会使用位置编码。它将每个标记的位置相关信息注入到嵌入中。

您将创建一个 PositionalEncoding 类,包含以下参数:

  • d_model:输入嵌入的维度
  • max_seq_length:最大序列长度(如果每个序列长度相同,则为该序列长度)

本练习是课程的一部分

使用 PyTorch 的 Transformer 模型

查看课程

练习说明

  • 创建一个尺寸为 max_seq_length × d_model 的零矩阵。
  • position * div_term 进行正弦和余弦计算,以得到偶数和奇数位置的嵌入值。
  • 确保 pe 在训练期间不是可学习参数。
  • 将变换后的位置嵌入加到输入标记嵌入 x 上。

交互式实操练习

通过完成这段示例代码来试试这个练习。

class PositionalEncoding(nn.Module):
    def __init__(self, d_model, max_seq_length):
        super().__init__()
        # Create a matrix of zeros of dimensions max_seq_length by d_model
        pe = ____
        position = torch.arange(0, max_seq_length, dtype=torch.float).unsqueeze(1)
        div_term = torch.exp(torch.arange(0, d_model, 2).float() * -(math.log(10000.0) / d_model))
        
        # Perform the sine and cosine calculations
        pe[:, 0::2] = torch.____(position * div_term)
        pe[:, 1::2] = torch.____(position * div_term)
        # Ensure pe isn't a learnable parameter during training
        self.____('____', pe.unsqueeze(0))
        
    def forward(self, x):
        # Add the positional embeddings to the token embeddings
        return ____ + ____[:, :x.size(1)]

pos_encoding_layer = PositionalEncoding(d_model=512, max_seq_length=4)
output = pos_encoding_layer(token_embeddings)
print(output.shape)
print(output[0][0][:10])
编辑并运行代码