碎碎念 此文章为macOS使用docker配置openGauss的简单指引。之所以选择3.0.0版本，是因为我测试了若干版本后，发现很多更高的版本都会出现docker运行容器闪退的问题，于是根据 https://blog.csdn.net/Katharsis_Tk/article/details/138305306 和@ysy同学提供的经验，更换3.0.0版本后正常，特别感谢！ 但是，上述教程仍然存在一些问题，所以建议参考本文。 [scode type="blue"]本教程基于macOS，但windows亦可作为参考。windows适配的版本号未经测试。 推荐使用适宜的网络环境，如果没有，可以更换国内镜像源。 [/scode] STEP1 下载安装docker 有关docker desktop的安装可以参考上述文章的前半部分，这里不再赘述。 或者可以参考以下文章： [post cid="136" /] STEP2 拉取openGauss镜像 docker配置完成后，在后台打开docker desktop，然后打开终端输入以下命令，拉取3.0.0版本的镜像： docker pull enmotech/opengauss:3.0.0 等待拉取完成即可。 ​​ STEP3 创建openGauss容器 docker run --name opengauss --privileged=true -d -e GS_PASSWORD=openGauss@123 -p 5432:5432 enmotech/opengauss:3.0.0 运行该命令会返回一串id。 ​​ [scode type="red"]openGauss的密码要求包含大小写字母、数字和特殊符号。 作为测试，不推荐在此步修改GS_PASSWORD。 [/scode] 然后打开docker，验证一下是否处于运行状态 ​​ 此步中，如果出现容器运行闪退的情况，请检查： 1.端口是否被占用； 2.openGauss版本号是否为3.0.0。 上述命令中，-p 5432:5432​的位置不可改变。冒号前代表宿主机（即本机电脑）的端口号，冒号后代表docker中对应的端口号。如果你需要自定义，仅推荐修改前者。 如果容器处于Running状态，并且Port(s)列也正确显示了端口映射情况，则此步正确完成。 STEP4 完成openGauss的基础配置 此步参考https://blog.csdn.net/Katharsis_Tk/article/details/138305306。 安装后的openGauss默认有一个用户gaussdb，账户密码就是刚刚设置的密码，这里是openGauss@123 打开终端执行以下步骤： 先切换到omm用户,然后使用gsql工具创建普通用户方便管理： su - omm gsql -d postgres -U gaussdb -W openGauss@123 CREATE USER myuser WITH PASSWORD "userpw1."; 其中，"myuser"和"userpw1."可以分别替换为你设定的账号和密码。 STEP5 配置DBeaver 可以前往https://dbeaver.io/download/下载对应版本的DBeaver ​​ macOS可以直接使用brew下载（推荐） brew install --cask dbeaver-community 使用brew下载需要静待其完成安装，然后在启动台处即可找到。 如果提示没有brew可以自行搜索安装homebrew，一个强大的包管理器。 ​​ 然后，下载并解压对应架构的openGauss JDBC驱动。 如果你是windows系统或Intel芯片的mac系统，通常选择x86_64；如果你是M芯片的mac系统，选择AArch64。 ​​ ​​ 在DBeaver中，点击菜单栏的“Driver Manager”，然后点击NEW创建新的驱动。 在创建新驱动页，依次点击Libraries，Add File，添加我们刚刚解压的驱动文件（通常为带版本号的这个jar文件） 然后点击Find Class ​​ 完成后，切换到Settings，按照如下设置完成后，点击OK即可。（ID不用改） [scode type="blue"]2025.10.21补充：URL如下 jdbc:opengauss://{host}:{port}/{database} 方便各位粘贴[/scode] ​​ 然后，在主界面，右键如图所示的postgres，选择Edit connection，然后填写用户和密码。可以是默认的账户，也可以是刚刚你新设置的账户。如果填写默认账户，且你没有修改我给出的默认密码，则默认密码是openGauss@123 在此步中，请保证docker开启，并且openGauss容器处于运行状态。 现在，双击postgres，即可连接上openGauss了！ ‍
碎碎念 我在完成OS课程的Homework3时，本以为是很简单的配置，但不知是否因为本机环境太杂乱，还是遇到了一些小问题。由于立下了这个学期开始一定要坚持写一些东西、以免被AI支配的Flag，所以把这些不足为道的经验分享给大家，希望能帮助到遇到同样问题的同学。 ::aru:cryingface:: STEP1 Docker下载及安装 如果你是Windows或Mac，可以直接从Docker官网下载适用于Windows或Mac的Docker Desktop安装包。按照向导完成安装即可。如果是Linux，相信你可以跳过此步。 建议参考网上的教程安装以及检验，不再赘述。之后的步骤记得保证Docker处于运行状态。 STEP2 插件安装 无论是VScode还是Cursor，都可以直接在扩展处搜索安装此插件。至此，准备工作就完成了。 STEP3 使用Dockerfile构建环境 这一步就容易出问题了。按照老师的步骤进行，你可能会遇到： "Docker not found" 错误 如果在执行reopen in container时遇到类似于“Docker not found”的错误提示，首先检查Docker是否正确安装并运行。Windows或Mac可以直接查看任务栏Docker Desktop是否正常工作；Linux环境可以通过以下命令检查Docker状态：sudo systemctl status docker 如果Docker没有启动，请尝试启动它： sudo systemctl start docker 如果还是无法找到Docker，检查VScode的插件是否正确安装，并确保VScode的设置中Docker路径配置正确，可以尝试重启。 "无法连接到远程开发容器" 错误 此错误一般出现在输入"reopen in container"创建容器之后，同时控制台可能输出以下错误信息（节选）： type=volume,source=vscode,target=/vscode,external=true --skip-post-create --update-remote-user-uid-default on --mount-workspace-git-root --include-configuration --include-merged-configuration [2025-09-23T11:37:12.076Z] Exit code 1 遇到此错误时，可以尝试以下解决方案： 解决方法 进入 lmbench 文件夹下的 .devcontainer 文件夹。 打开 Dockerfile 文件，并将内容替换为以下配置： # 使用 Ubuntu 22.04 作为基础镜像 FROM ubuntu:22.04 # 安装ca-certificates以解决证书验证问题 RUN apt-get update && apt-get install -y ca-certificates # 如果BFSU镜像有问题，可以将镜像源替换为官方Ubuntu镜像 # COPY sources.list /etc/apt/sources.list # 更新包列表并安装wget RUN apt-get update && apt-get install -y wget # 添加LLVM的GPG密钥 RUN wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc # 更新包列表 RUN apt-get update # 安装必要的软件包和工具链 RUN apt-get update && apt-get install -y \ make \ git \ gcc \ clang \ clangd \ gdb && \ rm -rf /var/lib/apt/lists/* # 设置默认的工作目录 WORKDIR /workspace/lmbench 此问题一般是证书验证问题或网络问题导致的，通常更换Dockerfile的内容后即可正常下载镜像创建容器了。如果仍有网络问题，可以尝试使用特殊方法，或是自行搜索教程，更换其它源。 STEP4 编译评测 经过前面的配置，现在的VScode已经处于Linux环境中，接下来是进行编译和评测的步骤。 编译 lmbench 在 lmbench 目录下，使用以下命令来编译 lmbench： make results 执行 make results 后，你会看到一系列提示，要求你设置一些测试选项。通常情况下，可以直接按回车键使用默认设置即可，无需更改。 注意 在编译过程中，你可能会遇到一些路径问题，错误信息类似如下： ../scripts/results: 30: cannot create ../../results//b36cd28369b4.1: Directory nonexistent Mailing results ../scripts/results: 37: mail: not found make[1]: Leaving directory '/workspaces/lmbench/src' 其中 mail: not found 是因为测试完成后，脚本试图自动发送邮件通知，但由于没有配置邮件系统，所以可以忽略这个错误。 另外，Directory nonexistent 表示结果目录不存在，这是因为在编译过程中，脚本期望将测试结果保存到特定的子目录中，但该目录没有正确创建。 解决方案 对于 Directory nonexistent 错误，可以通过创建软链接来解决： cd /workspaces ln -sf lmbench/results results 然后运行： cd /workspaces/lmbench make rerun 这将会把缺失的目录链接到正确的位置，从而不优雅地解决路径问题。 编译完成后，你会在 results 文件夹下看到一个以标识符（如 b36cd28369b4.1）命名的文件。但实际上，它的正确路径应该在一个同名的文件夹下。由于之前的路径错误，这个文件没有存放在正确的文件夹中，导致 getlist 脚本期望的结果文件路径不正确。 解决方法(选择一种，不可同时使用)： 创建一个同名的文件夹，将文件放入该文件夹中。 在 results 文件夹下创建一个名为 LIST 的文件，在其中输入该标识符（如 b36cd28369b4.1）： echo "b36cd28369b4.1" > /path/to/results/LIST 然后，重新运行 make see 命令： make see 此时，你应该能够看到正确的 summary.out 文件，文件内容会更加易读。 关于 percent.out 内容缺失的情况 percent.out 文件是统计百分比的。里面没有正确的内容，是因为 lmbench 的版本存在不兼容的问题。这个问题可以忽略，因为你只需要查看 summary.out 文件的内容即可。 总结 以上方法没有根本性的解决路径问题，但是也已经让这个评测可用了，所以我也懒得继续折腾 ::aru:proud:: 。默认情况下运行还是比较慢的，得等一会。 后记 以上记录的坑与解决方案，都是我在mac环境下完成OS课程Homework3时个人踩到的。它们带有很强的主观性，仅供遇到类似问题的同学参考，也希望能给你节省一些排查环境的时间。 这些小问题虽然看起来不算严重，但实际操作中却常常耗费一些时间。写下来既是给自己做个备忘，也希望能给后来者一点帮助。如有疏漏，欢迎讨论指正。 之后如果有时间，我也会继续更新一些零散的笔记或日常心得。
MemOS: An Operating System forMemory-Augmented Generation (MAG) in LargeLanguage Models (Short Version) Part1 核心内容 LLMs的记忆受限于参数化的、短期的内存，知识演化和迭代能力受到了制约。本文引入了MemOS——一个专为LLMs设计的内存操作系统，首次将内存提升为一级操作资源。 就是把原来模糊不清、散乱的大模型“记忆”用了一个系统来明确地管理。 Part2 深入探究 2.1 方法论 对于记忆系统的探索 step1 一般的分类：隐式记忆和显式记忆、短期和长期 隐式记忆：模型权重、推理过程中的缓存 显式记忆：上下文（短期）、类似RAG的外部检索（长期） step2 类人记忆模式 step3 系统化记忆管理 ———得到了我们的牛b系统，记忆大一统。 Q：但是这样本质上不是还是原来的这些记忆方式和记忆编辑手段吗？有什么新意吗？发现其实没有。 MemOS将内存分为三种核心类型：参数化内存（Parametric Memory）【包括可插拔的LoRA模块】、激活内存（Activation Memory）【可持久化？？？】和明文内存（Plaintext Memory） 2.2 模型架构 引入MemCube作为封装单元。（可以类比消息） 结构分为Header、Payload，以及一些其他的有关访问控制的属性。（行为指标） 框架分为Interface Layer（输入）、Operation Layer（执行）、Infrastructure Layer（基本架构） ‍ AGENT KB: Leveraging Cross-Domain Experience for Agentic Problem Solving Part1 核心内容 给出一种新框架AGENT KB，让agent可以学习、提炼以往经验（更高层面，而不只是局限于某一特定的任务），实现经验知识在智能体之间的传递。 Part2 深入探究 2.1 方法论 构建共享的知识库，捕捉高层次的解决问题策略及详细的执行教训，从而实现知识在不同框架内智能体之间的传递。 Reason-Retrieve-Refine（推理、检索、精炼）流水线，teacher-student检索机制。学生首先检索工作流程级别的模式来构建其方法，而教师随后识别特定的执行模式来优化实现细节（实现监督）。这两个智能体都是为最后执行智能体服务的。 先通过任务池提取经验，构成经验库。然后在推理中进行检索和应用。 ‍ 当前agent系统的三大缺陷： 1.agent对于不同类型任务的经验是孤立的，没有很好的泛化性。（没有办法迁移） 2.agent检索问题时没有一个序列化的推理优化。 3.agent的经验形式太垂直？（从经验保存的角度来看，比如对于某一专业领域的经验，没有经过抽象，太难迁移） 2.2 模型架构 对于这两种智能体，实际上都有RRR的流程。 学生智能体的核心功能是生成符合任务需求的初始规划，流程包括： 问题解析 提取任务的问题模式（$\hat{\pi}$）和目标（$\hat{\gamma}$），生成初步解决思路（$\tau$）； 经验检索 从 AGENT KB 中检索与任务匹配的工作流级经验（$\mathcal{E}_w$），公式为： $\mathcal{E}_{w} = \underset{\mathcal{E}_{i} \in \mathcal{K}}{top-k}\left[\alpha \cdot \phi_{r}\left(\mathcal{E}_{i}, \mathcal{T}, \hat{\pi}, \hat{\gamma}\right)\right]$其中$\phi_r$衡量经验与任务的相关性，$\alpha$为权重； 方案优化 检索到的经验与初始思路整合，生成结构化执行计划（$\Pi$）并执行，输出执行轨迹（S）。 学生智能体的重点是确保任务解决的整体框架合理，例如工具选择、步骤顺序等策略层面的正确性。 教师智能体的核心功能是优化学生的执行细节，流程包括： 轨迹分析 总结学生的执行轨迹（$Z = \text{SUMMARIZE TRAJECTORY}(S)$），识别错误类型及原因； 精准检索 从 AGENT KB 中检索与错误步骤匹配的步骤级经验（$\mathcal{E}_s$），公式为： $\mathcal{E}_{s} = \underset{\mathcal{E}_{j} \in \mathcal{K}}{top-m} \sum_{s_{i} \in \mathcal{Z}}\left[\alpha \cdot \phi_{r}\left(s_{i}, \mathcal{S}_{j}\right)\right]$其中$\phi_r$衡量步骤与经验的相似度； 指导生成 将检索到的经验适配到当前场景，生成具体修正建议（$\Gamma$），指导学生优化执行。 教师智能体的重点是修正执行中的细粒度问题，例如参数配置、错误处理、工具使用细节等，提升任务解决的精度。 2.3 实验设计 测试在GAIA（通用助手）与SWE-bench（软件工程）两个基准测试上展开。对于这两个测试，分别使用SmolAgents和Openhands框架。 AGENT KB构建的知识库来源： 对于通用助手任务，BrowseComp[43]（1,266个任务），HopRAG[44]（2,556个任务），HLE[45]的一个文本子集（3,000个任务）和WebWalkerQA[46]（680个任务）。 经验库构造格式实例 { "question": "有一个获得多项格莱美奖的知名人物……", "true_answer": "St. John’s Health Center（圣约翰健康中心）", "agent_planning": "1. 解析问题，提取所有关键约束条件：获得多项格莱美奖，第一张专辑发行于1969年之前，有药物依赖问题，20岁前被学校开除，第一位人生伴侣于1997年去世，曾作为军装人员服役，确定死亡地点/医院。\n2. 概念性规划：\n- 确定所有符合以上条件的艺人候选人。\n- 对每位候选人：\n a) 验证首张专辑发行时间（1969年之前）\n b) 检查格莱美获奖历史\n c) 检索传记资料，确认药物依赖与教育背景\n d) 确认伴侣去世年份和军装服役信息\n e) 锁定匹配人物的死亡日期和具体地点/医院。", "search_agent_planning": "1. 从代码代理处获得精确的人物身份，或利用传记线索进行三角定位。\n2. 制定搜索查询，确认人物身份及其具体去世医院。\n3. 优先查找官方传记、权威新闻媒体、格莱美官方记录。\n4. 交叉核查关键信息点，确保人物匹配。\n5. 从讣告中提取死亡地点和医院信息。", "agent_experience": [ "将复杂多条件问题拆分为小型约束检查", "明确记录并多渠道验证传记约束条件", "优先选用高可靠性传记和奖项数据来源", "在早期将具体子查询委托给搜索代理", "通过依次回链所有事实，最终验证答案" ], "search_agent_experience": [ "将复杂查询分解为连续的搜索细化步骤", "为模糊身份设计高度具体的检索关键词", "优先使用权威信息源而非娱乐/八卦内容", "从多方独立来源交叉验证信息", "直接引用和明确来源，规范化结果格式" ] } 对于软件工程知识，RepoClassBench[47]，SWE-Gym-Raw[48]和RepoEval[49]，总共包含约3,000个结构化问题解决轨迹。 评估的LLMs包括GPT-4o(2024-11-20)、GPT-4.1(gpt-4.1-2025-04-14)、Claude-3.7(sonnet-20250219)、o3-mini(o3-mini-2025-01-31)、Qwen-3 32B和DeepSeek-R1。在所有实验中，top_k设置为0.1，温度设置为1.0。 ​+AGENT KB​：学生代理尝试一次，教师代理提供反馈 ​+AGENT KB ✓​：Pass@2，两次尝试选最佳 ​+AGENT KB ✓♡​：Pass@3，三次尝试选最佳（对标SOTA） ‍ 2.4 结果分析 ​ 为什么Level3没有动？ ​ 消融实验： 可以看出这个框架效果还是很好的 SkillWeaver: Web Agents can Self-Improve by Discovering and Honing Skills Part1 核心内容 提出了一个三阶段的网页Agent自我改进框架SkillWeaver，通过自动合成API使Agent能够自主发现和改进其技能。三个阶段：技能提议、技能合成和技能精进。这些阶段利用LLMs的反馈能力迭代地完善探测的网站环境的技能。 Part2 深入探究 2.1 方法论 让网页Agent自己给自己生成API，充实“技能库”，从而达成Agent的自我升级与迭代。 2.2 模型架构 阶段 名称 功能描述 Stage I Skill Proposal（技能提议） LLM根据网页结构和已有技能，提出新的可学习任务（如“搜索药品”、“筛选商品”）。 Stage II Skill Synthesis（技能合成） Agent尝试执行任务，成功后将其封装为python的API，并附带文档和使用日志。 Stage III Skill Honing（技能精进） 自动生成测试用例，反复验证API，失败则调试修正。 可以理解为每个技能是一个轻量的Python函数，封装了一些网页的交互流程。 这些技能（API）可被即插即用，无需重新训练模型。 2.3 结果分析 docker测试网站（WebArena）： ​ 真实网站： ​ 文中这句话如果成立，则应当是说，原WebArena采用的也是GPT-4o，而使用了SkillWeaver的GPT-4o-mini超越了此基线。 感觉好像不太对？ 下面这段话的数据也不知从何而来。这篇论文中的数据似乎不太完善，不过思想是比较经典的，有点类似我的大作业。 API的执行可行性还是不错的 ‍ Mobile-Agent-E: Self-Evolving Mobile Assistant for Complex Tasks Part1 核心内容 与上一篇相比，这一篇主要是在移动领域应用的Agent自进化。对类似手机AI助手之类的应用开发应当有启发价值。 实际上回答了以下几个问题： 如何使智能助手具备自我学习和改进的能力？ 如何设计一个能够处理复杂任务的移动Agent？ 如何评估移动Agent在真实场景中的性能？ Part2 深入探究 2.1 方法论 提出了Mobile-Agent-E。它是一个分层多Agent框架，可以实现自我进化。它将高层计划与低层行动执行明确分开，并导入了自我进化模块，可从过去经验中学习可重用的部分。 2.2 模型架构 多层架构 具体来说，Mobile-Agent-E由一个“上级”管理者和四个“下级”助手组成。（所谓的高层计划、低层行动） 管理者 一个基于大型多模态模型的推理Agent，用于为用户的请求创建包含分解子目标的高层计划。管理者还会参考长期记忆中的可用捷径（Shortcuts）来指导规划。此外，当模型观察到连续的动作失败时，会触发错误上报（Error Escalation），通知管理者检查最近的错误并决定高层次的调整以解决问题。在其他情况下，当错误首次发生时，操作员（Operator）会先尝试解决问题，只有在无法解决时才将问题升级给管理者。 感知者 一个基于纯视觉的感知模块。用于检测当前截图中细粒度的文本和图标信息。Perceptor包含三个子模块：OCR模型、图标识别（icon recognition）模型和图标描述（icon captioning）生成模型。 （纯视觉情况下，感觉上限太低了。） 操作员 一个基于LMM的推理代理，用于根据管理者提供的高层计划决定下一步即时动作（例如 点击 Tap(x, y)）。操作员还会参考长期记忆中的提示（Tips）来指导决策。动作空间不仅包含原子操作（Atomic Operations），还包括捷径（Shortcuts）。关于Tips和Shortcuts会在后文详细阐述。 动作反思者 是基于LMM的推理代理，用于通过比较动作前后的截图验证前一个动作是否达到预期结果。如果动作成功，动作反思者会记录当前的任务进展；如果动作失败，则提供额外的错误反馈。 记录员 是基于LMM的推理代理，用于在任务导航过程中记录并汇总重要信息。例如，商品价格或餐馆的电话号码。 自进化模块 另外一个很重要的创新点是自进化模块。 核心组成如下： Long-term Memory。存储两种关键知识 ——Tips​（通用指导）和Shortcuts​（捷径），且知识会随任务执行不断更新。 Experience Reflectors。包含两个专用 Agent，分别负责更新Tips​（$A_ET$​）和Shortcuts​（$A_ES$​），基于过往任务的交互历史生成新的或优化已有知识。 Tips更新： $L_T = \mathcal{A}_{ET} \left( I, W_P^\tau, W_G^\tau, W_A, W_E, T_F, L_T \right)$ 含义：A_ET​根据当前任务的查询（$I$）、最终计划（$W_P^τ$）、进度（$W_G^τ$）、行动历史（$W_{A}$）、错误历史（$W_E$）、未来任务（$T_F$）和现有 Tips（$L_T$），输出更新后的 Tips 集合（$L_T$）。 Shortcuts更新： $L_{S}= \mathcal{A}_{ES}\left( I, W_{P}^{\tau}, W_{G}^{\tau}, W_{A}, W_{E}, T_{F} , L_{S}\right)$ 含义：A_ES​基于与A_ET​相同的输入（替换为现有 Shortcuts $L_S$），输出更新后的 Shortcuts 集合（$L_S$）。 2.3 实验设计 构建了新的benchmark：Mobile-Eval-E 相较于原来的Benchmark，在难度上有了很大提升。 主要实验结果 可见分层Agent架构和进化模块的效果都很好 此外还进行了跨模型验证、效率分析、消融研究等，暂且不表。关于实验部分，AGENT-KB那篇文章是很好的，可以参考那一篇文章的叙述。感觉这几篇文章在这方面都差别不大。 实验上还有几个结论： 1.进化存在渐进性。任务越靠后，性能提升越明显。 2.Shortcuts的稳定性有待提高，可能存在误用或是错误。 Optimizing Model Selection for Compound AI Systems Part1 核心内容 这篇的想法其实与我之前做的那个项目也很像。对于不同的模块，其实可以分配不同的LLM，节省资源，优化响应速度，提高性能。 本文提出了LLMSELECTOR框架，能够在有限的API调用预算下，迭代选择和分配性能最佳的模型，实现高效的模型选择。 但是本文是基于性能优先选择的，且是静态而非动态的！ Part2 深入探究 2.1 方法论 本文框架基于两个关键的假设： 一是系统的端到端性能通常在各模块性能持平的情况下是单调的； （什么意思？——系统是简单的。如果某模块性能提升，总性能也会提升；系统是稳定的。模块性能持平的前提下，系统性能的变化是可预测的。） 二是模块性能可以通过LLM准确估计。 （为什么要估计？——让框架知道哪个模型在特定模块上表现最好，从而做出最佳选择。） 基于此，本文的框架通过迭代方式为每个模块分配表现最佳的模型，直至无法获得更多性能提升。 2.2 模型架构 本文假设复合的静态AI系统为一个有向无环图，每一个节点都表示一个（LLM）模块。如下图为两个简单的静态AI系统示例。 ​ 如下表规定了一些系统建模的定义，值得关注的是与P相关的。 $P(f)$即为给定模型下，分配f后，端到端的性能。我们就是要让$P(f)$尽可能高。 显然，不可能穷尽搜索所有可能的模型分配，因为其搜索空间会随着模块数量的增加呈指数级增长，这是一个NP问题。 ​ 在具体的优化实现层面，如下图。 模型输入：一个复合AI系统，一组待分配的LLM，一些训练数据集，一个预算上限。 优化选择：框架迭代选择一个模块，并将其分配给通过LLM估计的模块性能最高的模型。（Repeat，直到达到性能或预算上限） 返回结果：框架返回一个优化的模型分配。 ​ ​ 解析这个算法（懒得敲了，贴一下AI的结果）： 行号 原文 解析 1 Choose a random f0 ∈ F 随机初始化一个模型分配方案 f0，即给每个样本 z 随机指派一个模型 k ∈ M。 2 i ← 1, c ← 0, done ← False, f ← f0, ∀z ∈ DTr 初始化迭代计数器 i、已消耗预算 c、终止标志 done、当前方案 f。 3 while c ≤ B − M and done = False do 只要预算未耗尽且未达到停止条件，就继续循环。 4 j ← i mod L + 1 通过模运算，轮流选择第 j 个模块（1…L 循环）。 5 $k_z ← max_{k∈M} Πi(f_{z,j→k}, z)$​ 对于训练集中的每个样本 z，把第 j 个模块的模型换成 k，评估新方案$f_{z,j→k}$对 z 的效果，选出使$Πi$ 最大的 k。 6 fz ← fz,j→k 真正地把样本 z 在第 j 个模块上的模型更新为刚选出的最优 k。 7 f_i ← mode({fz : z ∈ DTr}) 对所有样本在第 j 个模块上的最新模型做“众数/多数表决”，得到第 j 个模块的统一模型选择（减少碎片化）。 8 c ← c + M 更新已消耗预算。 9-11 if i > L and Π_{i−L}(f) = Πi(f) then done ← True 如果连续 L 次迭代性能都没有提升，则提前终止。 13 return f 返回最终优化后的模型分配方案 f。 所以就可以这么理解： 每个模块会遍历训练集：算法通过 “模块提名”（步骤 4：j \= i mod L + 1）轮流选中每个模块进行优化，每次选中模块 j 后，会遍历训练集内的所有任务 z（步骤 5-6），为每个 z 确定能最大化模块 j 性能的模型，进而更新该 z 的分配方案（仅调整模块 j 的 LLM，其他模块保持不变）。 更新标准是模块性能最高：对于当前选中的模块 j，针对每个任务 z，从候选 LLM 中选择能使模块 j 性能（pj）达到最高的模型 kz（步骤 5：kz \= maxk∈M pj (fz,j→k, z)），并将该模型分配给模块 j，完成对 z 的分配更新。 作为对比，普通的贪心算法是说： 迭代地选择一个模块，并为其分配能使系统端到端性能达到最高的模型。 具体来说，这种贪心算法每次只关注整体系统的最终表现，当为某个模块更换模型时，只有在这种更换能直接提升整个系统的端到端性能时，才会采纳该模型；如果更换模型后，端到端性能没有提升，即使该模型在模块级性能上更优，也不会被选择。 文中给出了一个例子。在TableArithmetic数据集上，当贪心算法遇到将GPT-4o mini分配给两个模块这一 “局部最优” 方案时，由于单独更换任何一个模块的模型都无法提升端到端性能，它就会停滞在该方案，无法继续搜索到更优的全局分配。 这里就呼应了一开始的两个假设，它们保证了这种“模块最优即全局最优”的想法是正确的。 一是系统的端到端性能通常在各模块性能持平的情况下是单调的； 二是模块性能可以通过LLM准确估计。 当然，实际系统自然不太可能一直满足这些假设（尤其是第一条）。不过本文也给出了说明，推导出的算法仍然适用实际情况，并表现出较好的性能。 有关“性能”的衡量，文中设置了一个LLM诊断器，用这个LLM去给分配的结果打分。这里诊断器的有效性是依托假设二成立的。这里需要得到说明和补充，可能存在创新点？ 但是这个论文的意义可能在于，依托这个假设构造的框架，在实际的实验上表现良好。有点黑箱的意思。 2.3 实验设计 实验的主要内容有以下三·点： 验证为复合AI系统的不同模块分配不同LLM能否显著提升性能； 验证使用基于模块最优的分配方法能否显著提升性能； 量化框架带来的性能增益。 复合AI系统 主要是上面提到的3类典型复合系统。（还有一类是简单的分析-解答，两个节点） 数据集 |6 个数据集|||| |数据集|任务类型|规模|评估指标| | -----------------------------------------| ------------------------------------| ----------------------| ------------------------------| |TableArithmetic|表格任务提取与算术解答|100 个样本|精确匹配（是否正确）| |TableBias|表格任务提取与逻辑推理|100 个样本|精确匹配| |LiveCodeBench|代码输出预测|479 个样本|精确匹配（代码输出）| |CommonGenHard|约束概念生成连贯文本|200 个样本|概念覆盖率（是否含所有概念）| |SimpleQA|事实性问答|4326 个样本|精确匹配（答案正确性）| |FEVER|事实验证（支持 / 反驳 / 信息不足）|2384 个样本|精确匹配（分类正确性）| LLM 使用10个主流LLM，包括闭源模型（如 GPT-4o、Claude 3.5 Sonnet、Gemini 1.5 Pro）和开源模型（如 Llama 3.1 405B、Qwen 2.5 72B）。 对比方法 1.对比单一模型，为所有模块分配同一 LLM（如 GPT-4o、Claude 3.5 Sonnet 等）； 2.对比其他优化方法，如DSPy（专注于提示词优化，使用 MIPROv2 优化器）； 3.对比其他分配LLM方法，如随机尝试模型分配、贪心搜索（迭代选择提升总体端到端性能的模型）。 2.4 实验结果 性能显著优！且在表格类任务（TableArithmetic、TableBias）中增益最显著，因这类任务的模块分工明确，不同LLM的优势差异大。 这个实验结果还是很令人振奋的，而且显示了垂直类模型、轻量级模型的潜力。参数量大的模型也并不是包打天下的。 ‍ MAS-GPT: Training LLMs to Build LLM-based Multi-Agent Systems Part1 核心内容 对于多智能体系统的构建，本文探讨了如何以最低成本自适应地构建针对查询的MAS。具体而言，就是训练了一个MAS-GPT模型，可以根据需求来构建相对应的多智能体系统。 MAS的构建重新表述为生成性语言任务，该任务的输入为用户查询，输出为相应的MAS。 Part2 深入探究 2.1 方法论和模型的架构 采用Python代码片段来统一表示MAS，把每个智能体的提示视为变量、LLM调用视为函数、智能体间关系通过字符串连接表示。 在数据集构建过程中，采用包含构建、评估、选择和优化的步骤来形成高质量的查询-MAS对，以提高模型学习通用模式和逻辑相关性的能力。经过监督微调训练后，构建的MAS-GPT模型具备生成与具体查询对应的MAS的能力。 构建查询池+构建多智能体系统池+配对+评估 在配对中有两个special的处理方式。 第一，因为类似的或是相同的查询可能对应不同的MAS，这对模型训练不利。所以在选择的时候，对查询进行聚类，对每类查询，选择一个最佳的MAS。这样可以提高查询-MAS对的一致性，有助于模型学习识别可泛化的模式，并在相似查询之间进行泛化。 第二，在查询-MAS对里，可能存在内部“不一致”的情况。也就是查询内容和MAS之间的关联性不强，这样模型可能会混淆。所以作者通过两个策略来改进查询-MAS的对齐。第一是让LLM根据查询和先前选择的MAS调整MAS中AGENT的定义（与查询强相关）。第二是让LLM生成一个推理陈述（也就是解释一下），解释查询和优化后的MAS之间的关系，从而提高查询-MAS对的可解释性。这也是为了提高泛化能力。 2.2 实验设计与结果分析 训练样本（查询 - MAS对）约11k，来自多个开源数据集，涵盖数学（MATH、GSM8K）、编码（MBPP）、通用问答（MMLU、SciQ）等领域，确保查询可验证（有标准答案或测试用例）。 9个多领域基准测试，包括： 数学：MATH、GSM8K、GSM-Hard； 编码：HumanEval、HumanEval+； 通用 QA：MMLU、GPQA、SciBench； 高难度数学：AIME2024。 其中部分基准（如 GPQA、SciBench）为 “域外（out-of-domain）” 测试，验证泛化能力。 5个主流 LLM，包括开源模型（Llama-3-70B-Instruct、Qwen2.5-72B-Instruct）和闭源模型（GPT-4o-mini、o1-preview、DeepSeek-R1），验证MAS-GPT与不同LLM的兼容性。 基线方法：10+种多智能体或单智能体方法，包括： 单智能体：Single（直接用 LLM 回答）、Chain-of-Thought（思维链）； 多智能体：Self-Consistency（自一致性）、LLM-Debate（辩论）、Self-Refine（自优化）、AgentVerse、GPTSwarm、DyLAN等。 ​ 可见，这种方法在有效性、泛化能力上都有提升。 消融实验： 可见，数据构建中三个核心步骤都有正向作用。两个一致性模块均对性能有提升。 这个是训练了三次的结论吗？ AUTOMATED DESIGN OF AGENTIC SYSTEMS Part1 核心内容 这篇也是讲自动化生成Agent系统，和前面的MAS-GPT有点相似。提出了基于“Meta Agent Search”的ADAS框架。定义了三大组件：搜索空间（可被发现的智能体系统范围）、搜索算法（探索搜索空间的方法）和评价函数（衡量智能体性能的指标）。核心是让元智能体（meta agent）基于历史的代码存档迭代编程新智能体。（这里智能体也是以代码的形式） Part2 深入探究 2.1 方法论和模型的架构 三大组件：搜索空间（可被发现的智能体系统范围）、搜索算法（探索搜索空间的方法）和评价函数（衡量智能体性能的指标） ADAS的算法： （1）初始化存档（也就是基础的代码）。包含手动设计的基础智能体（如思维链、自我反思）。 （2）设计新智能体。元智能体基于存档生成新智能体的代码，通过两轮自我反思确保新颖性和正确性。 （3）评估与精炼 。 在目标领域验证新智能体，若出错则最多精炼5次。 （4）更新存档，将通过评估的智能体及其性能指标加入存档，用于后续迭代。​​ 2.2 实验设计与结果分析 测试： （1）ARC挑战 （2）四个流行的基准测试 ‍ （1）ARC挑战 ​ Meta Agent Search逐步发现性能优于baseline的智能体，最终在测试集上的准确率显著高，同时出现了一些设计很好的复杂智能体。 （2）四个流行的基准测试以及泛化 下图测试算法在阅读理解、数学、多任务和科学问题解决中的表现，涉及4个基准数据集。可见性能都有提高。 下图实验中存在跨领域迁移。将 MGSM（数学）领域发现的Top 3智能体迁移至其他数学任务（GSM8K、GSM-Hard）和非数学任务（MMLU、DROP）。可见迁移后，即使是在非数学任务中，仍然有不错的表现。 下图实验中存在跨模型迁移。将ARC任务中基于GPT-3.5发现的Top 3智能体迁移至Claude-Haiku、GPT-4、Claude-Sonnet模型。可见迁移后大部分情况下性能都更优。这两个实验一起说明了方法的泛化能力。
数学建模与模拟人口问题作业 问题 研究差分方程 $x_{k+1}=bx_{k}(1-x_{k})$ 的的收敛、分岔及混沌现象。 要求： 1.程序源代码 2.列表记录对应 b 的不同取值的收敛点。 3.作出收敛点关于 b 的取值图。 解答 1.程序源码 import numpy as np import matplotlib.pyplot as plt import pandas as pd # 设置matplotlib中文显示 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False def converge_point(x0, b, n=1000, m=100): '''计算迭代 参数： x0: 初值x0 b: 参数b n: 迭代次数 m: 舍去前m个迭代值 ''' x = x0 res = [] for i in range(n): x = b * x * (1 - x) #迭代公式 if i >= m: res.append(x) return res # 主程序 if __name__ == '__main__': # 参数设置 x0 = 0.5 b_min, b_max = 2.5, 3.5 delta_b = 0.01 b_list = np.arange(b_min, b_max + delta_b, delta_b) # 存储数据 b_plot = [] # 绘图用b值 x_plot = [] # 绘图用x值 all_data = [] # 存储所有数据 max_len = 0 # 最大收敛点个数 # 计算每个b值对应的收敛点 for b in b_list: x_values = converge_point(x0, b) conv_points = sorted(set(x_values)) # 存储绘图数据 for x in conv_points: b_plot.append(b) x_plot.append(x) # 存储表格数据 all_data.append({ 'b': f'{b:.2f}', 'points': conv_points }) max_len = max(max_len, len(conv_points)) # 绘制分岔图 plt.figure(figsize=(10, 6)) plt.scatter(b_plot, x_plot, s=0.5, c='black') plt.xlabel('参数 b') plt.ylabel('收敛值 x') plt.title('收敛点关于b的取值图') plt.grid(True) plt.savefig('img1.png', dpi=300, bbox_inches='tight') plt.close() # 生成完整数据表格 b_cols = [f'{b:.2f}' for b in b_list] data_rows = [['k'] + b_cols] # 表头 for k in range(max_len): row = [k] for i, b in enumerate(b_list): points = all_data[i]['points'] val = points[k] if k < len(points) else '' row.append(f'{val:.2f}' if val != '' else '') data_rows.append(row) pd.DataFrame(data_rows).to_csv('converge_points.csv', index=False, header=False, encoding='utf-8-sig') # 生成示例数据表格 test_b = [2.5, 2.7, 2.9, 3.1, 3.3, 3.5] # 选择6个b，不然太多了 test_data = [] # 计算示例数据 for b in test_b: points = sorted(set(converge_point(x0, b)))[:10] # 取前10个收敛点 test_data.append({ 'b': f'{b:.1f}', 'points': points }) # 生成示例表格 test_rows = [] test_rows.append(['k'] + [f'b={b:.1f}' for b in test_b]) for k in range(10): # 只取前10行 row = [k] for i, b in enumerate(test_b): points = test_data[i]['points'] val = points[k] if k < len(points) else '' row.append(f'{val:.4f}' if val != '' else '') test_rows.append(row) # 绘制示例表格 plt.figure(figsize=(12, 6)) plt.axis('off') tab = plt.table(cellText=test_rows, cellLoc='center', loc='center', colWidths=[0.1] + [0.15]*len(test_b)) tab.auto_set_font_size(False) tab.set_fontsize(10) tab.scale(1.2, 1.5) plt.savefig('img2.png', dpi=300, bbox_inches='tight') plt.close() 列表记录 作出图像
优化方法基础知识：向量范数、矩阵范数、方向导数、梯度和海森矩阵
优化方法基础知识：向量范数、矩阵范数、方向导数、梯度和海森矩阵 常见向量范数和矩阵范数 向量范数 1-范数：$||x||_1 = |x_1|+|x_2|+......+|x_n|$ 2-范数：$||x||_2 = \sqrt{|x_1|+|x_2|+......+|x_n|}$ 无穷-范数：$||x||_{\infty}=\max\limits_{1\leq{i}\leq{n}}\left\vert{x_i}\right\vert$ p-范数：$\|x\|_p=\left(\sum_{i=1}^n\lvert x_i\rvert^p\right)^{\frac{1}{p}}$ （1、2范数的一般形式） 矩阵范数 常见的矩阵范数：向量范数与矩阵范数具有相容性（见矩阵论） 由向量范数$\|\cdot\|_p$导出关于矩阵 $A_n\in R_n\times n$的$p$范数 $$ \|A\|_p=\max_{x\neq0}\frac{\|Ax\|_p}{\|x\|_p}=\max_{\|x\|_p=1}\|Ax\|_p $$ 其他还有： $$ \begin{aligned} & \|A\|_1=\max_{1\leq j\leq n}\sum_{i=1}^{n}|a_{ij}| & & \text{(1-范数,列和范数)} & & \\ & \|A\|_{\infty}=\max_{1\leq i\leq n}\sum_{j=1}^{n}|a_{ij}| & & \text{(∞-范数,行和范数)} & & \\ & \|A\|_2=\sqrt{\rho(A^{T}A)} & & \text{(2-范数,谱范数)} & & \rho(A)=\max_{1\leq i\leq n}|\lambda_{i}|\end{aligned} $$ 方向导数、梯度和Hessian矩阵 1.方向导数 对于二元函数 $f(x,y)$来说，其方向导数为 $$ f_{\vec{l}}(x_0,y_0)=f_x(x_0,y_0)\cos\alpha+f_y(x_0,y_0)\cos\beta $$ 其中$\alpha,\beta$是$R^2$中向量$\vec{l}$的方向角. 简单的理解，就是沿着 $\vec{l}$ 方向的变化率。 2.梯度 也就是每个向量分别求偏导，组成的向量。 若$f(x,y,z)$在点$P_0(x_0,y_0,z_0)$存在对所有自变量的偏导数，则称向量$\left(f_x(P_0),f_y(P_0),f_z(P_0)\right)$为函数$f$在 点 $P_0$的梯度，记作 $$ grad\:f(P_{0})=\left(f_{x}(P_{0}),f_{y}(P_{0}),f_{z}(P_{0})\right). $$ $gradf(P_{0})$的模为:${|grad\:f(P_0)|}={\sqrt{f_{x}(P_0)^2+f_{y}(P_0)^2+f_{z}(P_0)^2}}$ 当函数在P0可微时，f在P0的 梯度方向 是f的值增长最快的方向，沿这一方向的 变化率 就是梯度的模！（也就是方向向量和梯度向量的夹角为0）当与梯度向量方向相反，方向导数有最小值。 $$ f_i(P_0)=gradf(P_0)\cdot\vec{l_0}=|gradf(P_0)|\cos\theta $$ 上式给出了方向导数的另外一种表示方法。就是该点梯度的模乘梯度向量grad $f(P_0)$和方向向量$\vec{l}_0$的夹角，也就是这里的$\theta$ 3.海森矩阵（Hessian Matrix） 海森矩阵主要用于研究函数的曲率特性及其极值点的性质。 1. 定义 对于一个实值函数 $f: \mathbb{R}^n \to \mathbb{R}$，其海森矩阵是所有二阶偏导数的矩阵，定义为： 注：这里实际上就是按矩阵的元素标号求导。 $H(f) = \begin{bmatrix}\frac{\partial^2 f}{\partial x_1^2} & \frac{\partial^2 f}{\partial x_1 \partial x_2} & \dots & \frac{\partial^2 f}{\partial x_1 \partial x_n} \\\frac{\partial^2 f}{\partial x_2 \partial x_1} & \frac{\partial^2 f}{\partial x_2^2} & \dots & \frac{\partial^2 f}{\partial x_2 \partial x_n} \\\vdots & \vdots & \ddots & \vdots \\\frac{\partial^2 f}{\partial x_n \partial x_1} & \frac{\partial^2 f}{\partial x_n \partial x_2} & \dots & \frac{\partial^2 f}{\partial x_n^2}\end{bmatrix}.$ 性质 海森矩阵是对称矩阵（连续时） （如果 $f$ 的二阶偏导数连续，即满足 Schwarz 条件）$\frac{\partial^2 f}{\partial x_i \partial x_j} = \frac{\partial^2 f}{\partial x_j \partial x_i}.$ $H(f)$ 是 $f$ 的二阶导数的集合，用来描述函数的局部曲率。 2. 几何意义 海森矩阵描述了函数 $f$ 在某一点的曲率特性： 正定矩阵（Positive Definite）： 函数在该点是局部极小值，函数值朝所有方向上升。 负定矩阵（Negative Definite）： 函数在该点是局部极大值，函数值朝所有方向下降。 半正定或半负定矩阵： 函数可能存在[鞍点]()。 不定矩阵（Indefinite）： 函数在该点是鞍点。 几何解释可以通过二次近似来理解： 在点 $x_0$ 附近，将 $f(x)$ 用二次泰勒展开近似： $f(x) \approx f(x_0) + \nabla f(x_0)^\top (x - x_0) + \frac{1}{2}(x - x_0)^\top H(f)(x - x_0),$其中，二次项的符号由 $H(f)$ 决定。 3. 海森矩阵的特性 3.1 判断极值点 对于 $f(x)$ 的驻点（即 $\nabla f(x) = 0$），利用海森矩阵判断该点性质： 如果 $H(f)$ 正定，则该点是局部极小值； 如果 $H(f)$ 负定，则该点是局部极大值； 如果 $H(f)$ 不定，则该点是鞍点； 如果 $H(f)$ 半正定或半负定，需要进一步分析。 3.2 在牛顿法中的应用 在优化中，牛顿法利用海森矩阵来加速收敛： 更新公式： $x^{k+1} = x^k - [H(f(x^k))]^{-1} \nabla f(x^k),$其中 $H(f(x^k))$ 是函数 $f(x)$ 在 $x^k$ 处的海森矩阵。 牛顿法通过二次近似快速找到局部极值点，但需要 $H(f)$ 可逆且正定。 4. 具体例子 示例 1：二维函数的海森矩阵 设 $f(x, y) = x^2 + xy + y^2$，计算其海森矩阵。 一阶偏导数： $\frac{\partial f}{\partial x} = 2x + y, \quad \frac{\partial f}{\partial y} = 2y + x.$ 二阶偏导数： $\frac{\partial^2 f}{\partial x^2} = 2, \quad \frac{\partial^2 f}{\partial y^2} = 2, \quad \frac{\partial^2 f}{\partial x \partial y} = \frac{\partial^2 f}{\partial y \partial x} = 1.$ 海森矩阵： $H(f) = \begin{bmatrix}2 & 1 \\1 & 2\end{bmatrix}.$ 判断矩阵性质： 特征值为 $3$ 和 $1$，均为正值，因此 $H(f)$ 正定，函数在驻点是局部极小值。 5.特殊求法 利用矩阵的微积分： 将 $f(x)$ 表示为矩阵运算形式。 使用矩阵微积分公式直接计算二阶导数。 示例： 若 $f(x) = \frac{1}{2}x^\top Q x + b^\top x + c$，其中 $Q$ 是对称矩阵： 海森矩阵为： $$ H(f) = Q. $$ 二元函数求极值 Eg#1.函数 $f(x_1, x_2) = 2x_1^3 - 3x_1^2 - 6x_1x_2(x_1 - x_2 - 1)$。 1. 求稳定点（即驻点）： 驻点的条件是对函数的偏导数分别对 $x_1$ 和 $x_2$ 求导，并满足偏导数为 0。 第一步：计算偏导数 对 $x_1$ 求偏导： $$ \frac{\partial f}{\partial x_1} = \frac{\partial}{\partial x_1}\left(2x_1^3 - 3x_1^2 - 6x_1x_2(x_1 - x_2 - 1)\right) $$ 展开并逐项求导： $$ \frac{\partial}{\partial x_1}(2x_1^3) = 6x_1^2 $$ $$ \frac{\partial}{\partial x_1}(-3x_1^2) = -6x_1 $$ $$ \frac{\partial}{\partial x_1}(-6x_1x_2(x_1 - x_2 - 1)) = -6x_2(2x_1 - x_2 - 1) $$ 因此： $\frac{\partial f}{\partial x_1} = 6x_1^2 - 6x_1 - 6x_2(2x_1 - x_2 - 1)$ 对 $x_2$ 求偏导： $\frac{\partial f}{\partial x_2} = \frac{\partial}{\partial x_2}\left(2x_1^3 - 3x_1^2 - 6x_1x_2(x_1 - x_2 - 1)\right)$ 展开并逐项求导： $$ \frac{\partial}{\partial x_2}(2x_1^3) = 0 $$ $$ \frac{\partial}{\partial x_2}(-3x_1^2) = 0 $$ $$ \frac{\partial}{\partial x_2}(-6x_1x_2(x_1 - x_2 - 1)) = -6x_1(-x_1 + 2x_2 + 1) $$ 因此： $\frac{\partial f}{\partial x_2} = 6x_1(x_1 - 2x_2 - 1)$ 第二步：求解驻点 令 $\frac{\partial f}{\partial x_1} = 0$ 和 $\frac{\partial f}{\partial x_2} = 0$： $$ \frac{\partial f}{\partial x_1} = 6x_1^2 - 6x_1 - 6x_2(2x_1 - x_2 - 1) = 0 $$ $$ \frac{\partial f}{\partial x_2} = 6x_1(x_1 - 2x_2 - 1) = 0 $$ 从第 2 个方程： $6x_1(x_1 - 2x_2 - 1) = 0$ 可得两种情况： $$ x_1 = 0 $$ $x_1 - 2x_2 - 1 = 0$，即 $x_1 = 2x_2 + 1$ 过程略。代入可解得： 所有驻点： $(0, 0), \; (0, -1), \; (1, 0), \; (-1, -1)$ 2. 判别稳定点的性质（极值判断）： 使用 二阶导数判别法。记： $f_{x_1x_1} = \frac{\partial^2 f}{\partial x_1^2}(A), \; f_{x_2x_2} = \frac{\partial^2 f}{\partial x_2^2}(B), \; f_{x_1x_2} = \frac{\partial^2 f}{\partial x_1 \partial x_2}(C)$ 二阶偏导数： $$ f_{x_1x_1} = \frac{\partial}{\partial x_1}(6x_1^2 - 6x_1 - 6x_2(2x_1 - x_2 - 1)) = 12x_1 - 6 - 12x_2 $$ $$ f_{x_2x_2} = \frac{\partial}{\partial x_2}(6x_1(x_1 - 2x_2 - 1)) = -12x_1 $$ $$ f_{x_1x_2} = \frac{\partial}{\partial x_2}(-6x_2(2x_1 - x_2 - 1)) = -12x_1 + 6x_2 + 6 $$ 记 Hessian 矩阵： $H = \begin{bmatrix}f_{x_1x_1} & f_{x_1x_2} \\f_{x_1x_2} & f_{x_2x_2}\end{bmatrix}$ 计算每个驻点的 Hessian 确定性质。 也就是我们常说的：$\Delta=AC-B^2$ 判别（上面的行列式和数分课本的符号相反，记这里的。以下给出课本的情况，课本的**$\Delta=AC-B^2$ ，对于极小值的情况$A＆\Delta$同号**） 如果$\Delta > 0$ 且 $A > 0$，极小值点（局部）； 如果$\Delta > 0$ 且 $A < 0$，极大值点（局部）； 如果$\Delta < 0$ ，不是极值点； 如果$\Delta = 0$，不能确定。 求最值和求极值的区别与联系？ 二元函数的最值和极值有重要区别，虽然它们的计算方法有时相关，但最值问题通常需要额外的考虑。以下是详细区分： 1. 极值 定义：极值是指函数在某一点 $(x_1, x_2)$ 的局部范围内的最大值或最小值。具体来说： 局部极大值：在点 $(x_1, x_2)$ 的某个邻域内，$f(x_1, x_2)$ 大于等于邻域中所有其他点的函数值。 局部极小值：在点 $(x_1, x_2)$ 的某个邻域内，$f(x_1, x_2)$ 小于等于邻域中所有其他点的函数值。 求解方法：通过驻点和二阶导数判别法计算。这需要对函数在内部区域的驻点和其 Hessian 矩阵进行分析。 注意：极值只在函数的局部范围内定义，不考虑全局范围的最大或最小值。 2. 最值 定义：最值是指函数在整个定义域内的最大值和最小值。它包括： 全局最大值：函数在整个定义域内取到的最大值。 全局最小值：函数在整个定义域内取到的最小值。 求解方法： 找到函数内部的极值点（用驻点和 Hessian 矩阵判断）。 考虑函数在边界（或定义域边界）上的值： 若定义域是闭区域，函数的最值可能出现在边界上。 在边界上寻找极值通常需要参数化边界方程，转化为单变量问题。 比较所有可能点（包括内部极值点和边界上的值）以确定全局最值。 3. 极值与最值的关系 极值是最值的候选者之一，但极值并不一定是最值。例如： 函数可能有多个极值点，但它们的函数值可能不是定义域内的最大值或最小值。 最值可能出现在边界上，而极值通常只考虑内部驻点。 如果函数的定义域是整个平面（无边界），或者函数单调递增/递减，极值可能就是最值。 4. 是否用极值的方法计算最值？ 不完全是。计算最值时，需要额外考虑函数的边界或特殊点。例如： 如果函数定义域是闭区域，例如矩形或圆形，最值可能出现在边界上。 如果函数定义域是开放区域（例如无约束的 $\mathbb{R}^2$），可以通过分析极值点及其函数值的极限来寻找最值。 因此，极值的计算方法（驻点 + Hessian）只能找到函数的局部极值点，但不能保证直接找到全局最值。 总结 极值是局部性质，通过驻点和 Hessian 矩阵分析得出。 最值是全局性质，需要考虑所有极值点及定义域边界上的值，甚至无穷远处的函数行为。 示例场景： $f(x_1, x_2) = x_1^2 + x_2^2$，在 $\mathbb{R}^2$ 上有唯一全局最小值 $(0, 0)$，无局部极大值。 如果定义域是闭圆 $x_1^2 + x_2^2 \leq 1$，最值出现在边界和内部极小值点上。 [鞍点]()：在数学中，鞍点（Saddle Point） 是一个函数的驻点（即梯度为零的点），但它既不是局部极大值点也不是局部极小值点。鞍点的函数值在某些方向上是极大值，而在其他方向上是极小值，表现出类似马鞍形的特性。 ‍ ‍ 凸集和凸函数 凸集 n维向量空间$V$中，以向量$(\alpha_1,\alpha_2)$为端点的线段定义为 $\left\{r|r=k_1\alpha_1+k_2\alpha_2,k_1+k_2=1,k_1,k_2\geq0\right\}$ 也就是：两个点在一个集合中，两个点连成一条直线，也在集合中，这个集合就叫凸集。 超平面$H=\{x|p^Tx=\alpha\}$是凸集，其中$p\in\mathbb{R}^n$是非零向量，称为超平面的法向量，α 为实数[（凸集分离定理）]() 闭半空间$H^-=\{x|p^Tx\leq\alpha\}$和$H^+=\{x|p^Tx\geq\alpha\}$是凸集；开半空间$H_o^-=\{x|p^Tx<\alpha\}$和$H_o^+=\{x|p^Tx>\alpha\}$是凸集 推论：##凸集的线性组合仍然是凸集##。 凸集的任意有限给点的凸组合仍然是凸集 可行集为凸集的凸规划问题可确保任意局部最优解也是问题的全局最优解 设 x∗ 是凸规划问题的一个局部最优解，则 (1) 局部最优解 x∗ 也是**全局最优解 . (2) 如果目标函数是严格凸的，则 x∗ 是**唯一的全局最优解 ． 严格分离、分离、投影定理在PPT46页，此处暂且略去。 Eg#2.要证明两个凸集的差集 $D_1 - D_2 = \{x - y \mid x \in D_1, y \in D_2\}$ 是凸集 1. 定义复习 凸集差的定义 给定两个集合 $D_1$ 和 $D_2$，它们的差定义为： $D_1 - D_2 = \{z \mid z = x - y, \, x \in D_1, \, y \in D_2\}.$ 2. 要证明的目标 我们需要证明 $D_1 - D_2$ 是凸集。即，任意 $z_1, z_2 \in D_1 - D_2$ 和 $\lambda \in [0, 1]$，满足： $\lambda z_1 + (1 - \lambda) z_2 \in D_1 - D_2.$ 3. 证明步骤 (a) 假设 $z_1, z_2 \in D_1 - D_2$ 根据定义，存在 $x_1, x_2 \in D_1$ 和 $y_1, y_2 \in D_2$，使得： $z_1 = x_1 - y_1, \quad z_2 = x_2 - y_2.$ (b) 构造 $\lambda z_1 + (1 - \lambda) z_2$ 对任意 $\lambda \in [0, 1]$，我们有： $\lambda z_1 + (1 - \lambda) z_2 = \lambda (x_1 - y_1) + (1 - \lambda) (x_2 - y_2).$将右侧展开： $\lambda z_1 + (1 - \lambda) z_2 = (\lambda x_1 + (1 - \lambda) x_2) - (\lambda y_1 + (1 - \lambda) y_2).$ (c) 验证分量属于对应的凸集 由于 $x_1, x_2 \in D_1$，且 $D_1$ 是凸集，根据凸集定义： $\lambda x_1 + (1 - \lambda) x_2 \in D_1.$ 同理，因 $y_1, y_2 \in D_2$，且 $D_2$ 是凸集： $\lambda y_1 + (1 - \lambda) y_2 \in D_2.$ (d) 得出结论 设 $x = \lambda x_1 + (1 - \lambda) x_2 \in D_1$，$y = \lambda y_1 + (1 - \lambda) y_2 \in D_2$，则： $\lambda z_1 + (1 - \lambda) z_2 = x - y.$因此： $\lambda z_1 + (1 - \lambda) z_2 \in D_1 - D_2.$由于 $z_1, z_2$ 和 $\lambda$ 是任意的，这表明 $D_1 - D_2$ 是凸集。 凸组合、凸函数 凸组合：$\sum_{i=1}^{k}\lambda_{i}=1,x=\sum_{i=1}^{k}\lambda_{i}x_{i}\text{ 称为}x_{1},x_{2},\cdots,x_{k}\text{的凸组合}.$ 凸函数：设函数$f(x)$定义在凸集$D\subset R^n$上，若对任意的$x,y\in D$,及任意的$\alpha\in[0,1]$都有 $$ f(\alpha x+(1-\alpha)y)\leq\alpha f(x)+(1-\alpha)f(y) $$ 则称函数$f(x)$为凸集$D$上的凸函数。（下凸，和同济高数相反，典型例子是y=x^2） 几何上，代表这条曲线上方为凸集。任意连接这条曲线的两个点，直线总在曲线上方。 凸函数的判定定理 设$f(x)$定义在凸集$D\subset R^n$上，$x,y\in D$.令$\Phi(t)=f(tx+(1-t)y),t\in[0,1]$,则： $f(x)$是凸集$D$上的凸函数的充要条件是对任意的$x\in D$,一元函数 $\Phi(t)$为[0,1]上的凸函数. $f(x)$是凸集$D$上的严格凸函数的充要条件是对任意$x,y\in D(x\neq y)$,一元函数$\Phi(t)$为[0,1]上的严格凸函数。 严格凸函数也就是所谓的不取等号。 可行域与约束 几个概念： 可行域：满足所有限制条件的所有点组成的集合 可行点：满足所有限制条件的点 有效约束（active constraint） ：边界点（满足某不等式约束）。称该不等式在该点是active constraint。 在一个可行点$\bar{x}$考虑不等式约束 $c_i(x)\geq0$ 如果有 $c_i(\bar{x})=0$,就称不等式约束$c_i(x)\geq0$在点 $\bar{x}$ 是有效约束或起作用约束 (active constraint),并称可行点$\bar{x}$位于约束 $c_i(x)\geq0$ 的边界。 我们用$I(\bar{x})$表示在$\bar{x}$处所有有效的不等式约束的指标集（就是这个点在哪些边界上，这些边界的下标集合，同时不包含等式） $$ I(\bar{x})=\{i|c_i(\bar{x})=0,i\in I\} $$ 无效约束（inactive constraint）：就是$\bar{x}$是不在边界上的可行点，则这个不等式在$\bar{x}$处是无效约束。$\bar{x}$又叫这个约束不等式的内点。 （注意，此处是定义在单个约束不等式上的。下面给出在可行域上的定义） 在任意可行点，所有的等式约束都被认为是有效约束， 在一个可行点，所有有效约束的全体被称为该可行点的有效集，其指标集记为 $$ A_{\overline{x}}=\{i|i=1,2,\cdots,m,m+1,\cdots,p|c_i(\overline{x})=0\} $$ $$ A_{\overline{x}}=E\cup I(\bar{x})\quad $$ 对于一可行点$\bar{x}$ 如果没有一个不等式约束是有效的，就称$\bar{x}$是可行域的内点，不是内点的可行点就是可行域的边界点.显然，在边界点至少有一个不等式约束是有效约束.当存在等式约束时，任何可行点都要满足等式约束，因此不可能是等式约束的内点. ‍ ‍ 凸函数的条件 凸函数的一阶和二阶条件 凸函数在优化和数学分析中具有重要意义。通过函数的导数信息，可以判断其是否为凸函数。以下分别从一阶条件和二阶条件解释凸函数的判定方法： 1. 一阶条件 定义 一个可微函数 $f(x): \mathbb{R}^n \to \mathbb{R}$ 是凸函数，当且仅当它满足以下不等式： $f(y) \geq f(x) + \nabla f(x)^\top (y - x), \quad \forall x, y \in \mathbb{R}^n.$ 几何意义 割线在切线上方 适用范围 一阶条件适用于一次可微的函数。 2. 二阶条件 定义 如果函数 $f(x): \mathbb{R}^n \to \mathbb{R}$ 是二次可微的，则 $f(x)$ 是凸函数，当且仅当它在定义域内的海森矩阵（Hessian Matrix） $H(f(x))$ 是半正定的： $H(f(x)) \succeq 0, \quad \forall x \in \text{定义域}.$ 半正定的矩阵满足：$v^\top H(f(x)) v \geq 0, \quad \forall v \in \mathbb{R}^n.$ 几何意义 海森矩阵的半正定性意味着函数的二阶导数在任何方向上都不小于零，表明曲率非负，即函数的图形在每一点都是“向上的”。 适用范围 二阶条件适用于二次可微的函数。 3. 特殊情况 严格凸函数 一阶条件： 如果 $f(x)$ 是严格凸函数，则不等式改为严格大于： $f(y) > f(x) + \nabla f(x)^\top (y - x), \quad \forall x \neq y.$ 二阶条件： 严格凸函数的海森矩阵 $H(f(x))$ 必须是正定的： $H(f(x)) \succ 0, \quad \forall x \in \text{定义域}.$ 4. 一阶与二阶条件的关系 一阶条件是凸性的必要条件，对于不可微函数可能是唯一适用的。 二阶条件是更强的判定条件，但需要函数具有二阶导数。 5. 示例 示例 1：单变量函数的凸性判定 设 $f(x) = x^2$，判断其是否为凸函数。 一阶条件： $f(y) = y^2, \quad f(x) = x^2, \quad \nabla f(x) = 2x.$验证 $f(y) \geq f(x) + \nabla f(x) (y - x)$： $y^2 \geq x^2 + 2x(y - x) \quad \text{（成立）}.$ 二阶条件：$f''(x) = 2>0, \text{即海森矩阵为正定，函数为凸函数。}$ 示例 2：多变量函数的凸性判定 设 $f(x, y) = x^2 + y^2$，判断其是否为凸函数。 一阶条件： 梯度为 $\nabla f(x, y) = [2x, 2y]^\top$，验证 $f(y) \geq f(x) + \nabla f(x)^\top (y - x)$，成立。 二阶条件： 海森矩阵为： $H(f) = \begin{bmatrix}2 & 0 \\0 & 2\end{bmatrix}.$其特征值均为正，矩阵正定，函数为凸函数 *正定与半正定 概念 正定矩阵（Positive Definite Matrix） 对称矩阵 $A \in \mathbb{R}^{n \times n}$ 是正定的，当且仅当对于任意非零向量 $x \in \mathbb{R}^n$，满足： $x^\top A x > 0.$ 半正定矩阵（Positive Semi-Definite Matrix） 对称矩阵 $A \in \mathbb{R}^{n \times n}$ 是半正定的，当且仅当对于任意向量 $x \in \mathbb{R}^n$，满足： $x^\top A x \geq 0.$ 判定方法 1. 特征值判定 正定： 所有特征值均为正。 半正定： 所有特征值均非负。 2. 主子式判定（仅对对称矩阵适用） 正定： 所有主子式（即从左上角开始的所有子矩阵的行列式）均为正。 半正定： 所有主子式均非负。 3. 对角线元素判定（充分但非必要） 正定： 所有对角线元素为正（且其他条件需满足）。 半正定： 所有对角线元素非负（且其他条件需满足）。 几何意义 正定矩阵： 曲率总是向上（严格上凸）。 半正定矩阵： 曲率向上或平坦（可能部分方向平坦）。 ‍
问题提出 市场上有n种资产 S (i=1,2,...,n)可以选择作为投资项目，现用数额为M的相当大的资金作一个时 期的投资。这n种资产在这一时期内购买$S_i$的平均收益率为$r_i$,风险损失率为$q_\mathrm{i}$。投资越分散，总的风险越小，总体风险可用投资的$S_i$中最大的一个风险来度量。 购买$S_i$要付交易费(费率$p_i$),当购买额不超过给定值$u_i$时，交易费按购买$u_i$计算。另外，假定同期银行存款利率是$\mathbf{r}_0(\mathbf{r}_0=5\%)$,既无交易费又无风险费。 已知n=4时相关数据如下： 请给该公司设计一种投资组合方案，即用给定的资金M，有选择地购买若干种资产或存银行生息，使净收益尽可能大，且总体风险尽可能小。 类似模型一，求解模型二：固定盈利水平，优化风险。并根据结果分析参数k的选取。k的取值：[0,0.27]，每隔0.001求解一个相应的线性规划问题，记录相应的最优值和最优解。画出k与最优解R对应的散点图。指出k取何值时，模型最为合适，R的值最小。 问题假设 投资数额 M 相当大，为了便于计算，假设 M=1。 投资越分散，总的风险越小。 总体风险用投资风险中 $S_i$ 最大的一个风险来度量。 N 种资产 $S_i$之间是相互独立的。在投资的这一时期内，$r_i,q_i,p_i,r_0$为定值，不受意外因素的影响。净收益和总体风险只受$r_i,q_i,p_i$ 影响，不受其他因素干扰。 模型符号 $\begin{aligned} & S_{i} & & \text{第i种投资项目,如股票,债券等}\\ & r_{i_{}} & & \text{第i种投资项目的平均收益率}\\ & q_{i} & & \text{第i种投资项目的风险损失率}\\ & p_{i} & & \text{第i种投资项目的交易费率}\\ & u_{i} & & \text{第i种投资项目的交易定额}\\ & x_{i} & & \text{第i种投资项目的投资金额}\\ & r_0 & & \text{同期银行利率}\\ & \alpha & & \text{投资风险度}\\ & Q & & \text{总体收益}\\ & \Delta Q & & \text{总体收益的增量}\end{aligned}$ 模型建立： 投资者希望找到总盈利至少达到水平k以上，优化到风险最小的投资方案。这样就把多目标变成一个目标的线性规划。 决策变量： $x_i$ 目标函数： $$ \operatorname*{\mathrm{min}}R=\operatorname*{\mathrm{min}}{\operatorname*{\left\lbrace\mathrm{max}\{q_{i}x_{i},i=0,1\ldots n\}\right\rbrace}} $$ 约束条件： $$ \sum_{i=0}^{n}(r_{i}-p_{i})x_{i}\geq k $$ $$ \sum_{1=0}^{n}(1+p_{i})x_{i}=M $$ $$ x_{i}\geq0,i=0,1,...n $$ 模型求解 把上述题目数据代入公式： $$ \operatorname*{\mathrm{min}}R=\operatorname*{\mathrm{min}}{\operatorname*{\left\lbrace\mathrm{max}\{q_{i}x_{i},i=0,1\ldots n\}\right\rbrace}} $$ $$ s.t.\begin{cases}0.05x_0+0.27x_1+0.19x_2+0.185x_3+0.185x_4\geq k\\x_0+1.01x_1+1.02x_2+1.045x_3+1.065x_4=M\\x_i\geq0,i=0,1,2,3,4\end{cases} $$ import numpy as np import scipy.optimize as opt import matplotlib.pyplot as plt # 配置中文字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体字体 plt.rcParams['axes.unicode_minus'] = False # 正常显示负号 # 定义目标函数和约束 def objective(x, q): return np.max(q * x) def constraint_1(x, k): # 盈利约束 return np.dot([0.05, 0.27, 0.19, 0.185, 0.185], x) - k def constraint_2(x): # 资金约束 return np.dot([1, 1.01, 1.02, 1.045, 1.065], x) - 1 # 初始化参数 q = np.array([0, 0.025, 0.015, 0.055, 0.026]) # 各资产的风险损失率 k_values = np.arange(0, 0.271, 0.001) # k值从0到0.27，步长为0.001 R_values = [] # 用于存储最优风险值 x_values = [] # 用于存储最优投资组合 # 对每个k值求解线性规划问题 for k in k_values: x0 = np.zeros(5) # 初始投资组合 # 约束条件 cons = [ {'type': 'ineq', 'fun': constraint_1, 'args': (k,)}, {'type': 'eq', 'fun': constraint_2} ] # 目标函数最小化 result = opt.minimize(objective, x0, args=(q,), constraints=cons, bounds=[(0, None)]*5) if result.success: # 记录最优风险和投资组合 R_values.append(result.fun) x_values.append(result.x) else: # 无解的点跳过 continue # 剔除无解的点后，绘制k与最优解R的散点图 plt.figure(figsize=(8, 6)) # 调整图像大小 plt.scatter(k_values[:len(R_values)], R_values, color='blue', marker='o', alpha=0.6) # 找到最优的点 if R_values: best_k_index = np.argmin(R_values) best_k = k_values[best_k_index] best_R = R_values[best_k_index] # 标注最优点 plt.annotate(f'最优点: k={best_k:.3f}, R={best_R:.3f}', xy=(best_k, best_R), xytext=(best_k + 0.005, best_R + 0.005), arrowprops=dict(facecolor='red', arrowstyle="->"), fontsize=12, color='red') # 添加图形标签 plt.xlabel('目标盈利水平 k', fontsize=12) plt.ylabel('最优风险 R', fontsize=12) plt.title('k与最优风险 R 的关系', fontsize=14) plt.grid(True) plt.show() # 打印最佳k值和相应的最优解 if R_values: print(f"最优的k值为: {best_k}") print(f"对应的最优风险 R 为: {best_R}") print(f"对应的最优投资组合 x 为: {x_values[best_k_index]}") else: print("没有找到有效的解") 最优的k值为: 0.15 对应的最优风险 R 约为: 0.004 对应的最优投资组合 x 为: [0.34063082 0.15701512 0.26026417 0.07137367 0.15091922] ‍