人工智能学习:Transformer结构(文本嵌入及其位置编码器)

发布于:2025-09-09 ⋅ 阅读:(16) ⋅ 点赞:(0)

一、输入部分介绍

输入部分包含:

  • 编码器源文本嵌入层及其位置编码器

  • 解码器目标文本嵌入层及其位置编码器

在transformer的encoder和decoder的输入层中,使用了Positional Encoding,使得最终的输入满足:

1739846954844

        这里,input_embedding是通过常规embedding层,将每一个词的向量维度从vocab_size映射到d_model,由于是相加关系,自然而然地,这里的positional_encoding也是一个d_model维度的向量。(在原论文里,d_model=512)

二、文本嵌入层

        文本嵌入层(Text Embedding Layer)是深度学习模型中将文本(通常是单词或句子)转换为固定大小的向量表示的一个关键层。它的目标是将每个文本单元(如单词或子词)映射到一个高维空间中,以便模型能够更好地捕捉到词汇的语义信息和语法信息。

        无论是源文本嵌入还是目标文本嵌入,都是为了将文本中词汇的数字表示转变为向量表示, 希望在这样的高维空间捕捉词汇间的关系。常见的词嵌入方法包括:Word2Vec, GloVe, FastText, 以及可学习的embedding层。

nn.Embedding演示:

Python

embedding = nn.Embedding(num_embeddings=10, embedding_dim=3)
input = torch.LongTensor([[1, 2, 4, 5], [4, 3, 2, 9]])
print(embedding(input))

# padding_idx: 指定用于填充的索引。如果设置为0,则索引为0的输入将始终映射到一个全零向量,并且在反向传播时不会更新该嵌入。
# 全零向量:padding_idx 指定的索引(如0)会被映射到一个全零向量。
# 不更新梯度:在训练过程中,padding_idx 对应的嵌入向量不会被更新。
# 用途:常用于处理变长序列的填充部分,避免填充部分对模型训练产生影响。
embedding = nn.Embedding(num_embeddings=10, embedding_dim=3, padding_idx=0)
input = torch.LongTensor([[0, 2, 0, 5]])
print(embedding(input))

输出结果:

Python

tensor([[[-1.0378,  0.0594,  2.6601],
         [ 1.0423, -0.4094,  0.3436],
         [-1.8989,  1.3664, -0.3701],
         [ 0.3930,  0.9908,  1.5700]],

        [[-1.8989,  1.3664, -0.3701],
         [ 0.3479, -0.2118, -0.1244],
         [ 1.0423, -0.4094,  0.3436],
         [ 0.4161,  0.4799, -0.4094]]], grad_fn=<EmbeddingBackward0>)
tensor([[[ 0.0000,  0.0000,  0.0000],
         [-0.3378,  1.1013, -1.7552],
         [ 0.0000,  0.0000,  0.0000],
         [ 0.9153,  0.3548,  2.1857]]], grad_fn=<EmbeddingBackward0>)

文本嵌入层的代码实现:

Python

# 导入必备的工具包
import torch
# 预定义的网络层torch.nn, 工具开发者已经帮助我们开发好的一些常用层,
# 比如,卷积层, lstm层, embedding层等, 不需要我们再重新造轮子.
import torch.nn as nn
# 数学计算工具包
import math


# Embeddings类 实现思路分析
# 1 init函数 (self, d_model, vocab)
# 设置类属性 定义词嵌入层 self.lut层
# 2 forward(x)函数
# self.lut(x) * math.sqrt(self.d_model)

网站公告

今日签到

点亮在社区的每一天
去签到