当前位置: 首页 > article >正文

小白程序员也能看懂的大模型内部原理:从加减乘除到Llama 3.1(收藏版)

本文深入浅出地解析了大语言模型LLM的工作原理从基础的加减乘除运算开始逐步构建一个生成式AI并最终理解现代LLM和Transformer架构。文章剥去了机器学习领域的复杂术语将一切还原为数字帮助读者逐步掌握LLM的核心概念包括神经网络、训练过程、语言生成机制、LLM的优势、嵌入技术、子词分词器、自注意力机制、Softmax函数、残差连接、层归一化、Dropout、多头注意力、位置编码和GPT架构等。通过本文即使是初学者也能理解大模型的基本原理为深入学习LLM打下坚实基础。开始吧。首先要明确的是神经网络只能接受数字作为输入也只能输出数字。没有例外。艺术在于弄清楚怎么把你的输入转化为数字怎么解释输出的数字来达成你的目标以及怎么构建神经网络让它按照你选择的方式处理输入并给出你想要的输出给定你对输出的解释方式。我们来走一遍怎么从加减乘除走到 Llama 3.1[2] 这样的模型。1 简单的神经网络来走一遍做对象分类的简单神经网络可用的对象数据 主色RGB和体积毫升分类为 叶子 或 花叶子向日葵的数据大概长这样现在来构建做这个分类的神经网络。要确定输入输出的解释方式。我们的输入本身就是数字可以直接喂进网络。输出的是两个对象——叶子 or 花——神经网络没法直接输出这种东西。有两种方案可选让网络输出一个数字正数就说是叶子负数就说是花让网络输出两个数字第一个解释为叶子的分数第二个解释为花的分数然后选较大的那个两种方案都能让网络输出可以解释为叶子或花的数字。这里选第二个因为后面扩展起来更方便。这就是用这个方案做分类的神经网络来走一遍计算过程一些术语神经元/节点圆圈里的数字权重线上的彩色数字层神经元的集合称为一层。可以把这个网络看作有 3 层输入层 4 个神经元中间层 3 个神经元输出层 2 个神经元。计算预测/输出的过程叫前向传播从左边开始。输入层有可用的数据。要向前到下一层把圆圈里的数字和对应节点配对的权重相乘然后加起来。上面演示了蓝色和橙色圆圈的数学运算。跑完整个网络输出层第一个数字更大我们就解释为网络把这些RGB, Vol值分类为叶子。训练好的网络可以接受各种RGB, Vol输入并正确分类对象。模型本身不知道什么是叶子什么是花也不知道RGB, Vol是什么。它的任务就是接收恰好 4 个数字然后输出恰好 2 个数字。是我们解释这 4 个输入数字是RGB, Vol也是我们决定看输出数字然后推断第一个数更大就是叶子以此类推。最后选择合适的权重也是我们的事让模型把我们输入的数字处理成正确的两个数字这样我们的解释就能成立。有个有意思的副产品可以用同一个网络不喂 RGB, Vol而是喂其他 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 … 以此类推。如果有非线性函数就不是这样了。这帮助网络处理更复杂的情况。Bias偏置网络通常还会在每个节点关联一个数字简单地加到乘积上来计算节点值这个数字叫偏置。如果顶部蓝色节点的偏置是 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) 数字集都有叶子/花的标签这是标注数据。工作流程是这样的从随机数开始把每个参数/权重设成随机数然后假设我们输入叶子对应的数据 (R32, G107, B56, Vol11.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相加时忽略负号。这个叫损失。理想情况下希望损失接近零也就是要最小化损失。拿到损失后可以稍微改变每个参数看看增大或减小它会不会增加损失。这个叫该参数的梯度。然后把每个参数往损失下降的方向梯度的反方向移动一小步。所有参数都移动一点之后损失应该会降低。不断重复这个过程损失就会降低最终得到一组训练好的权重/参数。整个这个过程叫梯度下降。几点补充通常有多个训练样本改变一个例子的权重来最小化损失可能让另一个例子的损失变差。处理方法是定义损失为所有样本损失的平均值然后基于这个平均损失取梯度。每次这样的循环叫一个epoch。不断重复 epoch就能找到降低平均损失的权重。实际上不需要真的移动权重来计算每个权重的梯度——可以直接从公式推断出来比如如果上一步权重是 0.17神经元值是正的而我们想要输出层数字更大可以看出把这个数增大到 0.18 会有帮助。实际上训练深度网络是个hard且复杂的过程因为梯度在训练中很容易失控趋近于零或无穷叫梯度消失和梯度爆炸问题。这里讨论的损失定义完全有效但很少真的这么用因为有更好的针对特定目的的函数形式。现代模型有数十亿参数训练需要巨大算力也有自己的问题内存限制、并行化等。3 这些是怎么帮助生成语言的记住神经网络接收一些数字根据训练好的参数做数学运算然后输出一些其他数字。一切都是关于解释和训练参数即把它们设成某些数字。如果能把两个数字解释为叶子/花或一小时后下雨或晴天也就能把它们解释为句子里的下一个字符。但英文字母不止 2 个所以要把输出层的神经元数量扩展到比如英语字母表的 26 个字母再算上空格、句号等符号。每个神经元对应一个字符看输出层26 个或更多神经元里哪个数字最大就把这个字符作为输出字符。这样就有了一个能接收输入并输出字符的网络。如果把网络输入换成这些字符“Humpty Dumpt”让它输出一个字符并解释为网络对我们刚输入序列的下一个字符的建议。大概能调权重让输出y从而补全Humpty Dumpty。就一个问题怎么把字符序列输入网络网络只接受数字一个简单的解法是给每个字符分配一个数字。比如 a1, b2以此类推。现在可以输入humpty dumpt然后训练它输出y。网络大概长这样好了现在可以通过提供一串字符让网络预测一个字符了。可以利用这个事实构建整个句子。比如得到y预测之后把y加到已有字符列表末尾再喂给网络让它预测下一个字符。如果训练得好它应该给我们一个空格然后输入mpty dumpty “它输出s”以此类推。最后应该能递归生成Humpty Dumpty sat on a wall。这就是生成式 AI。*现在有了一个能生成语言的网络*当然实际上从来不会用随机分配的数值稍后会看到更合理的方案。忍不住的话可以看附录的 one-hot encoding 部分。细心的读者会注意到实际上不能把Humpty Dumpty输入网络——因为网络图只有 12 个输入神经元对应humpty dumpt里的每个字符含空格。那下一次输入y怎么办。加第 13 个神经元就要修改整个网络不现实。解法很简单把h踢出去发送最近的 12 个字符。所以发送umpty dumpty网络预测一个空格。然后输入mpty dumpty “它产生s”以此类推。大概是这样的上面喂给模型只有 sat on the wal扔掉了大量信息。那当今最新网络怎么处理大概就是这样。能输入网络的长度是固定的由输入层大小决定这叫上下文长度——即用于做未来预测的上下文。现代网络可以有非常大的上下文长度几千个词这有帮助。有些方法可以输入无限长序列但这些方法的性能虽然不错后来还是被固定但大的上下文长度模型超越了。细心读者会注意到的另一件事同一字母在输入和输出上的解释不一样比如输入h时简单地用数字 8 表示但输出层不是让模型输出一个数字h是 8“i是 9等等而是让模型输出 26 个数字然后看哪个最大如果第 8 个数字最大就解释为h”。为什么不两端用同样一致的解释可以只是对语言来说让自己选择不同的解释能有更大机会构建更好的模型。事实上目前最有效的输入和输出解释方式恰好不一样。实际上这里输入数字的方式也不是最好的稍后会看更好的方式。4 什么让大语言模型效果这么好一个字符一个字符生成Humpty Dumpty sat on a wall离现代 LLM 能做的还差得远。从我们讨论的简单生成式 AI 到像人一样的 bot有很多差异和创新。来看一下5 Embedding嵌入记得说过输入字符的方式不是最好的。只是随意给每个字符选了一个数字。如果有更好的数字可以分配让训练更好的网络成为可能怎么办怎么找到这些更好的数字有个巧妙的办法之前训练模型时移动权重看最终损失是否变小然后递归逐步改变权重。每轮喂入输入计算输出层和理想输出比较计算平均损失调整权重重新开始这个过程中输入是固定的。对 (RGB, Vol) 这样的输入来说是合理的。但现在给 a,b,c 等分配的数字是我们随意选的。如果每轮除了稍微移动权重也移动一下输入看看用不同的数字表示a等能不能得到更低的损失呢确实在降低损失让模型变好按设计“a的输入朝这个方向移动了。基本上把梯度下降不仅应用到权重也应用到输入的数字表示因为它们本来就是随意选的数字。这就叫Embedding”。是把输入映射到数字的方式而且如你所见需要训练。训练 embedding 的过程和训练参数很像。不过有个大好处训练好一个 embedding 后如果愿意可以给另一个模型用。注意同一个 token/字符/词要始终用同一个 embedding。Embedding 不一定是一个数。实际上 embedding 通常有多个数。因为用一个数很难捕捉概念的丰富性。看叶子和花这个例子每个对象有 4 个数字输入层大小。这 4 个数字每个都传达一个属性模型能用它们来有效猜对象。如果只有一个数比如颜色的红色通道对模型来说可能难很多。这里要捕捉人类语言——不止需要一个数字。所以不只是给每个字符分配一个数字而是分配多个数字来捕捉丰富性给每个字符分配一组数字。把这组有序数字叫向量有序意思是每个数字有位置交换两个数字的位置会得到不同的向量。叶子/花数据就是这样交换叶子的 R 和 G 数字会得到不同的颜色不再是同一个向量。向量长度就是包含的数字个数。给每个字符分配一个向量。有两个问题如果每个字符是向量而不是数字现在怎么把humpty dumpt喂给网络答案很简单。假设给每个字符分配了 10 维向量。那么输入层不是 12 个神经元而是 120 个因为humpty dumpt的 12 个字符每个有 10 个数字要输入。把神经元并排放置就行了。怎么找到这些向量好在我们刚学了怎么训练 embedding。训练 embedding 向量没有区别。现在有 120 个输入而不是 12 个但做的也是移动它们看怎么最小化损失。然后取前 10 个作为h对应的向量以此类推。所有 embedding 向量长度必须一致不然没法输入所有字符组合。比如humpty dumpt下一轮umpty dumpty——两轮都是输入 12 个字符如果 12 个字符每个不是等长 10 的向量就没法可靠地全部喂进 120 长的输入层。来可视化这些 embedding 向量把同尺寸向量的有序集合叫矩阵。上面的矩阵叫Embedding 矩阵。告诉它字母对应的列号查看矩阵那一列就能得到用来表示那个字母的向量。这个可以更一般地用于目前只见过一种简单神经网络结构叫前馈网络每层每个神经元全连接到下一层相邻两层任意两个神经元之间都有一条线而且只连接到下一层比如 1 层和 3 层之间没有线。但可以想见没有什么能阻止我们移除或建立其他连接或者建立更复杂的结构。来探索一个特别重要的结构自注意力。看人类语言的结构下一个想预测的词会依赖前面所有词。但对某些词的依赖程度可能比对其他词大得多。比如要预测Damian had a secret child, a girl, and he had written in his will that all his belongings, along with the magical orb, will belong to ____“这句话空缺词。这个词可能是her或him”具体取决于句子里更早的一个词girl/boy。好消息是简单前馈模型连接到上下文里的所有词所以能学到重要词的合适权重。但问题来了通过前馈层连接到模型里特定位置的权重是固定的对每个位置都一样。如果重要的词总在同一个位置就能学到合适的权重没问题。但下一个预测的相关词可能在系统里任何位置。改写上面那句话来猜her vs his时对这个预测非常重要的词是 boy/girl不管它出现在句子哪里。所以需要依赖位置也依赖那个位置内容的权重。怎么实现自注意力做的大概是把每个词的 embedding 向量加起来但不是直接相加而是给每个加一个权重。所以如果 humpty、dumpty、sat 的 embedding 向量是 x1、x2、x3分别乘以一个权重一个数再相加。比如 output 0.5 x1 0.25 x2 0.25 x3output 是自注意力输出。如果把权重写成 u1、u2、u3output u1x1u2x2u3x3怎么找这些权重 u1、u2、u3理想情况下希望这些权重依赖于我们正在聚合的向量——如所见有些可能更重要。但对谁重要对我们要预测的词重要。所以也希望权重依赖于我们即将预测的词前面那个词。当然预测前不知道要预测什么词。所以自注意力用紧挨着我们要预测词的那个词即我们有的句子末尾那个词不知道为什么是这样而不是其他但深度学习很多东西是试出来的我猜这个效果不错。好想要这些向量的权重希望每个权重依赖于我们聚合的词和即将预测词前面的那个词。基本上想要 u1 F(x1, x3)x1 是要加权的词x3 是序列最后一个词假设只有 3 个词。实现这个的一个直接办法是给 x1 搞一个向量叫 k1给 x3 搞一个单独向量叫 q3然后取点积。会得到一个依赖 x1 和 x3 的数。怎么得到 k1 和 q3构建一个单层小神经网络从 x1 到 k1或者 x2 到 k2x3 到 k3 等等。再构建另一个网络从 x3 到 q3。用矩阵记号基本上得到权重矩阵 Wk 和 Wq使得 k1 Wkx1q1 Wqx1 等等。现在可以取 k1 和 q3 的点积得到一个标量所以 u1 F(x1,x3) Wkx1 · Wqx3。自注意力里还有一件事不直接对 embedding 向量本身做加权求和。而是对那个 embedding 向量的某个值做加权求和也是通过另一个单层小网络得到的。类似于 k1 和 q1现在还有 v1 对应词 x1通过矩阵 Wv 得到 v1Wvx1。然后 v1 被聚合。3 个词预测第 4 个时大概是这样自注意力加号表示简单向量相加所以它们长度必须相同。最后一个没展示的修改标量 u1、u2、u3 等等不一定会加起来等于 1。如果需要它们是权重应该让它们加起来。所以这里用 softmax 函数。这就是自注意力。还有 cross-attention交叉注意力q3 可以来自最后一个词但 k 和 v 可以来自另一个完全不同的句子。这在翻译任务等场景很有价值。现在知道注意力是什么了。整个这东西可以装进一个盒子里叫自注意力块。基本上这个自注意力块接收 embedding 向量然后输出任意用户选的长度的一个输出向量。这个块有 3 个参数 Wk、Wq、Wv——不需要比这更复杂。这类块在机器学习文献里很多通常在图里用带名字的方块表示。长这样注意到自注意力的一个特点位置似乎无关。用的是同样的 W所以把 Humpty 和 Dumpty 换位置没什么区别——所有数字最后都一样。这意味着虽然注意力能搞清楚要注意什么但这和词位置无关。但知道词位置在英语里很重要给模型一些词位置感可能会提升性能。所以用注意力时往往不直接把 embedding 向量喂给自注意力块。后面会看到位置编码是怎么加到 embedding 向量上再喂给注意力块的。_给已入门者的注_对不是第一次读自注意力的人来说会注意到没有提 K 和 Q 矩阵或者应用 mask 什么的。那是因为这些是这些模型常用训练方式产生的实现细节。一批数据被喂进去模型同时训练从 humpty 预测 dumpty、从 humpty dumpty 预测 sat 等等。这是提高效率的手段不影响解释或模型输出我们选择这里省略训练效率技巧。8 Softmax之前在第一条note里简单聊过 softmax。Softmax 要解决的问题是输出解释里有多少个选项就放多少个神经元。说选择网络的选项时解释为数值最高的神经元。然后说计算损失是网络提供的值和理想值之间的差异。但那个理想值是多少叶子和花例子设成了 0.8。为什么是 0.8不是 5或者 10或者一千万越高越好对这个训练例子。理想情况想要无穷大现在问题就棘手了——所有损失都是无穷大最小化损失的 plan记得梯度下降就崩了。怎么办一个简单做法是给想要的值设上限。比如 0 到 1 之间这会让所有损失有限但又有新问题网络超调了怎么办假设一次输出 (5,1) 对应 (叶子,花)另一次输出 (0,1)。第一次选对了但损失反而更差现在需要一种方法把输出也转成 (0,1) 范围同时保序。可以用任意函数数学里函数就是一个数到另一个数的映射——进一个数出另一个数——是根据输入得到输出的规则来完成。可以选 logistic 函数见下图把所有的数映射到 (0,1) 之间同时保序现在输出层每个神经元都有一个 0 到 1 之间的数可以计算损失把正确神经元设成 1其他设成 0然后取和网络提供的差。这样可以但能做得更好回到Humpty dumpty例子尝试一个字符一个字符生成 dumpty模型在预测m时犯了错。不是给m最高值而是给u最高值但m排第二。现在可以继续duu然后尝试预测下一个字符但模型置信度会很低因为从humpty duu…没有那么多好的后续。另一方面“m是第二近所以也可以试试m”预测下几个字符看看会怎样也许能得到一个整体更好的词这里说的不是盲目选最大值而是试试几个。怎么做得给每个分配一个机会——比如 50% 选第一25% 选第二等等。这是个好办法。但可能希望这个机会依赖于底层模型预测。如果模型对 m 和 u 的预测值在这里很接近相对于其他值那探索两者的接近 50-50 可能是好主意需要一个好的规则把这些数字转换成机会。这就是 softmax 做的。是上面 logistic 函数的泛化且有额外特性。如果给 10 个任意数字——会给你 10 个输出每个在 0 到 1 之间关键是 10 个加起来等于 1所以可以解释为机会。几乎每个语言模型的最后一层都是 softmax。9 Residual Connection残差连接随着章节推进我们对网络的可视化在慢慢变化。现在用方块/盒子表示某些概念。这种记号对表示残差连接这个特别有用的概念很有帮助。来看残差连接加自注意力块的样子残差连接注意输入和输出画成盒子简化了但它们本质上还是神经元/数字的集合和上面一样。这在干嘛把自注意力块的输出在传入下一个块之前加上原始输入。注意这样要求自注意力块输出的维度和输入相同。这不是问题因为之前说过自注意力输出由用户决定。但为什么这么做不展开所有细节关键的是随着网络变深输入和输出之间层越多训练难度越来越大。残差连接被证明能帮助应对这些训练挑战。10 Layer Normalization层归一化层归一化是个相当简单的层接收进入该层的数据通过减去均值并除以标准差来归一化可能还多一点如下。比如如果在输入之后立即应用层归一化它取输入层所有神经元然后计算两个统计量均值和标准差。假设均值是 M 标准差是 D层归一化做的事是把每个神经元替换成 (x-M)/D其中 x 是该神经元原始值。这怎么帮忙基本上是稳定进入网络的向量帮助训练深度网络。一个担忧是归一化输入是否去掉了一些可能有帮助的有用信息。为此层归一化层有缩放和偏置参数。基本上对每个神经元乘以一个标量然后加一个偏置。这些标量和偏置是可以训练的参数。这让网络能学到可能对预测有价值的一些变化。而且因为参数不多LayerNorm 块没有很多要训练的参数。大概是这样的层归一化缩放和偏置是可训练参数。可以看到层归一化是个相对简单的块每个数字只做点对点操作初始均值和标准差计算之后。让人想起激活层比如 RELU关键区别是这里有一些可训练参数尽管由于简单的点对点操作比其他层少很多。标准差是数值分散程度的统计量比如所有值都一样标准差是零。如果一般来说每个值离这些值的均值很远标准差就高。一组数 a1、a2、a3…假设 N 个数标准差的计算公式大概是每个数减去这些数的均值然后对 N 个数每个平方相加然后除以 N再取平方根。给已入门者的注有经验 ML 专业人士会注意到这里没有讨论 batch norm。实际上这篇文章根本没有引入 batch 的概念。我认为 batch 是另一种训练加速手段和核心概念理解没太大关系也许 batch norm 除外这里不需要它。11 DropoutDropout 是一个简单但有效的避免模型过拟合的方法。过拟合是模型在训练数据上训练后表现好但在没见过的例子上泛化不好。帮助避免过拟合的技术叫正则化技术dropout 是其中之一。训练一个模型它可能在数据上犯错或过拟合得比较特殊。训练另一个模型可能做同样的事但方式不同。训练一批这样的模型然后平均输出怎么样这些通常叫集成模型因为通过组合一批模型的输出来预测通常比任何单个模型好。神经网络里可以同样做。可以构建多个略有不同的模型然后组合输出来得到更好的模型。但这可能计算成本很高。Dropout 是一种不完全构建集成模型但确实捕捉了概念精髓的技术。概念很简单通过在训练时插入 dropout 层随机删除 dropout 层所在层之间一定比例的直接神经元连接。在输入层和中间层50% dropout 率之间插入 Dropout 层大概是这样的这强制网络用大量冗余训练。本质上同时训练了很多不同的模型——但它们共享权重。推理时可以用集成模型同样的方法做多个 dropout 预测然后组合。但那样计算密集——而且因为模型共享公共权重——为什么不直接用所有权重做一次预测所以不是一次用 50% 权重而是同时用全部。这应该给我们集成模型的一些近似。但有个问题用 50% 权重训练的模型中间神经元数值和用全部权重的会非常不同。想要这里更多集成风格的平均。怎么做简单把所有权重乘以 0.5因为现在用的权重是两倍。Dropout 在推理时就是这么做的。它用带所有权重的完整网络简单把权重乘以 (1-p)p 是删除概率。这被证明是一种效果不错的正则化技术。12 Multi-Head Attention多头注意力这是 transformer 架构的关键块。已经见过注意力块长什么样。记住注意力块的输出由用户决定是 v 的长度。多头注意力基本上并行运行几个注意力头都接收相同输入。然后把它们的输出简单拼接起来。大概是这样的多头注意力注意从 v1 - v1h1 的箭头是线性层——每个箭头有一个矩阵做变换。为了避免混乱没有显示。这里发生的是给每个头生成相同的 key、query 和 values。但然后基本上在上面加一个线性变换分别对每个 k、q、v且对每个头分别。这个额外的层在自注意力里不存在。有个附注对我来说这是创建多头注意力的一种稍微令人惊讶的方式。比如为什么不给每个头创建单独的 Wk、Wq、Wv 矩阵而是加一个新层共享这些权重。知道的话告诉我——我真的不知道为什么。13 Positional Encoding and Embedding位置编码和位置嵌入在自注意力那一节简要讨论了使用位置编码的动机。这些是什么图里展示的是位置编码但用位置嵌入比用编码更常见。来说一个常见的位置嵌入但也覆盖附录里原论文用的位置编码。位置嵌入和其他 embedding 没有区别只是 embed 的是数字 1、2、3 等。所以这个 embedding 是和词嵌入长度相同的矩阵每列对应一个数字。就这样。14 GPT 架构来说 GPT 架构。这个用在大多数 GPT 模型上各有变体。如果跟到了这里应该相当容易理解。用方块记号高层来看架构长这样GPT 架构到这里除了GPT Transformer 块其他所有块都已经详细讨论过了。这里的 号只是说两个向量相加所以两个 embedding 大小必须相同。来看 GPT Transformer 块就这样。它叫transformer是因为它源自并属于 transformer——也就是引入 transformer 架构的那篇论文。这不影响理解因为之前已经覆盖了图中所有构建块。来回顾一下构建到 GPT 架构的所有内容见过神经网络怎么接收数字输出其他数字权重作为可训练的参数能给这些输入输出数字附加解释给神经网络现实意义能链接神经网络创建更大的可以叫每个块用方块表示方便画图。每个块做的事一样接收一组数字输出另一组数字学了很多不同类型的块各有不同用途GPT 就是上面展示的那些块的特殊排列加上第一部分讨论的解释随着时间推移各公司构建到强大现代 LLM 做了修改但基础一样。这个 GPT transformer 实际上是原 transformer 论文里叫解码器的东西。来看下一节。15 Transformer 架构这是推动语言模型能力最近快速提升的关键创新之一。Transformer 不仅提高了预测精度还比之前的模型更容易/更高效训练允许更大的模型规模。这就是上面 GPT 架构的基础。看 GPT 架构很适合生成序列中的下一个词。基本遵循第一部分讨论的同样逻辑。从几个词开始然后一次生成一个。但如果想做翻译呢如果有句德语比如 “Wo wohnst du?” “Where do you live?”想翻译成英语怎么训练模型做这个首先需要想个办法输入德语词。这意味着要扩展 embedding 同时包含德语和英语。现在有个简单方法为什么不在到现在生成的英语前面拼接德语句子喂给上下文。为了对模型更简单可以加个分隔符。每步看起来大概是这样的Nx这里的 Nx 只是表示这个块被链式重复 N 次。所以基本上把块头尾相接把上一个块的输入传给下一个。这是让神经网络变深的方法。看到图会对编码器输出怎么喂给解码器有困惑。假设 N5。会把每层编码器输出喂给对应解码器层吗不会。基本上编码器只跑一遍。然后取那个表示喂给 5 个解码器层的每一个。Add Norm 块这基本和下面的一样其他之前都讨论过了。现在有了从简单加法和乘法构建的 transformer 架构完整解释完全自包含知道图中每一条线、每一个加法、每一个方块和每一个词从零构建的含义。理论上这些笔记包含了从头编码 transformer 所需的一切。实际上如果有兴趣这个 repo[4] 用上面的 GPT 架构做了这个。16 构建预训练模型到这里有了设计和训练 LLM 所需的所有部件。把碎片拼起来做一个英语语言模型首先构建一个分词器能像在子词分词器一节讨论的那样对英语进行编码和解码。假设词表大小 32k接下来用 transformer 架构构建 LLM。输出向量和 embedding 矩阵都必须有 32k 个元素等于词表大小现在收集英语语料来训练模型。这是训练数据。通常这个数据集的关键部分是整个互联网的抓取比如 Common Crawl[5]现在可以开始训练模型了像训练那一节讨论的那样让模型预测下一个 token。通过为下一个 token 定义损失函数从训练数据已知并推动网络预测那个 token 来做对数百亿或数万亿 token 做这个就得到一组权重这就是预训练模型。这是一个能预测下一个 token 的模型现在可以用来补全句子甚至整篇文章附录矩阵乘法在上面 embedding 的背景下引入了向量和矩阵。矩阵有两个维度行数和列数。向量也可以看作一个维度等于 1 的矩阵。两个矩阵的乘积定义如下点代表乘法。现在再来看第一张图蓝色和橙色神经元的计算。如果把权重写成矩阵把输入写成向量可以用以下方式写出整个运算如果权重矩阵叫W输入叫x那 Wx 就是结果这里就是中间层。也可以转置两个写成 xW——这是个人偏好。标准差在层归一化一节用了标准差概念。标准差是一组数值分散程度的统计量比如所有值都一样标准差是零。如果一般来说每个值离这些值的均值很远标准差就高。一组数 a1、a2、a3…假设 N 个数标准差的计算公式大概是每个数减去这些数的均值然后平方对 N 个数每个平方相加然后除以 N再取平方根。位置编码这部分超出初中数学范围上面讨论了位置嵌入。位置编码是一个和词嵌入向量长度相同的向量只是这不是可训练的 embedding。我们只是给每个位置分配一个唯一向量比如位置 1 一个不同向量位置 2 一个不同向量以此类推。一个简单做法是让那个位置的向量直接充满位置数字。所以位置 1 的向量是 [1,1,1…1]位置 2 是 [2,2,2…2]记住每个向量长度必须和 embedding 长度一致才能相加。这有问题因为向量里可能最后有大数字给训练带来挑战。当然可以归一化这些向量除以位置最大值所以如果有 3 个词位置 1 是 [.33,.33,…,.33]位置 2 是 [.67, .67, …,.67]等等。但现在的问题是位置 1 的编码一直在变如果我们输入 4 个词的句子这些数字会不同给网络学习带来挑战。所以这里想要一个方案给每个位置分配唯一向量且数字不爆炸。如果上下文长度是 d即能喂给网络的最大 token/词数来预测下一个 token/词见这些是怎么生成语言的讨论embedding 向量长度是 10假设那需要一个 10 行 d 列的矩阵所有列都不同所有数字在 0 到 1 之间。0 到 1 之间有无穷多数字且矩阵大小有限这可以有很多方式做到。Attention is all you need论文里的做法大概是画 10 条正弦曲线每条是 si§ sin (p/10000(i/d))那是 10k 的 i/d 次方填编码矩阵使得 (i,p)th 数字是 si§比如位置 1 的编码向量第 5 个元素是 s5(1)sin (1/10000(5/d))为什么选这个方法改变 10k 的幂值就改变了沿 p 轴看正弦函数的振幅。如果有 10 个不同振幅的 10 条不同正弦曲线那么对于不同的 p 值要很久才会得到一次重复即所有 10 个值都一样。这帮助给我们唯一值。现在实际论文同时用正弦和余弦函数编码形式是i 是偶数时 si§ sin (p/10000(i/d))i 是奇数时 si§ cos(p/10000(i/d))。如何学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线科技企业深耕十二载见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事早已在效率与薪资上形成代际优势我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套AI 大模型突围资料包✅ 从零到一的 AI 学习路径图✅ 大模型调优实战手册附医疗/金融等大厂真实案例✅ 百度/阿里专家闭门录播课✅ 大模型当下最新行业报告✅ 真实大厂面试真题✅ 2026 最新岗位需求图谱所有资料 ⚡️ 朋友们如果有需要《AI大模型入门进阶学习资源包》下方扫码获取~① 全套AI大模型应用开发视频教程包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点② 大模型系统化学习路线作为学习AI大模型技术的新手方向至关重要。 正确的学习路线可以为你节省时间少走弯路方向不对努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划带你从零基础入门到精通③ 大模型学习书籍文档学习AI大模型离不开书籍文档我精选了一系列大模型技术的书籍和学习文档电子版它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。④ AI大模型最新行业报告2025最新行业报告针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。⑤ 大模型项目实战配套源码学以致用在项目实战中检验和巩固你所学到的知识同时为你找工作就业和职业发展打下坚实的基础。⑥ 大模型大厂面试真题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我精心整理了一份大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。以上资料如何领取为什么大家都在学大模型最近科技巨头英特尔宣布裁员2万人传统岗位不断缩减但AI相关技术岗疯狂扩招有3-5年经验大厂薪资就能给到50K*20薪不出1年“有AI项目经验”将成为投递简历的门槛。风口之下与其像“温水煮青蛙”一样坐等被行业淘汰不如先人一步掌握AI大模型原理应用技术项目实操经验“顺风”翻盘这些资料真的有用吗这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理现任上海殷泊信息科技CEO其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证服务航天科工、国家电网等1000企业以第一作者在IEEE Transactions发表论文50篇获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的技术人员这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。以上全套大模型资料如何领取

相关文章:

小白程序员也能看懂的大模型内部原理:从加减乘除到Llama 3.1(收藏版)

本文深入浅出地解析了大语言模型(LLM)的工作原理,从基础的加减乘除运算开始,逐步构建一个生成式AI,并最终理解现代LLM和Transformer架构。文章剥去了机器学习领域的复杂术语,将一切还原为数字,帮…...

即时消息系统:从核心概念到架构演进的深度解析

1. 即时消息系统的核心概念解析 第一次接触即时消息系统开发时,我被各种专业术语搞得晕头转向。直到自己动手实现了一个简易版IM系统,才发现这些概念其实都很接地气。让我们用日常聊天的场景来理解这些专业名词: 用户就是你和你的微信好友&am…...

【独家首发】华为云+蚂蚁集团联合复盘:AI原生项目失败率下降67%的关键决策树(含可落地Checklist)

第一章:AI原生软件研发最佳实践:大厂案例分享 2026奇点智能技术大会(https://ml-summit.org) 大型科技企业在构建AI原生软件时,已逐步形成以模型即服务(MaaS)、数据闭环驱动和开发者体验优先为核心的工程范式。Google…...

告别ArcGIS Server高成本!手把手教你用GeoServer 2.16发布ArcGIS 10.2切片包

开源GIS解决方案:GeoServer高效发布ArcGIS切片全流程指南 在GIS领域,数据可视化与在线地图服务已成为基础设施建设的标配需求。然而,商业软件高昂的许可费用常常让中小型团队望而却步——以ArcGIS Server企业版为例,单台服务器年费…...

mysql执行预处理语句流程是怎样的_SQL执行优化解析

预处理语句生命周期为PREPARE→EXECUTE→DEALLOCATE三阶段,执行计划在EXECUTE时生成且不跨连接复用;参数类型影响索引选择与优化效果;仅支持值占位,不支持动态表名/列名;PHP PDO默认模拟预处理会失效原生优化。预处理语…...

解锁Presto/Trino高级查询:从集合运算到多维分析与窗口函数实战

1. 从零掌握Presto/Trino集合运算 第一次接触Presto/Trino的集合运算时,我完全被UNION、INTERSECT、EXCEPT这些操作符搞晕了。直到在电商用户行为分析项目中踩过几次坑后,才发现它们其实是处理数据集的瑞士军刀。想象你手上有两份销售数据:线…...

Photoshop CS6 分享

下载链接Photoshop CS6 好用链接:https://pan.quark.cn/s/35e0b2cbe8094:/^tX0KdDR5jR^%第二步:双击exe文件打开即可\n三:软件介绍\n\n\n原版安装复杂、占满 C 盘,新版要求高配置带不动?今天给大家安排一款「宝藏版本」…...

Pandas 批量读写数据库:高效导入导出优化方案

在数据驱动的开发工作中,Pandas 凭借其强大的数据处理能力,已经成为 Python 数据生态中不可或缺的工具。然而,很多开发者在使用 Pandas 与数据库交互时,常常遇到一个令人头疼的问题:当数据量达到百万级甚至千万级时&am…...

数据结构与算法的实战场景剖析(持续更新)

1. 排序算法在数据库索引中的实战应用 数据库索引就像图书馆的目录系统,而排序算法就是构建这个目录的核心工具。在实际项目中,我们经常需要根据不同的查询需求选择合适的排序算法来构建索引。比如MySQL的InnoDB引擎就采用了B树作为索引结构,…...

java进阶-Dubbo

Apache Dubbo 是一款由阿里巴巴开源、Apache 基金会旗下的高性能微服务开发框架。它的核心是为分布式系统提供高效的RPC(远程过程调用)通信和服务治理能力。简单来说,Dubbo 就像微服务架构的"高速公路",让一个服务&…...

EF Core 原生 SQL 实战:FromSql、SqlQuery 与对象映射边界性

先唠两句:参数就像餐厅点单 把API想象成一家餐厅的“后厨系统”。 ? 路径参数/dishes/{dish_id} -> 好比你要点“宫保鸡丁”这道具体的菜,它是菜单(资源路径)的一部分。查询参数/dishes?spicytrue&typeSichuan -> 好比…...

Qt中TabWidget动态添加页面的控件自适应布局优化实践

1. 为什么TabWidget动态添加页面时布局会失效 在Qt开发中,TabWidget是一个非常实用的容器控件,它允许我们在同一个窗口内通过标签页切换不同的功能模块。很多开发者喜欢用addTab()方法动态添加页面,这种方式既实现了模块化开发,又…...

用Emoji魔法点亮Python日志:让程序输出告别枯燥,充满情感与个性!

1. 为什么你的Python日志需要Emoji魔法? 你有没有盯着满屏黑白文字日志debug到怀疑人生的经历?上周我维护一个爬虫系统时,凌晨3点还在2000行日志里找那个该死的"ERROR"关键词,那一刻突然意识到——我们的程序输出实在太…...

GBase 8c数据库全链路精准降本详解(下)

南大通用GBase 8c数据库(gbase database)用五招硬核技术,从存储、内存、CPU到I/O,全链路精准降本。不是省钱降质,而是让每一分硬件投入都产生最大价值。3第三招:内存精准管控,不浪费每一兆内存价格居高不下…...

【AW_在往数据表新增一行记录的时候,ID在已有的基础上递增。】

AW_在往数据表新增一行记录的时候,ID在已有的基础上递增。 INSERT INTOcockpit_ads_support_records (record_id,submit_time) VALUES((SELECT IFNULL(max_id, 0) 1 FROM (SELECT MAX(record_id) AS max_id FROM cockpit_ads_support_records) AS temp),{{ startTr…...

为什么你的LangChain应用上线3个月就不可维护?——AI原生债务的4层腐蚀模型与熔断机制设计

第一章:AI原生软件研发技术债务管理策略 2026奇点智能技术大会(https://ml-summit.org) AI原生软件区别于传统软件的核心在于其生命周期深度耦合模型迭代、数据漂移、推理服务演进与反馈闭环。技术债务在此类系统中不再仅体现为代码冗余或架构腐化,更表…...

避坑指南:GEO多数据集合并分析时,你的差异基因结果可靠吗?

GEO多数据集合并分析:差异基因结果的可靠性验证与优化策略 当你兴奋地从GEO数据库中整合了多个数据集,经过一系列复杂的分析流程后,终于获得了一份差异基因列表。但这份看似完美的结果,真的反映了真实的生物学差异吗?还…...

QML实战解析:从ListModel到ListView,构建动态数据列表的完整指南

1. 为什么需要ListModel和ListView? 刚开始接触QML的时候,我总觉得显示列表数据是个特别麻烦的事情。直到遇到了ListModel和ListView这对黄金搭档,才发现原来动态列表可以这么简单。想象一下,你要做一个联系人列表,或者…...

从经典到现代:探索成核理论的演变与应用

1. 成核理论的前世今生:从气液凝结到纳米材料制备 记得我第一次在实验室观察结晶过程时,被那种从混沌到有序的转变深深震撼——清澈的溶液中突然出现微小的晶核,随后像施了魔法般生长成规整的晶体。这种神奇现象的背后,正是成核理…...

告别String拼接:手搓Java词法分析器时,为什么StringBuilder性能能提升百倍?

Java词法分析器性能优化:StringBuilder如何实现百倍性能提升 在开发Java词法分析器时,字符串处理是最基础也是最频繁的操作。许多开发者习惯性地使用String进行字符拼接,却不知道这在性能敏感场景下会带来灾难性后果。本文将深入剖析String与…...

从0到1打造完美PRD:这10个细节让你的需求文档更专业

从0到1打造完美PRD:这10个细节让你的需求文档更专业 在跨部门协作的产品开发中,一份优秀的PRD(产品需求文档)如同航海图,既能指引团队方向,又能规避潜在风险。但现实中,许多产品经理的文档常陷入…...

HJ171 排座椅

题目题解(42)讨论(19)排行 简单 通过率:43.50% 时间限制:1秒 空间限制:50M 知识点贪心 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。 描述 教室内共有 n…...

用Cisco Packet Tracer模拟企业级网络:从IP规划到邮件服务器部署全流程

企业级网络全栈模拟实战:从拓扑设计到服务联调的Cisco Packet Tracer深度指南 当我们需要在真实环境中部署企业网络时,直接在生产设备上操作往往伴随着高风险。这时,Cisco Packet Tracer作为一款专业的网络模拟工具,能够为我们提供…...

HakcMyVM-Nebula

信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.2.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2026-04-10 00:30 EDT Nmap scan report for laboratoryuser (192.168.2.2) Host is up (0.00029s latency). MAC Address: 08:00:27:DD:5D:00 (PCS S…...

Diablo16串口库:Arduino驱动4D Systems图形屏实战指南

1. Diablo16-Serial-Arduino-Library 项目概述Diablo16-Serial-Arduino-Library 是一个专为 Arduino 平台设计的串行通信封装库,用于与 4D Systems 公司基于 Diablo16 图形处理器(GPU)的显示模块进行高效、可靠的指令交互。该库并非直接驱动 …...

肿瘤微创治疗适用人群有哪些?

肿瘤微创治疗以创伤小、恢复快、精准度高为特点,并非人人适用,但覆盖人群广泛,尤其为无法耐受传统手术或中晚期肿瘤患者提供了重要治疗选择,主要适用人群如下:高龄、体质虚弱患者老年患者常合并高血压、糖尿病、心肺功…...

Linux网络编程核心API速查手册贸

智能体时代的代码范式转移与 C# 的战略转型 传统的 C# 开发模式,即所谓的“工程导向型”开发,要求开发者创建一个复杂的项目结构,包括项目文件(.csproj)、解决方案文件(.sln)、属性设置以及依赖…...

最新版微信证件照小程序源码 前后端开源 带后台附教程

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示一、详细介绍 最新版微信证件照小程序源码 前后端开源 带后台附教程 无需单独购买API 本地0成本处理 无限免费调用API 不保存用户图片,仅保存生成后的最新一张 支持水印 支持流量主 支持自由开关鉴黄…...

代驾软件可以自己改界面吗?

在选择代驾软件时,很多企业主和创业者都非常关心一个问题:代驾软件的界面是否可以自定义? 这个问题的答案是肯定的。本文将详细介绍如何自定义代驾软件的界面,并提供具体的数据和案例支撑,帮助你更好地理解和操作。一、…...

最新彩虹云商城二开Pro美化版 新增超多功能 全开源 (1)

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示一、详细介绍 最新彩虹云商城二开Pro美化版 新增超多功能 全开源 测试环境:Nginx PHP7.4 MySQL 访问域名进行安装 该有的功能全都有 完美可直接运营 功能介绍: -用户登录注册页面独家美化 -后台登录页…...