用初中数学理解LLM工作原理

3e5aad2986445e7814561d2c62dbb09d.png

本文将从基础开始讨论大语言模型(LLM)的工作原理——假设你只知道如何对两个数字进行加法和乘法。

首先,作者Rohit Patel会从构建一个简单的生成式人工智能出发,逐步阐释理解现代LLM和Transformer架构所需的所有知识。本文将剔除机器学习中所有花哨语言和术语,将一切简单地表示为数字。

(本文作者Rohit Patel是Meta的数据科学家。本文由OneFlow编译发布,转载请联系授权。原文:https://towardsdatascience.com/understanding-llms-from-scratch-using-middle-school-math-e602d27ec876)

作者 | Rohit Patel
翻译|张雪聃、林心宇、刘乾裕

OneFlow编译

题图由SiliconCloud平台生成

本文主要内容:

1. 一个简单的神经网络

2. 这些模型是如何训练的?

3. 这一切是如何生成语言的?

4. 是什么使得LLM如此有效?

5. 嵌入

6. 子词分词器

7. 自注意力

8. Softmax

9. 残差连接

10. 层归一化

11. Dropout

12. 多头注意力

13. 位置信息嵌入

14. GPT架构

15. Transformer架构

1

一个简单的神经网络

首先,需要注意的是,神经网络只能接受数字作为输入,并只能输出数字,毫无例外。关键在于如何将输入以数字的形式表示,并以实现目标所需的方式解释输出的数字。

然后,构建神经网络,使其能够接收你提供的输入并给出你想要的输出(基于你选择的输出解释)。让我们看看如何从加法和乘法走向像Llama 3.1(https://ai.meta.com/blog/meta-llama-3-1/)这样的模型。

我们构建一个用于对物体进行分类的简单神经网络:

  • 可用的物体数据:颜色(RGB)和体积(毫升)

  • 分类为:叶子或花

以下是叶子和向日葵的数据示例:

9b28d95629cda75c42bcdc77190a5e24.png

现在,我们构建一个神经网络来进行分类。我们需要确定输入和输出的物理意义。我们的输入已经是数字,因此可以直接输入到网络中。我们的输出是两个物体,叶子和花,神经网络无法直接输出。我们可以考虑几种方案:
 

  • 我们可以让网络输出一个数字。如果这个数字是正数,我们就说它是叶子;如果是负数,我们就说它是花。

  • 或者,我们可以让网络输出两个数字。我们将第一个数字解释为叶子的数字,第二个数字解释为花的数字,然后选择较大数字对应的物体作为分类结果。

这两种方案都允许网络输出数字,我们可以将其解释为叶子或花。我们在这里选择第二种方案,因为它在我们后面要看的其他任务中也适用。以下是使用该方案进行分类的神经网络。我们来分析一下:

be76076f1fa721198c0de5d12b73a747.png

蓝色圆圈的计算方式如下:(32 * 0.10)+(107 * -0.29)+(56 * -0.07)+(11.2 * 0.46)= -26.6

术语:

神经元/节点:圆圈中的数字

权重:线条上的彩色数字

:一组神经元称为一层。可以认为该网络有3层:输入层有4个神经元,中间层有3个神经元,输出层有2个神经元。

要计算该网络的预测/输出(即“前向传播”),需从最左侧开始,在输入层中有原始的数据,要“向前”移动到下一个层,需要将上一层特定神经元圆圈中的数字与下一层配对神经元连边上的权重相乘,然后将汇聚到同一个神经元的所有连边产生的乘积加和。在上面的例子中,我们演示了蓝色圆圈的计算。运行整个网络,我们发现输出层的第一个数字更高,因此我们将其解释为“网络将这些(RGB,Vol)值分类为叶子”。经过良好训练的网络可以接受各种(RGB,Vol)的输入,并正确分类物体。

模型并不知道什么是叶子或花,或(RGB,Vol)是什么。它的任务是接收确切的4个数字并输出确切的2个数字。我们将这4个输入数字解释为(RGB,Vol),同时查看输出数字并推断如果第一个数字更大则为叶子,反之则为花。当然,我们需要选择合适的连边权重,以便模型能够接收我们的输入数字并给出正确的两个数字,使得我们解释时能得到想要的结果。

一个有趣的副作用是,对上面这个网络,不是输入RGB和体积,而是输入其他4个数字,如云层覆盖、湿度等,并将两个数字解释为“一个小时内晴天”或“一个小时内下雨”,如果将权重校准良好,便可以让同一个网络同时完成两项任务——分类叶子/花和预测一个小时内的降雨!网络只给出两个数字,无论将其解释为分类、预测还是其他东西,都完全取决于你。

为简化起见而省略的内容(可忽略,不影响理解):

  • 激活层:该网络中缺少一个关键的东西,即“激活层”。这是一个花哨的词,可以对每个圆圈中的数字施加非线性变换(RELU是一种常见的激活函数,只需将负数设置为零,正数保持不变)。因此在我们上面的例子中,我们会将中间层的两个数字(-26.6和-47.1)替换为零,然后再继续到下一层。当然,我们必须重新训练权重,使网络再次有效。没有激活层,网络中的所有加法和乘法都可以压缩成一个等价的单层网络(注:连续的矩阵乘等的结果还是一个矩阵)。在我们的例子中,你可以直接将绿色圆圈写成RGB的加权和,而不需要中间层。它的形式为(0.10 * -0.17 + 0.12 * 0.39–0.36 * 0.1)* R + (-0.29 * -0.17–0.05 * 0.39–0.21 * 0.1)* G ……依此类推。如果我们在其中引入非线性,多层网络就不能用一个等价的单层网络来简化了。这有助于网络处理更复杂的情况。

  • 偏置:网络通常还会包含与每个节点相关的另一个数字,该数字简单地加到计算节点值时的乘积上,这个数字称为“偏置”。因此,如果顶层蓝色节点的偏置为0.25,则节点中的值为:(32 * 0.10)+(107 * -0.29)+(56 * -0.07)+(11.2 * 0.46)+ 0.25 = -26.35。术语“参数”用来指代权重和偏置,也就是模型中所有不属于神经元/节点的数字。

  • Softmax:我们通常不会直接将输出层解释为模型所示的样子。我们将这些数字转换为概率(即,使所有数字为正数并相加为1)。如果输出层中的所有数字已经是正数,可以通过将每个数字除以输出层中所有数字的和来实现。然而,通常使用“softmax”函数可以处理正数和负数。

2

这些模型是如何训练的?

在上面的例子中,我们神奇地得到了能够将数据输入模型并得到良好输出的权重。那么,这些权重是如何确定的呢?设置这些权重(或“参数”)的过程称为“训练模型”,我们需要一些训练数据来训练模型。

假设我们有一些数据,已知每个输入对应的是叶子或花,这就是我们的“训练数据”,由于我们为每组(R,G,B,Vol)数字提供了叶子/花的标签,这就是“标注数据”。

具体过程如下:

  • 从随机数开始,即将每个参数/权重设置为随机数。

  • 现在,我们给了一个对应于叶子的输入(R=32, G=107, B=56, Vol=11.2),我们希望输出层中叶子的数值更大。我们设想叶子对应的数值为0.8,花对应的数值为0.2(如上例所示,但这些是示范性的数字,实际上我们不想要0.8和0.2。在现实中,这些应为概率,实际上并非如此,我们希望它们为1和0)。

  • 我们知道想要的输出层数值,以及从随机选择的参数得到的数值(这些与我们想要的不同)。因此,对于输出层中的所有神经元,我们计算想要的数值与实际数值之间的差值,然后将所有差值相加。例如,如果输出层的两个神经元为0.6和0.4,那么我们得到:(0.8–0.6)=0.2和(0.2–0.4)= -0.2,总共为0.4(忽略负号再相加)。我们可以称之为“损失”。理想情况下,我们希望损失接近于零,即希望“最小化损失”。

  • 一旦有了损失,我们可以轻微调整每个参数,以查看增加或减小它是否会增加或减小损失(称为移动权重)。这称为该参数的“梯度”。然后我们可以将每个参数按小幅度移动到损失降低的方向(梯度的方向)。一旦所有参数都轻微移动,损失应该会降低。

  • 不断重复这个过程,将减少损失,最终得到一组“训练”好的权重/参数。这个过程被称为“梯度下降”。

几点注意事项:

  • 通常会有多个训练样本,因此在一个样本中微调权重以最小化损失可能会导致另一个样本的损失变得更糟。处理这种情况的方法是将损失定义为所有样本的平均损失,然后对该平均损失进行梯度计算。这会减少整个训练数据集的平均损失。每

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值