关于大模型你需要知道的

by Teobler on 02 / 04 / 2024

views

前言

过去一年里可能大部分人的情绪经历了一个个 “兴奋 - 惶恐 - 失望 - 理性 - 兴奋” 的轮回,甚至于这样的情绪反复发生了好几次,而每一次都是因为发布了一个可能之前从未出现过的 AI 产品。

而当一个行业的信息更新以周为单位在迭代时,我的情绪还夹杂这一丝懒惰和纠结

  • 怎么上个星期才看的东西这个星期就不行了
  • 不看了不看了,稳定了再看
  • 不行,不看后面看不懂了,还是看点上手玩玩
  • 要不还是不看了
  • ......

a_decadent_person

但是不知不觉已经过去了一年多了,发现零零散散在脑子里还是有很多东西。最近结束了休整期,感觉是时候克服以下懒癌,把好久前断更的博客捡起来。一是保持下 blogger 的人设,二是写东西确实能帮助自己理清一些东西。

于是下定决定开启这个入门 AI Agent 的系列,我将从简单的原理开始从头理解大模型,然后慢慢到代码层面如何动手开始创造你的第一个 AI Agent。由于我不是一个研究员,我本质上还是一个臭写代码的。所以原理部分我会点到为止,学到我认为不妨碍我理解代码即可。当然也可能理解有误学歪了,欢迎帮我指正。

如果你是想试试 Agent 的开发但不知道怎么下手,或者你也在一直关注 GenAI 的发展但是总觉得自己遗漏了东西,那这个系列的文章将会非常适合你。至于这个坑啥时候能填完,只能说慢慢来🐶话不多说,开整。

大语言模型与预训练模型

这两个词的出现离不开 ChatGPT 的爆火,首先结论是大语言模型就是一种预训练模型。

不过不同于传统的预训练模型,大语言模型通常参数量和用于训练的文本数据量巨大,这使得大语言模型相较于传统预训练模型来说能够胜任多任务,传统预训练模型通常来说是针对某一个领域的特定任务进行训练的。而这个任务大多时候是做标记

但也正是因为这些原因,大模型的预训练需要大量的计算资源来支撑其训练和推理,这又直接将英伟达这样的卖铲子的显卡厂商送上了神坛。(至于你问为啥 CPU 不行?没了解,不知道🐶)

那既然预训练模型已经存在这么久了,为啥它没能出现在大众视野里,大模型却能爆火呢?主要还是它不够“智能”。人工智能有一句调侃的话叫作有多少人工就有多少智能,这是因为传统的模型需要人工标注数据,需要人类告诉它这是哪一类数据,这样它才能知道类似的数据,这不仅低效,还导致它只能处理类似的同一批数据,这就意味着这样的模型只能处理单类问题。有点像功能机,只能打电话发短信。

而大模型由于能够实现自我标注(当然这不是大模型解决的问题,是无监督学习解决的,我们不在此展开),并且训练数据广泛,数据量巨大,使得它能够处理多种多样的任务并具备一定的推理能力,能够举一反三

神经网络与参数

细心的你可能发现,当人们讨论一个模型是不是足够时,除了说它用了多少多少数据来进行训练。还会提到这个模型的参数,比如 llama2 有 7B、13B、70B 三个型号,这里的 B 是英文 Billion 的缩写,它们分别表示这个模型具有 70亿、130亿、700亿参数。

那不知道你有没有想过这里的参数代表什么意思,它好像也不支持直接问一个70亿长度的问题呀?要聊清楚参数,又得从神经网络说起。

首先我们将目光放在整个神经网络层面来看

neuron_network

想象一下,你的大脑就像一个由许多小工作站组成的大工厂。每个工作站都能处理一些信息,并且它们之间通过道路(神经突触)相连。当你看到、听到或感觉到什么时,这些信息就会通过这些工作站传递,每个工作站都会对信息进行一些处理,最终形成你的思考、记忆和感知。

神经网络正是受到这种大脑工作方式的启发而设计的。它是由许多“神经元”(类似于大脑的工作站)组成的网络,每个神经元都能接收输入、进行计算并输出结果。这些神经元通过“连接”(类似于神经突触)相互传递信息。

在神经网络中,信息的传递遵循一定的规则。每个神经元接收来自前一层神经元的输入,然后根据这些输入计算出一个输出值,并将这个值传递给下一层的神经元。这个过程会一直重复,直到最后一层的神经元输出最终结果。

在训练一个模型时,为了让一个初始化的神经网络更好地学习和处理信息,我们会给它一些“训练数据”。通过这些数据,神经网络可以不断调整神经元之间的连接强度(称为权重),来决定下一个神经元有多“重视”上一个神经元的输出。

然后我们将目光聚焦到单个神经元上来

neuron

这里出现了一个新的词语 - 权重。我们先将它搞明白,它的作用可以理解为:

  1. 放大或缩小输入信号:权重的数值决定了前一层神经元的输出信号在传递给当前神经元时是被放大还是缩小。如果权重值较大,那么这个输入信号的影响力就增强;如果权重值较小,影响力就减弱。
  2. 调整神经元激活程度:每个神经元都有一个激活函数,它决定了该神经元是否以及如何对输入信号做出反应。权重的调整实际上是在影响激活函数的输入值,从而影响神经元是否应该被激活(即输出一个较大的信号)。
  3. 学习特征的组合:在神经网络中,每个神经元可以被看作是在学习输入数据中不同特征的组合。权重的学习过程就是找到最佳的特征组合方式,使得神经网络能够有效地识别或分类输入数据。

举个例子,假设我们正在处理图像识别任务,神经网络的某一层正在学习识别图像中的边缘。如果一个神经元专门负责检测垂直边缘,那么与这个神经元相连的权重就会调整为能够最大化该神经元对垂直边缘图像片段的响应。这样,当输入图像中出现垂直边缘时,这个神经元的激活程度会很高,从而对网络的最终决策产生较大影响。

权重不仅仅是影响处理的某一个方面,而是通过调整前一层神经元输出对当前神经元的影响,来优化整个神经网络对输入数据的识别和分类能力。

而权重就是我们提到的参数之一

在神经网络中,每个神经元接收到的输入实际上是上一层神经元的输出值与相应的权重相乘的结果。这个过程可以看作是以下几个主要步骤:

  1. 接收输入:每个神经元从上一层的神经元那里收集输出值。这些输出值可以看作是前一层神经元处理过的信息。
  2. 加权求和:每个神经元将其接收到的所有输入值与对应的权重相乘,然后将这些乘积加在一起。这个加权求和的过程实际上是在计算一个综合的输入信号,它反映了不同输入对于当前神经元的重要性。
  3. 增加偏置项:这个加权求和的结果,再加上一个偏置项(bias),偏置是加在每个神经元输出上的一个常数,用于提供额外的灵活性,帮助模型更好地拟合数据。
  4. 输入激活函数:上述结果就构成了当前神经元的净输入。然后,这个净输入会通过一个激活函数进行处理,产生最终的输出值,这个输出值随后会成为下一层神经元的输入。

通过这种方式,神经网络能够逐层传递和转换信息,最终完成对输入数据的识别、分类或其他形式的处理。而权重的调整,是神经网络学习过程中的关键部分,它使得网络能够适应不同的任务和数据集。

所以简单来说参数可以不恰当的总结成上一层的输入权重偏置项以及激活函数

最后我们将目光放大些许,放到两个神经元的连接上来

two_neurons

到这里我们已经明白了神经网络大概的处理流程,那么神经元之间是怎么连接的呢?是上一层的每一个神经元都无脑连接下一层每一个神经元吗?当然不是,神经元之间如何连接,取决于以下几个因素:

  1. 网络架构:神经网络的设计者会根据特定任务的需求来确定网络的架构,包括层数、每层的神经元数量以及神经元之间的连接方式。这些设计决策直接影响了信息如何在网络中流动。
  2. 连接模式:在全连接网络(Fully Connected Network)中,上一层的每个神经元都会与下一层的所有神经元相连。这意味着,上一层中某个神经元的输出会作为输入传递给下一层的每一个神经元。而在卷积神经网络(Convolutional Neural Networks, CNNs)中,连接模式可能是局部的,神经元只与上一层的局部区域相连。
  3. 权重分配:在神经网络初始化时,每个神经元之间的连接(权重)会被赋予初始值。在训练过程中,这些权重会根据损失函数和反向传播算法进行调整,以最小化预测误差。权重的值决定了上一层输出对下一层神经元的影响程度。也决定了某些神经元是否会断连。

到这你基本上已经了解了关于大模型的一些基础知识了,包括神经网络参数指的是什么东西了。所以你也能理解当人们描述一个模型参数很大时,往往意味着这个模型得有足够的神经元来接收这些参数,也就意味着这个模型可能拥有更多的神经网络层数和每层更多的神经元。