Gen-ai 简明教程

Input Embeddings in Transformers

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

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

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

What are Input Embeddings?

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

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

Importance of Input Embeddings in Transformers

现在我们来了解输入嵌入为何在 Transformer 中很重要 −

Semantic Representation

输入嵌入捕获了输入文本单词之间的语义相似性。例如,像“国王”和“王后”,或“猫”和“狗”这样的单词在嵌入空间中具有相邻的向量。

Dimensionality Reduction

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

Enhanced Learning

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

Working of the Input Embedding Sublayer

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

Step 1: Tokenization

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

让我们看一下两种标记化 −

  1. Word-level tokenization −顾名思义,它将文本拆分成单个单词。

  2. Subword-level tokenization − 正如其名称所暗示,它将文本拆分为较小的单元,这些单元可以是单词的部分。这种标记化用于像 BERT 和 GPT 这样的模型中来处理拼写错误。例如,应用于文本 ="Transformers 革新了 NLP 领域" 的子词级标记化工具将产生标记 = "["Transformers", " revolutionized ", " the ", "field", "of", "NLP"]

Step 2: Embedding Layer

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

  1. Vocabulary − 它是模型识别的唯一标记集合。

  2. Embedding Dimension − 它表示标记表示所在的向量空间的大小,例如大小为 512。

当标记传递到嵌入层时,它会从嵌入矩阵返回相应的稠密向量。

How Input Embeddings are Implemented in a Transformer?

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

Example

import numpy as np

# Example text and tokenization
text = "Transformers revolutionized the field of NLP"
tokens = text.split()

# Creating a vocabulary
Vocab = {word: idx for idx, word in enumerate(tokens)}

# Example input (sequence of token indices)
input_indices = np.array([vocab[word] for word in tokens])

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

# Parameters
vocab_size = len(vocab)
embed_dim = 512  # Dimension of the embeddings

# Initialize the embedding matrix with random values
embedding_matrix = np.random.rand(vocab_size, embed_dim)

# Get the embeddings for the input indices
input_embeddings = embedding_matrix[input_indices]

print("Embedding Matrix:\n", embedding_matrix)
print("Input Embeddings:\n", 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 ]]

Conclusion

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

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

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

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