
GPT从零构建
文章平均质量分 97
欢迎来到我们的技术专栏,我们将带您深入了解大语言模型的构建和训练过程。我们将从自注意力开始,带您一步一步的编写模型的每个组件,从预训练开始一步一步的训练自己编写的模型。在构建过程中,我们会从实现原理的角度去剖析这些组件都是做什么的,又是怎么被设计出来的,做到知其然,知其所以然。
沉下心来学鲁班
擅长设计高性能、可扩展、结构优良的软件,并致力于在编程领域宏扬工匠精神。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
GPT从零构建:模型推理之选词算法
从上面温度对概率分布的影响可以看出,温度如果持续升高,高可能性词和低可能性词的概率值将趋近于相同,这意味着模型输出将接近完全随机,等于回到了预训练之前,这肯定不是我们想要的,所以实际场景中,温度调整范围会限定在一个有效的区间内,像ChatGPT的温度有效区间就是0-2原创 2025-01-20 12:30:43 · 713 阅读 · 0 评论 -
GPT从零构建:SFT之指令微调
在之前对SFT数据的准备时,会因为每批数据长度不等而对数据作填充对齐,因此需要引入注意力掩码attention_mask来取消对padding token的注意力计算,attention_mask的作用在于指示哪些位置是有效的(模型应该关注),哪些位置是填充的(模型应该忽视)。原创 2025-01-14 08:20:19 · 952 阅读 · 0 评论 -
GPT从零构建:SFT指令微调之数据处理
目标是构建一个适用于指令微调场景的自定义数据集类SFTDatasettorch.utils.data.Dataset 是 PyTorch 提供的一个数据集基类,我们将基于这个基类来构建自己的数据集类。json用于解析jsonl格式的数据;linecache用于高效读取文件中的特定行。分词器tokenizer;序列最大长度max_len,默认为1024原创 2025-01-08 09:35:43 · 1163 阅读 · 0 评论 -
GPT从零构建:SFT之分类微调
理论上来讲,只需要训练新的输出头out_head,但业界一些实验表明,训练更多的层有助于提高性能。因此,我们将最后一个transformer block和连接它的layernorm设置为可训练,其它层设置为不可训练。如上打印信息所示,需要训练的参数总共有708万,占所有参数109605890的比例约6.47%。原创 2025-01-04 03:30:00 · 850 阅读 · 0 评论 -
GPT从零构建:预训练模型之分布式训练
这里其实是一个坑,处理不好会造成训练过程中僵死,原因在于DDP封装过的模型在推理时会自动在多卡之间同步运算状态,但由于其它进程并没有运行模型评估,所以这个状态永远同步不到,训练时的表现就是整个训练进度卡住不动。原创 2025-01-02 02:00:00 · 1993 阅读 · 0 评论 -
GPT从零构建:预训练模型之加速运算
16位是一种数据精度,32位是另一种数据精度,如果在模型训练时混合使用16位和32位就可以称之为混合精度训练。这个优化思想就好比在做饭的时候,有些成分用精确的量杯(32 位浮点数)来测量,有些成分用粗糙的量杯(16 位浮点数)来测量。原创 2024-12-31 03:00:00 · 1235 阅读 · 0 评论 -
GPT从零构建:预训练模型之从零起步
目标序列是将输入序列向前平移一个位置得到,这种设计可以让模型训练时,能够基于当前的输入预测下一个词,从而有效地捕捉序列中的上下文信息。原创 2024-12-10 17:52:27 · 943 阅读 · 0 评论 -
GPT从零构建: 预训练之高效数据加载
这里会用到一个np.memmap技术,这是一种将文件映射到内存的技术,它允许用户像访问普通内存中的numpy数组一样访问磁盘上的整个数据集,但实际上只有少部分数据从磁盘加载到了内存中,这种技术非常适合处理大型数据集。原创 2024-12-03 02:16:35 · 1001 阅读 · 0 评论 -
GPT从零构建:带你搭建MiniGPT
输出的logtis是一个(2,4,32000)形状的张量,表示每个位置的next token预测结果是一个32000维度的向量,即词表中每个token的可能性分数。注:上面的各个配置项的默认值,就是我们将要构建的模型目标结构,这里采用768维的向量嵌入,12个解码层,12个注意力头,1024的上下文长度。原创 2024-12-01 03:45:00 · 139 阅读 · 0 评论 -
ScratchLLMStepByStep:构建自己的大语言模型教程
在学习大语言模型的时候,总会遇到各种各样的名词,像自注意力、多头、因果、自回归、掩码、残差连接、层归一化等等。这些名词会让学习者听的云里雾里。本教程将会带你从零开始,一步一步的去构建每一个组件,揭开它们的神秘面纱,并最终用这些组件组装成一个大语言模型。在构建过程中,我们会从实现原理的角度去剖析这些组件都是做什么的,又是怎么被设计出来的,让我们知其然,知其所以然。原创 2024-11-29 23:43:25 · 474 阅读 · 0 评论 -
GPT从零构建:带你构建TransformerBlock
在以前的某些架构中,层归一化是在MultiHeadAttention和FeedForward之后用的,这被称为Post-Layernorm,这种方法在较浅的网络中表现良好,但在更深的网络中会遇到训练不稳定的问题,总体来说,Pre-Layernorm在稳定性方面表现更好。原创 2024-11-13 14:19:25 · 985 阅读 · 0 评论 -
GPT从零构建:带你实现多头注意力
将大权重矩阵按照头的数量(num_heads)分割,即能模拟出多头各有一个小的权重矩阵的效果。多头注意力是指将注意力机制分为多个“头”,每个头学习数据的不同方面,使模型能够从多个层面来捕获输入序列中各部分之间的关系,这提高了模型在复杂任务中的表现。原创 2024-11-11 23:21:05 · 985 阅读 · 0 评论 -
GPT从零构建:带你实现因果注意力机制
与标准自注意力一次允许访问访问整个输入序列不同的是,因果自注意力会遮蔽序列中当前位置之后的输入,限制模型在计算注意力得分时,只能访问当前位置及之前的token,因此也被称为遮蔽注意力(masked_attention)。原创 2024-11-11 13:14:26 · 1407 阅读 · 0 评论 -
带你从零认识Tokenizer
Tokenizer是一个词元生成器,它首先通过分词算法将文本切分成独立的token列表,再通过词表映射将每个token转换成语言模型可以处理的数字。原创 2024-05-31 00:04:26 · 1866 阅读 · 0 评论 -
GPT从零构建:带你从零认识自注意力
尽管只是计算一个token的上下文向量z(2),但我们仍然需要所有token的键向量k和值向量v,因为查询向量q_2需要与序列中所有token的k向量和v向量运算,才能得到x_2的注意力权重和上下文向量。原创 2024-11-06 22:02:29 · 979 阅读 · 0 评论 -
GPT从零构建:词嵌入和位置嵌入
在前面一篇文章带你从零训练分词器中我们训练了一个分词器,并通过分词器的序列化方法得到了文本的token_id序列表示。但是在深度学习中,许多算法(例如:注意力)都需要对输入数据进行距离和相似度计算,而离散的token_id序列本身并没有距离和相似度的概念,例如100和101两个token_id虽然数值接近,但并不表示这两个token_id相似。因此,我们通常会将离散的token映射到一个高维的、连续的向量空间,这样就允许我们使用线性代数中的操作(如加法、点积)进行计算。原创 2024-11-06 15:50:25 · 878 阅读 · 0 评论 -
带你从零认识语言模型
本文会以Qwen2-0.5B模型为例,从使用者的角度,从零开始一步一步的探索语言模型的推理过程。从使用的角度来接触模型本地运行的方式来认识模型以文本生成过程来理解模型以内部窥探的方式来解剖模型。原创 2024-11-04 13:03:28 · 1217 阅读 · 4 评论 -
GPT从零构建:训练自己的Tokenizer
这一点非常重要,因为每个utf-8字符都是由一到多个字节组成的,将这个长度为256的编码表中的字节进行组合,理论上就能对世界上所有语言中的字符进行编码,并且还不会出现。原创 2025-01-17 22:28:44 · 1629 阅读 · 0 评论