无任何数学公式理解大模型基本原理
前言
为什么我们使用chatgpt问一个问题,回答时,他是一个字或者一个词一个词的蹦出来,感觉是有个人在输入,显得很高级,其实这这一个词一个词蹦不是为了高级感,而是他的实现原理决定的,下面我们看下为什么是一个一个蹦出来的
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19t78wJG617mHFfs6Q.png)
大模型的本质
特斯拉前AI总监Andrej Karpathy将大语言模型简单的描述为: 大模型的本质就是两个文件,一个是参数文件,一个是包含运行这些参数的代码文件。
参数文件是组成整个神经网络的权重,代码文件是用来运行这个神经网络的代码,可以是C或者其他任何编程语言写的,当然目前主要都是Python
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19f6yalzJLhGiivBD.png)
那么接下来的问题就是:参数从哪里来?
这就引到了模型训练。
本质上来说,大模型训练就是对互联网数据进行有损压缩(大约10TB文本),需要一个巨大的GPU集群来完成。
以700亿参数的Llama 2(Facebook开源的羊驼大模型)为例,就需要6000块GPU,然后花上12天得到一个大约140GB的“压缩文件”,整个过程耗费大约200万美元。
而有了“压缩文件”,模型就等于靠这些数据对世界形成了理解。
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19ie7PZKhAHOcm84V.png)
大模型是如何工作的
简单来说,大模型的工作原理就是依靠这些压缩数据的神经网络对所给序列中的下一个单词进行预测。
比如我们问将“中 华 人民 ”输入进去后,请大模型补充完整,可以想象是分散在整个网络中的十亿、上百亿参数依靠神经元相互连接,顺着这种连接就找到了下一个连接的词,然后给出概率,比如“共和国(97%)”,就形成了“中华人民共和国”的完整句子。然后继续将“中华人民共和国”作为输入,继续依·靠神经元相互连接,顺着这种连接就找到了下一个连接的词,然后给出概率,比如“中华人民共和国 成立于1949年(98%)”.
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19XdbCHH9bPqsDaGQ.jpg)
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19zziyT8Do0OSOIsM.png)
根据维基百科我们可以看到中华人民共和国出现了571次,概率非常大,实际上大模型就是对给出序列的下一个词的概率预测
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19srltrd17TR6wuwGO.png)
这就是为什么我们刚才讲大语言模型都是一个词一个词的蹦了,你可以理解大模型就是一个很牛逼的成语接龙大师
那么大模型又是如何训练,并预测下一个词的呢?
神经网络
看到“神经网络”几个字就觉得复杂了不往下看了,别紧张,一点都不复杂,让我们继续看。
历史上,科学家一直希望模拟人的大脑,造出可以思考的机器。人为什么能够思考?科学家发现,原因在于人体的神经网络。
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19rmbQVfF19Qs0JaIs.png)
感知器
最简单的神经网络“感知器”,早在1957年就被发明,并使用了.直到今天还在用
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-18-21-1643SNMVa6zKU6dwd7.png)
上图的圆圈就代表一个感知器。它接受多个输入(x1,x2,x3...),产生一个输出(output),好比神经末梢感受各种外部环境的变化,最后产生电信号。
为了简化模型,我们约定每种输入只有两种可能:1 或 0。如果所有输入都是1,表示各种条件都成立,输出就是1;如果所有输入都是0,表示条件都不成立,输出就是0。
下面来看一个例子。最近刚上映一部好莱坞大片,张三拿不定主意。周末要不要去看电影.
决定他要不要去看电影有三个因素(特征)。
这就构成一个感知器。上面三个因素就是外部输入,最后的决定就是感知器的输出。如果三个因素都是 Yes(使用1
表示),输出就是1(去看电影);如果都是 No(使用0
表示),输出就是0(不去看电影)。
权重和阈值
那么:如果某些因素成立,另一些因素不成立,输出是什么?比如,周末是好天气,票价也不贵,但是张三找不到女朋友,他还会不会去看电影呢?
现实中,各种因素很少具有同等重要性:某些因素是决定性因素,另一些因素是次要因素。因此,可以给这些因素指定权重(weight),代表它们不同的重要性。
上面的权重表示,天气是决定性因素,女朋友和价格都是次要因素。
如果三个因素都为1,它们乘以权重的总和就是 8 + 4 + 4 = 16。
如果天气和价格因素为1,女朋友因素为0,总和就变为 8 + 0 + 4 = 12。
这时,还需要指定一个阈值(threshold)。如果总和大于阈值,感知器输出1,否则输出0。假定阈值为8,那么 12 > 8,小明决定去看电影。阈值的高低代表了意愿的强烈,阈值越低就表示越想去,越高就越不想去。
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19wHJM7iQNOWd6HOS.png)
这就是一个包含了输入层、隐藏层、输出层、权重的一个非常简单的神经网络例子。当然实际场景会比这个更复杂,对于神经网络小白来说,已有了一个感性的认识.
上面图中的连接是神经元中最重要的东西。每一个连接上都有一个权重。
上面我们自定义了几个因素的权重
但是实际情况,这个权重我们只是初始化了一个值,通过大量的数据进行训练,然后不断的调整得到的权重值.例如随机利用1万人的习惯数据,他们是否都是天气好的时候去看电影,没女朋友的时候不去看电影等等.这个权重值就是经过训练不断更新得到的.这样就可以预测张三会不会去看电影
这就是一个简单的神经网络,一个神经网络的训练过程就是让权重的值调整到最佳,以使得整个网络的预测效果最好。最终的训练结果可能是“女朋友”这个权重占98,其他都是次要的
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19d19ddAhQspU6mJEB.png)
玩一玩神经网络
上面我们讲的都是一些简单的例子,下面我们看一个简单神经网络在线演示和实验的平台
TenforFlow Playground 又名 TensorFlow 游乐场,是一个用来图形化教学的简单神经网络在线演示和实验的平台,非常强大且极其易用。如果您已经有一部分神经网络知识,使用此工具,可以快速体验一个算法工程师的调参工作。
在线体验地址: http://playground.tensorflow.org/
开源github地址:https://github.com/tensorflow/playground
下图可简单理解为,正在训练1万人,以天气、价格、女朋友这三个特征,进行训练,判断什么情况下会,人们会去看电影、什么情况下不会去看电影
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19Uv19V6R6ewE7r7OX.png)
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19PWYwPd8gp4GxJYP.png)
上图标明了该页面上每个部分的含义,刚开始不用全部都理解,感兴趣再去研究每部分都是干嘛的,下面列了理解该页面的一些解释。
一些名词解释
特别注意:不是学习的越精准、越没瑕疵越好,过度拟合或导致误判
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19lt6jSudsOd6pHcC.png)
神经网络的学习过程本质上就是在学习数据的分布
Transformer架构(深度学习模型)
有了上面的感性理解后,让我们稍微加一点点难度,理解一下Transformer架构。
目前绝大多数的开源大模型都是基于Transformer架构的。Transformer架构自2017年由Vaswani等人在论文《Attention is All You Need》中提出以来,迅速成为自然语言处理(NLP)领域的主流架构,广泛应用于各种任务,如机器翻译、文本生成、问答系统等等。Transformer模型的核心创新是自注意力机制(Self-Attention Mechanism),这使得模型能够在处理序列数据时,有效地捕捉序列内各元素之间的关系,无论它们在序列中的位置如何远近。
1、向量、矩阵
讲Transformer之前,先回忆一下高中知识:向量、矩阵
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19dRTYgW6og9etaQl.png)
向量相加得到另一个向量,可以理解为两条向量一共走了多少路径,的直线距离
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19RPTvYXlAyQL669Z.png)
向量相乘,可以看成向量B在向量A的垂线上的正射投影和向量A的长度的乘积
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-197cNg0jpWgPgDIho.jpg)
矩阵其实就是多维向量组,如图就是3个向量组成的1个矩阵
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19hY6HuPTBSc6HoS6.png)
矩阵相乘,请查看动画演示
http://matrixmultiplication.xyz/
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19RfBdEmgESw7IxSR.png)
感兴趣并想深入研究的同学,可以自行温习一下向量、向量的加、乘法、三角函数、矩阵、线性代数等基础知识。有以上几张图的基本理解就完全足够理解下面我们即将要讲的大模型核心架构Transformer了。
2、Transformer架构图
下图就是一个Transformer的架构图,现在让我们看Transformer时如何实现训练的
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19fSVs8qJjTTohUzB.jpg)
从下往上大致分为这样一个流程,样本文字转数字向量--->增加位置信息--->自身的语义关系学习---->数字缩放(归一化)---->输出概率---->对应的文字。下面让我们逐一的来看每一层都做了什么。
3、训练文字的token化与嵌入向量
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19eCQasNZo7jnBSe4.png)
对输入的文本进行token的数字转换,每个字对应一个从编码库中标记出来的一个token向量.得到一个4行x64列的这么一个矩阵,每一行代表了1个token(1个token其实就是一个向量,chatgpt按token收费,其中的token就是这个意思),每列代表了这个token在不同语义下的1个数字
是如何标记的呢,实际上是通过一张超级大的编码字典表中查找到的.
目前常用的是openai开源的向量查找表库tiktoken
https://github.com/openai/tiktoken
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-199bq6vQBVToWBNOF.png)
为什么有多列呢?因为每个字可能存在多种意思,例如“思”字, 你是什么意思?我没什么意思,就是意思意思,每个思字是不同含义的.
4、位置信息编码
经过token化和嵌入向量得到的数据矩阵还不能给模型训练.
例如,张麻子正在打李麻子,这句话中,通过token化嵌入向量后,不明确“麻子”这个词指代的是哪个麻子,所以需要进行位置编码,需要让我们在训练的过程中即知道token、又知道语义,还需知道位置,怎么引入位置呢?
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19eH8mMlaWADZwhb6.png)
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-196YTGktT19bbzZW6V.png)
当添加位置信息编码时,不可能像咱们现在这样,每个位置的编码是整数顺序大小的,我们这里只有“中华人民”四个字,所以是1、2、3、4的位置编码,如果我们有1万字,位置编码就会很大,导致向量比较分散,如何解决呢?
sin,cos正好可以拿来做位置编码,因为正弦、余弦的值永远都在-1~1之间
奇数位置:sin(f(x))
偶数位置:cos(f(x))
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19iMiNFaALf9l8LWR.png)
token矩阵与位置编码矩阵相加,得到的矩阵就可以丢给模型去训练了
5、自注意力机制
注意:这一小节是核心,这一小节是核心,这一小节是核心
汉字的序顺并不定一影阅响读
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-1948b246GgAHnzFJo.png)
例子:在处理句子"汉字的序顺并不定一影阅响读"时,自注意力层会帮助模型理解"序"和"顺"的关系。
想象一下,你正在一个聚会上,周围有很多人在聊天。你的大脑会自动地选择性地听某些人的话,这取决于你认为谁的话对当前的对话最重要或最有趣。也就是说,即便所有的声音都进入了你的耳朵,你的大脑还是会“关注”某些特定的声音或信息。这个过程,就有点像自注意力机制在做的事情。
在自然语言处理(NLP)中,当我们给模型输入一个句子,比如:“我爱吃苹果”,模型的目标可能是理解这个句子的意思,或者翻译成另一种语言。自注意力机制允许模型在处理每个词(比如“苹果”)时,不仅考虑这个词本身,还要考虑它与句子中其他词的关系。模型会“关注”句子中的每个词,然后根据这些词之间的关系来决定哪些词是更重要的。
自注意力机制会为句子中的每个词生成一个“权重”,这个权重反映了当前处理的词对句子中其他词的关注程度。比如,在处理“苹果”这个词时,模型可能会给“吃”这个词分配更高的权重,因为这两个词之间有直接的关系。通过这种方式,模型就可以更好地理解每个词在句子中的作用,进而更好地理解整个句子的意思。回到前面的句子“汉字的序顺并不定一影阅响读”,看下图,“顺”字跟句子中其他字之间都会生成一个关系权重,经过大量的训练,“顺”字对“序”字的权重最大。
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-199mx70d44TcNHHUC.png)
简单来说,自注意力就是模型在处理信息时,能够“自己决定”去关注哪些相关的信息,这样做可以帮助模型更好地理解和处理数据。
如何实现的呢?自注意力机制的核心思想是让每个输入元素(如一个词)能够关注到其他输入元素,从而捕捉到序列中的全局依赖关系。矩阵乘法在自注意力机制中起到了关键作用,使用矩阵相乘,找到位置相似的向量,即最终得到比较合理的权重值
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19VsftqO8xrIi0E0b.png)
矩阵相乘后,值越大说明词与词之间的关注度越高
大致的训练过程是这样的:“顺”字对“序”字的关注度,是在训练的过程中不断的调整向量坐标(权重),以达到最佳效果
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-26buFWAsx7IIUMOJE.png)
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-07-09-42WaPcCbhTiwGLfjf.gif)
自注意力层实际上做了两件事,1是计算词与词之间的关注度权重,同时加权求和后输出新的矩阵(预测出的词的得分矩阵)
计算词与词之间的关注度权重(Attention Scores):自注意力机制首先会计算序列中每个词对于其他所有词的关注度权重。这个过程通常涉及将输入序列的每个元素(例如,每个词)转换成三个向量:查询(Query)、键(Key)和值(Value),通过计算查询向量与键向量之间的相似度(通常是点积或某种归一化形式的点积),来得出这些权重。这些权重表明了序列中每个元素对其他元素的重要性程度。
加权求和后输出新的矩阵:一旦计算出关注度权重,自注意力机制会使用这些权重对值(Value)向量进行加权求和,以生成每个位置新的表示。这个过程实质上是根据每个元素对序列中其他元素的关注度,重新组合了原始信息。这样,输出的新矩阵中的每个元素都融合了整个序列的信息,反映了序列内部的复杂依赖关系。
6、 归一化注意力分数
归一化是一种将数据按照一定规则缩放到一个特定范围(通常是0到1之间或者是-1到1之间)的过程。这个过程可以帮助我们在处理数据时,减少数据之间因为量纲(单位大小)不同带来的影响,使得数据之间的比较或者计算更加公平和合理。同时提高训练速度和稳定性
归一化后的注意力分数可以被解释为概率,表示一个词关注另一个词的程度。
神经网络的学习过程本质上是在学习数据的分布,如果没有进行归一化的处理,那么每一批次的训练数据的分布是不一样的,
下图中,我们可以看到数据归一化后的效果。 原始值(蓝色)现在以零(红色)为中心。 这确保了所有特征值现在都处于相同的比例。
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19qyeqWPaugomKtCX.png)
例子说明归一化:
再举个简单的例子,假设一个班级里有5个学生参加了一次考试,分数分别是
学生A=90分
学生B=80分
学生C=70分
学生D=60分
学生E=50分
这个分数比较大,对于如果我们想将这些分数归一化到0到1之间,我们可以将每个学生的分数减去最低分50分,然后再除以最高分和最低分的差值,即40分(90-50)。这样,90分就变成了1((90-50)/40),50分就变成了0((50-50)/40),其他分数也会相应转换到0到1之间的某个值。这个过程就是归一化。通过归一化,我们可以更直观地看出每个学生的成绩在班级中的相对位置。
7、 前馈神经网络
通过以上步骤,输出的内容基本都是向量矩阵,都是线性的,并且每个词都是独立处理的,单词之间没有信息的交换,然而,前馈神经网络可以访问之前由头注意力复制的任何信息。前馈层由神经元组成,这些神经元是可以计算其输入加权和的数学函数。前馈层之所以强大,是因为它有大量的连接。例如,GPT-3 的前馈层要大得多:输出层有 12288 个神经元(对应模型的 12288 维词向量),隐藏层有 49152 个神经元。
自注意力机制:在这一步,每个词会观察周围的词,以找出与自己相关的上下文信息。
前馈神经网络:在这一步,每个词会根据自己收集到的上下文信息,进行信息的整合和处理。
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19lPACNgrJYTJ9ViZ.png)
在数学和物理学中,非线性是指任何不遵循加法原理(输出不是输入的直接倍数)或者乘法原理(系统的响应不是输入的简单线性组合)的现象。
8、 训练与推理
以上训练过程实际上就是我们文章开头提到的“大模型训练就是对互联网数据进行有损压缩”的有损压缩的过程。
其实上面我们只讲了大模型训练的过程,没有讲推理的过程,推理的过程跟训练的过程大致相同,相差就是训练的过程是沉淀结果,推理是直接计算完成之后输出,并沉淀结果。感兴趣的同学可以自己下来,我们网上经常看到的Transformer架构图如下,左边是输入,右边是输出,可以看出输入、输出的中间部分基本是相同的
我们可以简单理解左边部分时训练的过程、右边部分时推理的过程.时间关系,推理的过程咱们先不讲了,感兴趣的同学可以下去看看
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-06-06-16-19o6wV6WgsibAnCJ6.png)