Gen-ai 简明教程
Input Embeddings in Transformers
Transformer 的两个主要组件,即编码器和解码器,包含各种机制和子层。在 Transformer 架构中,第一个子层是输入嵌入。
输入嵌入是一个至关重要的组件,用作输入数据的初始表示。这些嵌入在将文本输入模型进行处理之前,首先将原始文本数据(例如单词或子单词)转换为模型可以处理的格式。
阅读本章了解输入嵌入是什么,它们为何重要,以及如何在 Transformer 中实现它们,其中包含 Python 示例来说明这些概念。
What are Input Embeddings?
输入嵌入基本上是离散标记(例如单词、子单词或字符)的向量表示。这些向量捕获了标记的语义含义,使模型能够有效理解和处理文本数据。
输入嵌入子层在 Transformer 中的作用是将输入标记转换为高维空间 $\mathrm{d_{model} \: = \: 512}$,其中相似的标记具有相似的向量表示。
Working of the Input Embedding Sublayer
输入嵌入子层的工作原理就像其他标准转导模型一样,包括以下步骤 −
Step 1: Tokenization
在嵌入输入标记之前,应该对原始文本数据进行标记化。标记化是将文本拆分成单词或子单词等较小单元的过程。
让我们看一下两种标记化 −
-
Word-level tokenization −顾名思义,它将文本拆分成单个单词。
-
Subword-level tokenization − 正如其名称所暗示,它将文本拆分为较小的单元,这些单元可以是单词的部分。这种标记化用于像 BERT 和 GPT 这样的模型中来处理拼写错误。例如,应用于文本 ="Transformers 革新了 NLP 领域" 的子词级标记化工具将产生标记 = "["Transformers", " revolutionized ", " the ", "field", "of", "NLP"]
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 ]]