Transformer 中的输入嵌入

Transformer 的两个主要组件,即编码器和解码器,包含各种机制和子层。在 Transformer 架构中,第一个子层是输入嵌入。

输入嵌入是一个关键组件,作为输入数据的初始表示。这些嵌入在将文本输入模型进行处理之前,首先将原始文本数据(如单词或子词)转换为模型可以处理的格式。

阅读本章以了解输入嵌入是什么、它们为何重要以及如何在 Transformer 中实现它们,并使用 Python 示例来说明这些概念。

什么是输入嵌入?

输入嵌入基本上是离散标记(如单词、子词或字符)的向量表示。这些向量捕获了标记的语义含义,使模型能够有效地理解和操作文本数据。

Transformer 中输入嵌入子层的作用是将输入标记转换为高维空间 $\mathrm{d_{model} \: = \: 512}$,其中相似的标记具有相似的向量表示。

Transformer 中输入嵌入的重要性

现在让我们了解为什么输入嵌入在 Transformer − 中很重要

语义表示

输入嵌入捕获输入文本单词之间的语义相似性。例如,"国王"和"王后"或"猫"和"狗"等词在嵌入空间中将具有彼此接近的向量。

降维

传统的独热编码将每个标记表示为具有单个高值的二进制向量,这需要很大的空间。另一方面,输入嵌入通过提供紧凑而密集的表示来降低这种计算复杂性。

增强学习

嵌入还捕获上下文关系,因此它们提高了模型学习数据中的模式和关系的能力。这种能力使 ML 模型在 NLP 任务上的表现更好。

输入嵌入子层的工作原理

输入嵌入子层的工作原理与其他标准传导模型一样,包括以下步骤 −

步骤 1:标记化

在嵌入输入标记之前,应该对原始文本数据进行标记化。标记化是将文本拆分成更小的单元(如单词或子单词)的过程。

让我们看看这两种标记化 −

  • 单词级标记化 − 顾名思义,它将文本拆分成单个单词。
  • 子单词级标记化 − 顾名思义,它将文本拆分成更小的单元,这些单元可以是单词的一部分。这种标记化方法用于 BERT 和 GPT 等模型来处理拼写错误。例如,将子词级标记器应用于文本"Transformers revolutionized the field of NLP"将生成标记 ="["Transformers", " revolutionized ", " the ", "field", "of", "NLP"]

步骤 2:嵌入层

第二步是嵌入层,它基本上是一个查找表,将每个标记映射到固定维度的密集向量。此过程涉及以下两个步骤 −

  • 词汇表 − 它是一组由模型识别的唯一标记。
  • 嵌入维度 − 它表示表示标记的向量空间的大小,例如大小为 512。

当将标记传递到嵌入层时,它会从嵌入矩阵。

如何在 Transformer 中实现输入嵌入?

下面给出了一个 Python 示例,用于说明如何在 Transformer 中实现输入嵌入 −

示例

import numpy as np

# 示例文本和标记化
text = "Transformers 彻底改变了 NLP 领域"
tokens = text.split()

# 创建词汇表
Vocab = {word: idx for idx, word in enumerate(tokens)}

# 示例输入(标记索引序列)
input_indices = np.array([vocab[word] for word in tokens])

print("Vocabulary:", vocab)
print("Input Indices:", input_indices)

# 参数
vocab_size = len(vocab)
embed_dim = 512 # 嵌入的维度

# 使用随机值初始化嵌入矩阵
embedding_matrix = np.random.rand(vocab_size, embed_dim)

# 获取输入索引的嵌入
input_embeddings = embedding_matrix[input_indices]

print("Embedding Matrix:
", embedding_matrix)
print("Input Embeddings:
", input_embeddings)

输出

上述 Python 脚本首先将文本拆分为标记,并创建一个将每个单词映射到唯一索引的词汇表。之后,它用随机值初始化一个嵌入矩阵,其中每行对应于一个单词的嵌入。我们使用的嵌入维度为 512。

Vocabulary: {'Transformers': 0, 'revolutionized': 1, 'the': 2, 'field': 3, 'of': 4, 'NLP': 5}
Input Indices: [0 1 2 3 4 5]
Embedding Matrix:
 [[0.29083668 0.70830247 0.22773598 ... 0.62831348 0.90910366 0.46552784]
 [0.01269533 0.47420163 0.96242738 ... 0.38781376 0.33485277 0.53721033]
 [0.62287977 0.09313765 0.54043664 ... 0.7766359  0.83653342 0.75300144]
 [0.32937143 0.51701913 0.39535506 ... 0.60957358 0.22620172 0.60341522]
 [0.65193484 0.25431826 0.55643452 ... 0.76561879 0.24922971 0.96247851]
 [0.78385765 0.58940282 0.71930539 ... 0.61332926 0.24710099 0.5445185 ]]
Input Embeddings:
 [[0.29083668 0.70830247 0.22773598 ... 0.62831348 0.90910366 0.46552784]
 [0.01269533 0.47420163 0.96242738 ... 0.38781376 0.33485277 0.53721033]
 [0.62287977 0.09313765 0.54043664 ... 0.7766359  0.83653342 0.75300144]
 [0.32937143 0.51701913 0.39535506 ... 0.60957358 0.22620172 0.60341522]
 [0.65193484 0.25431826 0.55643452 ... 0.76561879 0.24922971 0.96247851]
 [0.78385765 0.58940282 0.71930539 ... 0.61332926 0.24710099 0.5445185 ]]

结论

输入嵌入子层将原始文本数据(如单词或子词)转换为模型可以处理的格式。我们还解释了为什么输入嵌入对于 Transformer 的成功工作很重要。

通过捕获单词之间的语义相似性并通过提供紧凑和密集的表示来降低计算复杂度,该子层确保模型可以有效地学习数据中的模式和关系。

我们还提供了一个 Python 实现示例,以实现将原始文本数据转换为适合在 Transformer 模型中进一步处理的格式所需的基本步骤。

理解和实现输入嵌入子层对于有效地将 Transformer 模型用于 NLP 任务至关重要。