LLMs(大型语言模型)和生成式人工智能现在非常流行。IBM发布的惊人统计数据显示,近三分之二的C-Suite高管感受到了投资者加速采用生成式人工智能的压力。自然而然,这种压力也向数据科学和机器学习团队渗透,他们负责应对炒作并创建获胜的实现。
随着形势的发展,LLM的生态系统已经分化为开源和工业模型,并迅速填充了护城河。这种新兴的场景促使许多团队考虑以下问题:我们如何使LLM更具体地适用于我们的用例?
在本文中,我们探讨了一些应该考虑的关键因素,当考虑投资时间和工程周期来构建一个细分LLM时,这些因素应该放在首要位置。在这个过程中,了解一些关于建立精细调整的语言模型的潜在限制和最佳实践的最新研究是至关重要的。阅读本文后,您将掌握更多的想法,以便引导您的组织做出正确的决定,是进行培训还是不进行培训以及如何进行培训。
您可能无法用开源模型模仿GPT
众所周知,OpenAI正在使用最新的GPT版本领导LLM领域。因此,许多利益相关者可能要求开发团队部署一个模型,以模仿更强大的模型的结果,出于各种原因(速率限制,数据隐私,成本等)。这自然会引导开发人员思考:我们可以从GPT生成输出并利用它们来对模型进行精细调整吗?
这个问题的答案仍然不确定,因为它似乎取决于几个因素。这个特定的任务,称为模仿学习,涉及使用来自更先进模型(如GPT)的目标观察来进行微调训练新的语言模型。虽然这似乎是从下游模型获得良好性能的好方法,但它也有潜在问题。
最近一篇名为“模仿专有LLM的虚假承诺”[1]的论文阐述了这种方法可能遇到的潜在问题。作者展示了一些实验,证明添加更多的模仿数据可能会导致模型性能下降。从上面的图中可以看出,在中间的图表中,基准任务的准确性随着标记数量的增加而降低。但为什么会这样呢?
作者建议,这种情况发生的原因是模仿模型学习了它正在模仿的模型的风格,而不是学习和理解模型的内容。从上面图的左侧窗格中可以看出,人类审阅员喜欢模仿模型的结果,而不是ChatGPT的结果。经过探索后,清楚地表明,审阅员喜欢模仿模型的风格,但没有仔细检查内容。据指出,模仿模型产生的内容往往具有弱的事实性,导致作者总结“模仿模型实际上体现了AI助手的最糟糕的方面:它们的答案听起来很自信,但比ChatGPT的答案更不实际。”
需要注意的是,有些情况下,模仿模型可以实现良好的性能。作者指出,模仿模型可以在本地任务或复制教师模型的特定行为的任务上实现良好的性能。在为该研究创建的一个任务NQ-Synthetic上,作者要求语言模型生成与给定上下文相关的10个问题和答案。值得注意的是,模仿模型的得分接近GPT的得分。这表明,更具体的模型在试图模仿来自教师模型的行为时可以实现有利的结果。
论文中的一个引人注目的推论是,使用教师模型对模型进行微调实际上可以帮助降低模仿模型的毒性得分。这对于想要快速暴露开源LLM而不必进行围绕输出构建过滤器的繁琐任务的公司非常有用。公司可以通过训练来自精心策划的数据集的输出来获得一个坚实的起点,而不是手动尝试构建过滤器。
值得一提的是,最近微软研究团队开发的模型Orca,将GPT的信号作为训练数据的一部分。不同之处在于模型所使用的训练数据的大小。Orca在500万个示例上进行微调,而覆盖广泛的模仿模型则在约15.1万个观察值上进行了微调。由于我认为我的受众大部分不会花费16000美元来进行LLM的训练,以进行非正式实验,因此我倾向于提出更接近于模仿建模论文而非Orca的观点。话虽如此,我们还需要等待更多的研究,以确定模仿学习在更广泛任务中成为可行选项所需的最少示例数量。
要点:根据您的任务的复杂性,试图用一个较弱的模型模仿GPT或任何复杂的模型的输出可能会导致模型性能不佳。
仅需要上下文学习吗?
在上下文学习或少样本学习中,将任务特定的示例包含在提示中是一个过程。这种方法是针对复杂的语言模型的,因为开源模型还没有达到所需的灵活性来处理上下文学习。通常,从这种方法中可以获得很好的结果,但您是否曾经想过为什么会这样呢?
这个问题的答案在Dai等人的论文[3]中得到了探讨,他们探讨了在提示中加载示例和使用相同示例进行微调之间的数学联系。作者们证明了提示示例产生的元梯度在推理时进行前向传播时会被反映出来。在微调的情况下,示例实际上会产生用于更新权重的实际梯度。因此,看起来在内容学习中实现了与微调类似的结果。为了更深入地理解这些发现,我鼓励阅读该论文,该论文在数学联系方面毫不吝啬地详细说明了。
虽然上下文学习的方法很好,但是在微调中并不存在的限制也存在。在我们有大量训练数据的情况下,通过使用实际梯度更新模型,可以利用所有这些数据进行微调。在上下文学习期间,我们只能提供有限数量的观察结果。因此,这里的问题是:在给定大量训练语料库的情况下,如何利用与我们的输入最相关的示例来获得最佳结果?
解决此问题的一种方法是使用启发式选择示例,幸运的是,LangChain提供了对此的支持。LangChain是一个Python模块,它实质上包含了预先构建的提示,简化了使用语言模型的工作。我们现在要关注的来自LangChain的工具是ExampleSelector。
def get_similarity(seq_a: str, seq_b: str) -> Union[float, int]: """ 创建相似度启发式,这里我们使用Jaccard相似度或IOU seq_a: 要比较的第一个序列 seq_b: 要比较的第二个序列 返回: 相似度得分(浮点数或整数) """ # 标记化 set_a = set(seq_a.split(' ')) set_b = set(seq_b.split(' ')) # 计算IOU/Jaccard相似度 return len(set_a.intersection(set_b)) / len(set_a.union(set_b))def example_selector(examples: List[str], input: str, examples2use: int) -> List[str]: """ 用于示例选择器的伪代码 examples: 训练语料库列表 input: 要翻译的目标序列 examples2use: 要使用的示例数量 返回: 所选示例的列表 """ scores = [get_similarity(example, input) for example in examples] sorted_idx = [i for i, _ in sorted(enumerate(scores), key=lambda x: x[1], reverse=True)] return examples[sorted_idx[:examples2use]]
ExampleSelector是一种类型的提示操作器,它允许我们在推理期间动态更改使用的示例。可以使用许多启发式方法。上面我创建了一些LangChain选择器的伪代码,实际上是使用输入序列和示例序列之间的Jaccard相似度。在LangChain中还有许多其他选项,因此请在这里查看。
具有这种方法的两个主要优点。首先,通过选择与给定输入最相关的示例,可以使您的LLM具有数据效率,而不是为所有观察结果静态加载少量示例。第二个好处来自成本节约,如果通过管理服务进行调整。在撰写本文时,使用微调的基础Davinci模型每1,000个标记的成本为0.12美元。相比之下,使用instruct Davinci的成本为0.02美元,这是价格增长了400%!这些价格也不包括培训成本。
需要注意的是,这些价格可能会随时更改,因为OpenAI尚未使用LoRa或适配器,正如一篇现已删除的博客文章[5]所揭示的那样。尽管如此,由于需要维护个别用户的定制权重,因此微调模型仍然可能更昂贵。这也没有考虑到上下文示例的成本。您的团队需要从成本和准确性的角度评估ICL或微调哪种方法更合适。
结论:动态示例加载的上下文学习可以实现与微调相同的结果,而不会产生由托管服务带来的重大额外成本。
您的任务在最终推断之前是否受益于一个或多个中间步骤?
假设您正在尝试回答长文档中的复杂问题。这个任务根本需要语言模型具有良好的语言掌握能力和理解能力。这引出了一个问题:如果我们协助语言模型将推理过程分解为子任务,类似于人类分析文档并依次执行任务,会怎样呢?
这正是微软研究人员的研究重点,他们对这个问题的回答是PEARL [4]。PEARL代表长文档推理的规划和执行动作。该通用框架分为三个步骤:
- 动作挖掘:首先提示语言模型阅读文档并提取可能用于回答特定领域问题的动作。为了提取这些动作,语言模型将获得一些示例动作。下面列出了一个动作示例。
- 计划生成:在生成一组任务特定动作之后,现在要求LLM根据问题和上下文生成要执行的后续动作列表。LLM提供了其他任务计划的一些示例,这有助于构建高质量的计划。有关技术细节的更多信息可以在论文中找到。
- 计划执行:现在模型拥有了计划。我们现在提供输入到模型并执行计划。
有一些中间步骤用于确保各个阶段之间的质量。作者包括了一个自我纠正步骤,以确保计划符合所需格式。还有一个自我细化步骤,用于确定计划是否可以作为一些示例。
在评估中,PEARL在其他GPT模型中表现出明显的改进,特别是在包含长文档时。从这个过程中得出的关键结论是,在某些情况下,多个步骤可以显着地帮助模型。
当要包含的文档数量超过语言模型支持的范围时,拥有中间步骤也会证明是有益的另一种情况。目前,OpenAI使用的注意力机制的规模为O(n²),尚无解决方案来克服这一问题[5]。这引起了将上下文缩小到最小形式的极大兴趣。
根据您的任务,有处理这种情况的方法。例如,如果您的任务完全围绕实体展开,那么有机会提取相关实体及其相关属性。您可以将此方法视为有损压缩,可让您向LLM提供更多上下文。这个中间步骤的另一个好处是,您将非结构化数据转换为结构化格式,这使您可以在没有LLM的情况下进行明智的决策。下图是Fei等人的一个示例任务[6]。
要点:将一个任务分解成更小的子问题可以帮助将一个更大的问题简化为更易管理的部分。您还可以使用这些较小的任务来解决与模型限制相关的瓶颈问题。
总结思路
这些是研究人员在LLM性能和效率的新前沿探索时考虑的一些一般性思路。这不是微调模型时要考虑的所有事情的详尽列表,但这是考虑这个过程时的一个很好的起点。
欲了解更多信息,请参阅Hugging Face关于训练LLM的文章,这是一个非常有趣的地方,当探索本地问题上的仿真模型时,这将是一个很好的起点。了解LangChain的具体理解也非常有帮助。虽然大部分库可以为您的用例进行重写,但主要的好处是如果其他人为您编写代码,那么更容易跟上研究进展!
以下是要点:
- 根据您的任务的复杂性,尝试使用比GPT或任何复杂模型更弱的模型模拟输出可能会导致模型性能不佳。
- 使用动态示例加载的上下文学习可能会实现与微调相同的结果,而不会产生来自托管服务的实质性额外成本。
- 将任务分解成更小的问题可以帮助将一个更大的问题简化为更易管理的部分。您还可以使用这些较小的任务来解决与模型限制相关的瓶颈问题。
感谢阅读本文!我的主要兴趣领域是为用户创建个性化互动。请考虑与本文进行交互,并关注我的小猪AI!如果您想就本文中的任何技术错误与我联系或保持联系,请在LinkedIn上联系我。
参考文献
[1] Arnav Gudibande,Eric Wallace,Charlie Snell,Xinyang Geng,Hao Liu,Pieter Abbeel,Sergey Levine和Dawn Song。(2023)。仿制专有LLM的虚假承诺。
[2] Mukherjee,S.,Mitra,A.,Jawahar,G.,Agarwal,S.,Palangi,H.和Awadallah,A。(2023)。Orca:从GPT-4的复杂说明跟踪中进行渐进式学习。 arXiv:计算与语言。
[3] Dai,D.,Sun,Y.,Dong,L.,Hao,Y.,Ma,S.,Sui,Z.和Wei,F.。(2023)。为什么GPT可以学习上下文?语言模型隐式执行梯度下降作为元优化器。
[4] Jörke,M.,Sefidgar,Y.,Massachi,T.,Suh,J.和Ramos,G。(2023)。Pearl:用于机器辅助反思个人数据的技术探针。在IUI 2023中。
[5] Habib,R.。(2023)。Sam Altman根据OpenAI的计划。
[6] Hao Fei,Fei Li,Chenliang Li,Shengqiong Wu,Jingye Li和Donghong Ji。(2022)。继承前人的智慧:一个用于统一基于方面的情感分析的多重级联框架。