InternLM2 是一款由上海人工智能实验室和合作伙伴共同开发的第二代大规模语言模型。InternLM2 是在 InternLM 基础上进一步优化和扩展的版本,旨在提升模型的性能、理解能力和生成能力。
一、introduce
(一)上下文长度
扩展大型语言模型(LLMs)上下文长度是当前研究的热点课题,因为许多下游应用,例如检索增强生成(RAG)和智能代理,都依赖于长上下文。InternLM2 采用了一系列方法来有效地扩展上下文长度,具体如下:
1.组查询注意力(Group Query Attention, GQA):
- InternLM2 使用组查询注意力机制,在处理长序列时能够减少内存占用。GQA 通过将查询分组处理,降低了计算复杂度和内存需求,使得在推理阶段处理长上下文更加高效。
2.预训练阶段:
- 初始训练:InternLM2 首先使用4k上下文文本进行初始训练。这个阶段主要目的是使模型具备处理较长文本的基本能力。
- 进一步训练:在初始训练后,InternLM2 转向使用高质量的32k文本进行进一步训练。通过增加训练文本的长度,模型能够更好地适应长上下文,并提升处理长文本的能力。
3.位置编码外推(Positional Encoding Extrapolation):
- 在训练完成后,InternLM2 通过位置编码外推技术(如 LocalLLaMA, 2023),进一步扩展其上下文长度。位置编码外推允许模型在处理远超过训练时上下文长度的文本时,仍能保持良好的性能。
- 这种技术使得 InternLM2 在“针在干草堆”测试中表现出色,能够处理长度达到200k的上下文。这意味着模型在处理极长文本时,仍能有效地理解和生成相关内容。
(二)模型命名
InternLM2 在不同阶段发布了多个模型,包括预强化学习(pre-RLHF)和后强化学习(post-RLHF)阶段的模型。具体命名和发布如下:
-
预强化学习阶段模型(InternLM2-Chat-{size}-SFT):
- 这些模型是在进行强化学习之前的模型版本。SFT 代表“Supervised Fine-Tuning”(监督微调),意味着这些模型经过了初步的监督微调训练,具备一定的基础能力。
- 这些模型适用于需要高效、可靠的基础对话生成和理解的场景。
-
后强化学习阶段模型(InternLM2-Chat-{size}):
- 这些模型在经过强化学习后发布。强化学习阶段通常包括人类反馈强化学习(RLHF),进一步提升模型在对话生成和互动中的表现。
- 这些模型适用于需要更高精度和更自然互动体验的应用场景。
例如,对于不同大小的模型版本,它们的命名可能是:
- InternLM2-Chat-7B-SFT:表示7亿参数量的预强化学习阶段模型。
- InternLM2-Chat-13B:表示13亿参数量的后强化学习阶段模型。
通过发布这些模型,用户可以选择最适合自己需求的模型版本,无论是需要基础能力的预强化学习模型,还是需要经过进一步优化的后强化学习模型。
二、Infrastructure
(一)InternEvo
该框架能够在成千上万的GPU上进行训练
三、Pre-train
(一)Pre-training data
1.Text Data
对于网页和论文等数据进行数据规范化和过滤等操作,得到最终数据。
Data Formatting
我们将详细介绍使用网页数据的数据处理流水线,以网页数据为例。我们的网页数据主要来自Common Crawl。具体步骤如下:
-
解压缩原始Warc格式文件:
- 首先,我们需要解压缩从Common Crawl获取的原始Warc格式文件。这些文件通常包含大量的网页数据,包括HTML内容、元数据等。
-
HTML解析和主要文本提取:
- 解压缩后,我们使用Trafilatura(Barbaresi, 2021)库进行HTML解析和主要文本提取。Trafilatura能够高效地从HTML文档中提取主要的文本内容,同时过滤掉无关的HTML标签和广告等噪音数据。
import trafilatura def extract_main_text(html_content): return trafilatura.extract(html_content)
-
语言检测和分类:
- 接下来,我们使用pycld2库进行主要文本的语言检测和分类。pycld2是一款高效的语言检测工具,可以准确地识别文本的语言类别。
import pycld2 as cld2 def detect_language(text): is_reliable, _, details = cld2.detect(text) if is_reliable: return details[0][1] # 返回检测到的语言 return 'unknown'
-
数据格式化和存储:
- 最后,我们为每条数据分配一个唯一标识符,并将处理后的数据存储为jsonl(JSON lines)格式。jsonl格式是一种常用于大规模数据处理的文件格式,每行都是一个JSON对象,便于数据的逐行读写和处理。
import json import uuid def process_and_store_data(html_content): main_text = extract_main_text(html_content) language = detect_language(main_text) data_id = str(uuid.uuid4()) data = { 'id': data_id, 'text': main_text, 'language': language } with open('processed_data.jsonl', 'a') as outfile: outfile.write(json.dumps(data) + '\n')
通过以上步骤,我们能够从原始的Warc文件中提取主要的文本内容,进行语言检测,并将处理后的数据以jsonl格式存储,便于后续的分析和使用。这一数据处理流水线不仅高效,而且确保了数据的格式统一和质量可靠。
Rule-based Stage
网页数据通常包含大量低质量数据,如解析错误、格式错误和非自然语言文本。为了提升数据质量,我们设计了一系列基于规则的正则化和过滤方法。这些方法旨在修改和过滤数据,从而得到更高质量的文本内容。这种做法在Gopher(Rae et al., 2021)、C4(Dodge et al., 2021)和RefinedWeb(Penedo et al., 2023)中也有所体现。
以下是我们的规则设计和应用步骤:
-
异常分隔和换行检测:
- 检查文本中是否存在异常的分隔符和换行符。例如,连续的换行符或不合理的分隔符可能表示数据质量问题。
def check_separators_and_line_breaks(text): # 检测连续的换行符 if '\n\n\n' in text: return False # 检测不合理的分隔符(示例) if '---' in text: return False return True
-
异常字符频率检测:
- 统计文本中异常字符的频率,过高的异常字符频率可能表示数据质量问题。例如,罕见字符或乱码可能是低质量数据的标志。
import re def check_abnormal_characters(text): abnormal_characters = re.findall(r'[^\w\s.,!?]', text) # 查找非字母、数字、空白、标点的字符 if len(abnormal_characters) / len(text) > 0.05: # 异常字符占比超过5% return False return True
-
标点符号分布检测:
- 检查文本中标点符号的分布,异常的标点符号分布可能表示数据质量问题。例如,过多的连续标点符号或标点符号比例失衡。
def check_punctuation_distribution(text): punctuation_count = sum([1 for char in text if char in '.,!?']) if punctuation_count / len(text) > 0.1: # 标点符号占比超过10% return False return True
-
应用过滤规则:
- 通过上述规则过滤文本,保留高质量的数据。
def filter_text(text): if not check_separators_and_line_breaks(text): return False if not check_abnormal_characters(text): return False if not check_punctuation_distribution(text): return False return True def process_and_store_clean_data(html_content): main_text = extract_main_text(html_content) if filter_text(main_text): language = detect_language(main_text) data_id = str(uuid.uuid4()) data = { 'id': data_id, 'text': main_text, 'language': language } with open('clean_data.jsonl', 'a') as outfile: outfile.write(json.dumps(data) + '\n')
通过应用这些基于规则的过滤方法,我们可以有效地去除低质量数据,从而得到更为干净和高质量的文本数据。这样不仅提高了数据集的整体质量,也为后续的模型训练提供了更可靠的数据基础。
2.Code Data
为了构建丰富的训练数据集,我们从多个来源收集数据,包括直接从GitHub爬取的代码数据、公共数据集,以及与编程和编码相关的在线资源,如问答论坛、教程网站和API文档。
3.Long Context Data
大于32K,而且在text data中,所以long context data会被训练两次
(二) Pre-training Phases
这段内容详细介绍了大语言模型(LLM)在预训练过程中的不同阶段以及具体的训练方法。以下是详细的解释:
预训练阶段
-
总预训练数据量:
- 用于预训练1.8B、7B和20B模型的总词元数量在2.0万亿到2.6万亿之间。
- 预训练过程分为三个不同的阶段。
-
第一阶段:
- 使用长度不超过4k词元的预训练语料库。
-
第二阶段:
- 包括50%的长度不超过32k词元的预训练语料库。
-
第三阶段:
- 使用能力特定的增强数据。
在每个阶段中,混合了英语、中文和代码的数据。
4k上下文训练(3.3.1)
- 训练步骤:约90%的训练步骤使用长度最多为4096词元的数据。
- 数据处理:如果数据长度超过4096词元,会强制截断并使用剩余部分进行训练。
长上下文训练(3.3.2)
- 增强模型性能:使用扩展的上下文窗口显著提高了LLM在检索增强生成和智能代理等应用中的性能。
- 训练过程:从4K上下文语料库开始训练,然后转向32K上下文语料库。在长上下文训练阶段,仍有50%的数据长度小于4096词元。
- 训练步数:这一长上下文训练阶段占总训练步骤的约9%。
- 位置编码调整:为了适应这些更长的序列,将旋转位置嵌入(RoPE)的基数从50,000调整到1,000,000,以确保更有效的长上下文位置编码。
- 训练效率:由于InternEvo和闪存注意力(flash attention)的良好可扩展性,在将上下文窗口从4K调整到32K时,训练速度仅下降了40%。
四、Alignment 阶段
预训练阶段为大型语言模型(LLMs)提供了解决各种任务所需的基础能力和知识。为了进一步挖掘LLMs的潜力,并指导其成为有用且无害的AI助手,我们进行了精调阶段,这通常被称为“Alignment”阶段,包含两个主要部分:监督微调(SFT)和从人类反馈中进行强化学习(RLHF)。
(一) 监督微调(SFT)
- 数据集:使用包含1000万个指令数据实例的数据集,这些数据经过筛选,确保其有用且无害。数据涵盖广泛的主题,包括一般对话、NLP任务、数学问题、代码生成和函数调用等。
- 数据格式:将数据样本转换为ChatML格式,以便多任务的多样化表示。
- 训练设置:使用AdamW优化器,初始学习率为4e-5,7B和20B模型进行一个epoch的训练。
(二) 从人类反馈中进行强化学习(COOL RLHF)
- 挑战:RLHF面临的主要问题包括偏好冲突和奖励破解。
- 解决方案:提出了条件在线RLHF(COOL RLHF),引入条件奖励机制来协调不同的偏好,并采用多轮在线RLHF策略以减少奖励破解的发生。
条件奖励模型
- 创新性:通过不同的系统提示来处理不同的偏好,使单一奖励模型能够有效地管理多种偏好。
- 数据组成:训练过程中使用了240万个二值化的偏好对,数据涵盖对话、文章写作、诗歌、摘要、编码、数学和格式化输出等多个领域。
- 损失函数:引入难度衰减系数的排名损失函数和对奖励分数的对数屏障惩罚,以提高奖励模型的鲁棒性和一致性。
在线RLHF
- 快速路径:迅速识别和修正奖励破解问题,通过偏好对的构造来提高奖励模型的可靠性。
- 慢速路径:通过专业人类标注,进行全面的奖励模型改进,覆盖最新和最强的模型响应。
PPO训练细节
- 框架:包含四个模型:actor模型、critic模型、参考模型和奖励模型。训练过程中冻结后两者,只训练前两者。
- 初始化:参考模型和actor模型从SFT模型权重初始化,critic模型从奖励模型初始化,并进行50次迭代的预训练。
- 条件奖励:根据不同领域的查询,前置适当的条件系统提示以计算奖励分数,确保模型响应与不同领域需求一致。
- 超参数设置:包括KL散度系数、学习率、预训练损失系数等,以确保PPO阶段的稳定训练。
(三)长上下文微调
为了在微调后保持LLMs的长上下文能力,我们在SFT和RLHF中继续使用长上下文预训练数据。这些数据包括来自书籍的长上下文数据和从GitHub仓库获取并通过特定范式连接的长上下文数据。
(四)工具增强的LLMs
- 通用工具调用:采用修改后的ChatML格式引入“environment”角色,以支持各种插件扩展和AI环境。
- 代码解释器:通过将Python代码解释器视为特殊工具,增强InternLM2-Chat解决数学问题的能力。
InternLM2是一款性能优异的大型语言模型,涵盖1.8B、7B和20B的模型规模,经过超过2万亿高质量语料库的训练。为了支持长上下文处理,InternLM2采用GQA技术降低推理成本,并训练了长达32k上下文的数据。我们不仅开源了模型,还提供了训练过程各阶段的检查点。
报告详细描述了InternLM2的训练方法,包括训练框架、各种预训练数据和对齐数据。此外,为解决RLHF中的偏好冲突问题,我们提出了条件在线RLHF(Conditional Online RLHF)方法。这些信息为准备预训练数据和有效训练大型模型提供了宝贵的见解。