自然语言处理:第五十八章 如何从头训练大语言模型: A simple technical report(转载)

本人项目地址大全:Victor94-king/NLP__ManVictor: 优快云 of ManVictor

原文地址: 如何从头训练大语言模型: A simple technical report - 知乎


写在前面: 笔者更新不易,希望走过路过点个关注和赞,笔芯!!!

写在前面: 笔者更新不易,希望走过路过点个关注和赞,笔芯!!!

写在前面: 笔者更新不易,希望走过路过点个关注和赞,笔芯!!!




大模型时代,倒不是看谁代码写的好了,只有涉猎广泛,有训练经验,能进行Infra的debug,肯认真做数据,才是王道。所以我觉得眼下最有价值的文章,还得看大厂技术报告。

1. Model Architecture

分两块讲:语言模型本身和对应的tokenizer构建。这部分没什么好说的,比较简单,大家都差不多。

基本都是llama的魔改,不过今年大家更关注inference消耗和长文本了,所以出现了各种各样的变体。其中Deepseek的MLA架构一枝独秀。不过我不想讨论MoE。

与图像生成模型还在忙着争论模型架构不同,主流自回归LLM基本都是casual attention,只是各家对MHA做了优化而已,目的是为了尽可能减少kv cache, 从而在更少的显存消耗上做到更快的推理速度,降本增效。

1.1 MQA->GQA->MLA

图片

  • MQA :把多头注意力里的多个attention head去对应一个K与V,非常朴素的想法,是kv cache节约的上界。过于暴力,今年应该没人用了。
  • GQA :介于MHA与MQA之间,把attention head分成多个group, 组内共享KV,十分自然的过渡。
  • MLA :只需要少量的 KV 缓存,相当于只有 2.25 组的 GQA,但却能获得比 MHA 更强的性能。不过没法直接使用ROPE倒是一个弊病,需要做一些改动。虽然MLA会增加一些计算,但是推理速度无疑是很快的。图片

1.2 Norm, Activation, Initialization

现在主流共识是用RMSNorm和SwiGLU, 比layernorm和relu两个老东西效果好多了,训练也更稳定。(不过GLM是用的GeLU和deepnorm)

为了保证训练稳定(实在太难了),一般采用预归一化,先归一化,再残差计算。据说post-norm效果更好,但不够稳定。

参数初始化策略看模型大小而定。某些策略似乎能缓解loss spike现象,可见Spike No More: Stabilizing the Pre-training of Large Language Models

https://arxiv.org/pdf/2312.16903

1.3 Long Context

今年大家都卷起来了,似乎没有1M窗口都不好意思发布模型,“大海捞针”实验上kimi还是一枝独秀。

位置编码都是ROPE, 不少工作都在探究ROPE怎么做外推/内插。此前基本就是PI和NTK。后续训练中也有逐步增大ROPE基频的.

qwen报告里使用了Dual Chunk Attention(DCA),这是training free的;后面用yarn调整注意力权重做外推.

1.4 Tokenizer与词表

不少工作都是直接挪用的别人的tokenizer, 如果自己从头训,好处可能是在自己数据上有更高的压缩率(词表大小相同的情况下)。主流算法都是BPE或者BBPE比较多。实际训练上主要是工程优化并发的问题。

记得评估一下tokenizer的压缩率。压缩率表示文本向量化后的长度,压缩率越高向量越短。多语言的时候也留意一下token的覆盖率,比如llama的中文就不太行,他们的训练数据本身中文就很少 (不知道为什么meta这么做,反而support一些其他的语言比较多)

一个非常重要的问题就是词表的修改。尤其是SFT阶段有些special token, 做agent的时候更重要了,最好不要等模型训起来了再去补词表,否则norm的时候会乱掉,调整起来多少有些麻烦。当然,有些人也有词表剪枝的需求,去掉冗余的token,比如只要英文,这样可以大大减少参数量。

词表的大小也很重要,词表越大,也会导致Loss越大。有些文章在探讨vocal size的scaling law,很有意思:Scaling Laws with Vocabulary: Larger Models Deserve Larger Vocabularies (arxiv.org)。数据瓶颈就减小词表,够的话自然上大词表,vocab size经验一般是64的倍数。

https://arxiv.org/abs/2407.13623v1

自然语言处理中,从头实现语言模型是一个具有挑战性但有价值的任务。 ### 实现方法 #### 数据准备 需要收集大量文本数据,对其进行清洗、分词等预处理操作。例如,去除文本中的特殊符号、停用词等,将文本分割成单个的词语或子词。可以使用常见的分词工具,如 NLTK、SpaCy 等。 #### 模型架构选择 - **循环神经网络(RNN)**:是早期用于语言模型的经典架构,它可以处理序列数据,但存在梯度消失或梯度爆炸问题,在处理长序列时效果不佳。 - **长短期记忆网络(LSTM)**:是对 RNN 的改进,通过引入门控机制,能够更好地捕捉序列中的长期依赖关系。 - **门控循环单元(GRU)**:也是一种改进的循环神经网络,它在保持与 LSTM 相似性能的同时,结构相对简单,计算效率更高。 - **Transformer**:近年来被广泛应用于自然语言处理任务,具有强大的并行计算能力和长序列处理能力。BERT 就是基于 Transformer 架构的预训练语言模型 [^1]。 #### 模型训练 使用准备好的数据对选择的模型进行训练。在训练过程中,需要定义合适的损失函数,如交叉熵损失函数,来衡量模型的预测结果与真实标签之间的差异,并使用优化算法(如随机梯度下降、Adam 等)来更新模型的参数。 #### 模型评估 使用测试数据集对训练好的模型进行评估,常用的评估指标包括困惑度(Perplexity)、准确率、召回率等。 ### 相关资料 #### 书籍 - 《深度学习》(Deep Learning):由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 所著,这本书详细介绍了深度学习的基本概念、算法和应用,包括语言模型的相关内容。 - 《自然语言处理入门》:对自然语言处理的基础算法和技术进行了系统的介绍,适合初学者。 #### 在线课程 - Coursera 上的“Natural Language Processing Specialization”:由顶尖高校的教授授课,涵盖了自然语言处理的各个方面,包括语言模型的实现。 - edX 上的“Introduction to Natural Language Processing”:提供了丰富的教学资源和实践项目。 #### 开源代码 - GitHub 上有许多开源自然语言处理项目,例如 PyTorch 和 TensorFlow 的官方示例代码,其中包含了从头实现语言模型的代码示例。 ```python # 以下是一个简单的使用 PyTorch 实现的基于 LSTM 的语言模型示例 import torch import torch.nn as nn class LSTMLanguageModel(nn.Module): def __init__(self, vocab_size, embedding_dim, hidden_dim): super(LSTMLanguageModel, self).__init__() self.embedding = nn.Embedding(vocab_size, embedding_dim) self.lstm = nn.LSTM(embedding_dim, hidden_dim, batch_first=True) self.fc = nn.Linear(hidden_dim, vocab_size) def forward(self, x): embedded = self.embedding(x) output, _ = self.lstm(embedded) logits = self.fc(output) return logits # 示例使用 vocab_size = 1000 embedding_dim = 128 hidden_dim = 256 model = LSTMLanguageModel(vocab_size, embedding_dim, hidden_dim) input_tensor = torch.randint(0, vocab_size, (1, 10)) output = model(input_tensor) print(output.shape) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曼城周杰伦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值