赞
踩
对于让大模型处理更长的文本,有一些有效的方法可以考虑:
分块处理:将长文本分割成较短的片段,然后逐个片段输入模型进行处理。这样可以避免长文本对模型内存和计算资源的压力。在处理分块文本时,可以使用重叠的方式,即将相邻片段的一部分重叠,以保持上下文的连贯性。
层次建模:通过引入层次结构,将长文本划分为更小的单元。例如,可以将文本分为段落、句子或子句等层次,然后逐层输入模型进行处理。
部分生成:如果只需要模型生成文本的一部分,而不是整个文本,可以只输入部分文本作为上下文,然后让模型生成所需的部分。例如,输入前一部分文本,让模型生成后续的内容。
注意力机制:注意力机制可以帮助模型关注输入中的重要部分,可以用于处理长文本时的上下文建模。通过引入注意力机制,模型可以更好地捕捉长文本中的关键信息。
模型结构优化:通过优化模型结构和参数设置,可以提高模型处理长文本的能力。例如,可以增加模型的层数或参数量,以增加模型的表达能力。
References
全参数微调所需的显存因多个因素而异,包括模型大小、训练数据长度、优化器类型等。以ChatGLM-6B为例
对于全参数微调所需显存的一般说法是约为推理所需显存的3-4倍,包括模型推理、梯度和优化器状态(AdamW 2倍,SGD 1倍)。因此,ChatGLM-6B 在FP16半精度下,至少需要13GB的显存进行推理。结合模型量化技术,这一需求可以进一步降低到10GB(INT8)和6GB(INT4),使得ChatGLM-6B可以部署在消费级显卡上。
具体的显存需求还取决于模型的其他参数和训练设置。如果你想要微调其他模型,可以根据模型的参数量和训练需求来估算所需显存。
References
有监督微调(SFT) 是指在已经预训练好的语言模型(LLM)的基础上,通过使用有标注的特定任务数据进行进一步的微调,从而使得模型具备遵循指令的能力。通常,LLM的预训练是无监督的,但微调过程往往是有监督的。在进行有监督微调时,模型权重会根据与真实标签的差异进行调整。通过这个微调过程,模型能够捕捉到标签数据中特定于某一任务的模式和特点,使得模型更加精确,更好地适应某一特定任务。
举个简单的例子,假设你有一个已经预训练好的LLM。当输入“我不能登录我的账号,我该怎么办?”时,它可能简单地回答:“尝试使用‘忘记密码’功能来重置你的密码。”这个回答很直接,适用于一般问题,但如果是客服场景,可能就不太合适了。一个好的客服回答应该更有同情心,并且可能不会这么直接,甚至可能包含联系信息或其他细节。这时候,有监督微调就显得非常重要了。经过有监督微调后,你的模型可以提供更加符合特定指导原则的答案。
下面来看下计算损失的步骤来看看SFT的实现原理:
首先,构造数据。SFT的每一条样本一般由两部分组成,即prompt(指令)+ answer。例如:
将prompt和answer拼接,并在answer两侧添加开始和结束的符号,计算prompt/instruction的长度以及后面需要pad的长度。生成一个mask向量,其中answer部分为1,其他部分为0。
将token转为embedding,经过transformer的过程,得到一个维度为(1, 10, vocab_size)的输出。
计算answer部分的loss,通过mask将不希望考虑的地方乘以0,保留answer部分的loss。
References
SFT(Self-Instruct)指令微调数据集是一种用于微调预训练模型的大规模、多样化的开源数据集。它的目的是通过在人类指令和期望输出之间构建配对数据,增强大型语言模型(LLMs)的能力和可控性 .
构建这样的数据集通常涉及以下步骤:
数据收集:首先,需要收集大量的数据。这些数据可以来自现有的数据集,也可以通过特定任务的数据收集获得。
数据预处理:对收集到的数据进行清洗、整理和标准化,以确保数据的质量和可用性。
指令生成:构造人类编写的指令,这些指令将作为模型的输入。这些指令应该具有多样性,涵盖不同类型的任务,例如生成、分类、问答等。
期望输出:为每个指令提供期望的输出。这些输出可以是文本答案、摘要、重写等。
配对数据集:将指令和期望输出配对,形成训练数据集。这些配对数据将用于微调预训练模型。
References
混合通用数据:如果仅仅使用领域数据集进行模型训练,模型容易出现灾难性遗忘现象。因此,在领域训练过程中,加入一定比例的通用数据是必要的。目前并没有一个固定的比例,但一般在领域数据量不是很大时,通用数据比例在1:5到1:10之间是比较合适的 .
SFT数据(MIP):在领域模型的Continue PreTrain阶段,可以同步加入SFT数据,即Multi-Task Instruction PreTraining。这样可以让模型在预训练过程中学习到更多的知识。例如,T5、ExT5、Glm-130b等多任务学习在预训练阶段可能比微调更有帮助.
遵循Chat模型原有的系统指令和数据输入格式:在Chat模型上进行SFT时,应该保持与Chat模型原有的输入格式一致,以确保训练效果明显。此外,建议不采用全量参数训练,以避免模型原始能力的遗忘.
领域评测集的设计:建议有两份领域评测集,一份选择题形式的自动评测,一份开放形式的人工评测。这样可以选择最优的checkpoint,并且任务形式更贴近真实场景.
领域词表扩增:领域词表扩增可能对解码效率有帮助,但对模型效果的提升可能不会很大。因此,是否进行领域词表扩增需要谨慎权衡.
References
在领域模型的预训练过程中,确实有一些技巧可以帮助模型更好地学习到领域知识。以下是一些关键点和建议:
领域相关数据:在预训练时,加入领域相关的技术标准文档、书籍等数据是关键。这些数据通常具有高质量、领域相关性强、知识覆盖广的特点,有助于模型更好地适应领域。
通用数据的混合:仅使用领域数据进行训练可能导致通用能力下降。为了缓解这一问题,可以在领域训练过程中加入通用数据。合适的领域数据和通用数据比例可能因数据量而异,但一般在1:5到1:10之间。
多任务学习:在预训练阶段,可以同步加入下游任务数据,例如T5、ExT5、Glm-130b等多任务学习。这有助于模型在预训练过程中学习到更多的知识。ChatHome的研究也发现,多任务学习在领域上的评测集上效果优异。
选择题形式和开放形式评测集:建议使用两种类型的评测集来验证领域模型效果。一种是选择题形式的自动评测,另一种是开放形式的人工评测。这样可以选择最佳的模型checkpoint,并更贴近真实场景。
词表扩增:领域词表扩增可能对解码效率有帮助,但对模型效果的提升可能有限。因此,是否进行词表扩增需要谨慎权衡。
模型规格选择:大多数企业最终落地的模型规格限制在13B级别。虽然更大的模型会不断涌现,但实际部署时,10B级别的模型已经足够满足需求。
References
在进行SFT实验的时候,大模型选用Chat还是Base作为基座,需要根据SFT的数据量进行决定。如果你只拥有小于10,000条数据,建议你选用Chat模型作为基座进行微调;如果你拥有100,000条以上的数据,建议在Base模型上进行微调 。
这个选择取决于你的数据规模,Chat模型适用于较少的数据,而Base模型适用于更大的数据集。
References
领域模型微调和领域评测集的构建是训练定制化大模型以适应特定领域需求的关键步骤。让我为您概述一下相关流程和注意事项。
数据层:
模型层:
训练层:
应用层:
References
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。