Transformer 中的输入嵌入



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

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

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

什么是输入嵌入?

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

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

输入嵌入在 Transformer 中的重要性

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

语义表示

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

降维

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

增强学习

嵌入还捕获上下文关系,因此它们提高了模型学习数据中模式和关系的能力。这种能力导致机器学习模型在自然语言处理任务上的性能得到改善。

输入嵌入子层的运作

输入嵌入子层的运作方式类似于其他标准的转录模型,包括以下步骤 -

步骤 1:分词

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

让我们看看两种分词 -

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

步骤 2:嵌入层

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

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

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

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

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

示例

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 ]]

结论

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

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

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

了解和实现输入嵌入子层对于有效地使用 Transformer 模型执行自然语言处理任务至关重要。

广告

© . All rights reserved.