当前不少工作选择在一个较强的基座模型上进行微调且通常效果不错如[alpaca]、[vicuna] 等。这种成功的前提在于预训练模型和下游任务的差距不大预训练模型中通常已经包含微调任务中所需要的知识。但在实际情况中我们通常会遇到一些问题使得我们无法直接使用一些开源 backbone大多数开源基座对中文的支持都不太友好例如[Llama]、[mpt]、[falcon] 等这些模型在英文上效果都很优秀但在中文上却差强人意。续写任务测试LLaMAMPT杭州西湖是杭州西湖是杭州的一个静静的一个游泳池游泳池是杭州西湖的一个游泳池游泳池是杭州西湖的一个游泳池游泳池是杭州西湖的一个游泳池杭州西湖是中国最大的湖泊是中国最大的湖泊是中国最大的湖泊是中国最大的湖泊是中国最大的湖泊是中国最大的湖泊是中国最大的湖泊琅琊榜的导演是琅琊榜的导演是很多的人都不知道因为他的父亲是一位杰作家他的父亲的杰作家是一位杰作家琅琊榜的导演是谁Who are the directors of the Rolling Stone?琅琊榜的导演是谁Who are the2.专业知识不足当我们需要一个专业领域的 LLM 时预训练模型中的知识就尤为重要。由于大多数预训练模型都是在通用训练语料上进行学习对于一些特殊领域金融、法律等中的概念和名词无法具备很好的理解。我们通常需要在训练语料中加入一些领域数据如[xuanyuan 2.0]以帮助模型在指定领域内获得更好的效果。轩辕 2.0金融对话模型论文中所提及的训练语料分布其中 Financial Pretraining 为金融语料基于上述原因我们在进行 SFT 步骤之前先来看看预训练任务是如何做的。Tokenizer Training在进行预训练之前我们需要先选择一个预训练的模型基座。一个较为普遍的问题是大部分优秀的语言模型都没有进行充分的中文预训练因此许多工作都尝试将在英语上表现比较优秀的模型用中文语料进行二次预训练期望其能够将英语上的优秀能力迁移到中文任务中来。已经有许多优秀的仓库做过这件事情比如[ Chinese-LLaMA-Alpaca]。但在进行正式的训练之前我们还有一步很重要的事情去做词表扩充。通俗来讲tokenizer 的目的就是将一句话进行切词并将切好词的列表喂给模型进行训练。例如输入句子 你好世界 切词结果 [你, 好, 世, 界]通常tokenizer 有 2 种常用形式WordPiece和BPE。WordPieceWordPiece 很好理解就是将所有的「常用字」和「常用词」都存到词表中当需要切词的时候就从词表里面查找即可。bert-base-chinese tokenizer 可视化上述图片来自可视化工具 [ tokenizer_viewer]。如上图所示大名鼎鼎的 BERT 就使用的这种切词法。当我们输入句子你好世界BERT 就会依次查找词表中对应的字并将句子切成词的组合。BERT 切词测试图当遇到词表中不存在的字词时tokenizer 会将其标记为特殊的字符 [UNK]Out of VocabularyOOV情况Byte-level BPEBBPE感谢评论区指正有关 BBPE 的原理可以参考 [ 这里]。WordPiece 的方式很有效但当字词数目过于庞大时这个方式就有点难以实现了。对于一些多语言模型来讲要想穷举所有语言中的常用词穷举不全会造成 OOV既费人力又费词表大小为此人们引入另一种方法BBPE。BPE 不是按照中文字词为最小单位而是按照unicode 编码作为最小粒度。对于中文来讲一个汉字是由 3 个 unicode 编码组成的因为平时我们不会拆开来看毕竟中文汉字是不可拆分的所以我一开始对这个概念也不太熟悉。我们来看看 LLaMA 的 tokenizer 对中文是如何进行 encode 的LLaMa tokenizer 中文测试上述图片来自可视化工具 [ tokenizer_viewer]。可以看到「编码」两个字能够被正常切成 2 个字但「待」却被切成了 3 个 token这里的每个 token 就是 1 个 unicode 编码。LLaMA tokenizer 查找结果「待」不在词表中「编」「码」在词表中通过 token 查找功能我们可以发现「编」「码」在词表中但「待」不在词表中。但任何 1 个汉字都是可以由 unicode 表示只是组合顺序不同因此「待」就被切成了 3 个 token。BBPE 的优势不会出现 OOV 的情况。不管是怎样的汉字只要可以用 unicode 表示就都会存在于词表中。BBPE 的劣势模型训练起来将会更吃力一些。毕竟像「待」这样的汉字特定 unicode 组合其实是不需要模型学习的但模型却需要通过学习来知道合法的 unicode 序列。通常在模型训练不够充足的时候模型会输出一些乱码不合法的 unicode 序列游泳池是杭州西湖的一个游泳池词表扩充为了降低模型的训练难度人们通常会考虑在原来的词表上进行「词表扩充」也就是将一些常见的汉字 token 手动添加到原来的 tokenizer 中从而降低模型的训练难度。我们对比 [Chinese-LLaMA] 和 [LLaMA] 之间的 tokenizer 的区别Chinese LLaMA 和 原始LLaMA 之间 tokenizer 的区别上述图片来自可视化工具 [ tokenizer_viewer]。我们可以发现Chinese LLaMA 在原始 tokenizer 上新增了17953 个 tokens且加入 token 的大部分为汉字。而在 [BELLE] 中也有同样的做法在 120w 行中文文本上训练出一个 5w 规模的 token 集合并将这部分 token 集合与原来的 LLaMA 词表做合并最后再在 3.2B 的中文语料上对这部分新扩展的 token embedding 做二次预训练。语言模型预训练在扩充完 tokenizer 后我们就可以开始正式进行模型的预训练步骤了。Pretraining 的思路很简单就是输入一堆文本让模型做 Next Token Prediction 的任务这个很好理解。我们主要来讨论几种预训练过程中所用到的方法数据源采样、数据预处理、模型结构。数据源采样在 [gpt3] 的训练过程中存在多个训练数据源论文中提到对不同的数据源会选择不同采样比例GPT3 Paper Page-9通过「数据源」采样的方式能够缓解模型在训练的时候受到「数据集规模大小」的影响。从上图中可以看到相对较大的数据集Common Crawl会使用相对较大的采样比例60%这个比例远远小于该数据集在整体数据集中所占的规模410 / 499 82.1%因此CC 数据集最终实际上只被训练了 0.440.6 / 0.82 * (300 / 499个 epoch。而对于规模比较小的数据集Wikipedia则将多被训练几次3.4 个 epoch。这样一来就能使得模型不会太偏向于规模较大的数据集从而失去对规模小但作用大的数据集上的学习信息。数据预处理数据预处理主要指如何将「文档」进行向量化。通常来讲在 Finetune 任务中我们通常会直接使用 truncation 将超过阈值2048的文本给截断但在 Pretrain 任务中这种方式显得有些浪费。以书籍数据为例一本书的内容肯定远远多余 2048 个 token但如果采用头部截断的方式则每本书永远只能够学习到开头的 2048 tokens 的内容连序章都不一定能看完。因此最好的方式是将长文章按照 seq_len2048作分割将切割后的向量喂给模型做训练。模型结构为了加快模型的训练速度通常会在 decoder 模型中加入一些 tricks 来缩短模型训练周期。目前大部分加速 tricks 都集中在 Attention 计算上如MQA 和 Flash Attention [falcon] 等此外为了让模型能够在不同长度的样本上都具备较好的推理能力通常也会在 Position Embedding 上进行些处理选用 ALiBi[Bloom]或 RoPE[GLM-130B]等。具体内容可以参考下面这篇文章​编辑何枝【LLM 加速技巧】Muti Query Attention 和 Attention with Linear Bias附源码345 赞同 · 23 评论 文章Warmup Learning Ratio 设置在继续预训练中我们通常会使用 warmup 策略此时我们按照 2 种不同情况划分当训练资源充足时应尽可能选择较大的学习率以更好的适配下游任务当资源不充足时更小的学习率和更长的预热步数或许是个更好的选择。具体内容可以参考下面这篇文章​编辑何枝如何更好地继续预训练Continue PreTraining300 赞同 · 20 评论 文章1.3 数据集清理中文预训练数据集可以使用 [悟道]数据集分布如下主要以百科、博客为主悟道-数据分布图但开源数据集可以用于实验如果想突破性能则需要我们自己进行数据集构建。在 [falcon paper] 中提到仅使用「清洗后的互联网数据」就能够让模型比在「精心构建的数据集」上有更好的效果一些已有的数据集和它们的处理方法如下各种数据源 数据清理方法有关 Falcon 更多的细节可以看这里​编辑何枝【Falcon Paper】我们是靠洗数据洗败 LLaMA 的370 赞同 · 13 评论 文章大模型token https://teniuapi.online/1.4 模型效果评测关于 Language Modeling 的量化指标较为普遍的有 [PPL][BPC] 等可以简单理解为在生成结果和目标文本之间的 Cross Entropy Loss 上做了一些处理。这种方式可以用来评估模型对「语言模板」的拟合程度即给定一段话预测后面可能出现哪些合法的、通顺的字词。但仅仅是「生成通顺句子」的能力现在已经很难满足现在人们的需求大部分 LLM 都具备生成流畅和通顺语句能力很难比较哪个好哪个更好。为此我们需要能够评估另外一个大模型的重要能力 —— 知识蕴含能力。C-Eval一个很好的中文知识能力测试数据集是 [C-Eval]涵盖1.4w 道选择题共 52 个学科。覆盖学科如下c-eval 数据集覆盖学科图由于是选择题的形式我们可以通过将题目写进 prompt 中并让模型续写 1 个 token判断这个续写 token 的答案是不是正确答案即可。但大部分没有精调过的预训练模型可能无法续写出「A B C D」这样的选项答案因此官方推荐使用 5-shot 的方式来让模型知道如何输出答案以下是中国关于会计考试的单项选择题请选出其中的正确答案。 下列关于税法基本原则的表述中不正确的是____。 A. 税收法定原则包括税收要件法定原则和税务合法性原则 B. 税收公平原则源于法律上的平等性原则 C. 税收效率原则包含经济效率和行政效率两个方面 D. 税务机关按法定程序依法征税可以自由做出减征、停征或免征税款的决定 答案D 甲公司是国内一家领先的新媒体、通信及移动增值服务公司由于遭受世界金融危机甲公司经济利润严重下滑经营面临困境但为了稳定职工队伍公司并未进行裁员而是实行高层管理人员减薪措施。甲公司此举采用的收缩战略方式是____。 A. 转向战略 B. 放弃战略 C. 紧缩与集中战略 D. 稳定战略 答案C ... # 第 3, 4, 5 道样例题 下列各项中不能增加企业核心竞争力的是____。 A. 产品差异化 B. 购买生产专利权 C. 创新生产技术 D. 聘用生产外包商 答案通过前面的样例后模型能够知道在「答案」后面应该输出选项字母。于是我们获得模型续写后的第一个 token 的概率分布logits并取出「A B C D」这 4 个字母的概率通过 softmax 进行归一化probs ( torch.nn.functional.softmax( torch.tensor( [ logits[self.tokenizer.encode( A, bosFalse, eosFalse)[0]], logits[self.tokenizer.encode( B, bosFalse, eosFalse)[0]], logits[self.tokenizer.encode( C, bosFalse, eosFalse)[0]], logits[self.tokenizer.encode( D, bosFalse, eosFalse)[0]], ] ), dim0, ).detach().cpu().numpy() ) pred {0: A, 1: B, 2: C, 3: D}[np.argmax(probs)] # 将概率最大的选项作为模型输出的答案C-Eval 通过这种方式测出了许多模型在中文知识上的效果由于是 4 选项问题所以基线随机选择的正确率是 25%。C-Eval 也再一次证明了 GPT-4 是个多么强大的知识模型各模型在 5-shot 下的得分排名