查看原文
其他

InternLM2技术报告

刘聪NLP NLP工作站 2024-04-07

写在前面

大家好,我是刘聪NLP。

之前分享过Llama2Baichuan2QwenYi的技术报告,今天给大家带来InternLM2的技术报告的细节分享。

Paper: https://arxiv.org/abs/2403.17297
Github: https://github.com/InternLM/InternLM

下面分享内容主要涉及数据处理、预训练、微调、条件在线强化学习的部分内容。

预训练数据构造

大模型时代,数据的重要性已经不言而喻,无论是预训练阶段、还是指令微调、偏好对齐阶段,都离不开高质量数据。InternLM2的预训练数据主要由纯文本数据、代码数据、长文本数据构成。

文本数据

对于预训练阶段的文本数据,主要来自网页、论文、专利和书籍,详细分布如下所示,中英之间的比例大约为1:3。书籍和技术文献数据量占比相对较少,但由于平均文档长度较长,内容质量较高,数据更为重要。

预训练阶段文本数据分布情况

对于文本数据的完整数据清洗流程,详细如下图所示,包含数据格式化、规则清洗、文本去重、安全过滤和质量过滤五个阶段。

  • 数据格式化:网页数据主要来自Common Crawl,需要先解压原始WARC格式文件,再使用Trafilatura进行HTML解析并提取文本内容,然后利用pycld24进行语言检测和内容分类,并记录,最终将数据按jsonl格式进行存储,得到格式化数据。
  • 规则清洗:设计一系列基于启发式的方法,对网页抽取文本进行分隔和断行的异常检测、异常字符的频率检测、标点符号的分布检测等操作进行数据的规则清洗。
  • 文本去重:采用基于局部敏感哈希(LSH)的方法对数据进行模糊去重。具体为利用MinHash方法在文档的5-Gram上构建128行的签名矩阵,通过0.7阈值对文档进行相似过滤,得到最终的去重数据。
  • 安全过滤:先采用“域名屏蔽”和“词汇屏蔽”进行初筛,再利用“色情检测器”、“毒性检测器”对文本进行二次筛选,以获取更加安全的数据集。
    • 不安全域名列表由约1300万个域名组成;
    • 敏感词汇列表由36289个敏感词汇组成;
    • 毒性检测器采用Kaggle上“毒性评论分类挑战”的数据训练一个BERT模型;
    • 色情检测器是将去重后的数据采样一部分并使用Perspective API进行数据标注,构建一个色情分类数据集,再训练BERT模型。
  • 质量过滤:网页文本中充斥着广告和难以阅读且缺乏逻辑连贯性的文本,用过“广告过滤器”和“流畅性检测器”进行文本质量过滤。其中广告数据(是否包含广告内容)以及流畅性数据(根据一致性、噪音、信息量和语法四个方面评分)均由人工标注,再对BERT模型进行微调获取。

代码数据

编程能力是大模型的重要能力之一,并且大量研究表明预训练阶段增加代码数据可以提高大模型的逻辑推理能力,因此代码数据是预训练过程中必不可少的部分。InternLM2的代码数据主要来自GitHub、公共数据集、编程和编码相关的在线资源(论坛、教程网站、API文档)等,具体不同编程语言数据如下图所示,处理流程主要包括格式清理、代码去重、质量过滤和依赖排序。

  • 格式清理:将所有代码数据统一转换成markdown格式,主要是markdown兼容代码和文本混排,有利于教会大模型更好地编程。
  • 代码去重:去重方式与文本去重相似,只不过代码去重过程中,以文件为单位,可以更好地保持上下文的完整性。
  • 质量过滤:采用规则评分器和模型评分器混合过滤策略。为了获取更可靠的模型评分器(不同编程语言对模型评分器影响很大,最终只选择一致性较高的编程语言利用模型进行评分),采用如下图所示的迭代标注流程,主要标注评分器标记的高置信度的高质量和低质量数据,总共经过三次迭代。
  • 依赖排序:InternLM2上下文窗口可达到32K Tokens,可以将代码仓库中的所有代码文件进行学习,但代码文件中存在一定的连接顺序,排序代码之间的依赖关系,可以让大模型更好地学习长依赖能力。真实排序规则,将md文件排在子文件夹中第一个代码文件前面,代码文件之间的排序,采用正则表达式检测代码之间的“导入”关系(参考“__init__.py”或“include xx.h”文件),并利用拓扑排序确定文件的连接顺序选择最短路径。

最终代码的高中低三种不同质量分布如下表所示,在模型预训练过程中,对于高质量代码数据会进行多次采样、对于中等质量代码数据仅采样一次,低质量代码数据不会被使用。

代码质量数据分布情况

长文本数据

InternLM2设计了一套数据过滤管道筛选低质量的长文本数据,包括长度选择、统计过滤、困惑度过滤三个阶段。

  • 规则过滤器:选择文本长度超过32K的文本;
  • 统计过滤器:根据各种词汇和语言学特征构建统计过滤器(应包含连词和其他暗示语篇结构的词汇,如“尤其是”、“正式地”等),参考LongWanjuan方法,原则是过滤掉无意义的数据,而不是选择高质量的数据。
  • 困惑度过滤器:利用文本段之间的困惑度差异指标来进行数据过滤,过滤上下文语义层面不连贯的文本,如HTML解析失败文本、媒体随机拼接的摘录文本等。困惑度差异指标主要计算两段文本之间的条件概率,其中S1是在S2之前的文本,当两个文本强相关时,条件概率值大于单独计算S2的概率,困惑度差异值为负值。

对于统计过滤器和困惑度过滤器针对不同数据设置不同的过滤阈值。长文本数据经过数据过滤后,数据分布发生明显变化,网页数据比例大幅下降。

分词器

选取cl100k词表中前60004个词汇,并融合了32397个中文词汇,额外添加了147个预留词汇。

模型预训练

模型预训练过程共涉及三个阶段:

  • 4k长度数据训练:约90%的训练步数属于该阶段,模型的最大输入长度为4096,如果数据超长采用强制截断处理。
  • 32k长度数据训练:约9%的训练步数属于该阶段,模型的最大输入长度为32K,但并不是所有数据都是32K数据,大概50%的数据依然为4K长度。在模型训练期间,将旋转位置编码的基数由50000调整到1000000。
  • 特定能力数据训练:该阶段主要利用一些STEM数据、领域数据、高质量数据进行模型训练,总计24B Tokens,详细如下表所示,为了防止数据泄漏,去除了评测榜中的评测集数据,同时为了更好地适应这些数据,采用了更小的学习率和更大的批次。增强后的模型在代码、推理、问答和考试等任务上具有显著地提升。

模型包括1.8B、7B和20B三个规模,训练数据大于2T Tokens,采用AdamW优化器,其参数设置为β1、β2和ϵ分别为0.9、0.95和1e−8,权重衰减为0.1,采用余弦学习率衰减策略,下降到其最大值的10%。

指令微调

在指令微调阶段用使用了1000万指令数据(保证了有用性和无害性),包含对话、自然语言处理任务、数学问题、代码生成和函数调用等,详细如下图所示。并将所有任务数据均统一为ChatML格式。7B和20B模型分别使用AdamW优化器,初始学习率为4e-5,进行一个epoch的训练。

强化学习

RLHF在偏好对齐阶段已经取得很好的效果,但在实际中仍然存在一些问题:

  • 偏好冲突:我们希望大模型在提供有用信息的同时,又步产生任何有害的内容,但真实情况这两个偏好往往难以同时满足。如果依赖多个偏好模型进行评分,会额外增加训练过程中的模型数量,从而增加计算成本、降低训练速度。
  • 奖励欺骗:当模型参数增大时,模型可能会用过走捷径的方式来获取更高的奖励值,导致模型以非预期的方式优化,严重影响语言模型的有效性和可靠性。

InternLM2提出条件在线的RLHF(Conditional OnLine RLHF,COOL RLHF)方法,通过引入条件奖励机制来调和多样化的偏好,让奖励模型可以根据特定条件动态地将注意力分配给不同的偏好,并采用多轮在线RLHF策略使模型可以快速适应新的人类反馈,减少奖励欺骗发生。

条件奖励模型如下图所示,与传统多偏好模型的区别,主要通过修改系统提示词部分来引导奖励模型对特定场景输出不同的偏好分数。模型的训练数据涉及对话、写作、诗歌、摘要、代码、数学和格式化输出等多个领域,超过240万条。

为了减少训练过程中简单和困难样本不平衡对条件奖励模型的影响,采用Focal Loss对原始Ranking Loss进行改进,让困难样本的损失增大、简单岩本的损失减小。

其中, 表示大于的概率。困难度衰减系数仅在模型正确预测了训练样本的偏好时起作用,即时。是调节困难度衰减比的超参数,默认设置为2。

为确保模型在不同训练中的输出分数的稳定性和一致性,通过引入对数障碍惩罚将奖励值限制在-5到5的之间,

最终模型训练的损失函数为


其中,λ是一个平衡项,用于平衡,默认值为0.02。条件奖励模型在训练时,采用SFT模型进行参数初始化,将输出层修改随机初始化的一维线性层。利用AdamW作为优化器,学习率采用余弦衰减策略,从1e-5降到5e-6,仅训练一轮。在批次构造过程中,保证批次中偏好数据的总长度为16384,避免因为数据填充导致训练效率降低,最大上下文长度为8192。

利用在线HRLF方法解决PPO过程中的奖励滥用情况,主要分为两个独立路径:快速路径(Fast Path)用于立即、有针对性的改进;慢速路径(Slow Path)则用于长期、全面地优化奖励模型。

  • 快速路径 ,在每轮RLHF后识别出奖励滥用模式,通过比较当前轮次中早期和晚期PPO模型生成的响应,构建突显这些模式的偏好对。将20-100个这样的偏好对纳入模型训练过程防止奖励模型受到相应滥用模型的影响。
  • 慢速路径,使用不同训练阶段(包括SFT模型、早期PPO模型和晚期PPO模型)生成的模型响应形成成对比较,然后交给专业人士进行偏好标注,再利用这些偏好数据进行奖励模型训练,可以提高奖励模型的上限,确保奖励模型与人类偏好的复杂性和微妙性同步进化。

PPO训练的过程,总共利用200k指令数据进行了400轮迭代,并选择在验证集上表现最佳的checkpoint进行发布。由于奖励模型训练适应不同的条件,因此对不同领域指令计算奖励分数之前,需要在每个响应前添加合适的条件系统提示,如下图所示。同时为了减轻PPO阶段灾难遗忘的风险,与InstructGPT方法一致,额外加入预训练损失,其中预训练损失系数为0.5。训练过程中,KL散度的系数设置为0.01,动作模型和评论模型学习率分别为1e-6和1e-5。

长文本微调

为了保持大模型微调后的长上下文能力,在SFT和RHLF阶段中需要继续使用长上下文预训练数据,主要使用来自书籍的长上下文数据和从GitHub获得的长上下文数据。为了增强InternLM2的数据分析能力,选择在DS-1000中超过10000个核心仓库。实验结果表明,长上下文代码数据不仅可以提高大模型的长上下文能力,还可以提高大模型的代码能力。

工具增强

通过引入“环境”角色来实现通用工具调用,为了充分激发InternLM2的代理能力,将代理语料库与聊天领域对齐,并通过基本能力对语言模型进行细粒度训练,如Agent-FLAN。

结果

基于OpenCompass榜单进行了综合评测,涉及综合考试、语言和知识、推理和数学、代码、长上下文和工具使用。

Base模型-综合考试榜单
Chat模型-综合考试榜单

利用不同领域数据混合训练的奖励模型,来评估条件系统提示的影响,如下表所示,加入系统提示会显著提高这些领域的奖励值。

并且,在InternLM2在加入增强数据进行预训练时,并没有明显的数据污染。

写在最后

书生系列无论是模型还是框架(例如:lmdeploy、lagent等)都还是蛮良心的,开源不易,且用且珍惜吧。

PS:给公众号添加【星标⭐️】不迷路!您的点赞在看关注是我坚持的最大动力!

欢迎多多关注公众号「NLP工作站」,加入交流群,交个朋友吧,一起学习,一起进步!

我们的口号是“生命不止,学习不停”!

往期推荐:


继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存