博客

  • 当抽象弊大于利时:我们在生产环境中使用 LangChain 的教训以及我们应该做的

    当抽象弊大于利时:我们在生产环境中使用 LangChain 的教训以及我们应该做的

    作为一名资深科技专栏作家,我最近关注到人工智能领域的一个有趣现象:越来越多的开发者开始质疑框架的必要性。Octomind 公司的深度学习工程师 Fabian Both 近期发表了一篇博文,分享了他们团队在构建 AI 代理时放弃 LangChain 框架的心路历程,这篇文章引发了我的思考。

    LangChain 的诱惑与困境

    Octomind 团队最初选择 LangChain 的原因很简单:它提供了一系列令人印象深刻的组件和工具,并且在当时非常流行。正如 LangChain 的承诺那样,它似乎可以让开发者“在一个下午的时间里,从一个想法变成可运行的代码”。然而,随着 Octomind 团队需求的不断提高,LangChain 的弊端也逐渐显现。

    Both 指出,LangChain 最初在满足简单需求方面表现出色,但其高层抽象很快使得代码变得难以理解和维护。他以一个简单的翻译任务为例,展示了 LangChain 如何增加了代码的复杂性,却没有带来明显的好处。

    以下是使用 OpenAI 包的 Python 代码示例:

    from openai import OpenAI
    
    client = OpenAI(api_key="<your_api_key>")
    text = "hello!"
    language = "Italian"
    
    messages = [
        {"role": "system", "content": "You are an expert translator"},
        {"role": "user", "content": f"Translate the following from English into {language}"},
        {"role": "user", "content": f"{text}"},
    ]
    
    response = client.chat.completions.create(model="gpt-4o", messages=messages)
    result = response.choices[0].message.content

    以下是使用 LangChain 的 Python 代码示例:

    from langchain_openai import ChatOpenAI
    from langchain_core.output_parsers import StrOutputParser
    from langchain_core.prompts import ChatPromptTemplate
    
    os.environ["OPENAI_API_KEY"] = "<your_api_key>"
    text = "hello!"
    language = "Italian"
    
    
    prompt_template = ChatPromptTemplate.from_messages(
        [("system", "You are an expert translator"),
            ("user", "Translate the following from English into {language}"),
            ("user", "{text}")]
    )
    
    parser = StrOutputParser()
    chain = prompt_template | model | parser
    result = chain.invoke({"language": language, "text": text})

    Both 认为,LangChain 在这个例子中引入的“提示模板”、“输出解析器”和“链”等抽象概念,实际上增加了代码的复杂性,却没有带来任何实际价值。

    抽象的代价:速度与灵活性

    Both 进一步指出,LangChain 的高层抽象限制了团队的迭代速度和灵活性。当他们试图构建更复杂的 AI 代理时,LangChain 框架成为了绊脚石。

    例如,当 Octomind 团队希望根据业务逻辑动态更改 AI 代理可以访问的工具时,他们发现 LangChain 无法满足这一需求。最终,他们不得不放弃 LangChain,转而采用更灵活的模块化构建块方法。

    模块化构建块:大道至简

    Both 认为,在大多数情况下,开发者并不需要像 LangChain 这样复杂的框架来构建 AI 应用。他建议采用模块化构建块的方法,只使用少量经过精心挑选的外部软件包,保持架构精简。

    他列举了构建 AI 应用所需的核心组件:

    • 用于 LLM 通信的客户端
    • 用于函数调用的函数/工具
    • 用于 RAG 的向量数据库
    • 用于跟踪和评估的可观测性平台

    通过将这些模块化的构建块组合在一起,开发者可以构建出灵活且易于维护的 AI 应用。

    结论:拥抱简单,回归本质

    Octomind 团队放弃 LangChain 的故事,为我们敲响了警钟:在 AI 领域,抽象并不总是有益的。过度的抽象可能会导致代码复杂、难以维护,并最终阻碍创新。

    正如 Both 所说:“在大多数情况下,你对 LLM 的使用将是简单而直接的。你主要是在编写顺序代码,迭代提示,并提高输出的质量和可预测性。大多数任务都可以通过简单的代码和相对较少的外部软件包来完成。”

    因此,在构建 AI 应用时,我们应该始终牢记“大道至简”的原则,避免过度依赖框架,而是专注于解决实际问题。

    参考文献

    • Both, F. (2024). Why we no longer use LangChain for building our AI agents. Octomind Blog. Retrieved from https://www.octomind.dev/blog/why-we-no-longer-use-langchain-for-building-our-ai-agents
  • 黄巢:暴君还是英雄?

    黄巢,一个在历史中充满争议的人物。他领导的起义,被认为是唐朝灭亡的导火索之一。然而,这场起义究竟是残暴的掠夺,还是对千年毒瘤的根除?本文将带您重新审视黄巢起义,探寻其背后的历史真相。

    门阀政治:古代中国的“种姓制度”?

    要理解黄巢起义,首先要了解当时中国社会的背景——门阀政治。自两汉时期开始,官员选拔就形成了“举孝廉”制度,这种看似公平的制度,却为门阀士族的壮大提供了温床。官员之间互相推荐,导致官位长期被少数家族垄断,底层百姓几乎没有上升通道。

    正如文中所说:“上品无寒门,下品无世族”。这种现象,与印度的种姓制度何其相似!

    以“弘农杨氏”为例,其始祖杨喜,仅仅因为在追杀项羽时抢到一条胳膊,就被封为侯爵,其家族也因此繁衍壮大,最终成为中原地区势力最大的家族之一。

    隋唐时期,门阀士族势力达到顶峰,甚至连皇权更迭,也成为他们权力博弈的工具。这些家族拥有大量土地,却不用纳税,过着奢靡的生活,而底层百姓却生活在水深火热之中,甚至沦为奴隶,永无翻身之日。

    黄巢起义:对门阀政治的致命一击

    黄巢出身底层,深受门阀制度之害。他多次参加科举,却屡屡碰壁,最终看透了这个“上品无寒门”的黑暗现实。正如他诗中所写:“待到秋来九月八,我花开后百花杀,冲天香阵透长安,满城尽带黄金甲”。他要用自己的方式,打破这个不公平的社会。

    公元880年,黄巢率领起义军攻入长安,将城内的门阀士族诛杀殆尽,就连李唐皇室也未能幸免。正如文中所描述的,当时的景象令权贵们震惊不已,因为在此之前,即使是安禄山这样的枭雄,也不敢对门阀士族轻举妄动。

    诗人韦庄目睹了这一切,写下了“内库烧为锦绣灰,天街踏尽公卿骨!”的诗句,生动地描绘了当时长安城的混乱景象。

    黄巢起义的影响:打破门阀,开启新时代

    黄巢起义虽然最终失败,但其影响却极其深远。这场起义沉重打击了延续数百年的门阀政治,为寒门子弟打开了上升通道,也为后世“取士不问家世,婚姻不问门第”的社会风气奠定了基础。

    正如文中所说:“从黄巢起义算起,中华大地上才真正开始实现‘取士不问家世,婚姻不问门第’”。

    结语:功过是非,留待后人评说

    黄巢的一生充满了传奇色彩,他的起义虽然伴随着暴力和杀戮,但也对中国社会产生了深远影响。他究竟是残暴的屠夫,还是时代的英雄?这个问题或许永远没有答案。但不可否认的是,黄巢起义,是古代中国社会发展进程中的一次重要转折点。

    参考文献

    • 历史超有料. (2024-06-21). 黄巢杀人百万,用人肉当军粮,为啥还有人纪念他?. 微信公众号.

    声明: 本文部分内容摘录自参考文献,并进行了一定的改写和补充。

  • 当 Transformer 遇上状态空间模型:结构化状态空间对偶性揭秘

    近年来,深度学习领域取得的巨大成功离不开 Transformer 架构的贡献,尤其是在语言建模方面。然而,随着模型规模的不断扩大,Transformer 的二次时间复杂度成为了其进一步发展的瓶颈。与此同时,状态空间模型(SSM),例如 Mamba,展现出与 Transformer 相媲美甚至更优的性能,并且在中小规模模型上具有线性时间复杂度优势。

    本文将深入探讨 Transformer 与 SSM 之间的联系,并提出一个全新的理论框架——结构化状态空间对偶性(SSD)。该框架揭示了 SSM 与各种注意力变体之间的密切关系,并通过对结构化半可分矩阵的不同分解方式建立了联系。基于 SSD 框架,我们设计了一种全新的架构——Mamba-2,其核心层是对 Mamba 选择性 SSM 的改进,速度提升了 2-8 倍,同时在语言建模方面仍然可以与 Transformer 竞争。

    Transformer 与 SSM 的前世今生

    Transformer:深度学习的明星架构

    Transformer,特别是仅解码器模型(例如 GPT、Llama),以其强大的序列建模能力成为了现代深度学习成功的关键驱动力之一。然而,其核心注意力层的二次时间复杂度问题一直是研究者们努力攻克的难题。

    状态空间模型:线性复杂度的挑战者

    结构化状态空间模型(SSM)作为一种新兴的序列模型,在长程任务(例如 S4)中表现出色,并且最近在中小型语言建模任务中与 Transformer 达到或超过了 Transformer 的性能(例如 Mamba)。SSM 具有线性时间复杂度,在训练和推理过程中效率更高。

    结构化状态空间对偶性:架起沟通的桥梁

    为了更好地理解和改进 SSM,我们提出了结构化状态空间对偶性(SSD)框架,该框架通过结构化矩阵的抽象概念将 SSM 与注意力变体联系起来。

    结构化矩阵:SSD 框架的核心

    结构化矩阵的定义和性质

    结构化矩阵是指具有以下两个特性的矩阵:

    1. 可以通过压缩表示以亚二次(理想情况下是线性)参数表示。
    2. 具有快速算法(最重要的是矩阵乘法),可以直接对其压缩表示进行操作。

    半可分矩阵:SSM 的矩阵表示

    半可分矩阵是一种重要的结构化矩阵,其定义为:矩阵下三角部分中的每个子矩阵的秩最多为 N,其中 N 称为半可分矩阵的阶数或秩。

    本文证明了 SSM 与半可分矩阵之间的等价性,并通过半可分矩阵的顺序半可分(SSS)表示形式建立了联系。

    定理 3.5:状态大小为 N 的状态空间模型变换 y = SSM(A, B, C)(x) 与通过 N 阶半可分矩阵(以 SSS 表示形式)进行矩阵乘法 y = SSS(A, B, C) · x 相同。

    基于结构化矩阵算法的 SSM 计算

    通过将 SSM 视为半可分矩阵,我们可以利用结构化矩阵乘法算法来高效地计算 SSM。

    线性(递归)模式:利用 SSM 的递归形式,可以以线性时间复杂度计算 SSM。

    二次(朴素)模式:直接计算 SSM 的矩阵表示,时间复杂度为二次,但对于短序列长度,由于计算模式的硬件友好性,这种方法可能比线性算法更有效。

    结构化掩码注意力:线性注意力的推广

    注意力框架

    注意力机制的核心是为序列中每对位置分配分数,从而使每个元素能够“关注”其他元素。最常见的注意力变体是 softmax 自注意力,其定义为:

    Y = softmax(QKᵀ) · V

    线性注意力

    线性注意力通过将 softmax 折叠到核特征映射中,并利用矩阵乘法的结合律来重写注意力计算,从而避免了 softmax 的计算。

    命题 4.1:自回归核注意力(即具有因果掩码的掩码核注意力)可以通过每次步骤花费恒定时间的递归以 O(T) 时间计算。

    结构化掩码注意力

    结构化掩码注意力(SMA)将线性注意力推广到使用任何结构化掩码 L 的情况,只要 L 具有亚二次矩阵乘法即可。

    定义 4.2:结构化掩码注意力(SMA)(或简称结构化注意力)定义为对查询/键/值 Q, K, V 以及任何结构化矩阵 L(即具有亚二次矩阵乘法)的函数,通过四路张量收缩:

    Y = contract(TN, SN, SP, TS → TP)(Q, K, V, L)

    状态空间对偶性:SSM 与 SMA 的交汇

    标量-单位结构化 SSM

    当 SSM 中的 A 矩阵是标量时,其朴素二次计算可以看作是核注意力的一种实例。

    1-半可分结构化掩码注意力

    当 SMA 中的掩码 L 是 1-半可分矩阵时,其线性计算形式是状态空间模型的一种特例。

    推论 5.1:1-SS SMA(具有 1-半可分结构化矩阵 L 的掩码注意力)(15)是对角 SSM(8)的一种特例,其中对角矩阵是单位矩阵的标量倍数。

    定理 5.2:对于任何作为有界阶自回归过程的结构化掩码注意力(定义 4.2)实例,结构化掩码 L 必须是半可分矩阵。

    结构化状态空间对偶性

    SSD 框架揭示了 SSM 与 SMA 之间的对偶关系,其中线性 SSM 算法和二次核注意力算法是彼此的对偶形式。

    SSD 模型的硬件高效算法

    块分解

    为了高效地计算 SSD 模型,我们采用了一种块分解方法。将矩阵 M 分解成大小为 Q × Q 的子矩阵的 T/Q × T/Q 网格,其中 Q 是块大小。对角块可以使用二次 SMA 模式高效计算,而离对角块可以利用半可分矩阵的秩结构分解为更小的递归。

    计算成本

    SSD 算法的计算成本与线性 SSM 相同,但其硬件友好性与注意力机制相当,主要使用矩阵乘法。

    定理 6.1:考虑状态扩展因子为 N 且头部维度为 P = N 的 SSD 模型。存在一种算法,可以在任何输入 X ∈ R(T,P) 上计算模型,该算法仅需要 O(TN²) 训练 FLOP、O(TN) 推理 FLOP、O(N²) 推理内存,并且其工作量主要由矩阵乘法决定。

    Mamba-2 架构

    块设计

    Mamba-2 架构对 Mamba-1 块进行了一些修改,这些修改部分是受注意力机制的启发,也是为了提高 Mamba-2 的可扩展性。

    并行参数投影:Mamba-2 在块的开头使用单个投影并行生成 A, X, B, C,这与标准注意力架构类似,其中 X, B, C 对应于并行创建的 Q, K, V 投影。

    额外的归一化:为了提高稳定性,在最终输出投影之前添加了一个额外的归一化层(例如 LayerNorm、GroupNorm 或 RMSNorm)。

    多头模式

    类似于多头注意力,Mamba-2 也采用了多头模式,其中状态大小 N 和头部维度 P 分别类似于注意力的 QK 头部维度和 V 头部维度。

    多输入 SSM (MIS) / 多值注意力 (MVA) 模式:Mamba-2 使用 MVA 模式,其中 BC 矩阵(对应于注意力中的 KQ)在输入 X 的所有通道(对应于注意力中的 V)之间共享。

    其他 SSD 扩展

    SSD 还可以结合线性注意力文献中的其他思想,例如各种形式的核近似。

    核注意力近似 softmax 注意力:Mamba-2 中包含一个灵活的核特征映射,并将其应用于 BC 分支(对应于注意力中的 KV 分支)。

    合并归一化(分母)项:可以通过在 X 中添加一个额外的列 1 来找到分母项,从而得到形状为 (T, P + 1) 的张量。

    实验验证

    关联回忆

    在多查询关联回忆(MQAR)任务中,Mamba-2 表现出色,并且随着状态大小的增加,性能持续提高。

    语言建模

    在标准语言建模任务中,Mamba-2 在困惑度和零样本评估方面与其他架构相比具有竞争力。

    速度基准

    SSD 算法比 Mamba 的扫描实现快 2-8 倍,并且在中等序列长度下与优化的注意力机制相当。

    相关工作和讨论

    状态空间模型

    SSD 可以描述为具有 SISO 维度和标量-单位结构的选择性 SSM。

    结构化矩阵

    SSD 框架将 SSM 视为具有特定结构的矩阵混合器——半可分矩阵。

    (线性)注意力

    SSD 与标准(因果)注意力的主要区别在于:

    1. SSD 不使用 softmax 激活函数。
    2. SSD 将 logits 矩阵乘以一个输入相关的 1-半可分掩码。

    相关模型

    最近出现了一些与 Mamba 和 Mamba-2 非常相似的序列模型,例如 RetNet、TransNormerLLM、GateLoop、Gated Linear Attention (GLA)、HGRN、Griffin、xLSTM 和 RWKV(-4)。

    结论

    SSD 框架为理解和改进 SSM 提供了一个新的视角,并为设计更高效、更强大的序列模型开辟了新的方向。

    参考文献

    • Dao, T., Gu, A., et al. (2019). M2: A high-performance monarch matrix multiplication library. In Proceedings of the 2019 IEEE/ACM International Symposium on Code Generation and Optimization (CGO) (pp. 174–185).
    • Gu, A., Goel, K., & Ré, C. (2022). Efficiently Modeling Long Sequences with Structured State Spaces. In International Conference on Learning Representations.
    • Gu, A., & Dao, T. (2023). Mamba: Linear-Complexity Attention with Selective State Spaces. arXiv preprint arXiv:2307.00855.
    • Katharopoulos, A., Vyas, A., Pappas, N., & Fleuret, F. (2020). Transformers are rnns: Fast autoregressive transformers with linear attention. In International Conference on Machine Learning (pp. 5156–5165). PMLR.
    • Pernet, C., & Storjohann, A. (2018). Time and space efficient generators for quasiseparable matrices. Journal of Symbolic Computation, 85, 224–246.
    • Sun, Y., Dehghani, M., et al. (2023). Retentive Network: A Successor to Transformer for Large Language Models. arXiv preprint arXiv:2307.08621.

  • 化解信息迷航:让AI轻松应对海量文本挑战

    近年来,人工智能(AI)发展日新月异,尤其是大型语言模型(LLM)的出现,例如ChatGPT,更是让人们看到了AI在理解和生成人类语言方面惊人的潜力。然而,即使强大的LLM也面临着一个巨大的挑战:如何高效地处理海量文本信息?

    想象一下,当你面对浩如烟海的文献资料,需要从中寻找特定问题的答案时,是不是常常感到力不从心?LLM也面临着同样的困境。传统的LLM受限于“内存”大小,只能处理有限长度的文本,面对过长的文本就会像迷失在信息海洋中一样,难以抓住重点,更不用说从中提取有效信息并进行推理了。

    为了解决这个问题,科学家们提出了各种各样的方法,例如优化LLM的内部结构,或是借助外部工具帮助LLM检索信息。然而,这些方法要么效果有限,要么成本高昂,难以满足实际应用的需求。

    最近,一种名为GraphReader的全新系统横空出世,为解决LLM的“阅读障碍”带来了新的希望。

    GraphReader的工作原理是什么?

    简单来说,GraphReader就像一位高效的“阅读助手”,它可以将海量文本信息转化为一张结构清晰的“知识地图”,并指导LLM在这张地图上精准地找到目标信息。

    具体来说,GraphReader的工作流程可以分为以下几个步骤:

    1. 绘制地图: 首先,GraphReader会将长篇文本分割成多个小的片段,并从中提取出关键信息,例如人物、事件、地点等等。然后,它会根据这些关键信息之间的关系,将它们连接起来,形成一张类似于“思维导图”的知识图谱。
    2. 制定计划: 当用户提出问题后,GraphReader会先分析问题的类型和关键信息,然后制定一个合理的“阅读计划”,明确需要重点关注哪些信息。
    3. 精准导航: GraphReader会根据“阅读计划”,引导LLM在这张“知识地图”上进行有目的的探索,避免LLM在海量信息中迷失方向。
    4. 信息整合: LLM在探索过程中,会将收集到的相关信息记录下来,并最终整合这些信息,生成最终的答案。

    GraphReader的优势是什么?

    • 高效处理海量文本: GraphReader能够将长文本转化为结构化的知识图谱,帮助LLM快速定位关键信息,从而突破传统LLM在文本长度上的限制。
    • 提升推理能力: GraphReader引导LLM进行有目的的探索,避免了无关信息的干扰,从而提高了LLM的推理效率和准确性。
    • 降低计算成本: 相比于其他方法,GraphReader的计算成本更低,更容易应用于实际场景。

    GraphReader的应用前景

    GraphReader的出现为LLM处理海量文本信息提供了一种全新的思路,未来有望应用于各种需要处理长文本的场景,例如:

    • 智能客服: 帮助客服机器人更准确地理解用户问题,并给出更详细的解答。
    • 文献检索: 帮助研究人员快速从海量文献中找到所需的信息。
    • 新闻摘要: 自动生成简洁准确的新闻摘要,帮助读者快速了解新闻内容。

    总而言之,GraphReader的出现是LLM发展历程上的一个重要里程碑,它将帮助LLM突破自身局限,更好地理解和应用人类的知识,为我们带来更加智能化的未来。

  • GraphReader:基于图的智能体,增强大型语言模型的长文本处理能力

    大型语言模型 (LLM) 在自然语言理解和生成方面取得了显著进步,但受限于上下文窗口和内存使用,它们在处理长文本时仍然面临挑战。现有的长文本处理方法主要分为模型级别和智能体级别,但都存在一定的局限性:模型级别方法训练成本高昂,且容易忽略长文本中的关键细节;智能体级别方法则难以捕捉多跳关系和长距离依赖,在处理超长文本时效果不佳。

    为了解决这些问题,本文提出了一种名为 GraphReader基于图的智能体系统,它能够将长文本结构化为图,并利用智能体自主探索图结构,从而有效地处理长文本信息。

    1. GraphReader 的工作原理

    GraphReader 的工作流程主要分为三个阶段:图构建、图探索和答案推理

    1.1 图构建

    • 将长文本分割成多个文本块 (Chunk),并保留段落结构。
    • 使用 LLM 从每个文本块中提取关键元素 (Key Element) 和原子事实 (Atomic Fact)。
    • 将关键元素和原子事实构建成图结构,其中节点代表关键元素及其相关的原子事实,边代表节点之间的关系。

    1.2 图探索

    • 智能体根据问题和预先设定的理性计划,选择初始节点开始探索。
    • 智能体首先探索节点的原子事实,然后深入阅读相关的文本块,并不断记录新的见解和反思当前情况,以优化探索过程。
    • 智能体根据问题、理性计划和笔记内容,选择下一个要探索的相邻节点,直到收集到足够的信息来回答问题。

    1.3 答案推理

    • 将所有智能体收集到的笔记汇总,并使用 LLM 进行推理和生成最终答案。
    • LLM 首先分析每个笔记,并利用其他笔记中的信息进行补充和验证,最终综合所有信息生成最终答案。

    2. 实验结果

    GraphReader 在多个长文本问答基准测试中表现出色,包括多跳长文本问答 (HotpotQA、2WikiMultihopQA、MuSiQue) 和单跳长文本问答 (NarrativeQA)。

    2.1 超越 GPT-4-128k

    实验结果表明,GraphReader 在使用 4k 上下文窗口的情况下,在 16k 到 256k 的不同文本长度上,始终优于 GPT-4-128k。这表明 GraphReader 能够有效地利用图结构捕捉长距离依赖关系,并利用智能体进行高效的探索,从而在有限的上下文窗口内处理超长文本。

    2.2 强大的召回能力

    GraphReader 在关键信息召回方面也表现出色。在 HotpotWikiQA-mixup 数据集上,GraphReader 始终优于其他基线方法,即使在 256k 的超长文本长度下,仍然能够保持约 60% 的召回率。

    3. 结论

    GraphReader 是一种基于图的智能体系统,它能够有效地增强大型语言模型的长文本处理能力。通过将长文本结构化为图,并利用智能体进行自主探索,GraphReader 能够在有限的上下文窗口内捕捉长距离依赖关系,并高效地收集关键信息,从而在各种长文本问答任务中取得优异的成绩。

    4. 局限性

    GraphReader 目前依赖于闭源的 GPT-4 API,未来需要收集数据并训练开源模型,以便更好地服务于更广泛的社区。此外,智能体的效率取决于其规划和推理能力,未来需要进一步提升这些能力,以提高 GraphReader 的效率和性能。


    GraphReader 的核心优势:图结构与智能体协同合作

    GraphReader 的出色表现源于其巧妙的设计,它将图结构和智能体有机地结合在一起,充分发挥了各自的优势:

    • 图结构: 图结构能够有效地组织长文本信息,捕捉文本块之间的长距离依赖关系和多跳关系,为智能体提供全局视野。
    • 智能体: 智能体能够根据问题和理性计划,自主地探索图结构,并利用预定义函数进行精细化操作,从而高效地收集关键信息。

    5. GraphReader 的关键组件

    5.1 理性计划 (Rational Plan)

    理性计划是 GraphReader 的核心组件之一,它指导智能体进行高效的图探索。智能体会根据问题,将复杂问题分解成多个步骤,并确定每个步骤所需的关键信息,从而形成一个清晰的行动计划。

    5.2 节点选择 (Node Selection)

    GraphReader 的另一个关键组件是节点选择机制。智能体不会盲目地探索所有节点,而是根据问题、理性计划和笔记内容,选择最有可能包含关键信息的节点进行探索,从而提高探索效率。

    5.3 预定义函数 (Predefined Functions)

    GraphReader 为智能体提供了一组预定义函数,例如:

    • read_chunk(List[ID]): 读取指定 ID 的文本块。
    • stop_and_read_neighbor(): 停止当前节点的探索,并转向相邻节点。
    • search_more(): 继续探索当前节点的文本块。
    • read_previous/subsequent_chunk(): 读取前一个或后一个文本块。
    • termination(): 终止探索过程。

    这些函数使智能体能够执行精细化操作,例如选择性地阅读文本块、跳转到相邻节点、终止探索等,从而提高探索效率和准确性。

    6. 未来方向

    GraphReader 为解决 LLM 长文本处理问题提供了一种新思路,未来研究可以从以下几个方面进行扩展:

    • 开源模型: 目前 GraphReader 依赖于闭源的 GPT-4 API,未来可以收集数据并训练开源模型,以便更好地服务于更广泛的社区。
    • 智能体增强: 智能体的效率取决于其规划和推理能力,未来可以探索更强大的规划和推理算法,例如利用知识图谱或强化学习来提升智能体的性能。
    • 多模态扩展: GraphReader 目前主要处理文本信息,未来可以扩展到多模态场景,例如将图像、视频等信息也纳入图结构中,并利用智能体进行多模态信息处理。

    Q: 这篇论文试图解决什么问题?

    A: 这篇论文介绍了一个名为GraphReader的系统,旨在解决大型语言模型(Large Language Models, LLMs)在处理长文本和复杂任务时面临的挑战。具体来说,尽管已有多种方法尝试优化LLMs以处理长文本,但它们在处理长输入时仍存在一些限制,例如上下文窗口的限制和内存使用问题。这些限制导致LLMs在处理长文本时可能会忽略重要细节,特别是在处理多跳(multi-hop)问题时。

    为了克服这些问题,GraphReader通过以下几个关键步骤来增强LLMs处理长文本的能力:

    1. 将长文本分割成离散的块(chunks),提取关键信息,并将其压缩成关键元素和原子事实。
    2. 使用这些关键元素和事实构建一个图(graph),其中节点表示关键元素及其相关的原子事实。
    3. 通过一个代理(agent)系统自主地探索这个图,代理会根据问题逐步分析并制定合理计划,然后调用预定义的函数来读取节点内容和邻居信息,实现从粗到细的图探索。

    通过这种方法,GraphReader能够有效捕捉长文本中的长距离依赖和多跳关系,并且通过代理的自主探索和笔记记录,优化处理过程,直到收集到足够的信息生成答案。

    Q: 有哪些相关研究?

    A: 论文中提到了与长文本处理相关的几个研究领域,包括:

    1. 长上下文大型语言模型(Long-Context LLMs)
      • 研究者们专注于通过位置插值(Positional Interpolation, PI)增强模型处理长上下文的能力,但这需要在全文长度的文本上进行训练,导致数据和训练成本显著增加。
      • 一些方法如PoSE和SkipAlign研究了数据跳过策略,但这些方法可能会忽略长文本中的细节信息。
    2. 检索增强生成(Retrieval-Augmented Generation, RAG)
      • RAG利用大量文档数据库提取与任务相关的信息以辅助响应生成。
      • 研究者们探索了不同的检索粒度,包括标记(tokens)、实体(entities)和块(chunks)。
    3. 代理用于检索(Agent for Retrieval)
      • 最近的工作越来越多地利用LLMs作为代理来处理复杂问题,使用它们强大的规划和反思能力。
      • 例如,WebGPT模拟人类行为在互联网上搜索特定答案,而ReadAgent将文档组织成树形结构或分页页面。
    4. 变换器变体(Transformer Variants)
      • 提出了具有修改注意力机制的变换器变体,以解决长上下文问题,但这些模型可能会丢失早期信息。
    5. 其他相关工作
      • 包括对大型语言模型进行微调、修改位置嵌入、应用变换器变体等方法来优化长上下文任务的处理。

    这些研究为GraphReader的设计提供了背景和基础,同时也展示了现有方法的局限性,GraphReader旨在通过图结构和代理系统的方法来克服这些限制。

    Q: 论文如何解决这个问题?

    A: 论文通过提出GraphReader系统来解决大型语言模型(LLMs)处理长文本的问题。GraphReader的解决方案主要包括以下几个关键步骤:

    1. 图结构构建(Graph Construction)
      • 将长文本分割成小块(chunks),并提取关键元素和原子事实。
      • 将关键元素和原子事实构建成图,其中节点表示关键元素,边表示节点之间的关系。
    2. 代理初始化(Agent Initialization)
      • 代理首先制定一个理性的计划(Rational Plan),确定解决问题所需的关键信息。
      • 选择初始节点,这些节点是图探索的起点。
    3. 图探索(Graph Exploration)
      • 代理使用预定义的函数自主探索图结构,包括读取节点内容、邻居节点和相关信息。
      • 代理在探索过程中持续更新笔记本(notebook),记录相关信息。
    4. 信息收集与反思(Information Gathering and Reflection)
      • 代理在探索过程中,根据问题和理性计划,不断收集信息并进行反思,直到收集到足够的信息。
    5. 答案推理(Answer Reasoning)
      • 代理收集完所有信息后,使用链式思考(Chain-of-Thought)策略,分析每个笔记本中的内容,使用多数投票策略解决任何不一致性。
      • 最终,代理综合所有可用信息生成最终答案。
    6. 实验验证(Experimental Validation)
      • 在多个长文本问答(QA)基准测试中,验证GraphReader的性能,包括单跳和多跳问题。

    通过这种方法,GraphReader能够有效地处理长文本中的长距离依赖和多跳关系,同时在有限的上下文窗口内实现高效的信息检索和问题解答。

    Q: 论文做了哪些实验?

    A: 论文中进行了多项实验来评估GraphReader的性能,主要实验包括:

    1. 基准测试(Benchmark Evaluation)
      • 在两种类型的长文本问答(QA)基准测试上进行实验,包括多跳长文本QA(如HotpotQA、2WikiMultihopQA、MuSiQue)和单跳长文本QA(如NarrativeQA)。
      • 还包括了LV-Eval中的HotpotWikiQA-mixup,这是一个多跳基准测试,具有五个不同文本长度级别:16k、32k、64k、128k和256k。
    2. 评估指标(Evaluation Metrics)
      • 使用了多个自动评估指标,如F1分数、精确匹配(Exact Match, EM)分数和LV-Eval优化的F1*分数。
      • 为了评估答案的正确性,还实现了LLM Raters,使用LLM来评估答案的正确性,记为LLM-Rating-1(LR-1)和LLM-Rating-2(LR-2)。
    3. 与基线方法的比较(Comparison with Baseline Methods)
      • 将GraphReader与以下基线方法进行比较:检索增强生成(RAG)、长上下文LLM和基于代理的方法(如ReadAgent)。
    4. 主要结果(Main Results)
      • 展示了不同方法在四个多跳长文本基准测试和一个单跳长文本基准测试上的性能。
    5. 在极长文本任务上的评估(Evaluation on Extremely Long Context Tasks)
      • 研究了极长文本对GraphReader的影响,比较了不同方法在16k到256k不同文本长度级别上的性能。
    6. 消融研究(Ablation Study)
      • 分析了理性计划(Rational Plan)和节点选择(Node Selection)对GraphReader性能的影响。
      • 评估了不同初始节点数量对性能的影响,以及块大小(Chunk Size)对GraphReader性能的影响。
    7. 进一步分析(Further Analysis)
      • 对推理成本(Inference Cost)进行了分析,比较了ReadAgent和GraphReader的平均令牌消耗。
      • 对支持事实的召回率(Recall Rate Analysis)进行了评估,分析了不同方法在HotpotWikiQA-mixup数据集上的表现。

    这些实验结果表明GraphReader在处理长文本和复杂问题时的性能优于现有的方法,并且能够高效地利用有限的上下文窗口来处理长距离依赖和多跳关系。

    Q: 有什么可以进一步探索的点?

    A: 尽管GraphReader在处理长文本方面取得了显著的成果,但仍有一些潜在的研究方向可以进一步探索:

    1. 开放源代码:目前GraphReader使用的是闭源的GPT-4 API。未来的工作可以包括收集数据、训练模型,并将其开源,以便更广泛地贡献于学术界和工业界。
    2. 提高代理的效率:代理的效率依赖于其规划和推理能力。未来的研究可以探索如何增强这些功能,以提高方法的有效性。
    3. 处理更长文本:尽管GraphReader在长文本处理方面表现出色,但可以进一步研究如何扩展其能力以处理更长的文本,例如通过改进图结构的构建和探索策略。
    4. 优化图结构:研究不同的图结构优化技术,如节点聚类、边剪枝等,以提高图的可扩展性和探索效率。
    5. 多模态输入:探索将GraphReader扩展到多模态输入,例如结合文本、图像和其他数据类型,以处理更丰富的信息。
    6. 跨领域应用:研究GraphReader在不同领域(如医疗、法律、金融等)的应用,并针对特定领域进行优化。
    7. 用户交互:开发更复杂的用户交互机制,允许用户在探索过程中提供反馈,以指导代理更有效地搜索和推理。
    8. 实时性能:研究如何提高GraphReader的实时性能,以便在需要快速响应的应用场景中使用。
    9. 鲁棒性和泛化能力:进一步研究GraphReader在面对噪声数据、不完整信息或领域外数据时的鲁棒性和泛化能力。
    10. 可解释性:提高GraphReader的决策过程的可解释性,帮助用户理解其推理过程和答案生成的逻辑。
    11. 能耗和环境影响:评估和优化GraphReader在训练和推理过程中的能耗,以减少对环境的影响。
    12. 多语言支持:扩展GraphReader以支持多种语言,使其能够处理不同语言的长文本数据。

    这些探索点可以帮助GraphReader系统不断进步,更好地适应各种复杂和动态的环境。

    Q: 总结一下论文的主要内容

    A: 这篇论文介绍了GraphReader,一个基于图的代理系统,旨在增强大型语言模型(LLMs)处理长文本的能力。以下是论文的主要内容总结:

    1. 问题背景:传统的LLMs在处理长文本时面临上下文窗口和内存使用的限制,尤其在处理多跳问题时可能会忽略重要细节。
    2. GraphReader系统:提出了GraphReader,一个通过将长文本结构化为图并使用代理自主探索该图来处理长文本的系统。
    3. 系统组成
      • 图构建:将文本分割成块,提取关键元素和原子事实,构建图结构以捕捉长文本中的长距离依赖和多跳关系。
      • 代理操作:代理基于问题制定理性计划,选择初始节点,并使用预定义函数探索图结构。
    4. 方法论
      • 代理初始化:包括制定解决问题的步骤计划和选择起始节点。
      • 图探索:代理通过读取节点内容、邻居信息,并在探索过程中记录新见解。
      • 答案推理:代理收集完信息后,使用链式思考策略生成最终答案。
    5. 实验:在多个长文本问答基准上评估GraphReader的性能,包括单跳和多跳问题,并与现有方法进行比较。
    6. 结果:GraphReader在不同上下文长度的长文本任务上均优于基线方法,显示出在处理长文本方面的优势。
    7. 消融研究:分析了理性计划和节点选择对性能的影响,以及不同初始节点数量和块大小对系统性能的作用。
    8. 进一步分析:评估了GraphReader在推理成本和支持事实召回率方面的表现。
    9. 结论:GraphReader成功地通过图结构和代理探索方法增强了LLMs的长文本处理能力。
    10. 局限性和未来工作:讨论了GraphReader的局限性,并提出了未来可能的研究方向。

    整体而言,这篇论文提出了一个创新的系统,通过结构化长文本和代理探索的方法,有效地提高了LLMs处理长文本和复杂问题的能力。

  • 理解策略梯度算法

    引言

    策略梯度(Policy Gradient)是解决强化学习问题的一种方法。如果你对强化学习领域还不太了解,建议先阅读“A (Long) Peek into Reinforcement Learning » Key Concepts”一文,了解问题定义和基本概念。

    符号说明

    为了帮助大家更好地理解文中的公式,以下是一些常用符号的解释:

    符号含义
    (s \in \mathcal{S})状态
    (a \in \mathcal{A})动作
    (r \in \mathcal{R})奖励
    (S_t, A_t, R_t)在时间步 (t) 的状态、动作和奖励
    (\gamma)折扣因子;用于惩罚未来奖励的不确定性,(0 < \gamma \leq 1)
    (G_t)回报(或折扣后的未来奖励),(G_t = \sum_{k=0}^{\infty} \gamma^k R_{t+k+1})
    (P(s’, r \vert s, a))从当前状态 (s) 通过动作 (a) 转移到下一个状态 (s’) 并获得奖励 (r) 的概率
    (\pi(a \vert s))随机策略(代理行为策略),(\pi_\theta(.)) 是参数化的策略
    (\mu(s))确定性策略;我们也可以用 (\pi(s)),但用不同的字母可以更好地区分随机策略和确定性策略
    (V(s))状态值函数,衡量状态 (s) 的期望回报;(V_w(.)) 是参数化的值函数
    (V^\pi(s))跟随策略 (\pi) 时状态 (s) 的值,(V^\pi(s) = \mathbb{E}_{a\sim \pi} [G_t \vert S_t = s])
    (Q(s, a))动作值函数,类似于 (V(s)),但评估的是状态和动作对 ((s, a)) 的期望回报;(Q_w(.)) 是参数化的动作值函数
    (Q^\pi(s, a))跟随策略 (\pi) 时状态和动作对 ((s, a)) 的值,(Q^\pi(s, a) = \mathbb{E}_{a\sim \pi} [G_t \vert S_t = s, A_t = a])
    (A(s, a))优势函数,(A(s, a) = Q(s, a) – V(s));它可以被看作是另一种具有较低方差的 (Q) 值

    策略梯度的核心思想

    强化学习的目标是找到一个最优的行为策略,使智能体获得最大的奖励。策略梯度方法直接针对策略进行建模和优化。策略通常用参数 (\theta) 表示为 (\pi_\theta(a \vert s))。奖励(目标)函数的值依赖于这个策略,然后可以应用各种算法来优化 (\theta) 以获得最佳奖励。

    奖励函数定义为:

    [ J(\theta) = \sum_{s \in \mathcal{S}} d^\pi(s) V^\pi(s) = \sum_{s \in \mathcal{S}} d^\pi(s) \sum_{a \in \mathcal{A}} \pi_\theta(a \vert s) Q^\pi(s, a) ]

    其中,(d^\pi(s)) 是 (\pi_\theta) 的马尔可夫链的平稳分布(跟随策略 (\pi) 时的状态分布)。

    通过梯度上升,我们可以沿着梯度 (\nabla_\theta J(\theta)) 的方向调整 (\theta),以找到能产生最高回报的最佳 (\theta)。

    策略梯度定理

    计算 (\nabla_\theta J(\theta)) 比较复杂,因为它既涉及动作选择(直接由 (\pi_\theta) 决定)又涉及状态分布(间接由 (\pi_\theta) 决定)。由于环境通常是未知的,因此难以估计策略更新对状态分布的影响。

    幸运的是,策略梯度定理提供了一种简化梯度计算的优雅方法,不需要涉及状态分布 (d^\pi(.)) 的导数:

    [
    \begin{aligned}
    \nabla_\theta J(\theta)
    &= \nabla_\theta \sum_{s \in \mathcal{S}} d^\pi(s) \sum_{a \in \mathcal{A}} Q^\pi(s, a) \pi_\theta(a \vert s) \
    &\propto \sum_{s \in \mathcal{S}} d^\pi(s) \sum_{a \in \mathcal{A}} Q^\pi(s, a) \nabla_\theta \pi_\theta(a \vert s)
    \end{aligned}
    ]

    策略梯度定理的证明

    这一部分内容较为密集,我们将通过推导来证明策略梯度定理的正确性。

    首先,从状态值函数的导数开始:

    [
    \begin{aligned}
    & \nabla_\theta V^\pi(s) \
    =& \nabla_\theta \left(\sum_{a \in \mathcal{A}} \pi_\theta(a \vert s) Q^\pi(s, a) \right) \
    =& \sum_{a \in \mathcal{A}} \left( \nabla_\theta \pi_\theta(a \vert s) Q^\pi(s, a) + \pi_\theta(a \vert s) \color{red}{\nabla_\theta Q^\pi(s, a)} \right) \quad \text{(乘积法则)} \
    =& \sum_{a \in \mathcal{A}} \left( \nabla_\theta \pi_\theta(a \vert s) Q^\pi(s, a) + \pi_\theta(a \vert s) \color{red}{\nabla_\theta \sum_{s’, r} P(s’,r \vert s,a)(r + V^\pi(s’))} \right) \quad \text{(扩展 (Q^\pi) 以包含未来状态值)} \
    =& \sum_{a \in \mathcal{A}} \left( \nabla_\theta \pi_\theta(a \vert s) Q^\pi(s, a) + \pi_\theta(a \vert s) \color{red}{\sum_{s’, r} P(s’,r \vert s,a) \nabla_\theta V^\pi(s’)} \right) \quad \text{(使用 (P(s’,r \vert s,a)))}
    \end{aligned}
    ]

    可以看到,导数中的一项涉及 (V^\pi(s’)) 的导数,而这又会引入更多的状态和动作。然而,通过数学推导和一些运算技巧,我们可以逐步简化并得出最终的策略梯度公式。

    策略梯度算法

    接下来,我们介绍几种常见的策略梯度算法:

    1. REINFORCE

    REINFORCE 是一种基本的策略梯度方法,它通过采样轨迹来估计梯度,并利用这些估计值来更新策略参数。

    2. Actor-Critic

    Actor-Critic 方法结合了策略评估(critic)和策略改进(actor),使得算法在估计策略梯度时更加高效和稳定。

    3. Off-Policy Policy Gradient

    这种方法允许我们使用行为策略(behavior policy)来收集数据,并使用目标策略(target policy)来进行学习,从而提高数据利用率。

    4. A3C & A2C

    A3C(Asynchronous Advantage Actor-Critic)和 A2C(Advantage Actor-Critic)是 Actor-Critic 方法的改进版本,通过异步更新和同步更新来提高算法的效率和性能。

    5. DDPG & TD3

    DDPG(Deep Deterministic Policy Gradient)和 TD3(Twin Delayed Deep Deterministic Policy Gradient)适用于连续动作空间,利用深度神经网络来近似策略和值函数。

    6. PPO & TRPO

    PPO(Proximal Policy Optimization)和 TRPO(Trust Region Policy Optimization)通过引入信赖域和裁剪机制来确保策略更新的稳定性和有效性。

    7. SAC

    SAC(Soft Actor-Critic)引入了熵正则化项,使策略在探索和利用之间取得平衡。SAC 还可以自动调整温度参数,以优化探索过程。

    8. 其他算法

    除了上述几种常见的策略梯度算法,还有一些其他的变种和改进方法,如 SVPG(Stein Variational Policy Gradient)、IMPALA、DPG(Deterministic Policy Gradient)及其多智能体版本 MADDPG 等。

    策略梯度算法的应用

    策略梯度算法在强化学习的各个领域中有广泛的应用,包括但不限于以下几个方面:

    1. 游戏和娱乐:策略梯度算法被广泛应用于训练游戏 AI,例如 OpenAI 的 Dota 2 机器人和 DeepMind 的 AlphaGo。
    2. 机器人控制:用于复杂的机器人控制任务,如机械手臂的操作和无人机的导航。
    3. 自动驾驶:帮助自动驾驶系统在复杂的道路环境中进行决策和规划。
    4. 金融交易:用于优化交易策略,提高投资组合的收益率。
    5. 医疗诊断:辅助医疗决策,优化治疗方案。

    结论

    策略梯度算法提供了一种直接优化策略的方法,使得强化学习在解决复杂决策问题时更加高效和灵活。尽管计算过程相对复杂,但通过合理的算法设计和优化,可以在实际应用中取得显著的效果。

    如果你对策略梯度算法感兴趣,不妨深入研究本文提到的各种算法和数学推导。通过不断实践和探索,你将能够掌握这一强大的工具,并将其应用于各种实际问题中。

    参考文献

    • Sutton, R. S., & Barto, A. G. (2018). Reinforcement Learning: An Introduction. MIT Press.
    • Lilian Weng. (2018). Policy Gradient Algorithms. Retrieved from Lil’Log

    希望这篇文章能帮助你更好地理解策略梯度算法及其应用。如果有任何问题或建议,欢迎在评论区留言讨论。


  • RLHF 家族的奇巧魔改:On Policy 与 Off Policy 路线大PK

    随着 [Llama3] 的开源,Alignment 的重要性日益凸显,而作为 Alignment 中坚力量的 RLHF 家族也愈发繁荣。今天,我们就来一起探索一下 RLHF 领域中那些令人拍案叫绝的魔改思路吧!

    On Policy vs. Off Policy:究竟谁更胜一筹?

    在 LLM 领域,RLHF 主要分为两大路线:

    • On Policy 路线: 以 [PPO] 为代表,需要 LLM 在训练过程中实时生成文本。
    • Off Policy 路线: 以 [DPO] 为代表,不需要 LLM 在训练过程中实时生成文本,而是利用已有的数据进行学习。

    On Policy 方法通常需要更大的算力支持,训练时间也更长,但理论上具有更高的效果上限。

    On Policy:让模型亲自上阵

    On Policy 方法强调让模型在训练过程中“亲力亲为”,根据自身生成结果的好坏来学习改进。

    举个例子,想象一下你正在学习玩王者荣耀:

    • On Policy: 你亲自上阵,旁边有一位教练实时指导你的操作,当你成功推塔时给予鼓励,当你失误被杀时及时提醒。
    • Off Policy: 你观看大量职业选手和青铜玩家的对局视频,学习前者的优秀操作,避免后者的低级失误。

    On Policy 方法的优势在于训练数据与模型能力完全匹配,因为所有数据都是由当前模型生成的。

    Off Policy:站在巨人的肩膀上学习

    Off Policy 方法则侧重于利用已有数据进行学习,模型不需要亲自生成答案,因此训练速度更快,对算力要求更低。

    然而,Off Policy 方法的效果很大程度上取决于训练数据的质量和与模型能力的匹配程度。如果数据质量不高,或者与模型能力相差太远,那么训练效果就会大打折扣。

    1. On Policy 路线:PPO 及其优化

    1.1 ReMax:丢掉 Critic,轻装上阵

    [ReMax] 提出了一种大胆的想法:丢弃 PPO 中的 Critic 网络,让 Actor 直接与 Reward Model 对齐。

    这样做的好处显而易见:

    • 减少模型参数: 从 4 个模型减少到 3 个,参数量大幅降低。
    • 加速训练: 不再需要更新 Critic 网络,反向传播速度更快。

    ReMax 的核心在于使用“当前策略”认为最好的行为来作为 baseline,从而在没有 Critic 的情况下降低方差,稳定训练。

    1.2 GRPO:暴力求均值,效果依旧惊艳

    [DeepSpeek-v2] 中提出的 [GRPO] 算法则采取了另一种思路:保留 PPO 中 importance sampling 和 clip 等先进机制,但使用暴力采样求均值的方式来代替 Critic 网络。

    GRPO 的优势在于:

    • 简化模型结构: 无需 Critic 网络,降低了模型复杂度。
    • 保留 PPO 优势: 保留了 PPO 中的优秀机制,保证了训练效果。

    1.3 其他 On Policy 优化方向

    除了 ReMax 和 GRPO 之外,研究人员还探索了其他优化 PPO 算法的方向,例如:

    • 分布式 PPO: 将训练任务分配到多个 GPU 或 TPU 上,加快训练速度。
    • 基于 Transformer 的 PPO: 利用 Transformer 模型强大的表征能力,提升策略网络的性能。

    2. Off Policy 路线:DPO 及其改进

    2.1 DPO:最大化概率差,简单高效

    [DPO] 算法的思路非常直观:对于同一个 prompt,通过降低“坏答案”的采样概率,提升“好答案”的采样概率,从而训练模型。

    DPO 的优势在于:

    • 训练高效: 无需模型生成文本,训练速度快。
    • 数据利用率高: 可以充分利用已有的 pair 数据。

    2.2 DPOP:添加正则项,防止模型“训崩”

    DPO 算法存在一个问题:在某些情况下,”好答案” 和 “坏答案” 的采样概率会同时降低,导致模型效果不佳。

    为了解决这个问题,[DPOP] 算法在 DPO loss 的基础上加入了一个正则项,旨在:

    • 当模型对 “好答案” 拟合不足时,鼓励模型更多地学习 “好答案”。
    • 当模型对 “好答案” 拟合较好时,着重降低 “坏答案” 的采样概率。

    2.3 TDPO:引入 KL 惩罚,平衡效率与多样性

    与 PPO 类似,[TDPO] 算法也在 DPO 的 loss 函数中引入了 KL 惩罚项,用于限制模型更新幅度,防止过拟合。

    与 PPO 不同的是,TDPO 使用的是 forward KL,而不是 backward KL。这样做的好处是:

    • 输出多样性更高: forward KL 鼓励模型覆盖更广泛的概率分布,从而生成更多样化的文本。

    2.4 ORPO:抛弃参考模型,化繁为简

    [ORPO] 算法则更进一步,试图连 reference model 也一并省去。

    ORPO 的 loss 函数由两部分组成:

    • SFT Loss: 保证模型对 chosen response 的基本拟合。
    • Odds Ratio Loss: 通过最大化“好答案”与“坏答案”的 odds 值之比,来提升模型对“好答案”的偏好。

    结语

    无论是 On Policy 还是 Off Policy,RLHF 家族的“魔改”之路都充满了奇思妙想。相信随着研究的深入,RLHF 技术将会在 Alignment 领域发挥越来越重要的作用。

  • ChatGPT 背后的“功臣”——RLHF 技术详解

    OpenAI 推出的 ChatGPT 对话模型掀起了新的 AI 热潮,它能够流畅地回答各种问题,其表现令人惊叹,仿佛已经打破了机器与人类之间的界限。这一成就的背后,离不开大型语言模型 (LLM) 生成领域的一种全新训练范式:RLHF (Reinforcement Learning from Human Feedback),意为以强化学习方式依据人类反馈优化语言模型

    传统 LLM 评价体系的局限性

    过去几年,各种 LLM 在根据人类输入的提示 (prompt) 生成多样化文本方面取得了显著进展。然而,对于生成结果的评估却是一个主观且依赖于具体语境的难题。例如,我们可能希望模型生成一个充满创意的故事、一段真实可靠的信息性文本,或者是一段可执行的代码,而这些结果难以用现有的、基于规则的文本生成指标 (如 BLEU 和 ROUGE) 进行准确衡量。

    此外,传统的 LLM 通常以预测下一个单词的方式构建,并采用简单的损失函数 (如交叉熵) 进行训练,而没有显式地将人类的偏好和主观意见纳入考量。

    RLHF 的核心思想

    如果我们能够将人工反馈作为衡量生成文本质量的标准,甚至将其作为损失函数来优化模型,岂不是更好?这正是 RLHF 的核心思想:利用强化学习的方式,根据人类反馈直接优化语言模型。RLHF 使得基于通用文本数据训练的语言模型能够与复杂的人类价值观相一致。

    RLHF 技术分解

    RLHF 涉及多个模型和不同的训练阶段,可以概括为以下三个步骤:

    1. 预训练语言模型 (LM)
    2. 聚合问答数据并训练奖励模型 (Reward Model,RM)
    3. 利用强化学习 (RL) 微调 LM

    Step 1. 预训练语言模型

    首先,我们需要使用经典的预训练目标训练一个基础语言模型。例如,OpenAI 在其首个 RLHF 模型 InstructGPT 中使用了较小版本的 GPT-3;Anthropic 则采用了 1000 万到 520 亿参数不等的 Transformer 模型;DeepMind 则使用了自家的 2800 亿参数模型 Gopher。

    Step 2. 训练奖励模型

    奖励模型 (RM) 的训练是 RLHF 区别于传统训练范式的关键所在。RM 接收一段文本作为输入,并返回一个标量奖励值,该值代表了人类对这段文本的偏好程度。

    RM 的构建方式可以是端到端的 LM,也可以是模块化的系统 (例如,先对多个输出进行排序,再将排序结果转换为奖励值)。

    Step 3. 用强化学习微调

    长期以来,由于工程和算法上的原因,人们普遍认为使用强化学习训练 LLM 是不切实际的。然而,目前多个研究机构已经找到了可行的解决方案,即使用策略梯度强化学习 (Policy Gradient RL) 算法,特别是近端策略优化 (Proximal Policy Optimization,PPO) 算法,对初始 LM 的部分或全部参数进行微调。

    RLHF 的未来

    尽管 RLHF 取得了一定的成果,但它仍然存在一些局限性。例如,RLHF 模型仍然可能生成有害或不真实的文本。

    此外,RLHF 的成功很大程度上取决于人类偏好数据的质量和数量。生成高质量的回答需要雇佣专业的标注人员,而训练 RM 通常需要大量的奖励标签,这对于许多研究机构来说是一笔不小的开销。

    参考资料

    结语

    RLHF 是 LLM 领域的一项突破性技术,它为构建更符合人类价值观的 AI 系统开辟了新的道路。 随着研究的深入,我们可以预见 RLHF 将在未来发挥更大的作用。


    近端策略优化 (PPO) 算法

    在 RLHF 的第三阶段,我们需要利用强化学习对预训练的语言模型进行微调。近端策略优化 (Proximal Policy Optimization, PPO) 算法作为一种高效且常用的强化学习算法,在这一阶段扮演着至关重要的角色。

    为什么选择 PPO 算法?

    长期以来,由于工程和算法上的挑战,人们普遍认为使用强化学习训练大型语言模型 (LLM) 是不切实际的。然而,PPO 算法的出现改变了这一现状。

    PPO 算法具有以下优点,使其成为 RLHF 中的理想选择:

    • 高效性: PPO 算法在训练过程中能够高效地利用数据,并且收敛速度较快。
    • 稳定性: PPO 算法通过限制策略更新幅度,有效地避免了训练过程中的剧烈震荡,提高了训练的稳定性。
    • 易于实现: PPO 算法的实现相对简单,现有的深度学习框架 (如 TensorFlow 和 PyTorch) 都提供了相应的库和工具。

    PPO 算法的工作原理

    PPO 算法的核心思想是在每次迭代中,通过优化一个代理目标函数来更新策略,同时限制策略更新幅度,以确保训练的稳定性。

    具体来说,PPO 算法会维护两个策略:

    • 当前策略 (Current Policy): 用于与环境交互并生成训练数据的策略。
    • 旧策略 (Old Policy): 用于计算代理目标函数的策略,其参数在每次迭代开始时会被更新为当前策略的参数。

    PPO 算法的目标函数包含两个主要部分:

    • 策略改进项: 鼓励当前策略在旧策略的基础上取得更高的奖励。
    • 策略约束项: 限制当前策略与旧策略之间的差异,以确保训练的稳定性。

    PPO 算法在 RLHF 中的应用

    在 RLHF 中,我们将语言模型视为一个策略,该策略接收提示 (prompt) 作为输入,并生成文本作为输出。奖励模型 (RM) 则用于评估生成文本的质量,并提供相应的奖励值。

    PPO 算法通过迭代优化策略,使得语言模型能够生成获得更高奖励的文本,从而逐步提高语言模型与人类偏好的匹配程度。

    结语

    PPO 算法作为一种高效且稳定的强化学习算法,在 RLHF 中发挥着至关重要的作用。随着研究的深入,我们可以预见 PPO 算法将在未来推动 LLM 领域取得更大的突破。

  • 加拿大留学骗局?看这几个事实你就明白了

    最近,一张照片在北美社交媒体上引起了广泛关注。照片中,一位多伦多大学的女博士举着一块写有“985双一流”、“QS前30”的牌子在街头乞讨。这不仅让人们对高学历者的就业难题产生了深深的共鸣,还引发了对加拿大留学现状的质疑。

    前几天,一位加拿大帅哥也在小红书上抱怨,他投了400封简历却仍然找不到工作,并公开质问:“到底出了什么问题?”

    其实,答案很简单:加拿大留学存在巨大的隐患。

    根据ICEF今年年初发布的数据,现在加拿大的留学生人数已经超过100万。这意味着,加拿大的留学生人数已经与美国相当,甚至超过了一些传统的留学热门国家。例如,澳大利亚在今年巅峰时期的留学生人数只有70万,而且澳洲政府已经开始强制减少留学生数量。

    那么,为什么加拿大的情况如此糟糕?以下几个原因可能给你一些启示。

    1. 加拿大的“留学海界王中王”地位(原因①)

    尽管加拿大吸引了大量留学生,但并不是所有人都了解其中的复杂情况。加拿大对黑人留学生更为青睐,而对白人和亚洲留学生的态度相对冷淡。现今,印度等南亚地区的留学生人数是亚洲人的5到6倍。

    2. 欧亚移民的边缘化(原因②)

    由于种族歧视的存在,东亚留学生在加拿大的地位并不高。即使他们在哈佛等名校表现出色,但在加拿大,他们的机会却受到限制。这种现象反映了加拿大教育系统对非白人尤其是亚洲人的不公平待遇。

    3. 加拿大的生产力低下(原因③)

    加拿大的生产力在所有西方发达国家中处于最低水平。如果加拿大的工作人口每小时能产生1美元的效益,美国则能产生1.3美元,即美国的生产力比加拿大高了30%。讽刺的是,加拿大的人口平均学历却是西方发达国家中最高的。然而,高学历者在加拿大往往从事低技能工作,这使得他们的教育背景无法得到应有的回报。

    4. 高学历者的困境(原因④)

    在加拿大,高学历并不总能带来优越的职业机会。许多外国学历的持有者在加拿大只能从事低技能工作。据统计,几乎四分之一的外国大学毕业生在加拿大从事的工作不需要高学历。这反映了加拿大的教育体系存在严重的滥发文凭现象。

    5. 市场竞争的下降(原因⑤)

    加拿大竞争局的报告指出,加拿大企业之间的竞争程度正在下降,许多行业已经形成了固定的价格架构,不再提供物有所值的服务。这种市场环境进一步削弱了加拿大的经济效益。

    6. 移民政策的收紧(原因⑥)

    五年前,加拿大约有20%的留学生能够留在当地,但现在这种机会已经大幅减少。加拿大政府对移民政策的收紧,使得许多留学生在毕业后不得不选择回国或寻找其他出路。

    总结

    综合来看,加拿大留学的现状可以通过以下因果链条来解释:

    • 市场竞争的下降(原因⑤)导致了经济效益的低下(原因③)。
    • 经济效益的低下导致了对非黑人留学生的歧视和边缘化(原因②)。
    • 对非黑人留学生的歧视和边缘化导致了教育体系的滥发文凭(原因④)。
    • 教育体系的滥发文凭进一步导致了加拿大留学的“海界王中王”地位(原因①)。

    最终,这一系列问题共同构成了加拿大的教育和移民骗局。面对这种情况,我们不得不承认,加拿大的留学市场已经陷入了一片混乱之中。

    是的,加拿大的留学之路已经变得异常艰难,甚至可以说,加拿大的留学市场已经彻底完蛋了。

  • 剩女困境?高学历女性的婚恋迷思

    越来越多的高学历、高收入女性在婚恋市场上遭遇困境,这背后的原因值得我们深思。

    1. 社会进步与传统观念的碰撞

    随着女性社会地位和经济独立性的提升,她们不再将婚姻视为唯一的依靠,而是更加注重自我价值的实现和精神层面的契合。然而,传统的婚恋观念仍然根深蒂固,社会对女性,尤其是大龄女性的评价标准依然存在偏见,这给她们带来了无形的压力。

    2. 高期望与现实差距

    高学历、高收入的女性往往拥有更广阔的视野和更高的择偶标准,她们渴望找到与自己在精神、物质等方面都匹配的伴侣。然而,现实生活中符合她们期望的男性相对较少,导致她们难以找到理想的对象。

    3. 婚恋市场的信息不对称

    传统的相亲方式存在信息不对称的问题,双方往往只能通过简短的接触来了解彼此,很难深入了解对方的性格、价值观等方面。这导致很多潜在的优秀伴侣被错过。

    4. 女性在婚育中的牺牲和风险

    尽管社会在不断进步,但女性在婚育方面仍然承担着更多的责任和牺牲。生育、抚养孩子以及照顾家庭的压力,可能会影响她们的职业发展,甚至被迫放弃事业。这种风险和压力也是很多女性选择单身的原因之一。

    如何破解高学历女性的婚恋困境?

    • 转变观念, 尊重女性的选择 社会应该尊重女性的婚恋选择,无论是结婚还是单身,都应该得到理解和支持。
    • 拓宽交友渠道, 创造更多相遇的机会 鼓励发展更加多元化的婚恋交友平台,为高学历女性提供更多接触优秀异性的机会。
    • 关注女性需求, 提供婚育支持 完善社会保障体系,减轻女性婚育压力,为她们创造更加公平、友好的生育环境。
    • 加强沟通, 寻求理解与包容 男女双方应该坦诚沟通,互相理解,在婚姻中共同承担责任,共同成长。

    高学历女性的婚恋问题,不仅仅是个人问题,更是社会问题。只有社会各界共同努力,才能为她们创造更加美好的未来。