- 领域模型Continue PreTrain数据选取?
- 收集垂直领域数据:首先搜集与目标专业领域密切相关的数据,可以包括网络爬虫获取数据、特定行业文档或企业内部的信息资源等。这类数据能够丰富模型的专业知识库和语言理解能力,进而提升模型在该领域的性能表现。
- 领域专家参与打标:可以让领域专家对相关数据进行精确筛选和打标。这一步骤涉及各类任务,如类别归纳、实体识别、关系提取等,旨在为模型训练提供精确无误的监督数据。
- 使用伪标签:在无法获得领域专家支持或数据打标成本较高时,可以利用自动化技术生成伪标签。例如,运用已预训练的模型对特定领域数据作出预测,并将这些预测结果作为伪标签用于进一步训练。通常会通过ChatGPT生成相关数据进行知识蒸馏。
- 保证数据均衡:在选择数据时,要关注数据的平衡性,不仅要灌输垂直领域的数据还应该添加一定比例的通用领域数据。对于样本量不足的类别,可考虑应用数据增强或过采样技术,以实现数据量的平衡。
- 领域数据训练后,通用能力往往会有所下降,如何缓解模型遗忘通用能力?
如果仅仅使用领域数据集进行模型训练,模型很容易出现灾难性遗忘现象,为了解决这个问题通常在领域训练的过程中加入通用数据集。但对于领域数据集和通用数据集应该按照什么比例目前还没有一个准确的答案。如果领域数据集数据量没有那么多时一般领域数据与通用数据的比例在1:5到1:10之间。
- 领域模型Continue PreTrain,如何让模型在预训练过程中就学习到更多的知识?
- 增大数据收集范围:收集垂直领域数据可以来自互联网、论文、书籍等等多个方面的数据。将这些数据混合在一起进行预训练,可以使得模型在预训练阶段习得足够的专业知识。
- 大规模数据:使用更大规模的数据进行预训练,可以让模型接触到更多的语言和知识可以从互联网上爬取大量的文本数据,或者利用公开的语料库进行预训练。
- 数据增强:在预训练过程中,可以采用数据增强技术,如随机遮挡、词替换、句子重组等,来生成更多的训练样本。这样可以增加模型的训练数据量,使其能够学习到更多的知识和语言规律。
- 微调后的模型出现能力劣化,灾难性遗忘是怎么回事?
所谓的灾难性遗忘:即学习了新的知识之后,几乎彻底遗忘掉之前习得的内容。这在微调ChatGLM-6B模型时,有同学提出来的问题,表现为原始ChatGLM-6B模型在知识问答如“失眠怎么办"的回答上是正确的,但引入特定任务(如拼写纠错CSC)数据集微调后,再让模型预测“失眠怎么办”的结果就答非所问了。我理解ChatGLM-6B模型是走完“预训练-SFT-RLHF"过程训练后的模型,其SFT阶段已经有上千指令微调任务训练过,现在我们只是新增了一类指令数据,相对大模型而已,微调数据量少和微调任务类型单一,不会对其原有的能力造成大的影响,所以我认为是不会导致灾难性遗忘问题,我自己微调模型也没出现此问题。应该是微调训练参数调整导致的,微调初始学习率不要设置太高,lr=2e-5或者更小,可以避免此问题,不要大于预训练时的学习率。
- 领域模型词表扩增是不是有必要的?
不一定要扩充词表,但有些领域比较特殊,需要扩充词表。
- 领域特定词汇:对于目标领域内存在的专有术语或特殊词汇,若这些并不存在标准预训练模型的数据中,扩展词表就是有必要的。将这类特殊术语纳入模型的词库,能够增强模型对这些术语的理解与处理能力。
- 领域特定上下文:在特定的领域任务中,一个词的含义可能会由其所处的上下文决定。以医疗领域为例,一个术语在不同情境下可能代表着不同的事物。当领域特定任务中的上下文与预训练模型原训练数据中的上下文存在差异时,词表的扩充就能帮助模型更精确地理解和应对特定领域的上下文。
- 训练数据的局限性:由于预训练模型的词库过于庞大,在目标领域的训练资料较为匮乏,词表的扩充就能够辅助模型更有效地借鉴预训练模型中的知识,以优化其在特定领域任务中的表现。
- 进行SFT操作的时候,基座模型选用Chat还是Base?
在进行SFT实验的时候,大模型选用Chat还是Base作为基座进行微调,需要根据SFT的数据量进行决定。如果你只拥有小于10k数据,建议你选用Chat模型作为基座进行微调;如果你拥有100k的数据,建议你在Base模型上进行微调。
- 如何训练自己的大模型?
- 数据收集和预处理:首先收集与目标任务和领域相关的大规模数据集。这可以包括从互联网上爬取数据、使用公开数据集或者其他途径获得的数据。然后,对数据进行预处理和清洗,包括数据去重、有害数据集去除等。同时将数据集划分为训练集、验证集和测试集。训练集用于模型的训练,验证集用于调整超参数和模型选择,测试集用于最终评估模型的性能。
- 模型架构选择:根据任务的特点和目标,选择适合的开源模型架构。目前国内外有较多的开源LLM模型可供开发者使用,包括国外的LLaMa、BLOOM,国内的ChatGLM、Baichuan,或者其他机构基于开源框架训练得到的模型。可以根据自己的数据量、计算资源、任务需求来选择相应的模型进行微调。
- 模型训练和调参:训练包含二次预训练、SFT、RLHF等方式,同时可以选择是全参数训练或者部分参数训练。确定好训练方式后使用训练集对模型进行训练。训练过程中,需要选择合适的优化器、损失函数和学习率等超参数,并进行适当的调整和优化。
- 模型评估和测试:使用测试集对最终训练好的模型进行评估和测试。计算模型的性能指标(流畅性,相关性,完整性和专业性等方面),以评估模型的性能和泛化能力。
- 训练中文大模型有啥经验?
如果模型在预训练阶段就包含足够的中文如ChatGLM、Baichuan,可以直接利用其进行微调,如果模型在预训练阶段无中文或者中文数据含量较少的模型如LLaMa,需要对其tokenizer进行修改,添加中文字词,同时进行二次预训练使其充分理解中文再进行SFT微调。
- 微调需要多少条数据?
取决于预训练数据和微调任务的数据分布是否一致,分布一致,100条就够,分布差异大就需要多些数据,千条或者万条以上为佳。自己的任务复杂或者下游任务行业比较冷门,如药品名称识别任务,则需要较多监督数据。还有微调大模型时,一遍是记不住的。100条的微调数据,epochs=:20才能稳定拟合任务要求。
- 指令微调的好处?
- 个性化适应:尽管大型预训练模型在广泛的通用数据集上已经培养出了卓越的语言理解与表征能力,但由于对一些专门任务或领域在预训练阶段较为稀少,模型可能难以理解。于是利用特定任务或领域的数据对这些大模型进行指令微调,使得模型能够更准确地完成特定任务。
- 行为引导:大模型的行为往往不易解释和控制。借助指令微调,我们可以输入特别的指令或设定限制,这样不仅可以引导模型行为,还使其更好地满足特定任务的要求,如在创造性任务中,通过指令导向控制内容的风格和长度等。
- 数据效率:大模型训练通常依赖于大量数据,但在一些特定的任务或领域里,关键数据往往不够充足或难以采集。指令微调可以使我们仅利用少量特定任务的数据,结合大型模型的通用数据预训练知识,达到在数据受限的条件下也能够取得优异的性能。
- 节省资源:大模型的训练通常耗费巨大的计算资源及时间。通过对这些已训练好的模型进行指令微调,可以避免从零开始训练的大量时间与资源消耗,显著提升训练效率。
- 预训练和微调哪个阶段注入知识的?SFT操作是干嘛的?
在大模型训练过程中,知识注入主要是在预训练阶段进行的。在预训练阶段,使用大规模的通用数据对模型进行训练,以学习语言知识和表示能力。这一阶段的目标是通过自监督学习或其他无监督学习方法,让模型尽可能地捕捉到数据中的统计规律和语言结构,并生成丰富的语言表示。在预训练阶段,模型并没有针对特定任务进行优化,因此预训练模型通常是通用的,可以应用于多个不同的任务和领域。而在微调阶段,使用特定任务的数据对预训练模型进行进一步的训练和调整。微调的目标是将预训练模型中学到的通用知识和能力迁移到特定任务上,提升模型在目标任务上的性能。在微调阶段,可以根据具体任务的需求,调整模型的参数和结构,以更好地适应目标任务的特点。微调通常需要较少的任务数据,因为预训练模型已经具备了一定的语言理解和泛化能力。
- 样本量规模增大,训练出现OOM错?
- 减少批量大小(Batch Size):将批量大小减小可以减少每个训练步骤中所需的内存量。但较小的批量大小可能会导致训练过程中的梯度估计不稳定,但可以通过增加训练步数来弥补这一问题。
- 内存优化技术:使用一些内存优化技术可以减少模型训练过程中的内存占用。例如,使用混合精度训练(Mixed Precision Training)可以减少模型参数的内存占用;使用梯度累积(Gradient Accumulation)可以减少每个训练步骤中的内存需求。
- 减少模型规模:如果内存问题仍然存在,可以考虑选择规模更小的模型。虽然这可能会导致模型性能的一定损失,但可以在一定程度上减少内存需求。
- 增加硬件资源:可以考虑增加硬件资源,例如更换性能更强显存更大的显卡,或者增加显卡的数量以实现并行训练,减小单卡压力。
- 数据处理和加载优化:优化数据处理和加载过程可以减少训练过程中的内存占用。例如,可以使用数据流水线技术来并行加载和处理数据,减少内存中同时存在的数据量。
- 模型参数迭代实验?
模型的参数被迭代地调整,以便在训练过程中更好地适应特定的任务或数据集。可以尝试以下方法:
- 逐层解冻:从最后一层开始,逐层解冻模型,直到整个模型都被解冻。这样可以确保在训练过程中不会丢失之前学到的知识。
- 逐步降低学习率:在训练过程中,逐步降低学习率,以便模型能够更好地收敛。
- 使用更大的批次大小:使用更大的批次大小可以提高训练效率,并且可以更好地利用GPU。
- 分布式训练框架选择?
- Megatron-LM:Megatron是由NVIDIA深度学习应用研究团队开发的大型Transformer语言模型,该模型用于研究大规模训练大型语言模型。
- DeepSpeed:DeepSpeed是微软的深度学习库,已被用于训练Megatron-TuringNLG530B和BLOOM等大型模型。
- FairScale:FairScale(由Facebook研究)是一个用于高性能和大规模训练的PyTorch扩展库。
- ColossalA:Colossa-Al提供了一组并行组件,可以用来实现定制化的分布式/并行训练
- 模型大小如何选择?加速卡如何选择?
需要考虑以下因素:任务要求、数据集大小、计算资源、时间限制
- 什么是LangChain?LangChain包含娜些核心概念?
LangChain是一个开源框架,旨在帮助开发人员使用大型语言模型(LLMs)构建端到端的应用程序。LangChain有很多核心概念:
- Components and Chains:在LangChain中,Component是模块化的构建块,可以组合起来创建强大的应用程序。Chain是组合在一起以完成特定任务的一系列Components(或其他Chain)。例如,一个Chain可能包括一个Prompt:模板、一个语言模型和一个输出解析器,它们一起工作以处理用户输入、生成响应并处理输出。
- Prompt Templates and Values:Prompt Template负责创建PromptValue,这是最终传递给语言模型的内容。Prompt Template有助于将用户输入和其他动态信息转换为适合语言模型的格式。PromptValues是具有方法的类,这些方法可以转换为每个模型类型期望的确切输入类型(如文本或聊天消息)。
- Example Selectors:当您想要在Prompts中动态包含示例时,Example Selectors很有用。他们接受用户输入并返回一个示例列表以在提示中使用,使其更强大和特定于上下文。
- Output Parsers:Output Parsers负责将语言模型响应构建为更有用的格式。它们实现了两种主要方法:一种用于提供格式化指令,另一种用于将语言模型的响应解析为结构化格式。这使得在您的应用程序中处理输出数据变得更加容易。
- Indexes and Retrievers:Index是一种组织文档的方式,使语言模型更容易与它们交互。检索器是用于获取相关文档并将它们与语言模型组合的接口。LangChain提供了用于处理不同类型的索引和检索器的工具和功能,例如矢量数据库和文本拆分器。
- Chat Message History:LangChain主要通过聊天界面与语言模型进行交互。ChatMessageHistory类负责记住所有以前的聊天交互数据,然后可以将这些交互数据传递回模型、汇总或以其他方式组合。这有助于维护上下文并提高模型对对话的理解。
- Agents and Toolkits:Agent是在LangChain中推动决策制定的实体。他们可以访问一套工具,并可以根据用户输入决定调用哪个工具。Tookits是一组工具,当它们一起使用时,可以完成特定的任务。代理执行器负责使用适当的工具运行代理。
- Models:LangChain支持多种类型的模型,包括LLMs、聊天模型和文本嵌入模型等。
- LangChain包含哪些特点?
模块化、易用性、可扩展性、全面性
- LangChain如何调用LLMs生成回复?LangChain如何修改提示模板?LangChain如何链接多个组件处理一个特定的下游任务?LangChain如何Embedding&vector store?
- 要使用LangChain调用LLMs生成回复,开发人员首先需要导入必要的组件和工具,例如LLMs,chat models,agents,chains,内存功能。这些组件组合起来创建一个可以理解、处理和响应用户输入的应用程序。LangChain为特定用例提供了多种组件,例如个人助理、文档问答、聊天机器人、查询表格数据、与AP!交互、提取、评估和汇总。
- LangChain提供了PromptTemplates组件,它可以帮助你更方便地构建提示。PromptTemplates是预定义的生成语言模型提示的配方。一个模板可能包括指令、fw-shot示例和适合特定任务的特定上下文和问题。开发人员可以使用PromptTemplates组件创建和处理提示。
- 在LangChain中,Component是模块化的构建块,可以组合起来创建强大的应用程序。Chain是组合在一起以完成特定任务的一系列Components(或其他Chain)。例如,一个Chain可能包括一个Prompt模板、一个语言模型和一个输出解析器,它们一起工作以处理用户输入、生成响应并处理输出。
- LangChain提供了向量存储(vector stores)工具和功能,可嵌入数据并执行向量搜索。向量存储负责存储嵌入数据并为您执行向量搜索。要使用向量存储,请先创建要放入其中的向量,通常是通过嵌入创建的。然后,在查询时嵌入非结构化查询并检索与嵌入查询“最相似”的嵌入向量。有许多优秀的向量存储选项,其中一些是免费、开源且完全在本地运行。
- LangChain存在娜些问题及方法方案?
低效的令牌使用问题:它的令牌计数性能,对于小数据集来说,它的效率很低。
- LangChain低效的令牌使用问题?
代替解决方案:Tiktoken是OpenAl开发的Python库