当前位置:   article > 正文

大语言模型的底层原理,ChatGPT,文心一言等人工智能体是如何产生的?本文将详细讲解_大语言模型训练原理

大语言模型训练原理


基础介绍

  • 大语言模型是指在海量无标注文本数据上进行预训练得到的大型预训练语言模型,例如 GPT-3。
  • 目前大语言模型所需要具有的最小参数规模还没有一个明确的参考标准,但是大语言模型通常是指参数规模达到百亿、千亿甚至万亿的模型;也有部分工作认为经过大规模数据预训练(显著多于传统预训练模型如 BERT 所需要的训练数据)的数十亿参数级别的模型也可 以称之为大语言模型(如 LLaMA-2 7B)。
  • 对于大语言模型,这里泛指具有超大规模参数或者经过超大规模数据训练所得到的语言模型。与传统语言模型相比,大语言模型的构建过程涉及到更为复杂的训练方法,进而展现出了强大的自然语言理解能力和复杂任务求解能力(通过文本生成的形式)。

从机器学习的观点来说,神经网络是一种具有特定模型结构的函数形式,而大语言模型则是一种基于 Transformer 结构的神经网络模型。

因此,可以将大语言模型看作一种拥有大规模参数的函数,它的构建过程就是使用训练数据对于模型参数的拟合过程。尽管所采用的训练方法与传统的机器学习模型(如多元线性回归模型的训练)可能存在不同,但是本质上都是在做模型参数的优化。大语言模型的优化目标更加泛化,不仅仅是为了解决某一种或者某一类特定任务,而是希望能够作为通用任务的求解器。

为了实现这一宏大的目标,大语言模型的构建过程需要更为复杂、精细的训练方法。一般来说,这个训练过程可以分为大规模预训练和指令微调与人类对齐两个阶段

一、预训练

预训练是研发大语言模型的第一个训练阶段,也是最为重要的一个阶段。

有效的预训练能够为大语言模型的能力奠定坚实的基础:通过在大规模语料上进行预训练,大语言模型可以获得通用的语言理解与生成能力,掌握较为广泛的世界知识,具备解决众多下游任务的性能潜力。在这一过程中,预训练语料的规模和质量对于提升大语言模型的能力至关重要。

1.数据准备

为了构建功能强大的大语言模型,需要从多元化的数据源中收集海量数据来进行训练。现有的大语言模型主要将各种公开的文本数据进行混合,作为预训练语料。

根据来源不同,预训练数据主要分为两种类型:通用文本数据和专用文本数据。

通用文本数据涵盖了网页、书籍和对话文本等。由于通用文本数据规模较大、多样性强且易于获取,大多数大语言模型都会收集大量的通用文本数据,以增强其语言建模能力。此外,为了进一步提升大语言模型在特定专业任务上的表现,人们还将预训练语料的范围扩展至更专业的数据集,如多语数据、科学数据和代码数据等。

预训练数据预处理流程图
在这里插入图片描述
当收集了丰富的文本数据之后,为了确保数据的质量和效用,还需要对数据进行预处理,从而消除低质量、冗余、无关甚可能有害的数据

质量过滤

直接收集到的文本数据往往掺杂了很多低质量的数据。例如,从网页抓取的数据中可能包含由机器自动生成的广告网页。为了优化模型学习的性能,需要去除语料库中的低质量数据。目前,研究人员主要使用以下两种数据清洗方法:(1)基于启发式规则的方法,和(2)基于分类器的方法。

敏感内容过滤

除了去除低质量内容,收集到的数据还可能包括有毒内容或隐私信息,需要进一步进行更为细致的过滤和处理。与质量过滤类似,不同类型的数据内容往往需要采用特定的过滤规则。

数据去重

对预训练数据进行去重处理是一个重要步骤。由于大语言模型具有较强的数据拟合与记忆能力,很容易习得训练数据中的重复模式,可能导致对于这些模式的过度学习。

研究工作发现,预训练语料中出现的重复低质量数据可能诱导模型在生成时频繁输出类似数据,进而影响模型的性能。此外,这些数据也可能导致训练过程的不稳定(训练损失震荡),可能导致训练过程崩溃。此外,为了避免数据集污染问题,还需要从预训练数据集中删除在测试集中可能出现的重复或者相关文本,从而防止训练集和测试集之间的重叠。总体来说,去重算法的设计可以基于不同的计算粒度以及匹配方法。

数据预处理实践

质量过滤

在过滤阶段,被判断为低质量的数据会被直接丢弃;而在清洗阶段,经过清洗后的高质量文本会替换原始文本。质量过滤阶段的实现可以依赖于启发式规则(如数据集统计特征、正则表达式匹配等)、预训练模型度量(如模型困惑度等)和语言标签判别(如语言分类器打分)等。用户还可以对数据进行采样,自由组合和安排预定义的算子灵活定制数据质量过滤流水线。

下面以使用 FastText 的语言过滤模块为例来展示实现细节。首先,加载预训练好的 FastText 语言分类器,为每个输入文本生成一个语言标签,不符合配置文件中语言类别的文本将被过滤。

from utils.evaluator import LangIdentifier

class FilterPassageByLangs():
    def __init__(self) -> None:
        # 使用 LangIdentifier 模块加载已经训练好的 fasttext 模型
        self.language_identifier = LangIdentifier(model_path="utils/models/fasttext/lid.176.bin")
        self.reject_threshold = 0.5
    def filter_single_text(self, text: str, accept_lang_list: list) -> bool:
        # 使用 fasttext 模型给 text 打分,每种语言生成一个置信分数
        labels, scores = self.language_identifier.evaluate_single_text(text)
        # 如果 text 所有语言的分数均比 reject_threshold 要低,则直接定义为未知
        if socres[0] < self.reject_thereshold:
            labels = ["uk"]
        accept_lang_list = [each.lower() for each in accept_lang_list]
        # 如果分数最高的语言标签不在配置文件期望的语言列表中,则丢弃该文本
        if labels[0] not in accept_lang_list:
            return True
        return False

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

去重

在去重阶段,YuLan-GARDEN 集成了句子级和文档级去重方法,分别基于句子间 声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】

推荐阅读
相关标签