变压器令牌和位置嵌入与 Keras PlatoBlockchain 数据智能。 垂直搜索。 哎。

使用 Keras 嵌入 Transformer 令牌和位置

介绍

有很多指南解释了转换器的工作原理,以及在其中的关键元素上建立直觉 - 令牌和位置嵌入。

位置嵌入标记允许转换器表示标记(通常是单词)之间的非刚性关系,这在语言建模中对我们的上下文驱动语音进行建模要好得多。 虽然该过程相对简单,但它相当通用,并且实现很快成为样板。

在这个简短的指南中,我们将了解如何使用 KerasNLP(Keras 官方插件)来执行 PositionEmbeddingTokenAndPositionEmbedding.

Keras自然语言处理

KerasNLP 是 NLP 的横向添加。 在撰写本文时,它还很年轻,版本为 0.3,文档仍然相当简短,但该软件包已经不仅仅是可用的了。

它提供对 Keras 层的访问,例如 TokenAndPositionEmbedding, TransformerEncoderTransformerDecoder,这使得构建定制变压器比以往任何时候都容易。

要在我们的项目中使用 KerasNLP,您可以通过以下方式安装它 pip:

$ pip install keras_nlp

导入项目后,您可以使用任何 keras_nlp 层作为标准的 Keras 层。

符号化

计算机处理数字。 我们用语言表达我们的想法。 为了让计算机处理它们,我们必须以某种形式将单词映射到数字。

一种常见的方法是简单地将单词映射到数字,其中每个整数代表一个单词。 词库创建一个词汇表,词汇表中的每个词都有一个索引。 因此,您可以将单词序列转换为称为索引的序列 令牌:

def tokenize(sequence):
    
    return tokenized_sequence

sequence = ['I', 'am', 'Wall-E']
sequence = tokenize(sequence)
print(sequence) 

然后可以将这个标记序列嵌入到一个密集向量中,该向量定义了潜在空间中的标记:

[[4], [26], [472]] -> [[0.5, 0.25], [0.73, 0.2], [0.1, -0.75]]

这通常是通过 Embedding Keras 中的层。 变形金刚不仅仅使用标准进行编码 Embedding 层。 他们表演 EmbeddingPositionEmbedding,并将它们加在一起,通过它们在潜在空间中的位置来替换常规嵌入。

使用 KerasNLP – 执行 TokenAndPositionEmbedding 结合了常规令牌嵌入(Embedding) 与位置嵌入 (PositionEmbedding).

位置嵌入

让我们来看看 PositionEmbedding 第一的。 它接受张量和参差不齐的张量,并假设最终维度代表特征,而倒数第二个维度代表序列。

# Seq
(5, 10)
     # Features

该层接受一个 sequence_length 参数,表示输入和输出序列的长度。 让我们继续在位置上嵌入一个随机均匀张量:

seq_length = 5
input_data = tf.random.uniform(shape=[5, 10])

input_tensor = keras.Input(shape=[None, 5, 10])
output = keras_nlp.layers.PositionEmbedding(sequence_length=seq_length)(input_tensor)
model = keras.Model(inputs=input_tensor, outputs=output)
    
model(input_data)

结果是:

<tf.Tensor: shape=(5, 10), dtype=float32, numpy=
array([[ 0.23758471, -0.16798696, -0.15070847,  0.208067  , -0.5123104 ,
        -0.36670157,  0.27487397,  0.14939266,  0.23843127, -0.23328197],
       [-0.51353353, -0.4293166 , -0.30189738, -0.140344  , -0.15444171,
        -0.27691704,  0.14078277, -0.22552207, -0.5952263 , -0.5982155 ],
       [-0.265581  , -0.12168896,  0.46075982,  0.61768025, -0.36352775,
        -0.14212841, -0.26831496, -0.34448475,  0.4418767 ,  0.05758983],
       [-0.46500492, -0.19256318, -0.23447984,  0.17891657, -0.01812166,
        -0.58293337, -0.36404118,  0.54269964,  0.3727749 ,  0.33238482],
       [-0.2965023 , -0.3390794 ,  0.4949159 ,  0.32005525,  0.02882379,
        -0.15913549,  0.27996767,  0.4387421 , -0.09119213,  0.1294356 ]],
      dtype=float32)>

令牌和位置嵌入

令牌和位置嵌入归结为使用 Embedding 在输入序列上, PositionEmbedding 在嵌入的标记上,然后将这两个结果加在一起,有效地替换空间中的标记嵌入以编码它们相对有意义的关系。

这在技术上可以这样做:

seq_length = 10
vocab_size = 25
embed_dim = 10

input_data = tf.random.uniform(shape=[5, 10])

input_tensor = keras.Input(shape=[None, 5, 10])
embedding = keras.layers.Embedding(vocab_size, embed_dim)(input_tensor)
position = keras_nlp.layers.PositionEmbedding(seq_length)(embedding)
output = keras.layers.add([embedding, position])
model = keras.Model(inputs=input_tensor, outputs=output)
    
model(input_data).shape 

输入被嵌入,然后位置嵌入,然后它们被添加在一起,产生一个新的位置嵌入形状。 或者,您可以利用 TokenAndPositionEmbedding 层,它在引擎盖下执行此操作:

查看我们的 Git 学习实践指南,其中包含最佳实践、行业认可的标准以及随附的备忘单。 停止谷歌搜索 Git 命令,实际上 学习 它!

... 
def call(self, inputs):
        embedded_tokens = self.token_embedding(inputs)
        embedded_positions = self.position_embedding(embedded_tokens)
        outputs = embedded_tokens + embedded_positions
        return outputs

这使得执行起来更干净 TokenAndPositionEmbedding:

seq_length = 10
vocab_size = 25
embed_dim = 10

input_data = tf.random.uniform(shape=[5, 10])

input_tensor = keras.Input(shape=[None, 5, 10])
output = keras_nlp.layers.TokenAndPositionEmbedding(vocabulary_size=vocab_size, 
                                                     sequence_length=seq_length, 
                                                     embedding_dim=embed_dim)(input_tensor)
model = keras.Model(inputs=input_tensor, outputs=output)
    
model(input_data).shape 

我们传递到层中的数据现在在位置上嵌入到 10 维的潜在空间中:

model(input_data)
<tf.Tensor: shape=(5, 10, 10), dtype=float32, numpy=
array([[[-0.01695484,  0.7656435 , -0.84340465,  0.50211895,
         -0.3162892 ,  0.16375223, -0.3774369 , -0.10028353,
         -0.00136751, -0.14690581],
        [-0.05646318,  0.00225556, -0.7745967 ,  0.5233861 ,
         -0.22601983,  0.07024342,  0.0905793 , -0.46133494,
         -0.30130145,  0.451248  ],
         ...

走得更远——手持式端到端项目

你好奇的天性让你想走得更远? 我们建议查看我们的 指导项目: “使用 CNN 进行图像字幕和使用 Keras 进行变形金刚”.

在这个指导项目中,您将学习如何构建图像字幕模型,该模型接受图像作为输入并生成文本字幕作为输出。

您将学习如何:

  • 预处理文本
  • 轻松矢量化文本输入
  • tf.data API 和构建高性能数据集
  • 使用 TensorFlow/Keras 和 KerasNLP 从头开始​​构建 Transformers - Keras 的官方横向补充,用于构建最先进的 NLP 模型
  • 构建混合架构,其中一个网络的输出为另一个网络编码

我们如何构建图像字幕? 大多数人认为它是生成式深度学习的一个例子,因为我们正在教一个网络来生成描述。 但是,我喜欢将其视为神经机器翻译的一个实例——我们正在将图像的视觉特征翻译成文字。 通过翻译,我们正在生成该图像的新表示,而不仅仅是生成新的含义。 将其视为翻译,并且仅通过扩展生成,以不同的方式界定任务范围,并使其更加直观。

将问题定义为翻译问题可以更容易地确定我们将要使用哪种架构。 仅编码器的 Transformer 非常擅长理解文本(情感分析、分类等),因为编码器对有意义的表示进行编码。 仅解码器模型非常适合生成(例如 GPT-3),因为解码器能够将有意义的表示推断到具有相同含义的另一个序列中。 翻译通常由编码器-解码器架构完成,其中编码器对句子(或图像,在我们的例子中)的有意义的表示进行编码,而解码器学习将这个序列转换为对我们来说更易于解释的另一种有意义的表示(例如句子)。

结论

自 2017 年以来,Transformers 掀起了一股浪潮,许多出色的指南都提供了有关它们如何工作的见解,但是,由于自定义实现的开销,它们对许多人来说仍然难以捉摸。 KerasNLP 解决了这个问题,提供构建块让您构建灵活、强大的 NLP 系统,而不是提供预先打包的解决方案。

在本指南中,我们了解了使用 Keras 和 KerasNLP 进行标记和位置嵌入。

时间戳记:

更多来自 堆栈滥用