解密LLMs:从头开始用Python创建Transformer编码器和多头注意力层
探秘LLMs:用Python从零开始构建Transformer编码器和多头注意力层
探索大型语言模型中编码器、多头注意力和位置编码的复杂性
本文由Rafael Nardi共同撰写。
简介
如今,计算自然语言处理(NLP)是一个快速发展的领域,其中计算的力量与语言学相结合。其中语言学方面主要归功于John Rupert Firth的分散语义理论。他曾经说过以下话:
“你可以通过它的伙伴认识一个词”
因此,一个词的语义表达是由它所使用的上下文决定的。正是根据这个假设,Ashish Vaswani等人的论文“注意力就是你所需要的”[1] 才具有了突破性的重要性。它将Transformer架构设定为许多迅速增长的工具(如BERT、GPT4、Llama等)的核心。
在本文中,我们将研究Transformer架构中编码器部分的关键数学操作。
![图1:自注意力是复杂的(作者提供的图像)](https://ai.miximages.com/miro.medium.com/v2/resize:fit:640/format:webp/1*YeXHeZ6NufKf2YbnWDXt5Q.png)
和往常一样,我们的GitHub上可以找到代码。
分词、嵌入和向量空间
在处理NLP问题时,我们首先要面对的任务是如何将一个句子中包含的信息编码成机器可以处理的形式。机器只能处理数字,这意味着单词、它们的意义、标点等必须被转化为数字表示。这就是嵌入的问题。
在深入讨论嵌入是什么之前,我们需要进行一个中间步骤,即讨论分词。在这里,词块或者词块的组成部分被定义为基本的构建模块(所谓的词块),稍后将被表示为数字。一个重要的注意事项是,我们不能用一个单一的数字来描述一个词或者词块,因此我们使用数字的列表(向量)。这给了我们更大的表达能力。