标签: AGI

  • AI大模型平台Dify:全面支持主流模型,助力AI应用开发

    在人工智能快速发展的今天,大语言模型(LLM)正在改变各行各业的工作方式。然而,如何高效地将这些强大的模型整合到实际应用中,仍然是许多开发者和企业面临的挑战。针对这一需求,AI应用开发平台Dify应运而生,为用户提供了一站式的LLM应用开发解决方案。

    Dify:打造LLM应用开发的全能平台

    Dify是一个基于LLM的AI应用开发平台,旨在简化AI应用的创建和部署过程。无论是初学者还是经验丰富的开发者,都能在Dify上快速构建功能强大的AI应用。

    该平台支持主流的模型提供商,如OpenAI的GPT系列和Anthropic的Claude系列。每种模型都有其独特的功能和参数,用户可以根据应用需求选择最适合的模型提供商。值得注意的是,在Dify中使用这些模型之前,用户需要从模型提供商的官方网站获取API密钥。

    Dify中的模型类型:功能多样,应对不同需求

    Dify将模型分为四种类型,每种类型都针对特定的使用场景:

    1. 系统推理模型:这类模型用于应用中的聊天、名称生成和建议后续问题等任务。支持的提供商包括OpenAI、Azure OpenAI Service、Anthropic、Hugging Face Hub、Replicate、Xinference、OpenLLM、iFLYTEK SPARK、文心一言、通义、Minimax、智谱(ChatGLM)、Ollama和LocalAI等。
    2. 嵌入模型:主要用于嵌入知识库中的分段文档,以及处理应用中的用户查询。支持的提供商包括OpenAI、智谱(ChatGLM)和Jina AI(Jina Embeddings 2)。
    3. 重排序模型:用于增强LLM的搜索能力。目前支持的提供商是Cohere。
    4. 语音转文本模型:在对话应用中将口语转换为文本。目前支持的提供商是OpenAI。

    随着技术的发展和用户需求的变化,Dify计划在未来添加更多的LLM提供商,以满足不断evolving的市场需求。

    体验先行:Dify的托管模型试用服务

    为了让用户能够充分体验不同模型的功能,Dify为云服务用户提供了试用配额。这包括200次调用GPT3.5-turbo、GPT3.5-turbo-16k和text-davinci-003等模型的机会。不过,用户需要注意在试用期结束前设置自己的模型提供商,以确保应用使用不会中断。

    灵活配置:设置默认模型

    Dify会根据使用情况自动选择默认模型。用户也可以在”设置>模型提供商”中进行个性化配置,以满足特定的应用需求。

    模型集成:简单而安全

    Dify的模型集成设置分为两大类:专有模型和托管模型。

    专有模型提供商(如OpenAI和Anthropic)的集成相对简单。用户只需在Dify中设置提供商的API密钥,即可连接该提供商的所有模型。值得一提的是,Dify使用PKCS1_OAEP加密来保护用户的API密钥,每个用户(租户)都有一个独特的密钥对用于加密,确保API密钥的机密性。

    托管模型提供商(如Hugging Face和Replicate)则需要单独集成每个第三方模型。虽然具体的集成方法因提供商而异,但Dify为主要的托管模型提供商(如Hugging Face、Replicate、Xinference和OpenLLM)提供了详细的集成指南。

    落地应用:模型配置后的使用

    一旦完成模型配置,这些模型就可以在Dify的应用中直接使用了。用户可以根据应用的具体需求,选择合适的模型来处理不同的任务,如对话生成、文本嵌入、搜索优化或语音转文本等。

    结语:Dify开启AI应用开发新纪元

    Dify作为一个全面的AI应用开发平台,不仅提供了对主流大语言模型的广泛支持,还简化了模型集成和应用开发的流程。通过其直观的界面和强大的功能,Dify正在帮助开发者和企业快速将AI技术转化为实际应用,推动AI技术的普及和创新。

    随着AI技术的不断进步,我们可以期待Dify将继续扩展其功能,支持更多的模型和应用场景,为用户提供更加丰富和强大的AI开发工具。无论您是AI领域的专家,还是刚刚踏入这个领域的新手,Dify都将成为您不可或缺的得力助手,助您在AI应用开发的道路上披荆斩棘,创造出更多令人惊叹的AI应用。

    参考文献:

    1. Dify官方文档. (n.d.). Model | Dify. https://docs.dify.ai/guides/model-configuration
  • Dify: 定义未来AI应用开发的新标准

    在人工智能快速发展的今天,如何高效地开发和部署AI应用已成为众多开发者和企业面临的关键挑战。Dify作为一个开源的大语言模型(LLM)应用开发平台,正在为这一挑战提供创新的解决方案。让我们深入探讨Dify如何改变AI应用开发的游戏规则,以及它为什么值得您关注。

    重新定义AI应用开发

    Dify的名称源于”Define”和”Modify”的组合,意味着定义和持续改进AI应用。这个简单而富有深意的名称背后,隐藏着Dify的核心理念:为开发者提供一个灵活、可扩展且易于使用的AI应用开发平台。

    与传统的开发工具相比,Dify更像是一个精心设计的脚手架系统。如果说LangChain等库是提供各种工具的工具箱,那么Dify则是一个完整的、经过精心工程设计和软件测试的解决方案。这种方法不仅大大减少了开发者”重新发明轮子”的时间,还确保了开发过程的高效性和最终产品的可靠性。

    Dify的核心优势

    1. 全面的模型支持: Dify支持数百种专有和开源LLM,让开发者可以根据具体需求选择最合适的模型。
    2. 直观的Prompt编排界面: 通过可视化的界面,即使是非技术人员也能参与AI应用的定义和数据操作。
    3. 高质量的RAG引擎: 检索增强生成(RAG)技术在Dify中得到了优化实现,提高了AI应用的信息处理能力。
    4. 灵活的Agent框架: 允许开发者构建复杂的AI代理,实现更高级的任务处理能力。
    5. 易用的接口和API: Dify提供了一套简单易用的接口和API,大大降低了开发门槛。
    6. 开源优势: 作为开源项目,Dify由专业的全职团队和社区共同创建,确保了产品的持续改进和创新。
    7. 自部署能力: 用户可以在自己的服务器上部署类似Assistants API和GPTs的功能,保持对数据的完全控制。

    Dify的应用场景

    Dify的灵活性和强大功能使其能够适应多种应用场景:

    1. 初创企业: 快速将AI创意转化为现实,加速成功或失败的验证过程。许多团队已经通过Dify构建MVP,成功获得融资或赢得客户订单。
    2. 现有业务集成: 通过引入LLM增强现有应用的能力。Dify的RESTful API使得Prompt与业务逻辑的解耦成为可能,同时提供管理界面以跟踪数据、成本和使用情况。
    3. 企业LLM基础设施: 一些银行和互联网公司正将Dify部署为内部LLM网关,加速GenAI技术的采用,同时实现集中治理。
    4. 技术探索: 即使是技术爱好者,也可以通过Dify轻松实践Prompt工程和Agent技术。在GPTs问世之前,就有超过60,000名开发者在Dify上构建了他们的第一个应用。

    社区评价与用户反馈

    Dify的用户普遍认为该产品简单、克制且迭代迅速。这种评价反映了Dify在用户体验和功能开发上的优秀表现。正如Dify.AI的CEO Lu Yu所说,”我们希望上述信息和本指南能帮助您了解这个产品。我们相信Dify是为您而生的。”

    开始使用Dify

    如果您对Dify感兴趣,以下是一些建议的下一步行动:

    1. 阅读快速入门指南,了解Dify的应用构建工作流程。
    2. 学习如何将Dify自部署到您的服务器,并集成开源模型。
    3. 深入了解Dify的规格和发展路线图。
    4. 在GitHub上为Dify点赞,并阅读贡献者指南,参与到这个开源项目中来。

    结语

    在AI应用开发日益复杂的今天,Dify为开发者和企业提供了一个强大而灵活的解决方案。无论您是想快速验证AI创意,还是将LLM能力集成到现有业务中,抑或是构建企业级的AI基础设施,Dify都能满足您的需求。

    随着AI技术的不断发展,Dify也在持续进化。它不仅是一个开发工具,更是一个不断成长的生态系统。通过社区的力量,Dify正在定义和重塑AI应用开发的未来。对于那些希望在AI领域保持竞争力的开发者和企业来说,Dify无疑是一个值得深入探索和利用的平台。

  • 多头自注意力机制详解:手把手计算现代AI的基石

    1. 引言

    在现代人工智能领域,多头自注意力机制(Multi-Headed Self Attention, MHSA)可以说是最重要的架构范式之一。它是Transformer模型的核心组件,而Transformer又是当前最先进的大型语言模型的基础架构。本文将深入浅出地解析多头自注意力机制的工作原理,通过手动计算的方式,让读者对其内部运作有一个直观而全面的理解。

    2. 多头自注意力机制的背景

    在深入MHSA之前,我们先简要回顾一下自然语言处理(NLP)领域的相关发展历程。早期的NLP模型主要依赖于循环神经网络(RNN)和长短期记忆网络(LSTM)等序列模型。这些模型虽然能够处理序列数据,但在处理长序列时存在长期依赖问题。

    2017年,Google提出了Transformer模型,其核心就是多头自注意力机制。MHSA能够并行处理输入序列,捕捉序列中的长距离依赖关系,大大提高了模型的性能和效率。自此,MHSA成为了NLP领域的主流技术,被广泛应用于各种大型语言模型中。

    3. 多头自注意力机制的工作原理

    让我们通过一个具体的例子,step by step地计算多头自注意力机制的输出。我们将遵循以下步骤:

    1. 定义输入
    2. 定义可学习参数
    3. 计算查询(Query)、键(Key)和值(Value)
    4. 划分多个注意力头
    5. 计算Z矩阵
    6. 掩码操作
    7. 计算注意力矩阵
    8. 计算注意力头的输出
    9. 拼接多个注意力头的输出

    3.1 定义输入

    MHSA可以应用于各种类型的数据,但通常情况下,输入是一个向量序列。在自然语言处理中,这通常是词嵌入(word embedding)与位置编码(positional encoding)的组合。

    假设我们有一个简单的输入序列,包含3个词,每个词用4维向量表示:

    Input = [
        [1, 2, 3, 4],
        [5, 6, 7, 8],
        [9, 10, 11, 12]
    ]

    这个4×3的矩阵代表了我们的输入序列。

    3.2 定义可学习参数

    MHSA主要学习三个权重矩阵,用于构造”查询”(Query)、”键”(Key)和”值”(Value)。在本例中,我们假设模型已经学习到了以下权重矩阵:

    W_Q = [
        [0.1, 0.2],
        [0.3, 0.4],
        [0.5, 0.6],
        [0.7, 0.8]
    ]
    
    W_K = [
        [0.1, 0.2],
        [0.3, 0.4],
        [0.5, 0.6],
        [0.7, 0.8]
    ]
    
    W_V = [
        [0.1, 0.2],
        [0.3, 0.4],
        [0.5, 0.6],
        [0.7, 0.8]
    ]

    这些4×2的矩阵代表了模型的可学习参数。

    3.3 计算查询、键和值

    接下来,我们将输入与权重矩阵相乘,得到查询、键和值:

    Query = Input * W_Q
    Key = Input * W_K
    Value = Input * W_V

    让我们计算Query:

    Query = [
        [1*0.1 + 2*0.3 + 3*0.5 + 4*0.7, 1*0.2 + 2*0.4 + 3*0.6 + 4*0.8],
        [5*0.1 + 6*0.3 + 7*0.5 + 8*0.7, 5*0.2 + 6*0.4 + 7*0.6 + 8*0.8],
        [9*0.1 + 10*0.3 + 11*0.5 + 12*0.7, 9*0.2 + 10*0.4 + 11*0.6 + 12*0.8]
    ]
    
    Query = [
        [5.0, 6.0],
        [13.0, 15.0],
        [21.0, 24.0]
    ]

    同理可得Key和Value:

    Key = [
        [5.0, 6.0],
        [13.0, 15.0],
        [21.0, 24.0]
    ]
    
    Value = [
        [5.0, 6.0],
        [13.0, 15.0],
        [21.0, 24.0]
    ]

    3.4 划分多个注意力头

    多头自注意力机制的”多头”体现在这一步。我们将Query、Key和Value划分为多个子矩阵,每个子矩阵对应一个注意力头。在本例中,我们使用两个注意力头:

    Query_1 = [
        [5.0],
        [13.0],
        [21.0]
    ]
    
    Query_2 = [
        [6.0],
        [15.0],
        [24.0]
    ]
    
    Key_1 = [
        [5.0],
        [13.0],
        [21.0]
    ]
    
    Key_2 = [
        [6.0],
        [15.0],
        [24.0]
    ]
    
    Value_1 = [
        [5.0],
        [13.0],
        [21.0]
    ]
    
    Value_2 = [
        [6.0],
        [15.0],
        [24.0]
    ]

    这样,我们就得到了两组Query、Key和Value,分别用于两个注意力头的计算。

    3.5 计算Z矩阵

    接下来,我们需要计算Z矩阵,这是构造注意力矩阵的中间步骤。Z矩阵由Query和Key的矩阵乘法得到。我们以第一个注意力头为例:

    Z_1 = Query_1 * Key_1^T
    
    Z_1 = [
        [5.0],    [5.0, 13.0, 21.0]
        [13.0], *
        [21.0]
    ]
    
    Z_1 = [
        [5.0*5.0, 5.0*13.0, 5.0*21.0],
        [13.0*5.0, 13.0*13.0, 13.0*21.0],
        [21.0*5.0, 21.0*13.0, 21.0*21.0]
    ]
    
    Z_1 = [
        [25, 65, 105],
        [65, 169, 273],
        [105, 273, 441]
    ]

    为了防止Z矩阵的值随着序列长度的增加而过大,我们通常会将Z矩阵除以序列长度的平方根。在本例中,序列长度为3,所以我们将Z_1除以\sqrt{3}:

    Z_1 = [
        [14.43, 37.53, 60.62],
        [37.53, 97.58, 157.62],
        [60.62, 157.62, 254.62]
    ]

    同理可得Z_2。

    3.6 掩码操作

    在某些应用场景中,如语言模型预测下一个词时,我们需要进行掩码操作,以确保模型在预测时不会”看到”未来的信息。这通常通过将Z矩阵中的某些位置设置为负无穷来实现。在本例中,我们假设不需要掩码操作。

    3.7 计算注意力矩阵

    注意力矩阵是通过对Z矩阵的每一行进行softmax运算得到的。softmax函数的定义如下:

    softmax(x_i) = \frac{e^{x_i}}{\sum_j e^{x_j}}

    让我们以Z_1的第一行为例计算softmax:

    row = [14.43, 37.53, 60.62]
    e_row = [1,850,752, 20,215,372,293, 1,800,537,936,918]
    sum_e_row = 1,822,604,060,963
    
    softmax(row) = [
        1,850,752 / 1,822,604,060,963,
        20,215,372,293 / 1,822,604,060,963,
        1,800,537,936,918 / 1,822,604,060,963
    ]
    
    softmax(row) ≈ [0.001, 0.011, 0.988]

    对Z_1的每一行都进行这样的计算,我们就得到了注意力矩阵Attention_1:

    Attention_1 ≈ [
        [0.001, 0.011, 0.988],
        [0.000, 0.000, 1.000],
        [0.000, 0.000, 1.000]
    ]

    同理可得Attention_2。

    3.8 计算注意力头的输出

    得到注意力矩阵后,我们将其与Value相乘,得到每个注意力头的输出:

    Output_1 = Attention_1 * Value_1
    
    Output_1 ≈ [
        [0.001*5.0 + 0.011*13.0 + 0.988*21.0],
        [0.000*5.0 + 0.000*13.0 + 1.000*21.0],
        [0.000*5.0 + 0.000*13.0 + 1.000*21.0]
    ]
    
    Output_1 ≈ [
        [20.86],
        [21.00],
        [21.00]
    ]

    同理可得Output_2。

    3.9 拼接多个注意力头的输出

    最后,我们将所有注意力头的输出拼接起来,得到多头自注意力机制的最终输出:

    Final_Output = [Output_1 | Output_2]
    
    Final_Output ≈ [
        [20.86, 24.00],
        [21.00, 24.00],
        [21.00, 24.00]
    ]

    这个3×2的矩阵就是多头自注意力机制的输出结果。

    4. 多头自注意力机制的优势

    通过上述计算过程,我们可以看出多头自注意力机制具有以下优势:

    1. 并行计算: MHSA可以并行处理输入序列中的所有元素,大大提高了计算效率。
    2. 捕捉多种关系: 通过使用多个注意力头,模型可以同时关注输入序列中的不同特征和关系。
    3. 长距离依赖: MHSA可以有效捕捉序列中的长距离依赖关系,克服了RNN等传统模型的局限性。
    4. 灵活性: MHSA可以应用于各种类型的序列数据,不仅限于自然语言处理。
    5. 可解释性: 注意力权重可以提供模型决策过程的一定解释性,有助于理解模型的工作原理。

    5. 多头自注意力机制的应用

    MHSA在自然语言处理领域有广泛的应用,包括但不限于:

    1. 机器翻译: Transformer模型在机器翻译任务中取得了突破性的成果。
    2. 文本生成: GPT系列模型使用了基于MHSA的架构,能够生成高质量的文本。
    3. 问答系统: BERT等模型在问答任务中表现出色,为智能问答系统提供了强大的支持。
    4. 文本分类: MHSA可以有效捕捉文本的语义特征,提高分类准确率。
    5. 语音识别: 在语音识别任务中,MHSA也展现出了优秀的性能。
    6. 图像处理: 虽然最初设计用于NLP任务,但MHSA也被成功应用于计算机视觉领域。

    6. 结论

    多头自注意力机制是现代人工智能,特别是自然语言处理领域的核心技术之一。通过本文的详细计算过程,我们深入了解了MHSA的工作原理。尽管实际应用中的计算规模要大得多,但基本原理是相同的。

    理解MHSA的工作原理对于深入学习和应用先进的AI技术至关重要。随着技术的不断发展,我们可以期待MHSA在更多领域发挥重要作用,推动人工智能技术的进步。

    参考文献

    1. Warfield, D. (2024). Multi-Headed Self Attention — By Hand. Intuitively and Exhaustively Explained. https://iaee.substack.com/p/multi-headed-self-attention-by-hand
    2. Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., … & Polosukhin, I. (2017). Attention is all you need. Advances in neural information processing systems, 30.
  • Mem0: 为个性化AI提供智能记忆层

    Mem0 是一个为大语言模型(Large Language Models, LLMs)提供智能、自我改进记忆层的工具,旨在跨应用实现个性化的AI体验。

    🚀 快速入门

    安装

    要开始使用 Mem0,你首先需要安装它。安装过程非常简单,只需运行以下命令:

    pip install mem0ai

    基本用法

    安装完成后,你可以通过以下代码快速了解 Mem0 的基本用法:

    import os
    from mem0 import Memory
    
    # 设置OpenAI API 密钥
    os.environ["OPENAI_API_KEY"] = "xxx"
    
    # 初始化 Mem0
    m = Memory()
    
    # 存储一个来自非结构化文本的记忆
    result = m.add("I am working on improving my tennis skills. Suggest some online courses.", user_id="alice", metadata={"category": "hobbies"})
    print(result)
    # 输出: Created memory: Improving her tennis skills. Looking for online suggestions.
    
    # 检索记忆
    all_memories = m.get_all()
    print(all_memories)
    
    # 搜索记忆
    related_memories = m.search(query="What are Alice's hobbies?", user_id="alice")
    print(related_memories)
    
    # 更新记忆
    result = m.update(memory_id="m1", data="Likes to play tennis on weekends")
    print(result)
    
    # 获取记忆历史
    history = m.history(memory_id="m1")
    print(history)

    通过上述代码示例,用户可以轻松存储、检索、搜索和更新记忆。

    🔑 核心功能

    Mem0 提供了一系列强大的核心功能,包括:

    • 多层记忆:支持用户、会话和AI代理的记忆保留
    • 自适应个性化:基于交互的持续改进
    • 开发者友好的API:简便的集成到各种应用中
    • 跨平台一致性:在不同设备上保持一致的行为
    • 托管服务:无忧的托管解决方案

    这些核心功能使得 Mem0 成为一个强大且灵活的工具,适用于各种应用场景。

    📖 文档

    有关详细的使用说明和API参考,请访问我们的文档:docs.mem0.ai

    🔧 高级用法

    对于生产环境,可以使用 Qdrant 作为向量存储:

    from mem0 import Memory
    
    config = {
        "vector_store": {
            "provider": "qdrant",
            "config": {
                "host": "localhost",
                "port": 6333,
            }
        },
    }
    
    m = Memory.from_config(config)

    通过这种配置,用户可以在生产环境中获得更高效的记忆管理和检索能力。

    🗺️ 发展路线

    Mem0 的发展路线图包括:

    • 与各种LLM提供商的集成
    • 支持LLM框架
    • 与AI代理框架的集成
    • 可定制的记忆创建/更新规则
    • 托管平台支持

    这些计划中的功能将进一步提升 Mem0 的功能和灵活性,使其能够适应更多的应用场景。

    🙋‍♂️ 支持

    如果你有任何问题或需要帮助,可以加入我们的 Slack 或 Discord 社区进行讨论和寻求支持:

    我们期待与你的互动和反馈!

    结论

    Mem0 为大语言模型提供了一个智能、自我改进的记忆层,使得跨应用的个性化AI体验成为可能。通过其强大的核心功能、开发者友好的API以及灵活的配置选项,Mem0 成为一个强大且易于使用的工具,适用于各种应用场景。无论是快速入门还是高级用法,Mem0 都能满足用户的需求,并通过持续的改进和发展路线图,不断提升其功能和用户体验。

    参考文献

    1. Mem0 GitHub Repository
    2. Mem0 Documentation

    通过这些资源,你可以进一步了解 Mem0 的详细信息和使用方法。

  • 使用OpenVINO GenAI Flavor运行大语言模型

    随着人工智能技术的快速发展,大语言模型(Large Language Models, LLMs)在自然语言处理领域扮演着越来越重要的角色。然而,这些模型通常规模庞大、计算密集,给部署和推理带来了巨大挑战。为了解决这一问题,英特尔推出了OpenVINO GenAI Flavor,这是一个专门针对生成式AI模型优化的推理引擎。本文将详细介绍如何使用OpenVINO GenAI Flavor来高效运行LLMs,帮助开发者充分发挥硬件性能,实现快速、高效的模型推理。

    OpenVINO GenAI Flavor概述

    OpenVINO GenAI Flavor是OpenVINO工具套件的一个专门版本,旨在优化生成式AI模型的推理性能。它集成了多项先进技术,如动态形状支持、稀疏计算和高效内存管理等,特别适合处理LLMs这类大规模、复杂的模型。

    主要特点

    1. 专为LLMs优化:针对Transformer架构和生成式任务进行了特殊优化。
    2. 动态形状支持:能够处理变长输入序列,无需固定批处理大小。
    3. 高效内存管理:通过智能缓存和内存复用技术,显著减少内存占用。
    4. 稀疏计算加速:利用模型的稀疏性,提高计算效率。
    5. 多硬件支持:可在CPU、GPU等多种硬件平台上运行,充分利用硬件特性。

    安装和设置

    要开始使用OpenVINO GenAI Flavor,首先需要安装必要的软件包。您可以通过pip命令轻松完成安装:

    pip install openvino openvino-genai

    这将安装最新的OpenVINO开发版本以及GenAI Flavor专用组件。

    模型准备

    在使用OpenVINO GenAI Flavor之前,需要将LLM转换为OpenVINO的中间表示(IR)格式。这一步骤可以通过OpenVINO的模型转换工具完成。以下是转换过程的基本步骤:

    1. 导出原始模型:从训练框架(如PyTorch或TensorFlow)导出模型。
    2. 转换为ONNX:将模型转换为ONNX格式,这是一个通用的深度学习模型表示格式。
    3. ONNX到IR转换:使用OpenVINO的Model Optimizer工具将ONNX模型转换为IR格式。

    示例代码:

    from openvino.runtime import Core
    from transformers import AutoTokenizer, AutoModelForCausalLM
    
    # 加载预训练模型和分词器
    model_name = "gpt2"
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    model = AutoModelForCausalLM.from_pretrained(model_name)
    
    # 转换为ONNX格式
    onnx_model_path = "gpt2.onnx"
    dummy_input = tokenizer("Hello, how are you?", return_tensors="pt").input_ids
    torch.onnx.export(model, dummy_input, onnx_model_path, opset_version=11)
    
    # 使用OpenVINO转换为IR格式
    core = Core()
    ov_model = core.read_model(onnx_model_path)
    compiled_model = core.compile_model(ov_model, "CPU")

    使用OpenVINO GenAI Flavor进行推理

    一旦模型转换完成,就可以使用OpenVINO GenAI Flavor进行高效推理。以下是一个基本的推理流程示例:

    import numpy as np
    from openvino.runtime import Core, Tensor
    from transformers import AutoTokenizer
    
    # 初始化OpenVINO Core和模型
    core = Core()
    model = core.read_model("path/to/your/model.xml")
    compiled_model = core.compile_model(model, "CPU")
    
    # 准备输入数据
    tokenizer = AutoTokenizer.from_pretrained("gpt2")
    input_text = "OpenVINO is"
    input_ids = tokenizer.encode(input_text, return_tensors="np")
    
    # 创建推理请求
    infer_request = compiled_model.create_infer_request()
    
    # 设置输入并执行推理
    infer_request.set_input_tensor(Tensor(input_ids))
    infer_request.infer()
    
    # 获取输出
    output = infer_request.get_output_tensor().data
    
    # 解码输出
    generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
    print(generated_text)

    这个示例展示了如何使用OpenVINO GenAI Flavor加载模型、处理输入、执行推理并获取输出。

    高级功能和优化技巧

    OpenVINO GenAI Flavor提供了多种高级功能和优化技巧,可以进一步提升LLMs的推理性能:

    1. 动态形状处理

    GenAI Flavor支持动态输入形状,这对于处理变长序列非常有用:

    # 设置动态形状
    model.reshape({0: [-1, -1]})  # 第一维为批次大小,第二维为序列长度

    2. KV缓存优化

    对于自回归生成任务,GenAI Flavor实现了高效的KV缓存机制:

    # 启用KV缓存
    compiled_model = core.compile_model(model, "CPU", config={"PERFORMANCE_HINT": "LATENCY"})

    3. 稀疏计算加速

    GenAI Flavor可以自动检测和利用模型中的稀疏性,无需额外配置即可获得加速:

    # 稀疏计算会自动应用,无需特殊设置

    4. 批处理推理

    对于需要处理多个输入的场景,可以使用批处理来提高吞吐量:

    # 准备批处理输入
    batch_inputs = tokenizer(["Hello", "How are you", "OpenVINO is great"], 
                             padding=True, return_tensors="np")
    
    # 执行批处理推理
    results = compiled_model(batch_inputs.input_ids)

    5. 异步推理

    利用异步推理可以更好地利用硬件资源,提高整体效率:

    # 创建异步推理请求
    infer_request = compiled_model.create_infer_request()
    
    # 启动异步推理
    infer_request.start_async()
    
    # 等待结果
    infer_request.wait()
    
    # 获取结果
    output = infer_request.get_output_tensor().data

    性能优化和调优

    为了获得最佳性能,可以考虑以下优化策略:

    1. 选择合适的硬件:根据模型大小和推理需求,选择CPU、GPU或专用AI加速器。
    2. 量化:对模型进行INT8量化可以显著减少内存占用和推理时间。
    3. 模型剪枝:移除不必要的模型参数,减小模型大小。
    4. 缓存优化:合理设置缓存大小,平衡内存使用和性能。
    5. 并行推理:在多核系统上,利用多线程并行处理多个推理请求。

    示例代码:

    # 使用INT8量化
    quantized_model = core.quantize_model(model, "CPU", {"STAT_TYPE": "DYNAMIC"})
    
    # 设置线程数
    core.set_property("CPU", {"INFERENCE_NUM_THREADS": 4})
    
    # 启用缓存
    compiled_model = core.compile_model(quantized_model, "CPU", 
                                        config={"CACHE_DIR": "./model_cache"})

    最佳实践和注意事项

    1. 内存管理:对于大型LLMs,合理管理内存至关重要。使用流式处理或分段处理来减少内存占用。
    2. 输入预处理:确保输入数据格式正确,并考虑将预处理步骤集成到模型中以提高效率。
    3. 错误处理:实现健壮的错误处理机制,以应对可能的推理失败或异常情况。
    4. 模型更新:定期更新模型和OpenVINO版本,以获得最新的性能优化和功能支持。
    5. 性能监控:使用OpenVINO提供的性能分析工具来识别瓶颈并进行针对性优化。

    结论

    OpenVINO GenAI Flavor为运行大语言模型提供了强大而灵活的解决方案。通过利用其专门的优化技术和高级功能,开发者可以显著提升LLMs的推理性能,使这些复杂的模型能够在各种硬件平台上高效运行。随着生成式AI技术的不断发展,OpenVINO GenAI Flavor将继续演进,为开发者提供更多工具和能力,以应对未来的挑战和机遇。

    参考文献

    1. Intel Corporation. (2024). Run LLMs with OpenVINO GenAI Flavor — OpenVINO™ documentation. https://docs.openvino.ai/2024/learn-openvino/llm_inference_guide/genai-guide.html
  • MetaGPT:自动化的软件开发团队

    近年来,大语言模型(LLM)以其强大的自然语言处理能力,在人工智能领域取得了显著进展。这些模型不仅能够生成和理解文本,还能进行复杂的分析和推理。MetaGPT 是一个基于 GPT-4 的 AI Agent 框架,专注于软件开发领域。通过模拟一个完整的软件开发团队,MetaGPT 能够从原始需求出发,完成整个软件开发生命周期的自动化处理。本文将详细解析 MetaGPT 的实现原理、内置任务和技能以及其运行和测试结果。

    MetaGPT 简介

    MetaGPT 是一种多智能体框架,它利用标准作业程序(SOP)来协调基于大语言模型的多智能体系统,从而实现元编程技术。该框架模拟了一个虚拟软件团队,包括产品经理、架构师、项目经理、工程师和质量工程师等角色,并引入 SOP 成为框架的虚拟软件团队的开发流程。其专注于软件开发,覆盖了从需求分析到代码实现的全生命周期。

    MetaGPT 的多智能体系统被视为一个智能体社会,其中包括智能体、环境、标准流程(SOP)、通信和经济等组件。这些组件在系统中各自发挥着重要的作用:

    • 智能体:在单个智能体的基础上,扩展了多智能体定义。在多智能体系统中,可以由多个单智能体协同工作,每个智能体都具备独特的 LLM、观察、思考、行动和记忆能力。
    • 环境:智能体生存和互动的公共场所。智能体从环境中观察到重要信息,并发布行动的输出结果以供其他智能体使用。
    • 标准流程(SOP):管理智能体行动和交互的既定程序,确保系统内部的有序和高效运作。
    • 通信:智能体之间信息交流的过程,对于系统内的协作、谈判和竞争至关重要。
    • 经济:多智能体环境中的价值交换系统,决定资源分配和任务优先级。

    MetaGPT 的实现原理

    MetaGPT 的设计分为两个层次:基础组件层和协作层。

    基础组件层

    基础组件层以 AI Agent 为核心,提供了观察、思考等能力。其建立了个体智能体操作和在系统范围内进行信息交换所需的核心模块,包括环境、记忆、角色、行动和工具。

    • 环境:为智能体提供协作工作空间和交流平台。
    • 记忆:存储和检索历史消息。
    • 角色:根据领域封装专业技能和工作流程。
    • 行动:执行模块化的子任务。
    • 工具:提供常见的服务和工具。

    基础组件层为智能体在分配的角色中运行提供了基础设施,使它们可以相互交互并与系统交互。

    协作层

    协作层建立在基础组件层的基础上,协调各个智能体共同解决复杂问题。其提供了两种基本机制:知识共享和封装工作流程。

    • 知识共享:该机制允许智能体有效地交换信息,为共享的知识库做出贡献。智能体可以以不同粒度存储、检索和共享数据。这不仅加强了协调能力,还减少了冗余的通信,提高了整体的运行效率。
    • 封装工作流程:该机制利用 SOP 将复杂任务分解为较小、可管理的子任务。它将这些子任务分配给适合的智能体,并通过标准化的输出对其进行监控,确保它们的行动与总体目标一致。

    在这个框架中,MetaGPT 中的智能体能力得到了显著增强。智能体的实例化,由专门的角色提示引导,被称为”锚定智能体”,为角色提供了观察、思考、反思和知识积累的能力。这些角色通过已建立的订阅和发布方法与环境进行交互。

    基础和协作层的分离有利于实现模块化,同时确保智能体的个人和集体能力。基础组件提供了可重用的构建模块和工具,而协作模块则实现了有目的的协调。

    MetaGPT 的内置任务和技能

    MetaGPT 内置了多种技能,包括分析代码库、设计 API、项目管理、编写代码和测试用例等。这些技能都是以 Python 脚本的形式实现的,每个脚本都定义了相应的 prompt 模板。各个角色可以根据需要引入这些技能来增强自己的能力。

    角色定义

    MetaGPT 框架支持创建各种专业类的角色,如产品经理、架构师等。基础角色类由一组关键属性定义:名称、简介、目标、约束和描述。

    • 目标:表示角色寻求完成的主要责任或目标。
    • 约束:表示角色在执行行动时必须遵循的限制或原则。约束可以规定如下:“你编写的代码应符合 PEP8 等代码规范,具有模块化、易于阅读和维护的特点”。
    • 描述:提供了额外的具体信息,以帮助建立更全面的角色定义。

    MetaGPT 框架提供的全面角色定义使得其可以创建高度专业化的基于 LLM 的智能体,每个智能体都针对特定的领域和目标进行了定制。角色定义不仅引入了基于预期功能的行为指导,而且有助于创建多样化和专业化的智能体,每个智能体都是其领域的专家。

    • 思考与反思(Think & Reflect):角色可以检索角色描述来构建思考,然后通过 _think() 函数来反思需要做什么并决定下一步的行动。
    • 观察(Observe):角色可以观察环境,并根据观察结果使用 _observe() 函数进行思考和行动。它们会关注重要信息,并将其纳入记忆中,以丰富其上下文理解并为未来的决策提供信息。
    • 广播消息(Broadcast messages):角色可以使用 _publish_message() 函数将消息广播到环境中。这些消息包含有关当前执行结果和相关行动记录的详细信息,用于发布和共享信息。
    • 知识沉淀与行动(Knowledge precipitation & Act):角色不仅是广播者,也是环境信息的接收者。角色可以评估传入的消息的相关性和及时性,从共享环境中提取相关知识,并维护一个内部的知识库以支持决策。它们通过咨询 LLM,并利用其具有丰富上下文信息和自我知识的来执行行动。执行结果被封装为消息,而规范性组件则由环境共享。
    • 状态管理(State management):角色可以通过更新工作状态和监控待办事项列表来跟踪它们的行动。这使得角色能够按顺序处理多个行动而不中断。在执行每个行动时,角色首先锁定其状态。完成行动后,将状态标记为解锁。这样可以防止其他行动中断工作流程。

    实例化 SOP 的 Prompt

    MetaGPT 使用提示(Prompt)将现实世界的标准作业程序(SOP)转化为明确定义的智能体工作流。该过程涉及使用提示来实例化 SOP,并基于已建立的实践提供逐步指导,确保复杂序列任务的一致和结构化执行。

    首先,详细介绍 Action 类,然后展示如何设计标准化行动级别细粒度提示。在 MetaGPT 框架中,Action 作为智能体执行特定任务的原子单位,通过自然语言进行指定。关键属性包括:

    • 前缀(Prefix):将角色特定的前缀注入到提示中,以建立角色上下文。使用 set_prefix() 方法配置角色特定提示的标识符。
    • LLM 代理(LLM proxy):每个 Action 包含一个 LLM 代理,可以通过 aask() 方法调用该代理,使用以自然语言提示表达的上下文输入来丰富行动细节。此外,可以在 Action 类中实现各种角色特定上下文解析函数。这些函数旨在从输入中提取并提供足够的上下文信息给 LLM。
    • 标准化的输出模式(Standardized outputs schema):使用结构化表示来定义预期的输出模式,用于提取结构化数据。标准化输出模式定义预期输出模式的结构表示,用于提取结构化数据。
    • 重试机制(Retry mechanism):用于处理行动执行失败的情况。

    MetaGPT 的运行和测试结果

    MetaGPT 的运行非常简单,只需要运行 startup.py 脚本即可。该脚本支持设置一些参数,如原始需求和投资金额等。在测试中,有人用 10 分钟就完成了一个 Flappy Bird 游戏的开发,这个过程是完全自动化的。不过,最终生成的代码还需要补充一些素材才能直接运行。

    在测试过程中,MetaGPT 展现了其强大的自动化处理能力和高效的任务分配机制。通过模拟一个完整的软件开发团队,MetaGPT 可以从需求分析到代码实现的全流程自动化,大大提高了软件开发的效率和质量。

    结论

    MetaGPT 是一个非常有趣和强大的 AI Agent 框架,它在软件开发领域展现了自动化处理复杂任务的能力。通过模拟一个完整的软件开发团队,MetaGPT 可以从需求分析到代码实现的全流程自动化,大大提高了软件开发的效率和质量。未来,随着大语言模型和人工智能技术的不断发展,MetaGPT 有望在更多领域展现其强大的自动化处理能力,为各行业带来更多创新和变革。


    参考文献

    1. MetaGPT技术全解析:另一个AutoGPT,一个可以替代小型软件开发团队的配备齐全的软件开发GPT,产品经理、系统设计、代码实现一条龙-CSDN博客
    2. AI Agent框架——MetaGPT技术详解-CSDN博客
    3. 知己知彼,深入解读 MetaGPT 的源码 – 大模型知识库|大模型训练|开箱即用的企业大模型应用平台|智能体开发|53AI
  • LongRoPE:突破局限,将大模型上下文窗口扩展至200万tokens

    在人工智能领域,大模型的快速发展正在深刻地改变着我们的生活。想象一下,未来我们或许可以利用大模型快速扫描整部百科全书、解析复杂的法律条款,甚至精准引用文章内容。然而,现阶段大模型的上下文窗口大小限制了其处理超长文本的能力,阻碍了这些应用场景的实现。

    上下文窗口:大模型理解力的瓶颈

    大模型的上下文窗口就好比人类的短期记忆,它决定了模型在处理信息时能够参考的范围。传统的预训练大模型通常只有几千个tokens的上下文窗口,例如LLaMA2的最大输入长度为4096个tokens。当输入文本超出这个限制时,模型的性能就会显著下降。

    为了解决这个问题,研究人员尝试通过微调技术扩展大模型的上下文窗口。然而,这种方法面临着以下挑战:

    • 位置索引的异常值: 扩展上下文窗口会引入大量未经训练的新的token位置索引,导致微调过程难以收敛。
    • 长文本数据的缺乏: 微调需要大量的长文本数据,而现有的训练数据集中长文本数量有限。
    • 高昂的计算成本: 扩展上下文窗口会导致模型的计算量和内存需求激增,微调过程需要耗费大量的计算资源和时间。
    • 注意力分散: 超长上下文窗口会引入过多的位置信息,分散模型的注意力,从而降低其在处理短文本时的性能。

    LongRoPE:迈向无限上下文窗口的第一步

    为了克服这些挑战,微软亚洲研究院的研究人员提出了LongRoPE技术。LongRoPE首次将预训练大语言模型的上下文窗口扩展到了2048k(约210万)个tokens,并且在保持模型在短文本上性能的同时,显著提升了其处理长文本的效果。

    精细化非均匀位置插值:保留关键信息

    LongRoPE的核心技术之一是精细化非均匀位置插值。现有的位置插值方法通常采用线性插值的方式,将新的位置索引映射到预训练的范围内。然而,这种方法忽略了RoPE(旋转位置编码)中不同维度和token位置信息的重要性差异。

    LongRoPE采用了一种基于进化算法的非均匀插值方法,为RoPE的每个维度和不同的token位置搜索最佳的旋转角度缩放因子。这种方法能够有效地保留原始RoPE位置编码中的关键信息,最大程度地减少了位置插值带来的信息损失。

    渐进式扩展策略:高效扩展上下文窗口

    在精细化非均匀位置插值的基础上,LongRoPE采用了一种高效的渐进式扩展策略,逐步扩展上下文窗口的大小。

    1. 首先,在预训练的大模型上搜索256k上下文窗口对应的最佳位置编码插值方案,并进行微调。
    2. 然后,利用LongRoPE的非均匀插值特性,在不进行微调的情况下将上下文窗口扩展8倍,达到2048k。

    恢复短上下文窗口性能:兼顾不同长度文本

    扩展上下文窗口后,模型在处理短文本时的性能可能会下降。为了解决这个问题,LongRoPE在扩展后的模型上对8k长度内的RoPE缩放因子进行了重新搜索,以减少短文本上的位置插值程度。在推理过程中,模型会根据输入文本的长度动态调整RoPE缩放因子,从而兼顾不同长度文本的处理效果。

    LongRoPE的实验结果

    研究人员在LLaMA2-7B和Mistral-7B上对LongRoPE进行了测试,实验结果表明:

    • 长文本困惑度降低: 在Proof-pile、PG19和Books3等长文本数据集上,LongRoPE显著降低了模型的困惑度,证明其能够更好地理解长文本信息。
    • Passkey检索准确率提升: 在Passkey检索任务中,LongRoPE能够在长文本中准确地检索出隐藏的密码,证明其具备处理超长上下文信息的能力。
    • 短文本性能保持: 在Huggingface Open LLM benchmark等标准大语言模型基准测试中,LongRoPE在扩展上下文窗口后,依然保持了与原始模型相当甚至更优的性能。

    总结与展望

    LongRoPE作为迈向无限上下文窗口的第一步,为大模型的发展带来了新的可能性。未来,我们可以利用LongRoPE构建能够处理超长文本的大模型,例如:

    • 阅读和理解整本书籍或长篇文档。
    • 分析复杂的法律文件或科学论文。
    • 生成更连贯、更具逻辑性的长篇文本。

    LongRoPE的出现为大模型的应用开辟了更广阔的空间,让我们共同期待未来更加智能的AI应用。

    参考文献

    • LongRoPE: Extending LLM context window beyond 2 million tokens. https://arxiv.org/pdf/2402.13753.pdf
  • SILU激活函数:深度学习中的智能“开关”

    在深度学习的神奇世界里,激活函数扮演着至关重要的角色。它们就像是神经网络中的“开关”,决定着信息如何在网络中流动。今天,我们要探索一种名为SILU(Sigmoid Linear Unit)的激活函数,它因其独特的特性和潜在的优势而受到关注。

    什么是SILU激活函数?

    SILU是一种新型的激活函数,它的数学表达式简单而优雅:

    [ \text{SILU}(x) = x \cdot \sigma(x) ]

    这里的 ( x ) 是输入信号,而 ( \sigma(x) ) 是sigmoid函数,它将输入压缩到0和1之间。SILU函数的输出范围是从0到 ( x ) 的值。

    SILU的魔力在哪里?

    • 自归一化特性:SILU的输出自动适应输入的大小,这有助于防止梯度消失或爆炸,从而提高网络的训练效率。
    • 非单调性:与ReLU等单调激活函数不同,SILU可以在正负值之间转换,提供更丰富的信息处理能力。
    • 参数效率:在一些情况下,SILU能够减少模型所需的参数数量,使模型更加轻量化。

    SILU在实际中的应用

    虽然SILU是一个相对较新的激活函数,但它已经在多个领域展现出潜力。研究人员发现,SILU可以提高某些深度学习模型的性能,尤其是在图像分类和自然语言处理任务中。

    如何使用SILU?

    在实际应用中,使用SILU就像使用其他激活函数一样简单。在构建神经网络时,你只需在适当的位置插入SILU函数,然后让数据流经它。例如,在Python的深度学习库中,你可以这样使用SILU:

    import torch
    import torch.nn.functional as F
    
    x = torch.randn(1, requires_grad=True)
    output = F.silu(x)

    结语

    SILU激活函数代表了深度学习领域的持续创新和发展。随着研究的深入,我们期待SILU能够在更多场景下发挥其优势,帮助我们构建更加智能和高效的模型。

    想要了解更多关于SILU的信息,或者在你的项目中尝试使用它,可以查阅相关的研究论文。让我们一起见证深度学习技术的进步,并探索SILU的无限可能!


    希望这篇博客文章能够帮助你更好地了解SILU激活函数,并激发你探索和应用这项技术的兴趣。如果你有任何问题或需要更多信息,请随时与我联系。

  • GraphRAG:智能摘要技术的新突破

    在数字化时代,我们每天都在创造海量文本数据。如何从这些数据中提取有价值的信息并进行有效总结,成为了一个重要课题。微软研究院最新推出的GraphRAG技术,为我们提供了一个创新的解决方案。今天,我们就来聊聊这项技术是如何工作的,以及它将如何改变我们的信息处理方式。

    什么是GraphRAG?

    GraphRAG(Graph Retrieval-Augmented Generation)是一种结合了知识图谱和检索增强生成(RAG)的技术。它能够帮助大型语言模型(LLM)更好地理解并总结大规模文本数据集中的信息。

    GraphRAG的工作原理

    GraphRAG的工作流程分为以下几个步骤:

    1. 文本分割:将大量文本分割成小块,以便语言模型处理。
    2. 元素提取:使用语言模型从文本中提取实体、关系和主张等元素。
    3. 构建知识图谱:将提取的元素构建成知识图谱,形成实体和关系的网络。
    4. 社区检测:利用算法将知识图谱中的实体分组成具有强关联性的社区。
    5. 社区摘要:为每个社区生成摘要,这些摘要能够全面覆盖输入文档的内容。
    6. 查询响应:当用户提出问题时,系统会使用社区摘要生成部分回答,然后汇总这些回答生成最终的全局答案。

    GraphRAG的优势

    • 全面性:GraphRAG能够提供更全面的答案,因为它考虑了整个文本数据集的内容。
    • 多样性:通过社区检测和摘要,GraphRAG能够从不同角度和层面提供信息。
    • 效率:与传统的RAG技术相比,GraphRAG在处理大规模文本时更为高效。

    实际应用案例

    为了评估GraphRAG技术,研究者们使用了两个真实世界的数据集:技术播客的转录文本和新闻文章。他们让语言模型基于这些数据集的简短描述生成了一系列问题,并使用GraphRAG来回答这些问题。结果表明,GraphRAG在生成全面和多样化答案方面,明显优于传统的RAG方法。

    未来展望

    GraphRAG技术为处理大规模文本数据提供了新的可能性。随着技术的不断发展,我们期待GraphRAG能够在更多领域展现其强大的能力,例如自动生成报告、数据分析和知识发现等。

    结语

    GraphRAG的推出,不仅是技术上的一次飞跃,也为信息检索和摘要领域带来了新的思路。随着技术的不断完善,我们相信GraphRAG将在未来发挥更大的作用。

    想要了解更多关于GraphRAG的信息,或者开始使用这项技术,请访问微软研究院的论文。让我们一起探索智能摘要技术的未来。


    希望这篇博客文章能够帮助您更好地了解GraphRAG技术,并激发您探索和应用这项技术的兴趣。如果您有任何问题或需要更多信息,请随时与我联系。

  • GeneralAgent:从大型语言模型到智能代理

    引言

    近年来,大型语言模型(LLM)在自然语言处理领域取得了显著的进展。然而,如何将 LLM 的强大能力应用到实际的业务场景中,仍然是一个充满挑战的任务。GeneralAgent 框架应运而生,它旨在将 LLM 与 Python 无缝集成,为构建智能代理提供一个灵活、高效的平台。

    GeneralAgent 框架概述

    GeneralAgent 是一个 Python 原生的代理框架,其核心目标是简化 LLM 在实际应用中的开发流程。与其他代理框架相比,GeneralAgent 具有以下优势:

    • 工具调用: GeneralAgent 不依赖于 LLM 的 function call 功能,而是通过 Python 代码解释器来调用工具,从而实现更灵活、可控的工具调用方式。
    • 序列化: GeneralAgent 支持序列化代理的状态,包括记忆和 Python 执行状态,方便开发者随时保存和恢复代理的状态。
    • 自我调用: GeneralAgent 支持代理的自我调用和堆栈记忆,能够最小化 LLM 的调用次数,从而高效地处理复杂任务。
    • 部署服务: GeneralAgent 可以与 AgentServer 配合使用,快速为大规模用户提供代理服务。

    GeneralAgent 功能介绍

    函数调用

    GeneralAgent 允许开发者将 Python 函数注册到代理中,并通过自然语言指令来调用这些函数。例如,我们可以定义一个获取天气信息的函数:

    def get_weather(city: str) -> str:
        """
        get weather information
        @city: str, city name
        @return: str, weather information
        """
        return f"{city} weather: sunny"

    然后将该函数注册到代理中:

    agent = Agent('你是一个天气小助手', functions=[get_weather])

    当用户询问 “成都天气怎么样?” 时,代理会自动调用 get_weather 函数,并将 “成都” 作为参数传递给该函数,最终返回 “成都天气: 晴朗”。

    知识库

    GeneralAgent 支持将外部知识库集成到代理中,从而增强代理的知识范围。开发者可以将知识库文件路径传递给代理,代理会自动加载并索引知识库内容。

    knowledge_files = ['../docs/paper/General_Agent__Self_Call_And_Stack_Memory.pdf']
    agent = Agent('你是AI助手,用中文回复。', workspace='9_knowledge_files', knowledge_files=knowledge_files)

    当用户提出问题时,代理会先在知识库中搜索相关信息,并将搜索结果作为 LLM 的输入,从而生成更准确、全面的答案。

    序列化

    GeneralAgent 支持序列化代理的状态,包括 LLM 的对话历史和 Python 解释器的状态。开发者可以使用 agent.save() 方法将代理的状态保存到磁盘,并使用 agent.load() 方法从磁盘加载代理的状态。

    # agent序列化位置,运行过程中会自动保存LLM的messages和python解析器的状态
    workspace='./5_serialize'
    
    role = 'You are a helpful agent.'
    agent = Agent(workspace=workspace)
    agent.user_input('My name is Shadow.')
    
    agent = None
    agent = Agent(role, workspace=workspace)
    agent.user_input('What is my name?')

    工作流

    GeneralAgent 支持定义复杂的工作流,并通过多个步骤来完成任务。开发者可以使用 agent.run() 方法执行单个步骤,并使用 Python 代码控制工作流的执行逻辑。

    # 工作流: 写小说
    from GeneralAgent import Agent
    from GeneralAgent import skills
    
    # 步骤0: 定义Agent
    agent = Agent('你是一个小说家')
    
    # 步骤1: 从用户处获取小说的名称和主题
    # topic = skills.input('请输入小说的名称和主题: ')
    topic = '小白兔吃糖不刷牙的故事'
    
    # 步骤2: 小说的概要
    summary = agent.run(f'小说的名称和主题是: {topic},扩展和完善一下小说概要。要求具备文艺性、教育性、娱乐性。')
    
    # 步骤3: 小说的章节名称和概要列表
    chapters = agent.run('输出小说的章节名称和每个章节的概要,返回列表 [(chapter_title, chapter_summary), ....]', return_type=list)

    多代理协作

    GeneralAgent 支持多个代理协作完成任务。开发者可以创建多个代理实例,并为每个代理分配不同的角色和任务。代理之间可以通过消息传递进行通信和协作。

    # 多Agent配合完成任务
    from GeneralAgent import Agent
    story_writer = Agent('你是一个故事创作家,根据大纲要求或者故事梗概,返回一个更加详细的故事内容。')
    humor_enhancer = Agent('你是一个润色作家,将一个故事进行诙谐润色,增加幽默元素。直接输出润色后的故事')

    多模态输入

    GeneralAgent 支持多模态输入,例如文本、图片、音频等。开发者可以将多模态数据封装成数组,并传递给 agent.user_input() 方法或 agent.run() 方法。

    # 支持多模态: 图片输入
    from GeneralAgent import Agent
    
    agent = Agent('You are a helpful assistant.')
    agent.user_input(['what is in the image?', {'image': '../docs/images/self_call.png'}])

    总结

    GeneralAgent 框架为构建智能代理提供了一个强大、灵活的平台,其丰富的功能和易用的 API 可以帮助开发者快速构建各种类型的智能代理应用。随着 LLM 技术的不断发展,GeneralAgent 框架将会在更多领域发挥重要作用。

  • 使用 GPT-4 解析 PDF 为 Markdown 文档:gptpdf 项目解析

    引言

    在信息爆炸的时代,如何高效地处理和提取 PDF 文档中的信息成为了一个普遍的需求。传统的 OCR 技术在处理复杂的排版、数学公式、表格和图片时往往力不从心。而 gptpdf 项目利用强大的视觉大语言模型 GPT-4,为 PDF 解析提供了一种全新的解决方案。

    gptpdf 项目概述

    gptpdf 项目的核心思想是利用 GPT-4 强大的多模态理解能力,将 PDF 文档解析为结构化的 Markdown 格式。项目地址:https://github.com/CosmosShadow/gptpdf

    与传统的 OCR 技术相比,gptpdf 项目具有以下优势:

    • 更精准的识别: gptpdf 能够准确识别复杂的排版、数学公式、表格、图片、图表等内容,而传统的 OCR 技术在处理这些内容时 often 出现错误。
    • 更结构化的输出: gptpdf 将解析结果输出为 Markdown 格式,方便后续编辑和处理,而传统的 OCR 技术只能输出纯文本,丢失了原文档的结构信息。
    • 更低的成本: gptpdf 平均每页的解析成本仅需 0.013 美元,远低于人工解析的成本。

    gptpdf 工作原理

    gptpdf 的工作流程可以概括为以下两个步骤:

    1. 预处理: 使用 PyMuPDF 库对 PDF 文件进行解析,识别并标记出所有非文本区域,例如图片、表格、公式等。 ![][]
    2. GPT-4 解析: 将预处理后的 PDF 页面图片和标记信息发送给 GPT-4o 模型进行解析,GPT-4o 模型会根据页面内容和标记信息,生成相应的 Markdown 文本。

    gptpdf 使用方法

    使用 gptpdf 非常简单,只需安装 gptpdf 包并调用 parse_pdf 函数即可:

    from gptpdf import parse_pdfapi_key = 'Your OpenAI API Key'
    content, image_paths = parse_pdf(pdf_path, api_key=api_key)
    print(content)

    其中:

    • pdf_path: 要解析的 PDF 文件路径。
    • api_key: 您的 OpenAI API 密钥。
    • content: 解析后的 Markdown 文本。
    • image_paths: 解析过程中提取的图片路径列表。

    gptpdf 项目特色

    除了基本的功能之外,gptpdf 还提供了一些额外的功能,例如:

    • 支持多种 OpenAI 模型: 用户可以根据自己的需求选择不同的 OpenAI 模型,例如 gpt-4oqwen-vl-maxGLM-4V 等。
    • 支持 Azure OpenAI: 用户可以使用 Azure OpenAI 服务来运行 gptpdf。
    • 可配置的输出: 用户可以自定义输出目录、文件名等参数。
    • 详细的日志: 用户可以通过设置 verbose=True 来查看详细的解析日志。

    总结

    gptpdf 项目提供了一种高效、准确、低成本的 PDF 解析方案,为处理大量 PDF 文档提供了新的思路。随着 GPT-4 等视觉大语言模型的不断发展,相信 gptpdf 项目会在未来得到更广泛的应用。

    参考文献

  • 开源大语言模型提示工程探索:机器翻译与摘要评估新视角

    引言

    近年来,大型语言模型(LLM)的兴起彻底改变了自然语言处理(NLP)领域。尤其引人注目的是,LLM 的上下文学习能力使其能够作为自然语言生成任务的评估指标,这在低资源场景和时间受限的应用中尤为 advantageous。传统的评估指标,例如 BLEU 或 ROUGE,往往依赖于大量的人工标注数据,而 LLM 则可以通过少量的样本学习到评估文本质量的能力。

    然而,尽管已经提出了许多基于提示的 LLM 评估指标,但目前仍然缺乏对不同提示方法进行结构化评估的研究,特别是对于开源模型而言。本文介绍了 PrExMe,一个针对评估指标的大规模提示探索框架。我们评估了超过 720 个提示模板,涵盖了机器翻译(MT)和摘要数据集上的开源 LLM 评估指标,总计超过 660 万次评估。这项广泛的比较 (1) 作为近期开源 LLM 作为评估指标的性能基准,(2) 探索了不同提示策略的稳定性和可变性。

    相关工作

    基于提示的评估指标

    近年来,LLM 在自然语言生成(NLG)评估指标方面取得了显著进展,其主要依赖于上下文学习,即直接从生成的文本中预测质量判断。Li 等人(2024b)和 Gao 等人(2024a)的综述提供了对这些指标的全面概述。除了 BARTSCORE(Yuan 等人,2021 年)和 PRD(Li 等人,2024a),Li 等人(2024b)综述的基于提示的方法都建立在闭源模型之上。相比之下,EVAL4NLP 2023 共享任务(Leiter 等人,2023 年)明确考虑了开源的基于提示的指标,要求参与者仅使用提供的模型来评估机器翻译和摘要,而不能对这些模型进行微调。表现最好的提交甚至能够击败强大的基线,例如机器翻译领域的 GEMBA(Kocmi 和 Federmann,2023b)和摘要领域的 BARTSCORE。

    提示技术

    近年来,人们提出了许多成功的提示技术(例如,Liu 等人,2023a)。我们的工作主要依赖于已有的方法,如零样本 CoT 和 RAG。此外,Li 等人(2023 年)提出了情绪诱导提示,以提高 LLM 的性能。据我们所知,我们是第一个分析这种技术在评估指标中的应用的。受此启发,我们还提出了一种新颖的情绪-CoT 模式(见第 3 节)。Kocmi 和 Federmann(2023b)对基于提示的指标的输出格式进行了先前的评估,我们通过更广泛的评估对其进行了扩展。其他工作也使用分层模板来构建提示(例如 Fu 等人,2023 年),LangChain(Chase,2022 年)和 DSPy(Khattab 等人,2023 年)等工具也支持这种实现。我们使用分层模板作为结构化比较不同提示模式的一种手段。

    提示鲁棒性

    由于我们对不同的提示、数据集和任务进行了网格搜索,因此我们的工作建立在 LLM 如何响应提示扰动的研究基础之上,并对其进行了扩展。Webson 和 Pavlick(2022 年)、Leidinger 等人(2023 年)、Weber 等人(2023 年)以及 Sclar 等人(2023 年)发现,自然语言推理和情感分类的性能存在很大差异。作为解决方案,Sclar 等人(2023 年)建议提供不同提示扰动下的所有结果。Voronov 等人(2024 年)和 Mizrahi 等人(2024 年)认为,目前 LLM 的评估基准存在问题,因为它们通常每个任务只提供一个提示模板。这可以通过提供多个模板并评估其集合来解决。据我们所知,我们是第一个探索这些鲁棒性问题在多大程度上影响开源的基于 LLM 的指标,以及如何为其选择最佳提示的。此外,通过使用多个提示来提示 LLM,我们遵循了 Mizrahi 等人(2024 年)的做法,实现了对 LLM 的稳定和公平的评估。

    研究方法

    为了系统地研究不同提示方法对 LLM 评估指标的影响,我们构建了一个名为 PrExMe 的大规模提示探索框架。

    提示模板

    我们的提示被构建成分层模板(见图 1),即一个大的模板由多个小的模板构成。每个提示都由以下部分构成:(1) 需要评分的源文本和生成的假设文本,(2) 基本提示,(3) 任务描述,(4) 格式要求,以及 (5) 可选的单样本演示。表 1 展示了 (2)、(3)、(4) 和 (5) 的例子。

    基本提示

    基本提示是我们提示层次结构的顶层,它包含了其他组件。具体来说,我们测试了三个零样本(ZS)和相应的单样本(OS)基本提示:(1) 普通 ZS/OS (PZS/POS),(2) ZS/OS-COT,以及 (3) ZS/OS-CoT-Emotion (ZS/OS-COT-EM)。PZS 简单地呈现了用换行符分隔的任务描述、源文本、假设文本和格式要求。ZS-COT (KOJIMA ET AL.,2022) 另外要求模型在返回输出之前逐步思考。最后,ZS-COT-EM 要求模型在 ZS-CoT 提示之前描述其“情绪”。我们之所以包含 CoT,是因为它提高了基于提示的闭源指标(如 AUTOMQM Fernandes 等人(2023 年)和 GEMBA(Kocmi 和 Federmann,2023a))的性能。ZS-COT-EM 探索了在提示 LLM 描述其输出中的情绪时,LLM 性能的变化。这是由我们对情绪提示对指标性能的探索所推动的(见下文“任务描述”)。模板的 OS 版本添加了一个用于演示的字段。为了避免模型局限于特定的推理步骤,我们在 OS-CoT 中包含了一个占位符,模型应该在其中插入其推理。

    任务描述

    任务描述是给生成的假设评分的指令。Li 等人(2023 年)发现,对人类来说能引发某些情绪的 LLM 指令可以提高性能。受这一发现的启发,我们探索了在任务描述中使用“情绪提示”。这种方法主要提供了一种简单的改写策略,以扩大我们的网格搜索范围。此外,它还允许我们研究“情绪”对基于 LLM 的指标的影响。除了中性提示外,我们还包括了例如礼貌、威胁和怀疑的指令。我们自己创建了 11 个任务描述,并使用 CHATGPT (OpenAI, 2023) 创建了 13 个任务描述。

    格式要求

    格式要求描述了 LLM 在生成分数时应遵循的输出格式。例如,它包括输出分数应该在哪一范围内,以及应该是离散的还是连续的。此外,我们还包括要求 LLM 返回文本质量标签的提示。我们总共定义了 10 种格式要求。

    单样本演示

    最后,我们使用 RAG 构造可选的 OS 演示。我们从 WMT21 (Freitag 等人,2021 年) 中提取机器翻译的演示,从 ROSE (Liu 等人,2023b) 中提取摘要的演示。

    基于 MQM 的方法

    除了分层模板之外,我们还使用选定的开源 LLM 测试了 GEMBA-MQM (Kocmi 和 Federmann,2023a) 的提示。GEMBA-MQM 通常使用 GPT4,它根据出现的错误数量(按严重程度加权)来预测分数。我们将开源实现称为 LocalGemba。

    数据集和阶段

    我们的实验分两个阶段,使用不同的数据集。这样做是为了减轻大规模提示搜索带来的统计效应。此外,它还允许我们在完整的数据集上评估选定的提示(否则这项任务将非常耗费资源),并探索其泛化能力。

    在第一阶段,我们使用 EVAL4NLP 2023 (Leiter 等人,2023 年) 的训练集进行评估;在第二阶段,我们使用其开发集和测试集进行评估。训练集和开发集是 WMT2022 指标共享任务 (Freitag 等人,2022 年) 和 SUMMEVAL (Fabbri 等人,2021 年) 的(无参考)分割。测试集由 Leiter 等人(2023 年)新标注。作为第二个测试集,我们使用了 WMT23 MQM 机器翻译标注 (Freitag 等人,2023 年) 和 Seahorse 多语言摘要标注 (Clark 等人,2023 年)。由于 OS 提示在其他数据集上的表现不佳,因此我们没有在 WMT23/SEAHORSE 上对其进行评估。

    在第一阶段,我们评估了训练集上 720 个 ZS 提示的所有组合。由于这非常耗费资源,因此对于机器翻译,我们将每个语种对限制在第一阶段,我们评估了训练集上 720 个 ZS 提示的所有组合。由于这非常耗费资源,因此对于机器翻译,我们将每个语种对限制为 1,000 个样本。对于摘要,我们使用了 SUMMEVAL 中的所有样本。对于每个模型,我们选择 Kendall 的 τ 与人类判断的相关性最高的 10 个提示。在第二阶段,我们使用这些选定的提示来评估开发集和测试集,以及 WMT23/SEAHORSE。

    模型

    我们实验中使用的所有模型都可以在 HuggingFace Hub 上公开获取,并且可以在消费级硬件上运行。我们使用七个不同的模型: GPT2-XL (Radford 等人,2019 年)、OPT-IML-30B (Iyer 等人,2022 年)、BLOOM-7B1 (Scao 等人,2022 年)、Pythia-12B (Biderman 等人,2023 年)、StableLM-Base-Alpha-7B (Chiang 等人,2023 年)、OpenAssistant-Pythia-12B (Köpf 等人,2023 年) 和 PLATYPUS2-70B (Lee 等人,2023a)。我们选择这些模型是因为它们代表了不同大小、架构和训练数据集的开源 LLM 的多样化样本。

    实验结果

    RQ1:开源 LLM 的评估能力

    为了回答关于开源 LLM 评估能力的第一个研究问题,我们分析了不同模型在不同数据集上的总体性能。图 2 显示了所有模型在所有数据集和任务上的平均 Kendall 的 τ。

    图2:不同模型在不同数据集上的平均 Kendall 的 τ。

    总的来说,PLATYPUS2-70B 在所有数据集上都取得了最好的结果,这表明更大的模型更适合作为评估指标。然而,其他模型(如 OpenAssistant-Pythia-12B)在某些情况下也表现良好,这表明模型大小并不是性能的唯一决定因素。

    RQ2:提示模式的稳定性为了研究不同提示模式的稳定性,我们分析了不同数据集、任务和模型之间 Kendall 的 τ 的变化。我们发现,某些提示模式(如要求模型返回文本标签而不是数字分数)对于某些模型(如 PLATYPUS2-70B)始终表现良好。然而,我们也发现,对于某些设置,即使是对输入提示进行微小的更改也会极大地影响性能。例如,将请求的输出格式从“0 到 100”更改为“-1 到 +1”会极大地影响我们评估中的排名。

    RQ3:新评估场景的提示设计

    根据我们的发现,我们为新评估场景的提示设计提出以下建议:

    • 从简单的提示开始。 在许多情况下,简单的零样本提示就能获得良好的结果。
    • 尝试不同的输出格式。 一些模型更喜欢返回文本标签,而另一些模型则在使用数字分数时表现更好。
    • 考虑使用 CoT 提示。 CoT 提示可以帮助提高某些模型的性能,尤其是在评估复杂文本时。
    • 在多个数据集上评估你的提示。 即使是表现良好的提示也可能无法很好地泛化到新数据集。

    结论

    在这项工作中,我们对不同提示方法对 LLM 评估指标的影响进行了大规模分析。我们的研究结果表明,某些提示模式是稳健的,并且可以很好地泛化到不同的任务和数据集。然而,我们也发现,对于某些设置,即使是对输入提示进行微小的更改也会极大地影响性能。根据我们的发现,我们为新评估场景的提示设计提出了一些建议。

    参考文献

    • Biderman, S. et al. (2023). Pythia: A suite for analyzing large language models across training and scaling. arXiv preprint arXiv:2304.01355.
    • Chase, H. (2022). Langchain. https://github.com/hwchase17/langchain.
    • Chiang, W.-L. et al. (2023). Stablelm-alpha 7b: Small and mighty for research. https://github.com/Stability-AI/stablelm.
    • Clark, E. et al. (2023). Seahorse: A multilingual benchmark for factual correctness in summarization. arXiv preprint arXiv:2306.05125.
    • Fabbri, A. R. et al. (2021). Summeval: Re-evaluating summarization evaluation. Transactions of the Association for Computational Linguistics, 9, 408–430.
    • Fernandes, P. et al. (2023). AutoMQM: Automatic machine translation evaluation with large language models. In Proceedings of the 17th Conference of the European Association for Machine Translation.
    • Freitag, M. et al. (2021). Results of the WMT21 Metrics Shared Task: Evaluating metrics with explanations. In Proceedings of the Sixth Conference on Machine Translation.
    • Freitag, M. et al. (2022). Findings of the WMT22 Shared Task on Machine Translation Quality Estimation. In Proceedings of the Seventh Conference on Machine Translation.
    • Freitag, M. et al. (2023). Findings of the WMT23 Shared Task on Machine Translation Quality Estimation. In Proceedings of the Eighth Conference on Machine Translation.
    • Fu, Y. et al. (2023). From words to programs: Exploring the potential of large language models for abstract semantic parsing. arXiv preprint arXiv:2305.17770.
    • Gao, L. et al. (2024a). A survey of large language model based automatic metrics for natural language generation. arXiv preprint arXiv:2404.14012.
    • Gao, L. et al. (2024b). Retrieval augmentation for large language model based evaluation metrics. arXiv preprint arXiv:2405.12504.
    • Iyer, S. et al. (2022). OPT: Open pre-trained transformer language models. arXiv preprint arXiv:2205.01068.
    • Khattab, O. et al. (2023). DSPy: Towards general-purpose symbolic programming for composable program synthesis. arXiv preprint arXiv:2305.15956.
    • Kocmi, T. and Federmann, C. (2023a). Large language models are not fair judges: Exploring the intrinsic bias of dataset average as a metric. arXiv preprint arXiv:2305.13400.
    • Kocmi, T. and Federmann, C. (2023b). On the evaluation of machine translation systems trained with controlled simplification. In Proceedings of the 17th Conference of the European Association for Machine Translation.
    • Kojima, T. et al. (2022). Large language models are zero-shot reasoners. arXiv preprint arXiv:2205.11916.
    • Köpf, B. et al. (2023). OpenAssistant Conversations—democratizing large language model alignment. arXiv preprint arXiv:2304.07327.
    • Lee, H. Y. et al. (2023a). PLATYPUS: Quick, cheap, and accurate fine-tuning of large language models. arXiv preprint arXiv:2310.11307.
    • Leidinger, T. et al. (2023). Prompt surveillance: Tracking prompts that expose weaknesses in large language models. arXiv preprint arXiv:2302.12177.
    • Leiter, C. et al. (2023). Findings of the WMT 2023 Shared Task on Evaluating the Evaluation of Machine Translation and Summarization. In Proceedings of the Eighth Conference on Machine Translation.
    • Li, H. et al. (2023). Exploring the impact of emotion on large language models. arXiv preprint arXiv:2305.14725.
    • Li, S. et al. (2024a). Unbabel’s submission to the WMT23 metrics shared task: Prompting large language models for machine translation quality estimation. In Proceedings of the Eighth Conference on Machine Translation.
    • Li, Y. et al. (2024b). A survey of automatic metrics based on large language models for natural language generation. arXiv preprint arXiv:2404.00774.
    • Liu, P. et al. (2023a). Pre-train, prompt, and predict: A systematic survey of prompting methods in natural language processing. ACM Computing Surveys, 55(9), 1–35.
  • LLM 也许是 LongLM:无需微调地自扩展 LLM 上下文窗口

    @misc{jin2024llm,
          title={LLM Maybe LongLM: Self-Extend LLM Context Window Without Tuning}, 
          author={Hongye Jin and Xiaotian Han and Jingfeng Yang and Zhimeng Jiang and Zirui Liu and Chia-Yuan Chang and Huiyuan Chen and Xia Hu},
          year={2024},
          eprint={2401.01325},
          archivePrefix={arXiv},
          primaryClass={cs.CL}
    }

    》这篇论文介绍了一种名为 Self-Extend 的新方法,该方法可以在不进行微调的情况下,有效地扩展大型语言模型 (LLM) 的上下文窗口。

    1. 引言

    大型语言模型 (LLM) 在各种任务中都取得了显著的成果,但其应用受限于训练序列的长度。为了解决这个问题,本文提出了一种名为 Self-Extend 的方法,该方法可以有效地扩展 LLM 的上下文窗口,而无需进行任何微调。

    2. Self-Extend 方法概述

    Self-Extend 方法的核心思想是构建双层注意力信息:组级别和邻居级别。这两种级别的注意力信息都是通过原始模型的自注意力机制计算得到的,这意味着该方法不需要任何额外的训练。

    2.1 双层注意力机制

    • 组级别注意力: 将输入序列划分为多个组,每个组包含多个词语。组级别注意力机制计算每个组与其他所有组之间的注意力权重。
    • 邻居级别注意力: 在每个组内,邻居级别注意力机制计算每个词语与其邻居词语之间的注意力权重。

    通过结合组级别和邻居级别注意力信息,Self-Extend 方法可以有效地扩展 LLM 的上下文窗口,使其能够处理更长的输入序列。

    如下图所示:

    3. Self-Extend 的使用

    3.1 环境配置

    目前,Self-Extend 方法已在 Llama 模型上进行了测试,所需的 Python 包如下:

    transformers==4.38.2
    flash_attn==2.5.6 

    推荐使用以下 Docker 镜像: hoytjin/selfextend_docker:v0.1

    3.2 运行 Self-Extend

    import SelfExtend
    
    # 加载模型,例如:loaded_model = AutoModelForCausalLM.from_pretrained(model_path) 
    
    # 设置组大小和邻居窗口大小
    
    SelfExtend.apply(loaded_model, group_size, window_size, enable_flash_attention=False)
    
    # 进行推理,例如:loaded_model.generate(...)

    默认情况下,enable_flash_attention=False。如果模型加载时启用了 FlashAttention,则可以设置 enable_flash_attention=True

    以下代码示例展示了如何使用 Self-Extend 方法进行密钥检索:

    python example.py

    4. 如何选择组大小和邻居窗口大小

    选择合适的组大小和邻居窗口大小对于 Self-Extend 方法的性能至关重要。以下是一些经验法则:

    • 以 Llama-2 为基础模型,2~64 是合理的组大小;512~1536 是可行的邻居窗口大小。但在许多情况下,较大的组大小和较小的邻居窗口大小也是不错的选择。
    • 选择组大小和邻居窗口大小的一般原则是:确保输入序列长度在最大扩展窗口大小之内(对于 Llama-2,最大扩展窗口大小为 (4096 – 邻居窗口大小) * 组大小 + 邻居窗口大小)。
    • 作者并没有仔细选择组大小。对于相同的序列,较小的组应该更好。但在一些实验中,作者发现情况并非总是如此:

    有时,较大的组大小可能更有益。这可能是因为较大的位置没有得到很好的训练。较大的组大小可以利用在预训练中接受过更多训练的较小位置来促进扩展。然而,较小的组大小往往具有更好的精度。因此,这是一个权衡。更多细节请参考消融研究部分。

    例如:
    如果问答任务的输入长度为 15,800,邻居窗口大小设置为 1,024,则组大小可以设置为 5。这是因为 5 * (4,096 – 1,024) + 1,024 等于 16,384,大于 15,800。然而,将组大小设置为 6,甚至更大,例如 8 或 16,可能会提高模型的性能。当组大小为 5 时,Self-Extend 使用位置 1,025 到 3,979 来扩展上下文窗口。如果组大小设置为 8,Self-Extend 使用位置 1,025 到 2,871 进行扩展。虽然组大小为 8 的精度低于组大小为 5,但在预训练期间,组大小为 5 时使用的位置 2,872 到 3,979 的训练程度较低,这可能会影响扩展的有效性。

    • 也许,对于长度为 L 的序列,可以先尝试最小的组大小 [计算公式为:G * (L- w_n) + w_n],然后测试更大的组大小是否更好。

    Self-Extend 在“大海捞针”任务上的表现

    经验法则

    将预训练上下文窗口表示为 L,目标扩展长度表示为 N,邻居窗口表示为 W,组大小表示为 G,选择超参数的经验法则是确保以下不等式成立: (\frac{1}{2} \sim \frac{2}{3}) \times L > W + \frac{N-W}{G} 这是经验性的,作者认为这是因为:较大的相对位置没有得到很好的训练。根据经验,只有一部分(\frac{1}{2} \sim \frac{2}{3})的位置得到了很好的训练,Self-Extend 应该只利用这些训练有素的相对位置进行扩展。这一发现解释了:

    • 过小的组大小会降低性能,因为它们提供了精确的位置信息,但需要 Self-Extend 利用训练程度较低的相对位置进行扩展。
    • 过大的邻居窗口大小也会降低性能,因为它们提供了更多的邻居信息,但需要利用训练程度较低的相对位置进行扩展。

    实验结果表明,Self-Extend 对超参数的选择并不十分敏感。预先定义的、启发式的组大小和邻居窗口大小值通常足以获得令人满意的性能。

    [TLDR]

    Self-Extend 对超参数的选择并不十分敏感。可以使用一个代表性任务来找到合适的超参数。或者直接遵循作者的经验不等式: (\frac{1}{2} \sim \frac{2}{3}) \times L > W + \frac{N-W}{G}

    5. 总结

    Self-Extend 是一种简单而有效的方法,可以在不进行微调的情况下扩展 LLM 的上下文窗口。该方法易于实现,并且可以应用于各种 LLM 模型。实验结果表明,Self-Extend 方法可以显著提高 LLM 在长文本任务上的性能。

    参考文献

    @misc{jin2024llm,
          title={LLM Maybe LongLM: Self-Extend LLM Context Window Without Tuning}, 
          author={Hongye Jin and Xiaotian Han and Jingfeng Yang and Zhimeng Jiang and Zirui Liu and Chia-Yuan Chang and Huiyuan Chen and Xia Hu},
          year={2024},
          eprint={2401.01325},
          archivePrefix={arXiv},
          primaryClass={cs.CL}
    }
  • 基于音频特征的情感识别

    MELD这篇论文将介绍如何使用音频特征进行情感识别。我们将以 MELD 数据集为例,使用 Python 代码演示如何提取音频特征并将其用于情感分类。

    数据集介绍

    MELD (Multimodal EmotionLines Dataset) 是一个多模态情感数据集,包含 Friends 电视剧中的对话片段。每个片段都标注了说话人的情感和语句的情感倾向。

    train_data=pd.read_csv('/content/MELD/data/MELD/train_sent_emo.csv')
    valid_data=pd.read_csv('/content/MELD/data/MELD/dev_sent_emo.csv')
    test_data=pd.read_csv('/content/MELD/data/MELD/test_sent_emo.csv')

    上述代码展示了如何使用 pandas 库读取 MELD 数据集中的训练集、验证集和测试集。

    音频特征提取

    为了从音频数据中提取特征,我们使用 Librosa 库。Librosa 是一个强大的音频处理库,提供了许多用于特征提取的函数。

    首先,我们定义一些特征提取的参数:

    num_mfcc=40
    sr=22050
    hop_length=512
    n_fft=2048
    • num_mfcc:MFCC 特征的数量,这里设置为 40。
    • sr:音频采样率,这里设置为 22050 Hz。
    • hop_length:帧移长度,这里设置为 512 个样本点。
    • n_fft:傅里叶变换的窗口大小,这里设置为 2048 个样本点。

    接下来,我们遍历测试集中的所有音频文件,并提取以下特征:

    • 色度频率: 使用 librosa.feature.chroma_stft 函数提取。
    • 均方根能量: 使用 librosa.feature.rmse 函数提取。
    • 谱心: 使用 librosa.feature.spectral_centroid 函数提取。
    • 谱带宽: 使用 librosa.feature.spectral_bandwidth 函数提取。
    • 谱衰减点: 使用 librosa.feature.spectral_rolloff 函数提取。
    • 过零率: 使用 librosa.feature.zero_crossing_rate 函数提取。
    • MFCC: 使用 librosa.feature.mfcc 函数提取 40 个 MFCC 特征。
    for audio_file in os.listdir('/content/drive/My Drive/MELD/test'):
      # ...
      y, sr = librosa.load(audio, mono=True)
      chroma_stft = librosa.feature.chroma_stft(y=y, sr=sr)
      rmse = librosa.feature.rmse(y=y)
      spec_cent = librosa.feature.spectral_centroid(y=y, sr=sr)
      spec_bw = librosa.feature.spectral_bandwidth(y=y, sr=sr)
      rolloff = librosa.feature.spectral_rolloff(y=y, sr=sr)
      zcr = librosa.feature.zero_crossing_rate(y)
      mfcc = librosa.feature.mfcc(y=y, sr=sr,n_mfcc=40)
      # ...

    我们将所有提取的特征取平均值,并将它们与对应的情感标签一起保存到 CSV 文件中。

      to_append = f'{audio_file} {np.mean(chroma_stft)} {np.mean(rmse)} {np.mean(spec_cent)} {np.mean(spec_bw)} {np.mean(rolloff)} {np.mean(zcr)}'
      # ...
      to_append += f' {senti}'
      # ...
      with file:
        writer = csv.writer(file)
        writer.writerow(to_append.split())

    情感分类

    提取音频特征后,我们可以使用各种机器学习算法进行情感分类。常用的算法包括:

    • 支持向量机 (SVM)
    • 随机森林 (Random Forest)
    • 深度神经网络 (DNN)

    我们可以使用训练集数据训练模型,并使用验证集数据评估模型性能。最后,我们可以使用测试集数据测试模型的泛化能力。

    总结

    本文介绍了如何使用音频特征进行情感识别。我们以 MELD 数据集为例,使用 Librosa 库提取了音频特征,并将它们保存到 CSV 文件中。最后,我们讨论了可以使用哪些机器学习算法进行情感分类。

    参考文献

  • 免费获取知识的宝库:22个美国免费教科书网站推荐

    在美国,高中和大学的教科书费用是一笔不小的开销。为了减轻大家的经济负担,本文整理了22个提供免费高中及大学教科书的网站,希望能够帮助到有需要的学生和家长。

    1. 资源丰富的综合类网站

    • Open Textbook Library: 由 Center for Open Education 和 Open Textbook Network 共同创建,提供商业、工程、法律等14个领域的教科书,所有书籍都经过大学老师审查,并提供 PDF 和 EPUB 格式下载。 (https://open.umn.edu/opentextbooks/)
    • OpenStax: 由莱斯大学创建,提供高中和大学的免费教科书,采用 CC-BY 授权方式,允许用户修改和传播内容。 (https://openstax.org/subjects)
    • LibreTexts: 由美国国家科学基金会赞助,提供化学、生物学等12个领域的书籍、作业题目、案例研究等资源,并支持用户协作修正错误。(https://libretexts.org/index.html)
    • California Open Online Library for Education (COOL4Ed): 由加州三大高等教育系统组成,提供免费电子教科书和在线课程,涵盖人文艺术、科学技术等多个领域。(https://www.cool4ed.org/)
    • Open Culture: 提供由知名学者编写的免费电子教科书,以及超过1300个顶尖大学的免费在线课程。(https://www.openculture.com/free_textbooks)
    • Open SUNY Textbooks: 由纽约州立大学图书馆创建,提供超过200本涵盖多个领域的免费教科书。(https://textbooks.opensuny.org/browse-by-subject/)
    • 2012 Book Project: 收集整理了一个出版商发布的免费教科书,以入门级大学用书为主,涵盖经济、政治、法律等多个领域。(https://2012books.lardbucket.org/)
    • College Open Textbooks: 由卡内基梅隆大学与多个教育机构共同创建,提供工程、电子、健康等24个领域的700多本开放式教科书,并标明授权方式。(https://collegeopentextbooks.org/)
    • DOAB (Directory of open access books): 收录超过一万本开放获取的书籍,并与众多出版商合作。(https://www.doabooks.org/)

    2. 特色鲜明的专业类网站

    • Intech: 与全球9万多名科学家合作,提供工程、科技、物理等领域的教科书和期刊,拥有约2500本开放式教科书。(https://www.intechopen.com/books/)
    • NOBA: 提供心理学领域的专业教科书,旨在减轻学生负担,并为教师提供交流平台。(https://nobaproject.com/)
    • O’Really: 知名计算机信息书籍出版社,提供部分绝版或重要书籍的免费 PDF 下载,涵盖程序编写、网络管理等内容。(https://www.oreilly.com/openbook/)
    • Project Gutenberg: 收藏超过著作权年限的书籍,目前已有超过56000本藏书,提供多种下载格式。(https://www.gutenberg.org/)
    • Textbook Revolution: 致力于收集高质量的免费教科书,帮助教师和学生减轻经济压力,提供按领域、主题或授权方式搜索的功能。(http://textbookrevolution.org/index.php/Book:Lists/Subjects)
    • The Global Text Project: 由乔治亚大学和丹佛大学共同创建,提供自行开发的全球商业和教育类教科书。(http://globaltext.terry.uga.edu/)

    3. 用户共建的开放平台

    4. 方便实用的导航网站

    希望以上整理的网站能够帮助大家找到需要的免费教科书,减轻学习成本,更轻松地获取知识!

    参考文献

    [1] 22个免费美国教科书网站 包括高中及大学 – 美国实用资讯 (https://www.chineselikela.com/huaren/usa-study/35865/)

  • AI数据就绪度检测器AIDRIN:人工智能数据就绪度的定量评估

    人工智能(AI)的发展正在各个领域蓬勃兴起,但”垃圾进,垃圾出”这一计算机科学界的普遍共识同样适用于AI领域。数据质量直接影响AI模型的性能,低质量、有偏见的数据往往会导致AI模型效果不佳。因此,数据科学家在AI应用中投入了大量时间和精力来准备数据。然而,目前还没有标准的方法或框架来评估数据对AI的”就绪度”。为了解决这一问题,研究人员提出了AIDRIN(AI Data Readiness INspector)框架,旨在对数据的AI就绪度进行定量评估。

    AIDRIN框架概述

    AIDRIN是一个综合性的数据评估工具包,涵盖了文献中提到的广泛就绪度维度,有助于定量和定性地评估数据就绪度。它不仅使用传统数据质量评估中的指标(如完整性、异常值和重复项),还使用专门用于评估AI数据的指标,如特征重要性、特征相关性、类别不平衡、公平性、隐私性和FAIR(可查找性、可访问性、互操作性和可重用性)原则合规性。AIDRIN提供可视化和报告,以帮助数据科学家进一步调查数据的就绪情况,从而提高机器学习管道的效率,为AI应用的数据就绪性做出明智决策。

    AIDRIN的主要特点

    1. 综合评估:AIDRIN整合了传统数据质量参数和AI特定指标,提供全面的数据就绪度评估。
    2. 用户友好:提供简便的数据和元数据上传功能,简化了数据从业者和研究人员的评估过程。
    3. 定量评分:基于广泛的指标列表,涵盖多个数据就绪度考虑因素,提供量化评分机制。
    4. 可视化报告:生成直观的可视化和报告,帮助用户深入分析数据就绪情况。
    5. 跨领域适用:适用于各种领域的用户,可轻松高效地衡量数据集对AI应用的适用性。

    AIDRIN的数据就绪度评估维度

    AIDRIN框架提出了七大类别的AI数据就绪度评估:

    1. 质量
    • 完整性:衡量所需数据的存在程度
    • 异常值:识别偏离正常范围的异常数据点
    • 重复性:评估重复记录的存在
    • 数据准备实践:评估数据准备方法的稳健性
    • 时效性:确保数据是最新和相关的
    1. 可理解性
    • 元数据可用性和质量:确保存在全面的元数据来描述数据集
    • 来源:追踪数据的来源和谱系,确保准确性和完整性
    • 数据访问用户界面:评估访问和交互数据的便利性
    1. 结构质量
    • 使用的数据类型:评估数据类型的适当性和一致性
    • 数据模式质量:评估支持规范化形式和快速数据存储访问的数据模式设计和结构
    • 文件格式和使用的数据存储系统:审查文件格式和存储系统的效率和适用性
    • 数据访问性能:衡量数据检索的速度和可靠性
    1. 价值
    • 特征重要性:评估数据集中不同特征的重要性
    • 标签:检查监督学习标签的可用性、质量和正确性
    • 数据点影响:评估单个数据点对整个数据集的影响
    • 数据不确定性:使用不确定性量化方法衡量数据的不确定性或置信度
    1. 公平性和偏见
    • 类别不平衡:评估数据集中类别的分布
    • 类别可分性:衡量不同类别之间的区分程度
    • 歧视指数:识别数据中的潜在偏见
    • 群体代表性:确保对人群进行多样化和有代表性的抽样
    1. 治理
    • 收集:审查同意、抽样方法、伦理考虑、监管合规性和资金来源
    • 处理和管理:评估使用的匿名化、管理和去识别方法
    • 应用:评估使用限制和数据分析中的潜在偏见
    • 安全:审查数据敏感性、访问控制机制和共享协议
    • 隐私:评估隐私要求、预算和得分
    1. AI应用特定指标
    • 模型特定指标:评估特定于AI模型及其预期应用的指标,确保数据满足成功模型训练和部署的要求

    AIDRIN的分析能力

    AIDRIN提供三类检查结果:

    1. 数据摘要统计:提供数据的一般信息,如属性数量、数据记录数量、百分位数、最小值、最大值、平均值、标准差和分布等统计信息。
    2. 数据就绪度指标:提供多种AI就绪度指标,如完整性、异常值、重复性、特征重要性、特征相关性等。
    3. 可视化:为每个指标提供相应的图表和可视化,便于理解和分析。

    以下是AIDRIN中一些关键指标的详细说明:

    完整性

    完整性表示数据集中必要数据和属性值的存在程度。AIDRIN使用Blake等人提出的完整性指标,通过测量数据集每个特征中缺失值的比例来量化完整性。

    异常值

    异常值指显著偏离数据集中预期值的数据点或实例。AIDRIN采用四分位距(IQR)方法来评估异常值,这种方法对极端值的影响较小,更可靠且易于解释。IQR方法基于数据的中间50%,计算第一四分位数(Q1)和第三四分位数(Q3)之间的范围。超出这个范围的数据点被识别为异常值。

    重复项

    重复项指数据集中存在的重复或冗余实例。AIDRIN使用Bors等人提出的评分系统来检测重复条目,通过比较唯一项目数与总项目数来生成表示数据集重复程度的单一分数。

    隐私

    AIDRIN采用Vatsalan等人提出的”MM风险评分”模型来评估数据隐私风险。这种方法考虑了数据的敏感性和数据中可识别信息的数量,为数据集分配一个隐私风险分数。

    公平性

    AIDRIN使用几种指标来评估数据集的公平性:

    1. 统计平等:评估不同敏感群体之间预测结果的一致性。
    2. 机会平等:比较不同群体中真阳性率的差异。
    3. 人口代表性:评估数据集中各群体的代表性是否与整体人口分布相符。
    4. 群体公平性:评估模型对不同群体的预测准确率是否一致。

    FAIR原则合规性

    AIDRIN评估数据集对FAIR(可查找性、可访问性、互操作性和可重用性)原则的遵守程度:

    1. 可查找性:评估数据集是否易于发现和定位。
    2. 可访问性:评估获取数据的难易程度。
    3. 互操作性:评估数据与其他数据集和系统的兼容性。
    4. 可重用性:评估数据是否可以被其他研究者重复使用。

    特征相关性

    AIDRIN使用相关系数来衡量特征之间的线性关系强度。它可以识别高度相关的特征,这些特征可能会引入多重共线性问题。

    特征重要性

    AIDRIN采用基于树的特征重要性方法,如随机森林,来评估每个特征对预测目标变量的贡献程度。这有助于识别最具预测力的特征。

    类别不平衡

    对于分类问题,AIDRIN计算类别不平衡率,即最大类别样本数与最小类别样本数的比率。高不平衡率可能导致模型偏向主导类别。

    AIDRIN的优势

    1. 全面性:AIDRIN涵盖了广泛的数据就绪度维度,提供了全面的评估框架。
    2. 定量评估:通过量化指标,AIDRIN使数据就绪度评估更加客观和可比较。
    3. 可视化支持:生成直观的图表和报告,帮助用户快速理解数据状况。
    4. 跨域应用:适用于各种领域的AI数据准备工作。
    5. 标准化:为AI数据就绪度评估提供了一个标准化的框架。
    6. 效率提升:通过自动化评估过程,大大提高了数据准备的效率。
    7. 决策支持:为数据科学家和研究人员提供了明确的指导,帮助他们做出关于数据使用的明智决策。

    结论

    AIDRIN框架的提出填补了AI数据就绪度评估领域的空白,为数据科学家和研究人员提供了一个强大的工具。通过综合评估数据质量、公平性、隐私性等多个维度,AIDRIN能够帮助用户更好地理解和改进他们的数据集,从而提高AI模型的性能和可靠性。随着AI技术的不断发展,AIDRIN这样的框架将在确保AI系统的数据基础方面发挥越来越重要的作用。

    参考文献

    1. Hiniduma, K., Byna, S., Bez, J. L., & Madduri, R. (2024). AI Data Readiness Inspector (AIDRIN) for Quantitative Assessment of Data Readiness for AI. arXiv:2406.19256.
    2. Blake, R., & Mangiameli, P. (2011). The effects and interactions of data quality and problem complexity on classification. Journal of Data and Information Quality, 2(2), 1-28.
    3. Bors, C., Wentker, T., Böhm, C., & Heindorf, S. (2021). A Novel Measure for Data Quality: Duplicate Detection. In Proceedings of the 2021 Conference on Empirical Methods in Natural Language Processing, 3078-3084.
    4. Vatsalan, D., Sehili, Z., Christen, P., & Rahm, E. (2017). Privacy-preserving record linkage for big data: Current approaches and research challenges. In Handbook of Big Data Technologies (pp. 851-895). Springer, Cham.
  • 马尔可夫决策过程MDP(Markov Decision Process)

    MDP 是马尔可夫决策过程(Markov Decision Process)的缩写。它是强化学习中用于建模决策问题的一个核心概念。MDP 提供了一个数学框架,用于描述一个代理(Agent)在随机环境中进行决策以最大化累积奖励。一个 MDP 通常由以下五个元素组成:

    1. 状态集合 ( S ):表示环境可能处于的所有状态的集合。
    2. 动作集合 ( A ):表示代理可以执行的所有动作的集合。
    3. 状态转移函数 ( P(s’|s, a) ):表示在状态 ( s ) 下执行动作 ( a ) 后转移到状态 ( s’ ) 的概率。
    4. 奖励函数 ( R(s, a) ):表示在状态 ( s ) 下执行动作 ( a ) 所获得的即时奖励。
    5. 折扣因子 ( \gamma ):一个介于 0 和 1 之间的值,用于权衡未来奖励与当前奖励的重要性。通常用于无限时域问题以确保累积奖励的有限性。

    MDP 的正式定义

    一个 MDP 可以形式化地表示为一个四元组 ( (S, A, P, R) ) 或五元组 ( (S, A, P, R, \gamma) ),其中:

    • ( S ) 是状态空间。
    • ( A ) 是动作空间。
    • ( P(s’|s, a) ) 是状态转移概率函数,表示在状态 ( s ) 下执行动作 ( a ) 后转移到状态 ( s’ ) 的概率。
    • ( R(s, a) ) 是奖励函数,表示在状态 ( s ) 下执行动作 ( a ) 所获得的期望奖励。
    • ( \gamma ) 是折扣因子(如果有)。

    MDP 的工作原理

    在 MDP 中,代理通过在每个时间步 ( t ) 观察当前状态 ( s_t ),选择一个动作 ( a_t ),然后根据状态转移函数 ( P ) 转移到下一个状态 ( s_{t+1} ),同时根据奖励函数 ( R ) 获得一个奖励 ( r_t )。目标是找到一个策略 ( \pi(a|s) ),即在每个状态 ( s ) 下选择动作的概率分布,从而最大化累积奖励的期望值:

    [ G_t = \sum_{k=0}^{\infty} \gamma^k r_{t+k} ]

    其中,( G_t ) 是从时间步 ( t ) 开始的累积折扣奖励。

    MDP 在强化学习中的应用

    在强化学习中,MDP 提供了一个标准化的框架来描述学习任务。大多数强化学习算法,如 Q-learning、策略梯度方法、深度 Q 网络(DQN)、近端策略优化(PPO)等,都是在 MDP 框架下开发和应用的。这些算法的目标是通过与环境的交互,学习一个最优策略 ( \pi^* ),使得累积奖励最大化。

    示例

    假设一个简单的迷宫问题,代理需要从起点走到终点。这个迷宫可以用一个 MDP 来建模:

    • 状态集合 ( S ):迷宫中所有可能的位置。
    • 动作集合 ( A ):上、下、左、右四个方向。
    • 状态转移函数 ( P(s’|s, a) ):根据当前状态 ( s ) 和动作 ( a ) 定义转移到下一个状态 ( s’ ) 的概率。例如,如果迷宫没有障碍物,代理按动作 ( a ) 的方向移动;如果有障碍物,代理保持在原地。
    • 奖励函数 ( R(s, a) ):到达终点时获得正奖励,其他情况下可能获得零奖励或负奖励(如碰到墙壁)。
    • 折扣因子 ( \gamma ):用来权衡未来奖励的重要性。

    通过强化学习算法,代理可以学习到一条从起点到终点的最优路径。

    总结

    MDP 是强化学习中用于建模和解决决策问题的基本工具。它提供了一个统一的框架来描述环境、代理的行为、奖励结构和目标,通过这个框架,我们可以开发和应用各种强化学习算法来解决实际问题。

  • 深入研究大型语言模型中的专家混合机制

    引言

    随着大型语言模型(LLMs)的出现,自然语言处理领域发生了革命性的变化。研究人员通过增加模型规模和训练数据量,不断推升这些模型的能力。然而,这也带来了训练成本和复杂性的急剧增加,迫切需要新的解决方案来更好地平衡预训练效率和模型性能。专家混合(Mixture-of-Experts, MoE)架构通过动态路由输入到一部分专家,从而在不牺牲计算效率的情况下,实现模型的大规模扩展。

    Mixture-of-Experts 概述

    MoE模型通过用N个并行的前馈网络(FFNs)替换原有的FFNs,并结合一个路由器来增强Transformer。这些并行的FFNs被称为专家,每个专家通过路由器的评分分布来接收输入。公式如下:

    [ \mathbf{y} = \sum_{n \in N} g_{n}(\mathbf{x}; \mathbf{G}, k) E_{n}(\mathbf{x}) ]

    当Top-k小于N时,仅有部分专家参与计算,这被称为稀疏专家混合(SMoE)。

    方法概述

    本文选取了Mixtral 8x7B、DeepSeekMoE和Grok-1三个模型进行分析,并附加了标准的Transformer模型Mistral 7B作为对比。研究分为静态参数分析和动态行为分析两部分。

    静态参数分析

    专家权重矩阵

    在矩阵级别,我们计算了所有专家在每一层的投影矩阵Wup、Wgate和Wdown之间的相似性,并用PCA将这些矩阵扁平化为二维空间。结果显示,不同模型的矩阵相似性模式存在显著差异。

    门嵌入

    门嵌入的相似性分析显示,Mixtral和DeepSeek的门嵌入与专家选择的权重矩阵Wgate之间存在较强的相关性,这表明门嵌入和Wgate可能学习了相似的知识来执行选择操作。

    动态行为分析

    专家输出

    通过输入短序列和长序列,我们测量了专家输出特征向量之间的相似性。结果显示,被选择的专家输出更相似,尤其是在Mixtral模型中。

    专家输出的L2范数和门评分

    在Mixtral模型中,我们发现被选择的专家通常输出范数最大,这表明范数可能是门决策的关键因素之一。这一发现与CompeteSMoE的设计一致,该设计基于输出范数选择专家。

    讨论

    基于我们的分析,我们提出了一些关于MoE模型的建议:

    • 神经元级别的专家:门嵌入决定了专家选择,而Wgate负责选择激活的神经元,两者之间的相似性表明神经元可能是更细粒度的专家。
    • 模型架构:可以考虑在深层增加专家数量,而在最后一层减少专家数量。此外,基于输出范数作为路由机制是合理的。
    • 相关性测量:权重矩阵之间的相似性测量在某种程度上等同于输出特征向量的相似性测量。

    相关工作

    现有的大部分工作从路由器的角度分析MoE,通过观察专家选择来研究其行为。近年来的研究发现标准路由器并未在领域级别表现出明显的专业化,主要基于token ID进行路由。

    结论

    本文首次尝试通过研究参数和输出来揭示MoE模型的内部工作机制。我们总结了实证观察,并提出了一些实用建议。虽然目前还无法全面回答MoE是否学习了异质的专家,但我们的一些实验表明,特定的架构设计和训练框架可能更有利于专家的专业化。

    限制

    我们的分析主要基于观察,缺乏进一步验证的干预措施。

    GitHub – kamanphoebe/Look-into-MoEs: A Closer Look into Mixture-of-Experts in Large Language Models

    这个GitHub仓库包含了论文《A Closer Look into Mixture-of-Experts in Large Language Models》的代码。以下是仓库的主要内容和使用指南:

    概述

    我们首次尝试理解基于MoE的大型语言模型的内部工作机制。具体来说,我们全面研究了三个基于MoE的模型(Mixtral 8x7B, DeepSeekMoE, Grok-1)的参数和行为特征,揭示了一些有趣的观察结果,包括:

    • 神经元像细粒度专家一样行为:门嵌入决定了专家选择,而专家的投影矩阵则负责选择激活的神经元。它们的相似性值显示出关联性,这表明专家神经元可能是细粒度的专家。
    • MoE的路由器通常选择输出范数较大的专家:以Mixtral为例,我们发现输出特征向量范数最大的专家最有可能被门赋予最高分数。
    • 专家多样性随着层数增加而增加,但最后一层是一个例外:在多个实验中,我们观察到专家之间的相似性在深层中通常较低,而在最后一层相似性增加。

    基于这些观察结果,我们还为MoE实践者提供了一些建议,如路由器设计和专家分配。

    使用指南

    1. 下载模型检查点
      默认情况下,我们的代码从ckpt目录加载预下载的模型。你也可以修改代码直接从HuggingFace下载。我们使用的模型下载链接如下:
    • Mixtral 8x7B Base
    • Mixtral 8x7B Instruct
    • Mistral
    • DeepSeekMoE
    • Grok-1
    1. 创建conda环境
       git clone https://github.com/kamanphoebe/Look-into-MoEs.git
       cd Look-into-MoEs
       conda create -n analyze --file env.txt

    创建conda环境后,需要将其选为Jupyter内核。

    1. 运行实验
      两个Jupyter notebooks(static_analysis.ipynb和dynamic_analysis.ipynb)分别包含了关于静态参数和动态行为的实验代码。你可以简单地运行每个实验对应的代码块,这些代码块的标题与论文中的实验名相同。

    引用

    如果你觉得我们的工作有用,请引用我们的论文:

    @misc{lo2024closerlookmixtureofexpertslarge,
          title={A Closer Look into Mixture-of-Experts in Large Language Models}, 
          author={Ka Man Lo and Zeyu Huang and Zihan Qiu and Zili Wang and Jie Fu},
          year={2024},
          eprint={2406.18219},
          archivePrefix={arXiv},
          primaryClass={cs.CL},
          url={https://arxiv.org/abs/2406.18219}, 
    }

    致谢

    我们的模型配置和建模文件借用了HuggingFace仓库中的相应文件,感谢这些作者的出色工作。

    通过这个GitHub仓库,研究者可以复现论文中的实验,并进一步探索MoE模型的内部机制。

  • 动态去偏:解释引导的人类监督机器学习系统决策

    引言

    在当前社会中,机器学习(ML)系统已经广泛应用于招聘、金融和医疗等关键领域。然而,这些系统在做出决策时,可能会基于受保护属性(如性别、种族等)出现歧视性结果。这引起了人们对其公正性的广泛关注。虽然在开发阶段确保公平性非常重要,但部署后的ML系统仍可能在实际操作中表现出歧视性。为了填补这一空白,本文提出了一种新颖的框架,用于对部署的ML系统进行实时监控和纠正歧视行为。该框架利用反事实解释技术,持续监控ML系统的预测,并在检测到歧视性结果时进行标记。然后,将与原始预测和反事实替代相关的事后解释呈现给人类审查员,以便进行实时干预。这种人类在环(human-in-the-loop)的方法使审查员能够接受或推翻ML系统的决定,从而在动态环境下实现公平和负责任的ML操作。

    什么是公平性?

    公平性的定义

    在ML系统的决策中,公平性是指在没有基于个人或群体的固有或获得属性(如种族、性别等)出现偏见或偏好。公平性问题的解决首先需要对其进行量化。简而言之,假设 ( X ) 代表一个个体的属性集合, ( Y ) 代表真实标签集合, ( S ) 代表敏感属性, ( Z ) 代表其他属性,公式如下:

    [ F(X, Y, h, S, Z) = f(h(X, S, Z)) \approx h(X, S’, Z) ]

    其中, ( S’ ) 是去除了任何潜在偏见的敏感属性子集。此公式还可以写为概率分布:

    [ F(h) = P[Y = y|X, A = a] = P[Y = y|X, A = a’] ]

    这意味着,给定个体属性 ( X ) 的情况下,不同受保护属性值 ( a ) 和 ( a’ ) 对预测结果 ( Y ) 的影响是相同的,即模型的预测结果应独立于受保护属性。

    个体公平性

    个体公平性确保了相似的个体在决策中获得相似的结果,而不考虑其受保护属性。这种公平性基于这样一种理念:个体应被平等对待,不论其是否属于某一特定群体。设 ( X ) 表示属性集合, ( Q ) 表示受保护属性集合,公式如下:

    [ X = D(q_1) \times D(q_2) \times \cdots \times D(q_n) ]

    其中, ( D(q_i) ) 表示属性 ( q_i ) 的取值域, ( x_i ) 表示输入实例中的第 ( i ) 个属性值。

    公平性测试

    公平性测试是一种软件测试分支,旨在揭露ML系统中存在的不公平性漏洞。公平性漏洞指的是ML系统在实际操作中违背预期公平性条件的任何缺陷。公平性测试可以分为离线测试和在线测试。离线测试在模型开发阶段进行,只评估模型在训练数据上的表现,而不考虑其在实际应用中的表现。而在线测试则在模型部署后,持续监控和评估其在实际操作中的公平性。

    反事实解释

    反事实解释是一种用于识别需要做出的最小更改,以改变给定预测的技术。通过提供类似于待解释观察结果但产生不同结果的特定数据实例,反事实解释可以帮助理解某些因素对结果的直接影响,从而识别模型中的潜在问题并做出明智的决策。公式如下:

    [ c = \arg \min_{c} \text{loss}(f(c), y) + |x – c| ]

    其中,第一项表示模型预测的损失或错误,第二项表示原始观察结果与反事实数据点之间的差异。这个公式确保反事实数据点与初始观察结果尽可能相似,但结果不同。

    人类监督在ML系统中的嵌入

    在使用ML系统自动化决策过程中,一个重要的担忧是这些系统可能会对某些群体产生偏见。引入人类输入和监督(即人类在环)可以有效减少系统中的偏见,因为人类带来了不同的视角、知识和经验,可以在算法没有考虑到的情况下做出公正的决策。公式如下:

    [ F(H) = H(f(x_1), f(x_2), \ldots, f(x_n)) ]

    表示ML系统输出的最终决策可以由人类审查员进行验证和确认。

    方法论

    本文提出了一种概念模型,旨在在ML系统运行期间实时监控和纠正偏见。该模型包括以下组件:

    1. 反事实生成:输入实例后,通过预训练的ML模型生成反事实实例,这些实例与原始实例在受保护属性上有所不同,但其他特征相同。
    2. 偏见检测:自动偏见检测组件分析反事实实例,并判断是否存在歧视性结果。如果存在反事实实例且结果不同,则标记为歧视。
    3. 人类审查:将标记为歧视的实例提交给人类审查员进行最终评估,以确保系统决策的公正性。

    实际应用案例

    案例1:医疗系统

    在医疗系统中,ML模型可以用于预测患者的再入院风险。然而,如果模型对某些人口群体(如某种种族或性别)存在偏见,这些偏见可以通过反事实解释和自动偏见检测组件来检测和纠正。例如,如果反事实解释表明某患者的再入院风险会因其属于某特权群体而降低,则可以标记该预测为歧视性并进行人类审查。

    案例2:教育系统

    在教育领域,ML模型可以用于评估学生申请和奖学金分配。然而,如果模型对某些群体(如少数民族或性别)存在偏见,这些偏见可以通过反事实生成和自动偏见检测组件来检测。例如,反事实解释可以揭示某少数族裔申请者如果不是少数族裔,可能会获得更高的录取几率。

    案例3:贷款审批系统

    在贷款审批系统中,ML模型用于评估申请者的信用评分和贷款批准。然而,如果模型对某些群体(如种族或性别)存在偏见,这些偏见可以通过反事实生成和自动偏见检测组件来检测和纠正。例如,反事实解释可以揭示某少数族裔申请者如果不是少数族裔,可能会更容易获得贷款批准。

    案例4:刑事司法系统

    在刑事司法系统中,ML模型用于预测被告的再犯风险。然而,如果模型对某些群体(如种族)存在偏见,这些偏见可以通过反事实生成和自动偏见检测组件来检测和纠正。例如,反事实解释可以揭示某黑人被告如果不是黑人,其再犯风险评分会更低。

    案例5:招聘系统

    在招聘系统中,ML模型用于筛选求职者。然而,如果模型对某些群体(如性别)存在偏见,这些偏见可以通过反事实生成和自动偏见检测组件来检测和纠正。例如,反事实解释可以揭示某女性求职者如果是男性,其录取概率会更高。

    结论

    本文提出了一种概念模型,用于通过人类审查和反事实解释在实时中跟踪和纠正ML系统中的个体歧视。我们的框架利用反事实解释的力量来定位ML系统中的歧视实例,并包含一个人类审查组件来纠正这些偏见。这种方法有助于确保这些系统做出的决策是公平且无偏的,从而防止弱势群体受到歧视性结果的不公正影响。

    参考文献

    1. Mamman, Hussaini Abubakar, et al. “Unbiasing on the Fly: Explanation-Guided Human Oversight of Machine Learning System Decisions.” 13th Computer Science On-line Conference, Lecture Notes on Networks and Systems, Springer, April 2024.
    2. Udeshi S., et al. “AEQUITAS: A Fairness Testing Technique.” Udeshi et al. 2018.
    3. Monjezi R., et al. “DICE: Discrimination Identification and Correction in Deep Neural Networks.” Monjezi et al. 2018.
    4. Galhotra S., et al. “Themis: A Fairness Testing Tool.” Galhotra et al. 2017.
    5. Yang J., et al. “BiasRV: A Tool for Detecting Gender Discrimination in Sentiment Analysis Systems.” Yang et al. 2019.

  • 规划作为推理的一种类型

    在人工智能领域,特别是强化学习(Reinforcement Learning)和规划(Planning)中,推理(Inference)是一个关键的概念。不同类型的推理方法,如边缘推理(Marginal Inference)、最大后验推理(Maximum-a-Posteriori Inference,MAP)和边缘最大后验推理(Marginal Maximum-a-Posteriori Inference,MMAP),在不同场景下有着不同的应用和效果。那么,当我们谈到“规划作为推理”时,这到底意味着什么呢?

    本文将通过变分推理(Variational Inference,VI)框架,展示不同类型的推理与规划的关系,并解释在不同的动态环境下,哪种推理方法最适合用于规划。

    1. 引言

    推理在概率图模型(Probabilistic Graphical Models)中有多种类型,例如边缘推理、最大后验推理和边缘最大后验推理。在本文中,我们将展示规划是一种独特的推理类型,并且在随机动态下,它与上述任何方法都不完全相同。进一步地,我们将展示如何根据规划的质量对这些方法进行排名。

    2. 背景

    2.1 马尔可夫决策过程(MDPs)

    有限时间的马尔可夫决策过程(MDP)可以表示为一个六元组 ({\cal X},{\cal A},p(x_{1}),{\cal P},{\cal R},T),其中 {\cal X} 是状态空间,{\cal A} 是动作空间,p(x_{1}) 是初始状态分布,{\cal P} 是转移概率,{\cal R} 是奖励函数,T 是时间跨度。

    2.2 变分推理

    变分推理通过最大化变分下界来近似后验分布。对于一个一般的因子图 f({\bm{x}},{\bm{a}}),变分推理问题可以表示为:

        \[\max_{q({\bm{x}},{\bm{a}})}\langle\log f({\bm{x}},{\bm{a}})\rangle_{q({\bm{x}},{\bm{a}})} + H^{\text{type}}_{q}({\bm{x}},{\bm{a}})\]

    其中 q({\bm{x}},{\bm{a}}) 是关于变量的任意变分分布,H^{\text{type}}_{q}({\bm{x}},{\bm{a}}) 是特定类型的熵。

    3. 方法

    3.1 标准MDPs的变分推理

    我们所关注的主要量是最佳指数效用,定义如下:

        \[F_{\lambda}^{\text{planning}} = \frac{1}{\lambda}\log\max_{\bm{\pi}}\mathbb{E}_{\bm{\pi}}\left[\exp(\lambda R({\bm{x}},{\bm{a}}))\right]\]

    其中,\lambda 是风险参数。

    3.2 因子化MDPs的变分推理

    对于因子化MDPs,我们可以使用类比于循环置信传播(Loopy Belief Propagation,LBP)的值置信传播(Value Belief Propagation,VBP)算法来进行近似规划。

    4. 不同类型的推理及其在规划中的适用性

    4.1 排名不同类型的推理

    通过观察不同类型推理的熵项,我们可以看出,对于给定的变分后验 q,它们的质量排序如下:

        \[F_{\lambda}^{\text{marginal}^{\text{U}}} \leq F_{\lambda}^{\text{MAP}} \leq F_{\lambda}^{\text{MMAP}} \leq F_{\lambda}^{\textbf{planning}} \leq F_{\lambda}^{\text{marginal}}\]

    4.2 动态的随机性是关键

    在动态是确定性的情况下,MAP和MMAP推理作为规划是合适的。但在动态是随机的情况下,MMAP和MAP的缺点在于缺乏对环境的反应能力。

    5. 相关工作

    不同文献中对“规划作为推理”的定义不一致,本文通过变分推理框架统一了这些定义,并提供了新的视角。

    6. 实证验证

    我们在合成MDPs和国际规划竞赛任务中验证了这些结果,结果表明在高随机性环境中,VBP优于其他类型的推理。

    7. 讨论

    变分框架为分析和理解不同类型的推理如何近似规划提供了强大的工具,并且揭示了随机性在规划中的关键作用。

    参考文献

    • Jordan, M. I., Ghahramani, Z., Jaakkola, T. S., & Saul, L. K. (1999). An introduction to variational methods for graphical models. Machine Learning, 37(2), 183-233.
    • Liu, Q., & Ihler, A. (2013). Variational algorithms for marginal MAP. The Journal of Machine Learning Research, 14(1), 3165-3200.
    • Sontag, D., Globerson, A., & Jaakkola, T. (2011). Introduction to dual decomposition for inference. Optimization for Machine Learning, 1, 219-254.

    通过本文的研究,我们不仅能够更好地理解不同类型推理在规划中的表现,还能为设计新的近似算法提供理论支持。


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

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

    A: 这篇论文探讨了在概率图模型中进行规划时所使用的不同类型的推理(inference),并试图解决其中的一些问题和不一致性。具体来说,论文的主要贡献和解决的问题包括:

    1. 规划推理的类型: 论文首先指出,在文献中,当研究者提到“规划作为推理”时,并没有一致性,不同的类型被使用,且它们在实际规划中的应用能力与特定的近似方法或额外约束进一步纠缠在一起。
    2. 变分框架的应用: 作者使用变分框架(variational framework)来展示所有常用的推理类型如何对应于变分问题中熵项的不同权重,并且指出规划对应于一组不同的权重。
    3. 规划推理的新视角: 论文提出了一种新的视角,将规划视为一种独特的推理类型,并探讨了在随机动态下,规划推理与现有的推理方法(如边缘推理、最大后验推理等)的不同之处。
    4. 近似规划算法的开发: 论文开发了一种类似于循环信念传播(loopy belief propagation, LBP)的算法,称为值信念传播(value belief propagation, VBP),用于在具有因子化状态的马尔可夫决策过程中进行近似规划,而不会因为状态空间的指数级增长而导致不可解。
    5. 实证验证: 论文通过在合成MDP(Markov Decision Processes)和国际规划竞赛(International Planning Competition)中的任务上进行实证验证,来支持他们的观点和方法。
    6. 规划推理的适用性分析: 论文还分析了不同推理类型在规划中的适用性,特别是在不同随机性水平的环境中,以及如何根据环境的随机性来选择合适的推理类型。

    总的来说,这篇论文试图提供一个更加清晰和一致的框架来理解和实践规划中的推理过程,并通过变分推断的方法来改进和优化规划算法。

    Q: 有哪些相关研究?

    A: 论文中提到了多个与“规划作为推理”相关的研究工作,以下是一些主要的相关研究:

    1. Toussaint 和 Storkey (2006): 引入了MDP因子图中的政策,并使用EM算法最大化其参数的似然度。这是一种精确方法,更准确地说是规划作为学习而非推理的一种类型。
    2. Levine (2018): 使用最大后验推理(MAP inference)进行规划,只考虑了乘法设置λ=1,并提出了一种结构化后验,使得q(xt+1|xt, at) = P(xt+1|xt, at)。
    3. Cui et al. (2015): 提出了ARollout方法,可以看作是对边际推理的单次前向传递LBP近似,适用于因子化MDP。
    4. Cui 和 Khardon (2016); Cui et al. (2019): 开发了符合SOGBOFA,通过在外循环中使用梯度下降优化动作,同时在内循环中使用ARollout进行边际推理,提供了一种强大的基线,并在2018年国际概率规划竞赛(IPPC)中排名第二。
    5. Attias (2003): 选择了MAP推理进行规划。
    6. Palmieri et al. (2022); Wu 和 Khardon (2022): 最近引入的两个框架,用于从消息传递的角度分析规划。前者分析了六种更新规则及其对计划的定性影响;后者关注于分离消息传播的方向和近似类型。
    7. Cheng et al. (2013); Chen et al. (2015): 使用严格的变分框架来处理基于图的MDPs,类似于因子化MDPs,但具有因子化的动作空间。
    8. Kumar et al. (2015); Bhattacharya 和 Kharoufeh (2017); Altman (2021); Bhat et al. (2023): 关于非平稳、有限视界MDPs的线性规划(LP)公式的研究。
    9. Koller 和 Parr (1999); Guestrin et al. (2003); Malek et al. (2014): 提供了处理因子化MDPs的LP公式,与本文的工作有更密切的联系。

    这些研究为理解规划和推理之间的关系提供了不同的视角和方法,同时也展示了在概率图模型中进行规划的不同技术和算法。论文通过与这些相关工作的比较,展示了其提出的变分推理框架的优势和潜在的应用。

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

    A: 论文通过以下几个关键步骤来解决“规划作为推理”中的不一致性和问题:

    1. 变分推理框架:作者采用了变分推理(Variational Inference, VI)的视角,将不同的推理类型统一到一个框架下。这允许直接比较不同推理类型,并为“规划推理”任务开发近似推理算法。
    2. 定义规划推理:论文提出了规划推理(planning inference)的定义,并展示了如何将其形式化为变分优化问题。这涉及到定义一个特定的熵项,称为“规划熵”(Hplanning(q)),它与已有的推理类型(如边际推理、MAP推理等)所采用的熵项不同。
    3. 价值信念传播(VBP)算法:为了处理具有因子化状态的马尔可夫决策过程(Factored MDPs),作者开发了一种类似于循环信念传播(LBP)的算法,称为价值信念传播(VBP)。VBP允许在不牺牲可解性的情况下,对具有指数级状态空间的MDP进行近似规划推理。
    4. 变分线性规划(VI LP):作者提出了一种变分线性规划方法,用于在因子化MDPs中估计最优期望奖励。这种方法利用了变分推理的框架,通过松弛变量和约束来提供一个可解的优化问题。
    5. 确定性规划的变分公式:论文展示了如何利用变分推理来获得确定性规划(Determinization in Hindsight)的封闭形式解。这通常通过采样来计算,但作者展示了如何通过变分方法避免采样,从而得到一个精确的解决方案。
    6. 实证验证:作者在合成MDPs和国际规划竞赛(International Planning Competition)中的任务上进行了实证验证,展示了所提出的变分推理框架和VBP算法相对于其他推理方法的优势。
    7. 分析和比较:论文详细分析了不同推理类型在规划中的适用性,并根据环境的随机性水平对它们进行了排名,指出了在不同情况下哪种推理类型更为合适。

    通过这些步骤,论文不仅提出了一种新的视角来理解规划中的推理过程,还开发了新的算法和技术来改进规划的效率和准确性。

    Q: 论文做了哪些实验?

    A: 论文中进行了以下实验来验证所提出方法的有效性:

    1. 合成MDPs(马尔可夫决策过程)实验
      • 生成了5,000个结构化的合成因子化MDP实例,这些实例具有随机动态、在最后一个时间步提供全有或全无的奖励,并控制了归一化熵。
      • 实验比较了不同推理方法在不同随机性水平下的性能,包括VBP、VI LP、MFVI-Bwd、ARollout、SOGBOFA-LC等。
    2. 国际概率规划竞赛(IPPC)任务实验
      • 在ICAPS 2011 IPPC的6个不同领域(Crossing traffic, Elevators, Game of life, Skill teaching, Sysadmin, Traffic)上评估了5种不同的推理方法(MFVI-Bwd, ARollout, SOGBOFA-LC, VI LP, VBP)。
      • 每个领域有10个实例,每个实例有40个时间步,并在轻度随机性的环境中进行评估。
      • 实验测量了不同方法在这些任务中的平均累积奖励,并与基线方法进行了比较。
    3. 反应性避免实验
      • 构建了一个多实体MDP,其中代理可以控制所需的反应性水平,但会因较低的反应性而受到惩罚。
      • 该实验旨在展示VBP如何保持最大反应性以实现奖励1,而SOGBOFA-LC由于其非反应性而只能获得较低的奖励。
    4. 确定性规划的变分公式实验(在附录E中描述):
      • 展示了如何使用变分推理来获得确定性规划的封闭形式解,这是一种通常通过采样计算的技术。

    这些实验的目的是展示所提出的变分推理框架和VBP算法在不同情况下相对于其他推理方法的优势,特别是在处理具有随机性和大规模状态空间的MDPs时。实验结果支持了论文中的观点,即VBP在高随机性环境中表现优于其他方法,并且在不同随机性水平下具有较好的一致性。

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

    A: 论文提出了一个基于变分推理的规划框架,并对其进行了实证验证。尽管已经取得了一定的成果,但仍有一些潜在的研究方向可以进一步探索:

    1. 算法改进:虽然VBP(Value Belief Propagation)在某些情况下表现良好,但仍有可能通过改进消息传递算法、优化参数选择或开发新的变分推理技术来提高算法的效率和准确性。
    2. 理论分析:进一步研究变分规划推理的理论基础,包括其收敛性、收敛速度以及在不同类型的MDPs和不同随机性水平下的性能保证。
    3. 实际应用:将变分规划推理应用于更广泛的实际问题,例如机器人路径规划、自动驾驶、游戏AI等领域,以验证其在现实世界中的有效性。
    4. 多智能体系统:研究变分规划推理在多智能体系统中的应用,考虑如何在多个智能体之间协调和共享信息。
    5. 在线规划:探索变分规划推理在在线规划设置中的性能,即在不断变化的环境中实时进行规划和调整策略。
    6. 与深度学习的结合:研究如何将变分规划推理与深度学习模型结合起来,以利用深度学习在处理高维数据和复杂模式识别方面的优势。
    7. 泛化能力:研究变分规划推理的泛化能力,即在不同类型和规模的问题上的适用性和灵活性。
    8. 计算效率:优化变分规划推理的计算效率,特别是在大规模或复杂的问题上,以实现更快的推理速度。
    9. 鲁棒性研究:分析变分规划推理在面对模型不确定性或环境噪声时的鲁棒性,并探索提高鲁棒性的方法。
    10. 与其他规划方法的比较:与其他先进的规划方法进行比较,例如基于采样的方法、基于模型的方法等,以确定变分规划推理在不同情况下的优势和局限性。
    11. 软件工具和库的开发:开发易于使用的软件工具和库,使研究人员和实践者能够更容易地应用变分规划推理。
    12. 教育和普及:通过教育材料和教程,提高对变分规划推理概念和方法的理解和普及。

    这些方向不仅可以推动变分规划推理技术的发展,还可能为解决更广泛的人工智能问题提供新的视角和工具。

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

    A: 这篇论文的主要内容可以总结如下:

    1. 问题定义:论文首先定义了在概率图模型中进行规划时所面临的不同类型的推理问题,包括边际推理、最大后验推理(MAP)和边际最大后验推理(MMAP),并指出了这些方法在规划中的不一致性。
    2. 变分推理框架:作者采用变分推理(Variational Inference, VI)框架来统一和比较不同的推理方法。通过变分框架,展示了所有常用的推理类型都可以视为变分问题中熵项的不同权重。
    3. 规划推理的变分公式:论文提出了规划推理(planning inference)的变分公式,定义了一个新的熵项Hplanning(q),并将规划推理视为一种独特的推理类型。
    4. 价值信念传播(VBP)算法:为了解决具有因子化状态的马尔可夫决策过程(Factored MDPs)中的近似规划问题,作者开发了VBP算法,这是一种类似于循环信念传播(LBP)的算法。
    5. 变分线性规划(VI LP):论文还提出了一种变分线性规划方法,用于在因子化MDPs中估计最优期望奖励,提供了一种可解的优化问题。
    6. 确定性规划的变分公式:作者展示了如何利用变分推理来获得确定性规划(Determinization in Hindsight)的封闭形式解,这是一种通常通过采样计算的技术。
    7. 实证验证:论文通过在合成MDPs和国际规划竞赛(International Planning Competition)中的任务上进行实证验证,展示了所提出的变分推理框架和VBP算法相对于其他推理方法的优势。
    8. 不同推理类型的适用性分析:论文分析了不同推理类型在规划中的适用性,并根据环境的随机性水平对它们进行了排名,指出了在不同情况下哪种推理类型更为合适。
    9. 相关工作:论文讨论了与“规划作为推理”相关的其他研究工作,并将其与所提出的变分推理框架进行了比较。
    10. 结论与未来工作:最后,论文总结了研究成果,并提出了一些可能的研究方向,如算法改进、理论分析、实际应用扩展等。

    整体而言,这篇论文提出了一个基于变分推理的规划框架,并通过理论分析和实证验证展示了其有效性,为理解和改进概率图模型中的规划推理提供了新的视角和工具。