博客

  • 重温SSM(一):线性系统和HiPPO矩阵

    引言

    前几天,我看了几篇介绍SSM(State Space Model)的文章,才发现自己从未认真了解过SSM,于是决定深入学习相关内容,并记录下我的学习所得。SSM的概念由来已久,但我们这里特指的是深度学习中的SSM。一般认为它的开篇之作是2021年的S4,而SSM最新的变体大概是去年的Mamba。

    SSM的背景与发展

    SSM在深度学习中的应用起源于S4,但在S4之前有一篇重要的奠基之作《HiPPO: Recurrent Memory with Optimal Polynomial Projections》(简称HiPPO)。本文将从HiPPO开始,深入探讨其基本形式、数学推导及其在SSM中的应用。

    基本形式

    对于已经对SSM有所了解的读者,可能知道SSM建模所用的是线性ODE系统:
    [
    \begin{aligned}
    x'(t) =&\, A x(t) + B u(t) \
    y(t) =&\, C x(t) + D u(t)
    \end{aligned}
    ]
    其中 (u(t) \in \mathbb{R}^{d_i}, x(t) \in \mathbb{R}^{d}, y(t) \in \mathbb{R}^{d_o}, A \in \mathbb{R}^{d \times d}, B \in \mathbb{R}^{d \times d_i}, C \in \mathbb{R}^{d_o \times d}, D \in \mathbb{R}^{d_o \times d_i})。

    线性系统的选择

    线性系统之所以被选择,是因为它们既足够简单,也足够复杂。简单是指线性化是复杂系统的基本近似,而复杂是指即便简单的线性系统也可以拟合异常复杂的函数。

    HiPPO的贡献

    HiPPO的贡献在于当我们试图用正交基去逼近一个动态更新的函数时,其结果自然而然地成为了线性系统。HiPPO不仅证明了线性系统能够逼近复杂函数,还告诉我们如何去逼近,甚至近似程度如何。

    邻近窗口计算与勒让德多项式

    通过选取勒让德多项式为基函数,HiPPO在处理实时信号的邻近窗口时,推导出了一个线性ODE系统。这一推导过程展示了线性系统在记忆和逼近动态函数方面的强大能力。

    应用与理论意义

    HiPPO的理论框架为后来的诸多SSM提供了基础,特别是在深度学习模型中。SSM的应用不仅限于解决复杂的动态系统问题,还展示了其在处理大规模数据和长序列记忆方面的潜力。

    总结

    本文以尽可能简单的方式重复了HiPPO的主要推导,通过适当的记忆假设,自下而上地导出了线性ODE系统,并且针对勒让德多项式的情形求出了相应的解析解。HiPPO的结果被诸多SSM使用,成为SSM的重要奠基之作。

    参考文献

    • 《HiPPO: Recurrent Memory with Optimal Polynomial Projections》

    以上内容是对SSM和HiPPO矩阵的简要介绍和总结,希望对大家有所帮助。


    原文链接:

  • 《文化和自然遗产:批判性思路》&《立地坡.上店耀州窑址》

    Reblog via Libgen中文新书速递

    《文化和自然遗产:批判性思路》
    作者:罗德尼·哈里森(Rodney Harrison)
    上海古籍出版社 2021
    下載:libgen.is/book/index.php?md5=A

    《立地坡.上店耀州窑址》
    作者:耀州窑博物馆等
    三秦出版社 2004
    下載:libgen.is/book/index.php?md5=2

  • 现代计算中的内存需求:从多核处理到高频率内存

    随着计算技术的不断进步,现代计算机尤其是高性能计算机对内存的需求越来越高。特别是在处理高分辨率视频渲染、科学计算等复杂任务时,对内存容量和频率的要求显得尤为重要。本文将结合Adobe官网的内存建议,探讨多核处理器对内存的需求,以及如何通过选择适当的内存配置来提升整体性能。

    多核同时渲染:内存需求的公式

    在现代计算中,利用多核处理器进行并行计算已成为常态。Adobe的多核渲染技术能够同时处理多帧,从而显著提高处理速度。然而,这种多核处理方式对内存容量提出了更高的要求。根据Adobe提供的公式:

    建议内存容量 = 1核心 × 4GB内存 + 20GB总内存容量

    通过这一公式,我们可以更准确地为不同核心数的处理器配置适当的内存。例如,以Intel i7-12700KF为例,这款处理器拥有8个性能核心(P core)和4个能效核心(E core),共计12核20线程。按照上述公式计算,其最低内存需求为:

    8 × 4GB + 20GB = 52GB内存

    高性能处理器与内存配置

    对于像i7/i9这样的高端处理器,建议搭配32GB以上的内存以充分发挥其性能。这在处理4K/8K分辨率的视频渲染时尤为重要。如今,大多数视频文件已经升级到4K+分辨率,对于4K RAW视频文件的剪辑,32GB内存已经远远不够用。

    内存频率与CPU性能的关联

    内存频率与CPU性能高度相关,尤其在进行科学计算如仿真等对计算速度要求极高的任务时,内存频率显得尤为重要。在这些场景下,降频扩容的方式几乎没有提升效果,反而可能导致性能瓶颈。

    例如,选择高频率内存条而不是仅仅扩充内存容量,可以显著提升性能。最近市场上推出的24GB×2的新方案,其频率普遍在5600MHz以上,甚至有6400/6800/7200MHz的高频率内存条,这样的配置不仅实现了大容量和高频率的需求,还解决了散热问题。

    结论

    在现代高性能计算中,内存的容量和频率对整体性能有着至关重要的影响。通过合理配置内存,尤其是选择高频率、大容量的内存条,可以显著提升计算效率,满足复杂任务的需求。为你的高端处理器选择适合的内存配置,将使你的工作流更加高效,从而达到最佳的生产力水平。

  • 深入解读 DeepSeek-V2 语言模型中的多头潜在注意力机制 (MLA)

    在最新的 DeepSeek-V2 语言模型中,多头潜在注意力机制 (Multi-head Latent Attention, MLA) 作为一种创新架构,被设计用来保证高效的推理过程。本文将详细介绍 MLA 的关键特性及其在 DeepSeek-V2 中的应用和优势。

    高效的推理过程

    MLA 通过将 Key-Value (KV) 缓存压缩到一个潜在向量中,显著减少了推理过程中所需的内存和计算资源。这种压缩大大降低了内存占用和计算需求,从而实现更快、更高效的处理 [1]

    Key-Value (KV) 缓存压缩

    在注意力机制中,KV 缓存是一个重要组件,负责存储输入序列中不同 token 之间的关系信息。MLA 将这个缓存压缩成一个潜在向量,显著减小其大小和内存占用 [1]

    稀疏计算

    MLA 是 DeepSeekMoE 架构的一部分,该架构通过稀疏计算实现经济高效的强大语言模型训练。这意味着每个 token 仅激活模型参数的一个子集,从而减少了训练过程中的整体计算需求 [1]

    提升的性能

    与其前身 DeepSeek 67B 相比,采用 MLA 的 DeepSeek-V2 实现了显著更强的性能。尽管仅激活了 21B 的参数,DeepSeek-V2 及其聊天版本仍在开源模型中达到了顶级性能 [1]

    结论

    总的来说,MLA 是一种通过将 Key-Value 缓存压缩到潜在向量中来保证高效推理的创新架构。它显著减少了内存和计算需求,带来了更快、更高效的处理过程。采用 MLA 的 DeepSeek-V2 在降低训练成本和提高生成吞吐量的同时,仍实现了强大的性能 [1]


    了解更多:

    1. [2405.04434] DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model
    2. [2405.04434] DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model
    3. Transformers Explained Visually (Part 3): Multi-head Attention, deep dive | by Ketan Doshi | Towards Data Science
  • 探索 ActivityPub:去中心化社交网络协议

    引言

    随着互联网的不断发展,去中心化的社交网络逐渐成为热点话题。ActivityPub 正是在这种背景下应运而生的,它是一种去中心化的社交网络协议,基于 ActivityStreams 2.0 数据格式。本文将详细介绍 ActivityPub 的工作原理及其实现方式。

    什么是 ActivityPub?

    ActivityPub 是一种去中心化的社交网络协议,旨在通过客户端到服务器和服务器到服务器的 API 实现内容的创建、更新和删除,以及通知和内容的分发。它的主要目标是让去中心化的网站能够共享信息,并让用户通过各种客户端与自己的账户进行互动。

    ActivityPub 的两层协议

    服务器到服务器的联邦协议

    这种联邦协议使得不同的去中心化网站能够共享信息。例如,当一个用户在一个服务器上发布内容时,其他服务器上的用户也能够看到并互动。

    客户端到服务器的协议

    这种协议允许用户(包括真实用户、机器人和其他自动化进程)通过各种客户端(如手机、桌面应用或 Web 应用)与他们在服务器上的账户进行通信。

    用户和演员

    在 ActivityPub 中,用户通过服务器上的账户表示为“演员”。每个演员都有一个收件箱和一个发件箱,用于接收和发送消息。这些都是通过 URL 进行标识的。

    示例

    {
      "@context": "https://www.w3.org/ns/activitystreams",
      "type": "Person",
      "id": "https://social.example/alyssa/",
      "name": "Alyssa P. Hacker",
      "preferredUsername": "alyssa",
      "summary": "Lisp enthusiast hailing from MIT",
      "inbox": "https://social.example/alyssa/inbox/",
      "outbox": "https://social.example/alyssa/outbox/",
      "followers": "https://social.example/alyssa/followers/",
      "following": "https://social.example/alyssa/following/",
      "liked": "https://social.example/alyssa/liked/"
    }

    如何发送和接收消息?

    发送消息

    • POST 到收件箱:将消息发送到某人的收件箱(仅适用于服务器到服务器的通信)。
    • POST 到发件箱:将消息发送到全世界(客户端到服务器)。
    • GET 从发件箱:查看某人发送的消息(客户端到服务器和/或服务器到服务器)。

    接收消息

    • GET 从收件箱:查看最新收到的消息(客户端到服务器)。

    一个完整的示例

    假设 Alyssa 想给她的朋友 Ben 发送一条消息,询问他是否还记得归还一本借来的书。她可以创建一个 ActivityStreams 对象并将其发送到她的发件箱。

    {
      "@context": "https://www.w3.org/ns/activitystreams",
      "type": "Note",
      "to": ["https://chatty.example/ben/"],
      "attributedTo": "https://social.example/alyssa/",
      "content": "Say, did you finish reading that book I lent you?"
    }

    服务器会将这条消息包装在一个 Create 活动中,并发送到 Ben 的收件箱。

    {
      "@context": "https://www.w3.org/ns/activitystreams",
      "type": "Create",
      "id": "https://social.example/alyssa/posts/a29a6843-9feb-4c74-a7f7-081b9c9201d3",
      "to": ["https://chatty.example/ben/"],
      "actor": "https://social.example/alyssa/",
      "object": {
        "type": "Note",
        "id": "https://social.example/alyssa/posts/49e2d03d-b53a-4c4c-a95c-94a6abf45a19",
        "attributedTo": "https://social.example/alyssa/",
        "to": ["https://chatty.example/ben/"],
        "content": "Say, did you finish reading that book I lent you?"
      }
    }

    安全性和验证

    在 ActivityPub 中,服务器应该验证收到的内容,以防止内容欺骗攻击。例如,当服务器接收到一个 Like 活动时,应该验证该活动的 id 是否存在并且是一个有效对象。

    结论

    ActivityPub 通过提供灵活的客户端到服务器和服务器到服务器的协议,使得创建、更新和分发内容变得更加简单和高效。它的去中心化特性也为社交网络带来了更多的自由和可能性。如果您对构建去中心化社交网络感兴趣,ActivityPub 将是一个非常有价值的工具。

    希望这篇文章能帮助您更好地理解 ActivityPub 及其在去中心化社交网络中的重要作用。

  • AI教父Hinton与神童创业家Hellermark的对话:人工智能的未来与挑战

    近日,27岁的天才创始人Joel Hellermark与“AI教父”Geoffery Hinton进行了一次深度对话。Hinton在采访中回忆了自己的人工智能生涯,讨论了神经网络、Scaling Law、多模态学习、模拟计算和人工智能伦理安全等多个话题,并且聊到了他的得意门生Ilya Sutskever(前段时间离职的OpenAI首席科学家)。

    神秘人物:Geoffery Hinton

    受访者Hinton是人工智能领域的传奇人物,而采访者Joel Hellermark也颇有背景。他自幼在东京长大,13岁开始编码,14岁创立了一家视频推荐公司。19岁时,他创办了人工智能研究实验室Sana,并在2023年成功筹集了8000万美元的融资。Hellermark坚信学习的力量,因此他没有选择上大学,而是通过斯坦福公开课程自学编程,创办Sana的目标就是“改变教育”。

    从研究大脑到编程

    开始编程的故事

    Hellermark:你是怎么开始编程的?

    Hinton:我从英国刚到卡内基梅隆大学的时候。1982年,我前往卡内基梅隆大学担任计算机科学系教授,直至1987年。在英国的研究单位时,每晚六点钟大家都会去酒吧喝一杯。但到了卡内基梅隆几周后,我还没交到多少朋友。所以在某个周六晚上,我决定去实验室编写一些程序,因为实验室里有一台Lisp机器,家里没有。

    剑桥时期的回忆

    Hellermark:能不能把我们带回剑桥时期,试图理解人脑的经历?

    Hinton:非常令人失望。我为了研究大脑,先是去学习生理学,但实际上他们只教了我们神经元如何传导动作电位……这非常有趣,但不是大脑工作的原理。于是我又转向了哲学,因为我以为他们会告诉我心灵是如何运作的,结果也是非常令人失望。最终,我选择到爱丁堡学习人工智能。

    影响深远的书籍和导师

    关键的启发

    Hellermark:你还记得是什么激起了你对人工智能的兴趣吗?

    Hinton:是唐纳德·赫布(Donald Hebb)的一本书,里面介绍了如何学习神经网络中的连接强度。早期我还读过约翰·冯·诺伊曼(John von Neumann)的一本书,书里介绍了大脑的计算方式以及大脑计算与普通计算机的区别。

    导师和合作伙伴

    Hellermark:你还记得以前经历过的合作吗?

    Hinton:我在卡内基梅隆大学时曾与泰伦斯·塞诺夫斯基(Terry Sinofsky)有过许多交流,我们共同研究玻尔兹曼机。还有彼得·布朗(Peter Brown),他是一位非常优秀的统计学家,在IBM从事语音识别工作。他启发我采用“隐藏层”这一概念来描述神经网络中的中间层。

    凭直觉思考的天才:Ilya Sutskever

    初次见面

    Hellermark:请带我们回忆你的另一位学生Ilya Sutskever。

    Hinton:我当时在办公室编程,突然有人急促地敲门,是Ilya。他告诉我,比起暑期炸薯条的工作,他更渴望能在我的实验室工作。所以我给了他一篇关于反向传播的论文阅读,约定一周后再见面。他回来后说:“我没看懂。”但他的直觉非常敏锐,对事物有独特的看法。

    合作与交流

    Hellermark:你们俩是如何交流的?你们各自扮演着什么样的角色?

    Hinton:非常有趣。我们曾试图用数据制作复杂的地图,Ilya对反复修改代码感到厌烦。一天早上,他告诉我已经搞定了编写接口的工作,这种高效的工作方式让我印象深刻。

    规模与创造力:GPT-4的未来

    模型的训练与预测

    Hellermark:可以为我们科普一下这些模型是如何训练来预测下一个单词的吗?

    Hinton:我制作了第一个使用嵌入和反向传播的神经网络语言模型。为了准确预测下一个词,模型必须理解上下文。随着模型规模的扩大,即使没有特别设计用于推理的组件,它们也展现出了推理的能力,并且随着规模继续增长,它们的推理能力也将随之增强。

    GPT-4的创造力

    Hellermark:你认为AI模型的创造力会如何发展?

    Hinton:GPT-4在规模扩大后,将会变得非常有创造力。它的创造力甚至会超过人类,因为它能够在表面上截然不同的事物之间看到类比。

    未来的应用与挑战

    医疗保健与新材料领域

    Hellermark:你认为未来最有前景的应用是什么?

    Hinton:我认为医疗保健是一个重要的领域,我们希望AI在这些领域变得更好。还有一个应用是在新工程领域开发新材料,例如太阳能电池板或超导材料。

    道德与安全

    Hellermark:你是否担心AI的发展会带来负面影响?

    Hinton:我确实担心不良分子利用AI做坏事,比如制造杀人机器人、操纵公众舆论、进行大规模监视等。

    总结

    Hinton和Hellermark的对话中,探讨了许多关于人工智能发展的核心问题。从神经网络的基础研究到大规模模型的应用,再到AI的伦理与安全,每一个话题都引发了深刻的思考。Hinton的智慧和远见,不仅推动了人工智能技术的发展,也为我们理解未来的AI世界提供了宝贵的见解。


  •  AI时代,教父Hinton谈创新思维与超越人类的未来

    前言:
    最近,27岁的天才创业家Joel Hellermark与人工智能教父Geoffery Hinton进行了一次深入采访。Hinton在对话中回顾了自己的人工智能研究历程,并就神经网络、算力扩展、多模态学习、模拟计算等前沿话题进行了分享。他还谈及了自己的得意门生Ilya Sutskever在人工智能领域的杰出表现。

    正文:
    一、从研究大脑到投身人工智能
    Hinton从英国来到美国卡内基梅隆大学后,凭借对大脑工作原理的好奇,开始投身人工智能领域的研究。他先后接触过唐纳德·赫布和约翰·冯·诺依曼的著作,深受启发。Hinton认为大脑的学习方式必然与传统的逻辑推理不同,因此必须探寻神经网络中连接权重调整的奥秘。

    二、与合作伙伴的心灵相通
    Hinton回忆与泰伦斯·塞诺夫斯基、彼得·布朗等人的合作经历,他们一起探索了玻尔兹曼机等前沿技术,产生了许多有趣的研究成果。Hinton认为,与聪明的学生合作交流是最令人兴奋的,因为他们往往能提出突破性的想法。

    三、Ilya Sutskever:凭直觉思考的天才
    Hinton特别提到了自己的得意门生Ilya Sutskever。Sutskever对人工智能充满热情,在反向传播算法上提出了独到见解。Hinton认为,Sutskever的直觉非常敏锐,常能发现问题的本质。在两人的合作中,Sutskever总能提出启发式的想法,推动研究不断前进。

    四、数据规模与计算能力推动进步
    Hinton承认,早期他和团队曾低估了数据规模和计算能力的重要性。Ilya Sutskever很早就认识到,扩大模型规模是提升性能的关键。事实也证明,即使没有特殊设计,仅靠海量数据和计算能力,人工智能模型也能展现出推理能力。

    五、多模态学习与创造力提升
    Hinton认为,多模态输入(如图像、视频、音频等)可以丰富模型对世界的理解,提升其创造力。因为这种学习方式更贴近人类的感知方式。他设想,未来的人工智能系统将能够从多角度理解同一事物,从而产生与人类不同的创新。

    结语:
    Hinton的故事生动诠释了人工智能的发展轨迹,以及从单一算法到海量数据驱动的转变。他的经历也启示我们,保持好奇心和开放心态,不断探索,才是推动科技进步的关键所在。当下,人工智能正在重塑人类社会的方方面面,我们应该以积极、理性的态度拥抱这个时代的机遇与挑战。

  • 从996到自由的挣扎:互联网大厂的职场生态

    在过去的几年里,中国的互联网大厂们一直是无数求职者心中的梦想之地。这些公司不仅提供高薪和优厚的福利,还承诺职业生涯的飞速发展。然而,随着时间的推移,这些光鲜亮丽的外表下开始显露出一些令人不安的问题。今天,我们来探讨一下互联网大厂的职场现状以及它给员工的生活带来的影响。

    首先,让我们来看一下所谓的“996”工作制。这是一个指代从早上9点工作到晚上9点,每周工作6天的加班文化。虽然这种工作制度可以迅速推动项目进度,但它对员工的健康和私人生活造成了极大的压力。有员工表示,长时间的高强度工作让他们感到身心疲惫,甚至出现了严重的健康问题。例如,有报道称,一些员工因为长时间熬夜加班而需要靠吃药和打点滴来维持。

    此外,互联网公司内部的竞争非常激烈。为了在公司中脱颖而出,员工不得不不断地推动自己的极限。一些公司甚至发明了“拼搏投入度”这样的新词,来评估员工的工作表现。在这种高压环境下,员工常常感到巨大的心理压力。

    更加令人担忧的是,一些公司在处理裁员和员工监管方面采取了极端措施。例如,有报道指出,某些公司在裁员前会严格检查员工的考勤和工作量,甚至要求员工上交手机进行检查,以确定他们是否在网络上发表了不利于公司的言论。这种做法不仅侵犯了员工的个人隐私,也增加了工作场所的不信任气氛。

    尽管面临这些挑战,许多员工仍然选择留在这些大公司工作,原因是这些公司能够提供无法抗拒的薪酬和职业发展机会。然而,随着经济环境的变化和技术的发展,一些曾经稳定的职位开始受到威胁。例如,人工智能的发展使得一些曾经由人类完成的技术工作可以由机器人来完成,这直接影响了程序员等技术人员的职业稳定性。

    在这样一个快速变化的环境中,员工需要重新考虑他们的职业路径。与其完全依赖于一个可能随时都会改变的外部系统,不如建立起自己的技能和能力,以应对未来可能出现的任何挑战。是否依附于大平台或是寻求更灵活的工作方式,这是每个职场人都需要思考的问题。

    虽然互联网大厂提供了许多吸引人的机会,但这些机会也伴随着不小的风险和挑战。职场人必须意识到,没有一份工作是永远安全的,只有不断提升自己的能力,才能在不断变化的世界中立于不败之地。


  • 知识编辑:弥补LLMs的不足

    在当前的人工智能研究领域,将大型语言模型(LLMs)的能力应用于解决复杂的强化学习问题是一个前沿且具有挑战性的课题。大型语言模型,如GPT系列、BERT等,已经在自然语言处理领域证明了其强大的信息处理和生成能力。这些模型通过在大规模数据上的预训练,能够捕捉到丰富的语言结构和知识。然而,当这些模型被直接应用于传统的强化学习任务时,如OpenAI Gym中的控制任务或Atari游戏,它们面临着一系列新的挑战和问题。

    大模型在强化学习中的应用挑战

    尽管LLMs在语言理解和生成方面表现出色,但它们在直接处理强化学习任务时往往表现出不确定性。这主要是因为强化学习的环境具有高度的动态性和不确定性,这与LLMs通常处理的更为静态的语言数据存在本质区别。在强化学习中,智能体需要根据与环境的交互不断调整其行为策略,这要求模型具备高度的适应性和决策能力。

    此外,虽然LLMs能够通过精细的提示工程(prompt engineering)来引导模型完成特定的任务,但这种方法依赖于大量的手工调整和试验,且其成功往往受限于模型对提示的敏感性和解释能力。这种方法的效率低下且可扩展性有限,难以适应快速变化的强化学习环境。

    知识编辑技术的潜力

    为了克服这些挑战,研究人员开始探索知识编辑技术,即通过修改模型的内部知识表示来直接提高LLMs在特定任务上的性能。这种方法的核心思想是在不重新训练整个模型的前提下,通过精确的修改来增强模型的任务相关能力。

    1. 外部知识依赖:这一方法侧重于通过外部输入来动态调整模型的行为。具体来说,可以在模型接收输入之前提供相关的背景信息或示例,帮助模型建立起对特定任务的初步理解。
    2. 外部知识注入:通过这种方法,可以将任务相关的知识直接注入到模型的某些部分。例如,可以通过修改模型的某些权重或参数,使其更好地适应特定的决策环境。
    3. 内在知识编辑:这是一种更深入的编辑方法,它涉及到对模型内部表示的直接修改。这包括调整模型中负责存储和处理知识的部分,如神经网络中的特定神经元或层,以优化模型对特定任务的响应。

    实践中的实现

    实现知识编辑技术需要对LLMs的内部工作机制有深入的理解。例如,研究人员需要确定哪些部分的模型是存储和处理特定类型知识的,以及如何通过技术手段进行精确的修改。此外,还需要开发有效的算法来自动化这一过程,减少人工干预,并确保编辑操作不会破坏模型在其他任务上的性能。

    最终,通过知识编辑技术,我们可以朝着创建更加智能和适应性强的语言模型迈进,这些模型不仅能够处理复杂的语言任务,还能有效地解决强化学习中的序列决策问题。这将大大扩展LLMs的应用范围,使其在游戏、机器人控制以及其他需要复杂决策的领域中发挥更大的作用。


    在当今的人工智能研究领域中,如何有效地更新和优化大型语言模型(LLMs)已成为一个重要议题。下面我们将探讨四种主要的技术路线:参数高效的微调(PET)、知识增强(knowledge augmentation)、持续学习(continual learning)、以及机器遗忘(machine unlearning),这些技术路线在提升模型性能及其应用的可适应性方面起着关键作用。

    参数高效的微调(PET)

    参数高效的微调旨在通过只调整模型极小部分的参数来提升模型在特定任务上的表现,从而减少计算资源的消耗。这一技术的实现方式主要有三种:基于加法的方法、基于规范的方法和基于重参数化的方法。

    1. 基于加法的方法:这种方法通过引入额外的可训练模块或参数来实现,这些模块或参数在原始模型中并不存在。典型的方法包括基于适配器的微调和基于提示的微调。例如,Adapter方法通过在Transformer层之间插入小型神经网络模块来增强模型的能力;而Prefix-tuning方法则是在模型输入的前缀部分添加可训练的上下文。
    2. 基于规范的方法:这种方法仅微调模型的一部分固有参数,如Bitfit方法仅对模型的偏差部分进行调整,而不改变模型的内部结构。
    3. 基于重参数化的方法:如LoRA方法,通过对自注意力模块中权重的增量矩阵进行低秩分解,达到优化效果。

    知识增强

    知识增强主要是针对LLMs在处理未知问题(如分布外或垂直细分领域问题)时的不足。检索增强生成(RAG)是一种流行的知识增强方法,它通过结合检索到的相关信息来增强模型的输出。RAG的核心思想是在模型的输入、中间层或输出端集成外部检索到的知识,从而提升模型的准确性和全面性。

    持续学习

    持续学习是指模型在学习新任务的同时,能够保持对旧任务的记忆。这一领域的研究主要集中在如何平衡模型的稳定性和可塑性,以及如何设计能够适应任务间和任务内分布变化的学习系统。持续学习的方法可以分为基于正则化、基于回放、基于表示、基于优化和基于架构的方法,每种方法都试图以不同的方式来缓解灾难性遗忘的问题。

    机器遗忘

    机器遗忘涉及到从模型中删除特定信息的需求,这通常是由于法律法规如GDPR或CCPA的要求。有效的机器遗忘方法需要能够在不重新训练整个模型的情况下,迅速准确地从模型中移除特定数据的影响。这一领域的方法通常分为两类:数据重组和模型操作。

    这些技术路线各有其独特的优势和挑战。在实际应用中,通常需要根据具体需求和场景来选择合适的技术组合,以达到最佳的性能和效率。通过不断的研究和实验,这些技术有望为未来的人工智能发展提供更多可能性和灵活性。


    知识编辑:弥补LLMs的不足

    为了提高LLMs的准确性和适应性,研究者们开发了“知识编辑”技术。知识编辑的目的是在不重新训练整个模型的情况下,快速准确地修改模型中的特定知识。这种技术包括三个基本操作:知识插入、知识修改和知识擦除。

    1. 知识插入:向模型中添加新的知识,扩展其识别和处理的信息范围。
    2. 知识修改:更新模型中已有的过时或错误信息,提高信息的准确性。
    3. 知识擦除:从模型中删除不再需要或不正确的信息,减少误导性或有害的内容。

    知识编辑的实现方法

    知识编辑的实现通常分为三个阶段:识别、关联和掌握阶段。

    • 识别阶段:这一阶段涉及到向模型展示新知识,帮助模型初步识别需要编辑的信息。
    • 关联阶段:在这一阶段,新知识将与模型中已有的知识形成联系,通过技术手段如增加参数或替换输出,实现知识的融合。
    • 掌握阶段:最后阶段是模型通过内部参数的调整,彻底掌握并准确应用这些编辑后的知识。

    每个阶段都有其特定的方法和技术挑战,例如在掌握阶段,如何避免模型在经过编辑后发生灾难性遗忘(catastrophic forgetting)是一个关键问题。此外,知识编辑的过程需要考虑到编辑的精确性和避免对模型其他功能的干扰。

    未来展望

    尽管知识编辑为提高LLMs的实用性和准确性提供了一种有效的手段,但这一领域仍处于发展阶段。目前,如何高效地实现知识编辑,以及如何处理由此可能引起的模型行为改变,都是需要进一步研究的问题。此外,随着技术的进步,未来可能会有更多创新的编辑方法出现,帮助我们更好地利用这些强大的语言模型。

    知识编辑不仅提升了LLMs的功能,也为人工智能的应用开辟了新的可能性。随着研究的深入和技术的发展,我们有理由期待在未来,这些模型能更加智能和精准地服务于各种复杂的应用场景。


    在当前的人工智能发展阶段,模型操纵技术已成为推动大语言模型(LLMs)应用和优化的重要手段。以下是几种主要的模型操纵方法,它们通过不同的机制实现对模型知识的控制和转移。

    1. 知识蒸馏与迁移

    知识蒸馏是一个有效的模型操纵技术,它允许从大型模型中提取关键知识并迁移到较小的模型中。这种方法不仅可以提高模型的运行效率,还能在资源有限的环境中部署先进的AI技术。例如,PKT技术通过分析模型中的知识神经元块,实现了从大模型到小模型的知识迁移,这对于模型的简化和应用具有重要意义。

    2. 子网络修剪

    另一种模型操纵技术是通过修剪关键子网络来消除模型对特定知识的依赖。这种方法不仅可以减轻模型的计算负担,还可以根据需要去除不必要或过时的信息。例如,Bayazit等人的研究通过修剪LLMs中的关键子网络,有效地移除了模型中的目标知识,从而避免了模型对特定信息的过度依赖。

    3. 权重投影

    在分析模型权重时,将不同模型的权重投影到同一嵌入空间中,可以实现模型间的知识连接和迁移。这种方法为模型间的信息共享和扩展提供了可能,使得不同模型之间可以通过共享嵌入空间更高效地交换和利用知识。

    应用实例:人工智能内容生成

    除了文本生成,LLMs的应用已扩展到多模态领域,如图像和声音。这些模型通过知识编辑技术能够更精准地控制生成内容的质量和相关性。例如,ReFACT技术通过编辑模型中的事实知识来提高图像生成的准确性和质量,这对于创造高质量的AI生成内容具有重要意义。

    可信人工智能

    知识编辑还可以用于构建更安全、更可信的AI系统。通过编辑模型中的知识,可以消除不安全特征,如有毒语言、偏见或不当内容。这不仅提高了模型的社会责任感,也增强了公众对AI系统的信任。

    结论

    通过这些高级的模型操纵技术,我们能够更有效地控制和优化大语言模型的行为和性能。无论是在提高模型效率、精确控制内容生成还是构建可信AI方面,这些技术都展现出巨大的潜力和价值。随着技术的进一步发展,我们期待这些方法能够为AI的应用和发展带来更多的创新和突破。

  • 工业通讯的进化:从Modbus到ProfiNET

    在工业自动化的世界里,通讯协议就像是语言,让机器之间能够互相理解和协作。随着技术的进步,我们见证了从Modbus到ProfiNET的转变,这不仅仅是技术的升级,更是对工业自动化需求的深刻理解。

    一、Modbus:简单而经典的选择

    Modbus,这个诞生于1979年的通讯协议,以其简单易用的特性,成为了工业自动化领域的宠儿。它支持RS-232、RS-485和以太网等多种通信方式,让设备之间的数据交换和远程控制变得轻而易举。然而,随着工业自动化的发展,Modbus在数据传输速度、安全性和扩展性方面的局限性也逐渐显现。

    二、ProfiNET:现代工业的新宠

    为了应对这些挑战,ProfiNET应运而生。作为PROFIBUS用户组织推出的工业以太网标准,ProfiNET基于以太网技术,提供了高速、实时的数据传输能力。它不仅支持实时以太网、运动控制和分布式自动化等多种通信机制,而且在数据传输速率、安全性和扩展性方面都有着显著的优势。

    三、优缺点的对比与应用场景

    Modbus的优点在于其简单性、成本效益和兼容性,使其成为小型或成本敏感项目的理想选择。然而,它的速度限制、安全性不足和扩展性有限也成为制约其发展的瓶颈。

    ProfiNET的优点则在于其高速传输、安全性和扩展性,使其成为大型工业自动化项目的首选。尽管初期投资可能较高,且协议相对复杂,需要专业知识进行配置,但其带来的长期效益是显而易见的。

    四、实际场景下的转变

    让我们通过一个制造工厂的例子来具体看看这种转变。假设这个工厂最初使用的是基于Modbus的控制系统。随着生产规模的扩大和自动化需求的提高,原有的Modbus系统已无法满足需求。为了解决这些问题,工厂决定升级到ProfiNET系统。

    在升级过程中,工厂需要将现有的Modbus设备通过网关或适配器转换为ProfiNET兼容设备。例如,原本通过Modbus与传感器和执行器通信的PLC,现在通过安装ProfiNET适配器,能够以更高的速度和更强的安全性与这些设备通信。同时,工厂还部署了ProfiNET交换机来构建一个高速、可靠的网络基础设施。

    通过这种转换,工厂不仅提高了生产效率,还增强了系统的安全性和未来的可扩展性。这正是从Modbus到ProfiNET转变的生动写照,也是工业通讯进化的必然趋势。

    结语

    随着工业4.0的推进,我们有理由相信,ProfiNET将会在工业通讯领域扮演越来越重要的角色。而对于Modbus,它仍然是许多小型或成本敏感项目的理想选择。技术的演进不是一蹴而就的,它需要我们不断地探索和适应。让我们拭目以待,工业通讯的明天将会更加精彩。


    在Java领域,存在一些开源项目和库,它们旨在提供与工业通信协议如ProfiNET的兼容性或实现相关的功能。以下是一些可能与ProfiNET相关的Java开源项目:

    1. Eclipse Milo – Eclipse Milo 是一个开源的OPC UA (Open Platform Communications Unified Architecture) 客户端和服务器SDK,它提供了Java实现。虽然它不是直接针对ProfiNET的,但OPC UA是与ProfiNET可以互操作的工业通信协议。 GitHub链接: https://github.com/eclipse/milo
    2. JOPC – JOPC是一个Java库,用于实现OPC UA协议栈。与Eclipse Milo类似,它不是直接针对ProfiNET,但可以用于与使用OPC UA的ProfiNET设备进行通信。 GitHub链接: https://github.com/FreeOpcUa/JOPC
    3. Apache MINA – Apache MINA 是一个网络应用框架,可以帮助开发高性能和高可靠性的网络服务器和客户端。虽然它本身不是工业通信协议的实现,但可以用作构建与ProfiNET兼容应用程序的基础。 Apache链接: https://mina.apache.org/
    4. Modbus4j – Modbus4j 是一个用于Modbus协议的Java实现。虽然Modbus与ProfiNET不同,但了解Modbus的实现可能有助于开发与ProfiNET兼容的Java应用程序。 GitHub链接: https://github.com/jfhaugh/modbus4j
    5. ProfiBASIC – ProfiBASIC 是一个开源的Profibus通信库,虽然它不是用Java编写的,但它提供了一些可以与Java应用程序交互的接口。 GitHub链接: https://github.com/profibasic/profibasic

    由于ProfiNET是一个专有的工业通信协议,没有开源的Java实现。但是,通过使用上述项目或库,开发者可以构建与ProfiNET设备通信的Java应用程序。此外,由于工业通信协议的复杂性和专有性,建议在实际应用中与协议的官方提供者或授权供应商合作,以确保兼容性和安全性。


    OPC UA(Open Platform Communications Unified Architecture)是一个独立于平台和语言的工业通信标准,由OPC基金会(OPC Foundation)开发和维护。OPC UA旨在解决传统OPC技术中的一些限制,并提供一种统一的、跨平台的通信方式,以支持工业自动化和物联网(IoT)环境中的设备和系统之间的互操作性。

    OPC UA 的主要特点:

    1. 跨平台和语言中立性:OPC UA可以在不同的操作系统和编程语言上运行,支持多种编程语言,如C#、Java、C++等。
    2. 服务导向架构(SOA):OPC UA基于服务导向架构,提供了一套标准化的服务,使得不同的系统和设备能够通过定义良好的接口进行通信。
    3. 安全性:OPC UA内置了高级的安全机制,包括传输层和消息层的安全,支持用户认证、数据加密和完整性保护。
    4. 数据模型:OPC UA具有强大的数据模型,可以表示复杂的数据结构,支持不同类型的数据,如标量数据、数组、结构体和复杂对象。
    5. 实时性和同步机制:OPC UA支持实时数据交换和同步机制,适用于需要快速响应的工业应用。
    6. 发现和注册服务:OPC UA提供了发现服务,使得客户端可以发现网络上的服务器和服务,以及注册服务,允许设备和服务注册到全球可访问的注册服务器。
    7. 事件和报警:OPC UA支持事件和报警的发布和订阅,允许用户定义和接收事件通知。
    8. 多语言支持:OPC UA支持多语言环境,可以处理多种语言的标签和描述。
    9. Web服务:OPC UA提供了基于HTTP和WebSocket的Web服务,使得Web应用程序能够与OPC UA服务器进行通信。

    OPC UA 的应用场景:

    • 工业自动化:OPC UA广泛应用于工业自动化领域,用于实现机器、传感器、控制器和其他工业设备之间的通信。
    • 企业系统集成:OPC UA可以作为企业资源规划(ERP)系统和制造执行系统(MES)之间的桥梁,实现数据的无缝集成。
    • 智能制造:在智能制造和工业4.0的背景下,OPC UA支持机器学习和数据分析工具与工业设备的集成。
    • 物联网(IoT):OPC UA支持与各种IoT设备和平台的集成,实现设备管理和数据收集。

    OPC UA 的实现:

    OPC UA标准定义了一套协议和接口,许多公司和开源项目提供了OPC UA的实现。例如,Eclipse Milo、FreeOpcUa、open62541等都是流行的开源OPC UA服务器和客户端库。

    OPC UA是一个强大的工业通信协议,它通过提供跨平台、安全的通信机制,支持复杂的数据模型和实时性,已经成为现代工业自动化和智能制造领域的关键技术之一。

  • 从Modbus转向ProfiNET

    在当前的工业自动化和智能制造领域,通信技术的进步不仅优化了生产效率,还显著提升了操作的安全性和系统的可扩展性。今天,我们将探讨为何将传统的Modbus通信协议转换为更现代的ProfiNET协议,以及这一转变对工业实践的深远影响。

    Modbus与ProfiNET的基本概念

    Modbus 是一种应用层协议,广泛应用于工业环境中,以实现设备间的数据通信。它支持多种通信方式,如RS-232、RS-485和以太网等。Modbus的设计简单易用,使其成为小型系统中的首选协议。然而,它的数据传输速度和安全性较低,难以满足更大规模和更复杂系统的需求。

    ProfiNET 则是基于以太网的工业通信技术,由PROFIBUS用户组织推出。这一标准不仅保证了高速的数据传输能力,还支持实时通信,适应了大规模和复杂网络的需求。ProfiNET在安全性和扩展性方面都有显著优势,能够支持现代工业自动化的高要求。

    为何从Modbus转向ProfiNET

    1. 性能提升:ProfiNET提供比Modbus更快的数据传输速率,这对于需要实时或近实时反馈的生产过程尤为关键。
    2. 安全性加强:在当前网络攻击日益频繁的背景下,ProfiNET的高级安全机制,如端到端加密,提供了比Modbus更为强大的数据保护。
    3. 未来兼容性:随着工业4.0和数字化转型的推进,ProfiNET的扩展性保证了它能够适应未来更加复杂的自动化需求和新兴技术的整合。

    实际应用案例

    设想一个初始使用Modbus协议的制造工厂,随着生产规模的扩大和技术的进步,原有系统已无法满足工厂的运营需求。工厂决定升级其生产线控制器为ProfiNET。在这一过程中,通过安装适配器将原有的Modbus设备转换为支持ProfiNET的设备,工厂的PLC(可编程逻辑控制器)能够与传感器和执行器进行更高速的通信。此外,部署ProfiNET交换机也构建了一个更高效、可靠的网络基础设施。

    通过这种改造,工厂不仅显著提升了生产效率,还增强了系统的安全性和扩展性,为未来的进一步自动化和智能化升级打下了坚实的基础。

    结论

    转换从Modbus到ProfiNET的决策,是工业企业在追求更高效、更安全和更可扩展的生产系统过程中的重要步骤。随着技术的不断发展,这种转变不仅有助于企业保持竞争力,还能够更好地适应未来市场的变化和挑战。

  • 打破不可能三角:WISE如何重新定义大语言模型的知识记忆

    在科技日新月异的今天,大语言模型(LLMs)的应用越来越广泛。然而,随着世界知识的不断更新,这些模型也需要不断地进行知识更新,以纠正错误的回答和应对新兴的事实。这就引出了一个重要的问题:模型的记忆如何管理和更新?本文将介绍一项名为WISE的创新方法,旨在解决大语言模型的知识记忆问题。

    大语言模型的挑战

    大语言模型在扩展参数数量和计算能力方面展现出了惊人的智能潜力。然而,这些模型在实际应用中仍然会犯错,例如产生幻觉、不准确的回答以及偏见等问题。同时,世界的知识是不断变化的,因此模型在预训练期间所学的知识可能已经过时。

    为了应对这些挑战,研究人员提出了“终身模型编辑”的概念,即在不需要重新训练或微调的情况下,持续地更新模型的知识。这种方法不仅能够节省大量的计算成本,还能确保模型能够及时响应最新的知识和事实。

    不可能三角:可靠性、泛化性和局部性

    有效的终身模型编辑方法需要满足以下三个特性:

    1. 可靠性:模型在进行一系列编辑后,能够记住当前和之前的所有编辑。
    2. 局部性:编辑操作不会影响与编辑内容无关的预训练知识。
    3. 泛化性:模型不仅仅是记住查询和目标对,而是能够理解并泛化这些知识。

    然而,现有的方法在这三个特性上往往无法同时满足。这被称为“终身编辑的不可能三角”。

    现有方法的局限性

    现有的方法主要分为两类:编辑长期记忆和编辑工作记忆。长期记忆是指直接编辑模型的参数,这种方法容易与预训练的知识产生冲突,导致局部性差。工作记忆是指通过检索机制在推理时替换模型的表示,而不改变模型参数。这种方法虽然在可靠性和局部性上表现较好,但在泛化性上表现不佳,因为检索机制难以让模型理解和泛化编辑内容。

    WISE:桥接长期记忆与工作记忆的创新方案

    WISE(智慧编辑)通过引入双重参数记忆机制,克服了上述不可能三角。它包括主记忆(存储预训练知识)和侧记忆(存储编辑知识)。具体来说,WISE设计了以下组件:

    1. 侧记忆设计:侧记忆是从模型的某层前馈网络(FFN)中复制出来的一部分,用于存储编辑流。通过这种方式,编辑操作只影响侧记忆,不会改变主记忆,从而避免了知识冲突。
    2. 记忆路由机制:类似于检索机制,WISE通过一个路由组件来决定在推理时是使用主记忆还是侧记忆。
    3. 知识分片与合并:为了避免知识遗忘,WISE将侧记忆分成多个子空间进行编辑,然后通过模型合并技术将这些子空间合并成一个共同的侧记忆。

    实验与结果

    通过在GPT、LLaMA和Mistral等主流大语言模型上的广泛实验,WISE在问答、幻觉和分布外数据集上的表现优于现有的模型编辑方法。实验结果表明,WISE能够在终身模型编辑中更好地同时实现可靠性、泛化性和局部性,打破了不可能三角。

    结语

    WISE的出现为大语言模型的终身编辑带来了新的希望。它通过巧妙的记忆管理和编辑机制,不仅解决了长期记忆与工作记忆之间的矛盾,还为模型的持续进化提供了强有力的支持。未来,随着技术的不断发展,我们有理由相信WISE及其衍生技术将在更多应用场景中发挥重要作用。


    WISE: Rethinking the Knowledge Memory for Lifelong Model Editing of Large Language Models

    https://papers.cool/arxiv/2405.14768

    Authors: Peng Wang ; Zexi Li ; Ningyu Zhang ; Ziwen Xu ; Yunzhi Yao ; Yong Jiang ; Pengjun Xie ; Fei Huang ; Huajun Chen

    Summary: Large language models (LLMs) need knowledge updates to meet the ever-growing world facts and correct the hallucinated responses, facilitating the methods of lifelong model editing. Where the updated knowledge resides in memories is a fundamental question for model editing. In this paper, we find that editing either long-term memory (direct model parameters) or working memory (non-parametric knowledge of neural network activations/representations by retrieval) will result in an impossible triangle — reliability, generalization, and locality can not be realized together in the lifelong editing settings. For long-term memory, directly editing the parameters will cause conflicts with irrelevant pretrained knowledge or previous edits (poor reliability and locality). For working memory, retrieval-based activations can hardly make the model understand the edits and generalize (poor generalization). Therefore, we propose WISE to bridge the gap between memories. In WISE, we design a dual parametric memory scheme, which consists of the main memory for the pretrained knowledge and a side memory for the edited knowledge. We only edit the knowledge in the side memory and train a router to decide which memory to go through when given a query. For continual editing, we devise a knowledge-sharding mechanism where different sets of edits reside in distinct subspaces of parameters, and are subsequently merged into a shared memory without conflicts. Extensive experiments show that WISE can outperform previous model editing methods and overcome the impossible triangle under lifelong model editing of question answering, hallucination, and out-of-distribution settings across trending LLM architectures, e.g., GPT, LLaMA, and Mistral. Code will be released at https://github.com/zjunlp/EasyEdit.


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

    A: 这篇论文试图解决大型语言模型(Large Language Models, LLMs)在持续更新知识以适应不断变化的世界知识和纠正错误响应(例如幻觉、偏见和事实衰减)时面临的挑战。具体来说,论文关注的核心问题是如何在模型编辑(model editing)过程中有效地更新知识,以实现以下目标:

    1. 可靠性(Reliability):模型能够在连续编辑后记住当前和之前的编辑。
    2. 局部性(Locality):模型编辑不会影响与编辑知识无关的预训练知识。
    3. 泛化性(Generalization):模型不仅仅是记忆查询-目标对,而应该能够在给定相同知识的不同形式查询时理解和泛化。

    论文指出,在现有的模型编辑方法中,很难同时实现上述三个目标,这构成了一个“不可能三角”。作者通过提出WISE(Wise Editor)系统,旨在弥合长期记忆(模型参数)和工作记忆(通过检索得到的神经网络激活/表示)之间的差距,打破这一不可能三角,实现更有效的终生模型编辑。

    Q: 有哪些相关研究?

    A: 这篇论文提到了多个与大型语言模型(LLMs)的知识和记忆更新相关的研究工作。以下是一些主要的相关研究:

    1. 长期记忆与工作记忆:论文讨论了LLMs中的长期记忆(存储在模型参数中)和工作记忆(存储在神经元激活中)的概念,并引用了相关研究来支持这一分类。
    2. 模型编辑:论文提到了几种模型编辑方法,包括:
      • ROME:使用MLP(多层感知器)作为关键-值存储,通过最小二乘近似进行编辑。
      • MEMIT:扩展了ROME,支持多层编辑,允许同时更新成百上千的事实。
      • FT-EWC:使用弹性权重巩固(Elastic Weight Consolidation)来减轻灾难性遗忘。
      • MEND:使用超网络(hypernetworks)来转换梯度,以实现更泛化的编辑。
      • SERAC/DEFER:使用额外的小模型来存储编辑知识,并通过一个范围分类器和反事实模型进行检索和生成。
      • GRACE:使用离散的键-值码本,在推理时检索并替换隐藏层的激活。
    3. 记忆增强:论文讨论了一些旨在增强LLMs记忆能力的研究,例如:
      • MemoryLLM:提出一种具有可更新记忆的LLM架构。
      • SPALM:结合了工作记忆和长期记忆的存储模块。
      • Memoria:一种类似于人类顺序处理的Hebbian记忆架构。
    4. 知识注入:论文探讨了如何通过不同的方法向LLMs注入或更新知识,包括原位学习(in-context learning)和检索增强生成(retrieval-augmented generation)。
    5. 模型融合:论文提到了一些模型融合技术,这些技术研究如何将不同模型的知识聚合到一个模型中,例如:
      • TIES-Merging:一种解决干扰并合并模型参数的方法。
      • MergeKit:一个用于合并大型语言模型的工具包。
    6. 持续学习:论文讨论了持续学习领域中的一些方法,这些方法旨在解决深度学习模型在学习新知识时遭受的灾难性遗忘问题。
    7. 其他:论文还提到了一些其他与LLMs的编辑、记忆和知识更新相关的研究。

    这些研究为理解LLMs的记忆机制、改进模型编辑方法以及解决知识更新中的挑战提供了理论基础和实践指导。论文通过综合这些研究成果,提出了WISE系统,旨在克服现有方法的局限性,实现更有效的终生模型编辑。

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

    A: 论文通过提出WISE(Wise Editor)系统来解决大型语言模型(LLMs)在持续知识更新和模型编辑中遇到的挑战。WISE系统的设计包含以下几个关键组件和策略:

    1. 双参数记忆方案:WISE引入了一个主记忆(main memory)和一个侧记忆(side memory)。主记忆用于存储预训练知识,而侧记忆用于存储编辑后的知识。
    2. 记忆路由机制:WISE训练了一个路由器(router),在给定查询时决定通过哪个记忆(主记忆或侧记忆)进行处理。这类似于基于检索的方法,允许模型在处理与编辑相关的查询时使用侧记忆,而在处理不相关的查询时使用主记忆。
    3. 知识分割与合并:为了持续编辑,WISE设计了一种知识分割机制,将不同的编辑集合存储在参数的不同子空间中。这些子空间随后通过一种称为Ties-Merge的模型合并技术合并到一个共享的侧记忆中,避免了冲突。
    4. 侧记忆设计:侧记忆被初始化为LLM的某个FFN(Feed-Forward Network)层的副本,专门用于存储编辑流。这种方法避免了直接在原始参数上进行编辑,从而减少了对预训练知识的干扰。
    5. 路由激活指示:为了在推理时确定使用主记忆还是侧记忆,WISE引入了一个基于激活的路由指示器。这个指示器基于输入查询的激活值来决定使用哪个记忆。
    6. 随机梯度掩码:在知识分割过程中,WISE使用随机梯度掩码来编辑侧记忆的不同子空间。这些掩码是二进制的,其中一部分参数被随机选择进行更新,而其余参数保持不变。
    7. Ties-Merge合并技术:为了合并不同子空间的知识,WISE采用了Ties-Merge技术,该技术通过修剪冗余参数、选择参数的符号以及计算具有相同正确符号的参数的不相交平均值来解决冲突。

    通过这些设计和策略,WISE旨在实现在LLMs的终生模型编辑中的高可靠性、局部性和泛化性,克服了现有方法难以同时实现这三个目标的“不可能三角”问题。论文通过在不同的LLM架构(如GPT、LLaMA和Mistral)上进行广泛的实验,验证了WISE在问答、幻觉和分布外设置下的有效性。

    Q: 论文做了哪些实验?

    A: 论文中进行了一系列实验来验证WISE(Wise Editor)系统在终生模型编辑中的有效性。以下是实验的主要设置和结果:

    1. 实验设置
      • 数据集:使用了ZsRE(闭卷问答任务)、SelfCheckGPT(幻觉检测)、Temporal(分布外泛化)等数据集。
      • 模型:选择了流行的自回归大型语言模型LLaMA-2-7B、Mistral-7B和GPT-J-6B进行评估。
      • 基线:与多种现有的模型编辑和持续学习方法进行了比较,包括FT-L、FT-EWC、ROME、MEMIT、MEND、SERAC/DEFER和GRACE。
    2. 评估指标
      • 可靠性(Reliability):模型在编辑后能够正确预测编辑查询的能力。
      • 泛化性(Generalization):模型对不同形式查询的理解和泛化能力。
      • 局部性(Locality):模型编辑不会影响与编辑无关的预训练知识。
    3. 主要结果
      • WISE在多个任务和长期编辑序列后的表现优于现有方法。
      • 直接编辑长期记忆的方法(如ROME、MEMIT等)与之前的预训练知识产生冲突,导致局部性差。
      • 基于检索的工作记忆修改激活的方法(如GRACE、DEFER等)在多样化查询中泛化能力不足。
    4. 分布外评估
      • 使用Temporal数据集测试了模型编辑方法在新兴实体上的分布外泛化能力。WISE在处理分布外泛化任务时表现优异。
    5. 进一步分析
      • 路由激活的可视化:展示了WISE的记忆路由模块在不同编辑次数下的激活值,证明了其在保持编辑局部性和防止预训练分布发生大的变化方面的效果。
      • 侧记忆的定位分析:分析了在不同阶段的解码器层中编辑的效果,发现中后层是理想的侧记忆层。
      • ρ和k的分析:研究了WISE中重要的超参数——掩码比例ρ和子空间数量k,发现存在一个固有的合并锚点和合并冲突之间的权衡。
      • 扩展到3K次编辑:将连续编辑次数扩展到3K,发现WISE系列在高可扩展性方面保持了高性能。
    6. 推理时间分析
      • 分析了WISE在不同编辑次数下的推理时间,发现WISE-Merge引入了恒定的推理延迟,而WISE-Retrieve由于引入了检索路由,随着编辑次数的增加,推理时间有所增加。

    通过这些实验,论文证明了WISE在大型语言模型的终生编辑中实现了高可靠性、局部性和泛化性,克服了现有技术的局限。

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

    A: 尽管WISE在终生模型编辑方面取得了显著的成果,但仍有一些潜在的探索方向可以进一步改进和扩展其能力:

    1. 侧记忆检索的改进:如文中所述,侧记忆检索的准确性有待提高。可以通过更精细的激活管理或增强侧记忆之间的特异性来改进检索过程。
    2. 编辑指令的优化:在某些情况下,WISE在处理特定编辑指令时可能会出现错误。研究如何优化编辑指令以提高模型的准确性和一致性可能是一个有价值的方向。
    3. 跨领域编辑能力:WISE在单一数据集上的性能较好,但在跨领域编辑时可能会遇到挑战。探索如何使WISE能够更好地处理不同领域的知识编辑是一个重要的研究方向。
    4. 知识锚点的作用:文中提到知识锚点在模型合并中的重要性。进一步研究如何利用知识锚点来提高模型的泛化能力和稳定性值得深入探讨。
    5. 计算成本的优化:虽然WISE在计算成本方面表现出了较好的效率,但随着编辑次数的增加,如何更有效地管理计算资源仍然是一个值得关注的点。
    6. 模型泛化性的进一步提升:尽管WISE在某些任务上表现出了良好的泛化能力,但在某些情况下,如文中所述的一般化失败案例,模型的泛化性仍有提升空间。
    7. 模型解释性:提高模型编辑过程的可解释性,帮助研究人员和用户理解模型是如何进行知识更新和决策的,这对于建立信任和透明度至关重要。
    8. 安全性和伦理考量:随着技术的发展,确保模型编辑过程符合伦理标准并防止滥用是非常重要的。研究如何设计安全防护措施和伦理指导原则是一个关键议题。
    9. 多模态编辑能力:当前的研究主要集中在文本编辑上,未来可以探索如何将WISE扩展到多模态场景,例如结合图像、视频和文本进行知识编辑。
    10. 实时编辑和增量学习:研究如何使WISE能够支持实时编辑和增量学习,这对于动态环境中的知识更新尤为重要。
    11. 与其他记忆增强技术的集成:考虑将WISE与其他记忆增强技术(如增强工作记忆或长期记忆的方法)结合,以进一步提升LLMs的记忆和编辑能力。
    12. 社区和开源协作:鼓励社区参与和开源协作,以便集思广益,共同推动终生模型编辑技术的发展和应用。

    这些探索点不仅可以推动WISE技术的进步,还可能对整个大型语言模型编辑和持续学习领域产生深远影响。

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

    A: 这篇论文的主要内容可以概括为以下几点:

    1. 问题识别:论文指出大型语言模型(LLMs)在持续更新知识和纠正错误响应时面临挑战。现有的模型编辑方法难以同时实现可靠性、局部性和泛化性,构成了一个“不可能三角”。
    2. WISE系统:为了解决这个问题,论文提出了WISE(Wise Editor)系统。WISE采用双参数记忆方案,包括主记忆和侧记忆,并通过路由器决定在给定查询时使用哪个记忆。
    3. 知识分割与合并:WISE引入了知识分割机制,将编辑知识存储在不同的参数子空间中,并通过Ties-Merge技术合并这些子空间,避免了知识冲突。
    4. 侧记忆设计:侧记忆被初始化为LLM的某个FFN层的副本,专门用于存储编辑流,避免了直接在原始参数上进行编辑。
    5. 路由激活指示:WISE使用基于激活的路由指示器来决定在推理时使用主记忆还是侧记忆。
    6. 实验验证:论文通过在问答、幻觉检测和分布外泛化等任务上的实验,验证了WISE在不同LLM架构(如GPT、LLaMA和Mistral)上的有效性。
    7. 分析与讨论:论文对WISE的路由激活、侧记忆定位、超参数选择等进行了深入分析,并讨论了如何改进检索准确性和模型泛化能力。
    8. 结论:WISE成功克服了现有终生模型编辑方法的局限,实现了高可靠性、局部性和泛化性的统一,为大型语言模型的知识更新提供了一种有效的解决方案。
    9. 未来工作:论文提出了一些未来可能的研究方向,包括改进侧记忆检索、优化编辑指令、提高跨领域编辑能力和模型泛化性等。

    整体而言,这篇论文在终生模型编辑领域做出了重要贡献,提出了一种创新的解决方案,并对其进行了全面的评估和分析。

  • 大型语言模型如何应对长篇数学文本问题

    近年来,随着人工智能技术的迅猛发展,大型语言模型(LLMs)在解决数学问题方面展现出了巨大的潜力。然而,当前的研究大多集中在那些背景简短的问题上。现实生活中的数学问题往往涉及复杂的叙述和背景,这对大型语言模型提出了更高的要求。本文将探讨LLMs在解决长篇数学文本问题(MWPs)方面的能力,并介绍一种名为E-GSM的新数据集及相关研究成果。

    背景介绍

    数学文本问题(MWPs)是以自然语言形式呈现的数学问题,需要精细的推理能力来解决。传统的数学问题数据集,如GSM8K,通常包含简短的叙述,只有几句话。然而,这种设置与现实世界中的情况存在差异。现实中的数学问题往往有更长的背景,这可能会对数学推理过程产生影响。研究表明,长篇背景可能会阻碍而不是促进数学推理过程。

    研究目的

    本研究的主要目的是探讨LLMs在解决长篇数学文本问题(CoLeG,即Context Length Generalizability)的能力。为此,我们构建了一个名为Extended Grade-School Math(E-GSM)的数据集,这个数据集包含了从GSM8K扩展而来的长篇数学问题。我们还提出了两种新的指标来评估LLMs在解决这些问题时的效率和韧性。

    研究方法

    数据集构建

    E-GSM数据集的构建过程主要包括以下几个步骤:

    1. 初始数据选择:从GSM8K测试集中选择问题。
    2. 文本扩展:使用GPT-4-turbo模型通过2-shot示例法对原始问题进行扩展。
    3. 质量控制:通过人工评估和启发式方法确保扩展问题的质量。

    我们通过多轮扩展逐步增加问题的长度,最终获得了一个包含多个扩展轮次问题的综合数据集。

    评估方法

    我们使用七个专有LLMs和20个开源LLMs,以及三种最先进的零样本提示技术对E-GSM进行了评估。结果表明,LLMs在长篇数学文本问题上的表现较弱,尤其是在处理更长的背景时。

    解决方案

    为了解决这个问题,我们针对专有LLMs和开源LLMs分别提出了不同的策略:

    1. 专有LLMs:我们开发了一种名为条件检索指令(CoRe)的新提示技术。这种技术鼓励LLMs首先检索问题条件,然后应用不同的推理模块。
    2. 开源LLMs:我们建议在微调过程中将扩展作为辅助任务,并发布了包含65K条链式推理数据的微调数据集。

    研究结果

    我们的实验结果表明,这些策略在E-GSM及其他多个MWP基准测试上都表现出了显著的效果和较强的泛化能力。具体来说,CoRe和扩展微调任务不仅提高了LLMs在E-GSM上的准确性,还展示了其在其他数学问题基准测试中的广泛适用性。

    结论

    LLMs在解决长篇数学文本问题上的能力对于其在现实世界应用中的重要性不言而喻。我们的研究表明,长篇数学问题会显著降低LLMs的数学推理能力。通过提出有针对性的解决方案,我们不仅改善了LLMs在长篇数学问题上的表现,也为未来研究提供了宝贵的方向和方法。

    本研究为LLMs在复杂、真实世界应用中的使用铺平了道路,提供了实用的解决方案,并为模型泛化能力和训练方法的进一步探索开辟了新的途径。


    本文参考了《Can LLMs Solve Longer Math Word Problems Better?》一文中的研究成果,旨在为读者提供关于大型语言模型在解决长篇数学文本问题方面最新进展的深入洞见。希望通过这篇文章,您能对这一前沿领域有更清晰的认识。

    Can LLMs Solve longer Math Word Problems Better?

    https://papers.cool/arxiv/2405.14804

    Authors: Xin Xu ; Tong Xiao ; Zitong Chao ; Zhenya Huang ; Can Yang ; Yang Wang

    Summary: Math Word Problems (MWPs) are crucial for evaluating the capability of Large Language Models (LLMs), with current research primarily focusing on questions with concise contexts. However, as real-world math problems often involve complex circumstances, LLMs’ ability to solve long MWPs is vital for their applications in these scenarios, yet remains under-explored. This study pioneers the exploration of Context Length Generalizability (CoLeG), the ability of LLMs to solve long MWPs. We introduce Extended Grade-School Math (E-GSM), a collection of MWPs with lengthy narratives. Two novel metrics are proposed to assess the efficacy and resilience of LLMs in solving these problems. Our examination of existing zero-shot prompting techniques and both proprietary and open-source LLMs reveals a general deficiency in CoLeG. To alleviate these challenges, we propose distinct approaches for different categories of LLMs. For proprietary LLMs, a new instructional prompt is proposed to mitigate the influence of long context. For open-source LLMs, a new data augmentation task is developed to improve CoLeG. Our comprehensive results demonstrate the effectiveness of our proposed methods, showing not only improved performance on E-GSM but also generalizability across several other MWP benchmarks. Our findings pave the way for future research in employing LLMs for complex, real-world applications, offering practical solutions to current limitations and opening avenues for further exploration of model generalizability and training methodologies.

  • 人工智能与教育:Ken Koedinger教授论智能辅导系统

    前国防部长唐纳德·拉姆斯菲尔德曾说过:“我们不清楚我们不知道的是什么。”这句话揭示了一个深刻的困境,即“未知的未知”,这是军方和数据科学家都熟悉的概念。

    同样的原则也适用于教育领域。卡内基·梅隆大学的人机交互和心理学教授肯·科丁格(Ken Koedinger)认为,这种不确定性动摇了传统的教学方式。他指出,学生在学习过程中可能表现不佳,因为他们往往无法判断自己是否真正掌握了知识,或者是否还需要更多的训练。

    为了解决这一问题,科丁格教授提倡使用人工智能(AI)作为辅助教学的工具,而不是替代教师。他认为,智能辅导系统可以为学生提供个性化的课程设计,避免重复学习已掌握的内容,同时收集数据来完善学习系统。

    1. 你知道什么时候该学习吗?

    在哈佛大学的演讲中,科丁格教授向应用计算科学研究所的50位与会者提出了一个问题:“你知道你什么时候该学习吗?”

    这个问题的回答往往是两极分化的,而科丁格教授认为,正确答案是“不知道”。研究表明,学生通常无法准确判断自己是否需要学习,他们自认为的学习状态实际上可能是一种错觉。

    喜欢 vs. 学会

    一个典型的例子是,学生们常常认为喜欢某一课程就意味着能够学得更好。然而,科丁格教授的研究表明,喜欢与学会之间的相关性很低。使用AI软件检测学生参与情况的结果显示,那些自称喜欢课程的学生可能会关注错误的内容,而那些看起来困惑的学生可能正处于有效的学习过程中。

    科丁格教授指出,学生缺乏必要的专业知识,无法将他们所知与实际掌握的知识区分开来。而教师们则往往高估了学生的理解能力。例如,在学习高中代数问题时,教师们认为方程式是学生最容易解决的形式,但学生实际上在基本的数学词汇上就遇到了困难。

    2. “以数据开始和结束”

    智能辅导系统,特别是其生成的数据,可能有助于弥补认知上的差距。科丁格教授讲述了卡内基·梅隆大学开发的智能辅导系统Cognitive Tutor及其背后的项目。

    Cognitive Tutor基于机器生成的认知模型和表现模型,已经存在了几十年。认知模型基于解决问题所需的技能、如何获得这些技能、问题管理规则以及学生可能犯的错误等。

    认知模型的算法

    认知模型使用两种算法来测量性能:

    1. 模型跟踪算法:通过跟踪学生的个人表现提供动态帮助,找出学生困惑的知识点以及困惑的原因。
    2. 贝叶斯知识跟踪算法:通过追踪学生所学知识点,评估学生的掌握情况。

    所有智能辅导系统的模型都产生数据,这对教育研究和改善学习系统至关重要。科丁格教授指出,这些改进是在一个以数据开始和结束的连续循环中进行的。研究人员使用A/B测试法(称为“体内测试”)进行随机、可控的实验,评估改进效果。

    数据还可以揭示学生的学习方式,通过生成学习曲线,映射学生的错误率,为改进提供依据。智能辅导系统产生的数据可以帮助教育者将广泛的话题拆分为具体的、细微的小问题来解决。

    科丁格教授举例说,类似于网球运动员在发球有问题时,找出具体原因并有针对性地练习,教育工作者也可以通过数据发现学生具体的学习问题,并在这些点上进行反复练习。


    科丁格教授主张通过数据驱动的智能辅导系统,不仅能够实现个性化教学,还能通过持续的数据反馈和改进,显著提升学生的学习效果。


    卡内基·梅隆大学的人机交互和心理学教授肯·科丁格(Ken Koedinger)提出了一个引人深思的观点:学生常常不知道他们真正掌握了什么。他引用前国防部长唐纳德·拉姆斯菲尔德的名言“未知的未知”来说明这一点,这种困境在教育中尤为显著。

    主要观点概括:

    1. 学生的学习自我评估往往不准确
      • 学生通常无法判断自己是否真正掌握了知识,容易陷入自我误导的学习状态。
      • 喜欢某一课程并不等同于学会该课程,学生可能会把注意力集中在错误的内容上。
    2. 教师的认知偏差
      • 教师们往往高估了学生的理解能力,低估了学生在基础知识上的困难。
      • 专家们对自己的知识缺乏意识,无法准确评估学生的困惑点。
    3. 智能辅导系统的作用
      • 通过AI和数据驱动的智能辅导系统,可以为学生提供个性化的课程设计,避免重复学习已掌握的内容。
      • 这些系统生成的数据可以帮助教育者识别学生的具体问题,并提供针对性的练习。

    补充说明和重点:

    科丁格教授提倡的智能辅导系统,如Cognitive Tutor,利用认知模型和表现模型,通过模型跟踪算法和贝叶斯知识跟踪算法,动态地评估学生的表现。这种方法不仅能识别学生困惑的知识点,还能了解学生困惑的原因,从而提供更有针对性的帮助。

    数据在这其中起到了至关重要的作用。通过持续的数据反馈,教育者可以进行“体内测试”(A/B测试),评估和改进教学方法。数据还可以揭示学生的学习方式,生成学习曲线,帮助教育者将复杂的学习任务拆分为具体的小问题进行解决。

    例如,在网球训练中,如果发现运动员发球有问题,通过数据分析可以找出特定的原因,如扔球的方式,然后进行针对性的练习。同样,智能辅导系统可以通过数据发现学生的具体学习问题,进行精细化的教学调整。

    Ken Koedinger教授的观点强调,通过数据驱动的智能辅导系统,不仅可以实现个性化教学,还能通过持续的数据反馈和改进,显著提升学生的学习效果。这种方法打破了传统的教学方式,为教育领域带来了新的可能性。

  • MySQL 事务一致性要求的级别

    在 MySQL 中,事务一致性级别是通过隔离级别(Isolation Level)来控制的。不同的隔离级别提供不同程度的事务隔离,以平衡一致性和性能。MySQL 支持以下几种隔离级别:

    1. READ UNCOMMITTED(未提交读):最低的隔离级别。事务可以读取其他事务尚未提交的更改,会导致“脏读”问题。
    2. READ COMMITTED(提交读):事务只能读取其他事务已经提交的更改,避免了“脏读”,但可能会出现“不可重复读”。
    3. REPEATABLE READ(可重复读):默认隔离级别。事务在开始时看到的数据一致,即使其他事务修改了数据,当前事务也不会看到这些更改,避免了“不可重复读”,但可能会出现“幻读”。
    4. SERIALIZABLE(可串行化):最高的隔离级别。事务完全隔离,强制事务串行执行,避免了“脏读”、“不可重复读”和“幻读”,但性能最差。

    要调低事务一致性要求,可以选择较低的隔离级别,如 READ COMMITTEDREAD UNCOMMITTED。以下是调整 MySQL 隔离级别的方法:

    调整全局隔离级别

    要调整 MySQL 实例的全局隔离级别,可以使用以下 SQL 语句:

    SET GLOBAL transaction_isolation = 'READ COMMITTED';

    或者:

    SET GLOBAL transaction_isolation = 'READ UNCOMMITTED';

    调整全局隔离级别需要重启 MySQL 服务才能生效,或者你可以启动一个新的会话来观察变化。

    调整会话隔离级别

    要调整当前会话的隔离级别,可以使用以下 SQL 语句:

    SET SESSION transaction_isolation = 'READ COMMITTED';

    或者:

    SET SESSION transaction_isolation = 'READ UNCOMMITTED';

    查看当前隔离级别

    要查看当前会话或全局的隔离级别,可以使用以下 SQL 语句:

    -- 查看当前会话的隔离级别
    SELECT @@session.transaction_isolation;
    
    -- 查看全局隔离级别
    SELECT @@global.transaction_isolation;

    示例

    以下是一个完整的示例,展示如何在 MySQL 中设置和查看隔离级别:

    -- 设置当前会话的隔离级别为 READ COMMITTED
    SET SESSION transaction_isolation = 'READ COMMITTED';
    
    -- 验证当前会话的隔离级别
    SELECT @@session.transaction_isolation;
    
    -- 设置全局隔离级别为 READ UNCOMMITTED
    SET GLOBAL transaction_isolation = 'READ UNCOMMITTED';
    
    -- 重启 MySQL 服务以应用全局隔离级别的更改
    -- 对于大多数管理工具,可以用以下命令重启服务
    -- sudo service mysql restart
    
    -- 验证全局隔离级别
    SELECT @@global.transaction_isolation;

    注意事项

    • 调低隔离级别可以提高性能,但可能会牺牲数据一致性。
    • 在选择隔离级别时,需要权衡性能和一致性,根据具体的应用场景和需求做出选择。
    • 在高并发环境中,较低的隔离级别可能会导致“脏读”、“不可重复读”和“幻读”等问题,因此需要特别注意。

    通过调整 MySQL 的隔离级别,可以根据具体需求在性能和一致性之间找到适当的平衡。

  • Koa2 框架介绍

    Koa 是由 Express 的原始团队开发的,旨在成为一个更小、更富表现力且更健壮的 Web 框架。Koa2 是 Koa 的第二个主要版本,具有一些显著的改进和特性。以下是对 Koa2 框架的详细介绍和分析:

    Koa2 的特点

    1. 轻量和模块化
      • Koa 本身非常轻量,没有内置的中间件。
      • 它鼓励用户通过模块化的方式来构建应用,只需安装需要的中间件即可。
    2. 现代 JavaScript 支持
      • Koa2 采用了 async/await 语法,取代了 Koa1 中的 generator 函数。这使得异步代码更加简洁和易读。
      • 完全支持 ES6/ES7+ 特性,利用了现代 JavaScript 的优势。
    3. 中间件机制
      • Koa 的中间件机制类似于洋葱模型,支持中间件的顺序执行和嵌套。
      • 中间件可以在请求处理前后执行代码,提供了极大的灵活性。
    4. 无内置路由
      • 与 Express 不同,Koa2 不包括内置的路由功能。用户需要选择第三方路由库,如 koa-router
    5. 更好的错误处理
      • Koa2 通过 try/catch 块来处理异步错误,避免了传统的回调地狱和难以调试的问题。

    Koa2 的使用场景

    1. API 服务
      • 由于其轻量和高性能,Koa2 非常适合用于构建 RESTful API 服务。
      • 中间件机制可以轻松处理身份验证、日志记录、错误处理等任务。
    2. 单页应用(SPA)后端
      • Koa2 可以用作前端单页应用的后端,提供数据接口和简单的路由功能。
    3. 微服务架构
      • 由于其模块化设计,Koa2 非常适合于微服务架构中的单个服务。
      • 每个微服务都可以独立部署和扩展。

    Koa2 示例代码

    以下是一个简单的 Koa2 应用示例:

    const Koa = require('koa');
    const Router = require('koa-router');
    
    const app = new Koa();
    const router = new Router();
    
    // 中间件示例
    app.use(async (ctx, next) => {
      console.log(`{ctx.method}{ctx.url}`);
      await next();
    });
    
    // 路由示例
    router.get('/', async (ctx, next) => {
      ctx.body = 'Hello, Koa2!';
    });
    
    router.get('/hello/:name', async (ctx, next) => {
      const name = ctx.params.name;
      ctx.body = `Hello, ${name}!`;
    });
    
    app
      .use(router.routes())
      .use(router.allowedMethods());
    
    app.listen(3000, () => {
      console.log('Server is running on http://localhost:3000');
    });

    Koa2 的优势

    • 高性能:由于 Koa2 的轻量和无内置中间件设计,其性能表现优异。
    • 灵活性:开发者可以自由选择和组合中间件,构建出适合自己需求的应用。
    • 现代化:全面支持 async/await,代码更加简洁和易读。

    Koa2 的局限性

    • 学习曲线:对于新手来说,Koa2 的学习曲线可能比 Express 稍陡。
    • 依赖第三方库:没有内置的路由、模板引擎等功能,需要依赖第三方库。

    总结

    Koa2 是一个现代、轻量且高效的 Node.js Web 框架,非常适合构建 API 服务和微服务。其模块化和中间件机制提供了极大的灵活性,使开发者可以根据需求自由组合功能。如果你喜欢现代 JavaScript 并且需要一个高性能的框架,Koa2 是一个非常不错的选择。


    Koa 是一个由 Express 的原始团队开发的 Node.js Web 框架,旨在提供一个更小、更富表现力且更健壮的基础来编写 Web 应用和 API。以下是 Koa 的历史和发展过程:

    Koa 框架的发展历史

    1. 初创背景

    Koa 的诞生背景与 Express 密切相关。Express 是最早的一批 Node.js Web 框架之一,由 TJ Holowaychuk 创建,并迅速成为最流行的 Node.js Web 框架之一。然而,随着 Node.js 和 JavaScript 生态系统的发展,Express 面临一些技术债务和设计局限性。

    • Express 的局限性
    • 使用了回调函数来处理异步操作,容易导致“回调地狱”。
    • 中间件的执行顺序较难管理。
    • 错误处理机制不够完善。

    2. Koa 的诞生

    为了克服这些局限性,TJ Holowaychuk 和其他核心开发者开始设计一个新的框架,这个框架就是 Koa。Koa 的目标是提供一个更现代、更灵活的开发体验。

    • 发布时间:Koa 的第一个版本于 2013 年发布。
    • 主要设计理念
    • 轻量和模块化:Koa 本身非常轻量,没有内置的中间件,鼓励用户通过模块化的方式来构建应用。
    • 现代 JavaScript:Koa 充分利用现代 JavaScript 特性,如 Generator 函数(在 Koa v1 中)和 async/await(在 Koa v2 中)。
    • 中间件机制:采用洋葱模型的中间件机制,提供了灵活的请求响应流程控制。

    3. Koa v1

    Koa v1 使用了 ES6 的 Generator 函数来处理异步操作,这在当时是一个非常前沿的设计。Generator 函数提供了优雅的异步控制流,但它们的使用方式相对复杂,特别是对于新手开发者。

    • Generator 中间件:Koa v1 的中间件是 Generator 函数,需要使用 yield next 来处理下一个中间件。
    • 代码示例
      const koa = require('koa');
      const app = new koa();
    
      app.use(function* (next) {
        this.body = 'Hello, Koa v1!';
        yield next;
      });
    
      app.listen(3000);

    4. Koa v2

    随着 ES7 async/await 的引入,JavaScript 的异步编程变得更加简单和直观。Koa 团队决定在 Koa v2 中采用 async/await 来取代 Generator 函数。

    • 发布时间:Koa v2 于 2017 年正式发布。
    • 主要改进
    • 使用 async/await 来处理异步操作,使代码更加简洁和易读。
    • 保持轻量和模块化的设计理念。
    • 代码示例
      const Koa = require('koa');
      const app = new Koa();
    
      app.use(async (ctx, next) => {
        ctx.body = 'Hello, Koa v2!';
        await next();
      });
    
      app.listen(3000);

    5. 发展和现状

    Koa 在发布之后,迅速获得了社区的认可,特别是在需要高性能和灵活性的场景中,如 API 服务和微服务架构。由于其轻量和模块化的设计,Koa 被广泛用于构建各种类型的 Web 应用和服务。

    • 社区和生态:Koa 有一个活跃的社区和丰富的中间件生态系统,开发者可以找到各种所需的中间件来扩展 Koa 的功能。
    • 持续维护和更新:Koa 核心团队持续维护和更新框架,确保其与最新的 Node.js 和 JavaScript 规范保持兼容。

    总结

    Koa 是由 Express 的原始团队开发的,旨在提供一个更现代、更灵活的 Node.js Web 框架。通过采用 async/await 等现代 JavaScript 特性,Koa 提供了一个更优雅的异步编程模型。其轻量和模块化的设计使其成为构建高性能 Web 应用和 API 的理想选择。随着社区和生态系统的不断发展,Koa 仍然是一个受欢迎的 Node.js Web 框架。

  • 职业发展中的市场切入与个人成长

    引言

    在职业发展的道路上,选择行业与市场切入点是至关重要的。尤其是在计算机行业,如何应对市场需求、选择合适的工作路径,直接影响到个人的职业成长和发展方向。

    选择行业与市场切入

    当你选择了一个行业,首先要考虑的是如何切入市场。对于计算机行业而言,市场被大公司所占据,对于个人而言,切入市场的方式就是迎合这些公司的招聘要求,这相当于从被动的角度去解决问题。

    为什么现在有这么多培训班,特别是Web前端,招生宣传往往是“一毕业就18K”?追根溯源,这是因为外包公司能给到这个价格。

    外包与自研公司的薪资差异

    为什么外包能给18K,而自研公司却不能?因为外包对接的是甲方客户,甲方一个岗位,初、中、高、专级别划分,能给到18K的,基本是中高级别的外包。但是你知道甲方给外包多少钱吗?据我了解,可以开到25~30K,中间的差价,相当于是外包公司的毛利了。

    你以为这就完了?大公司的部门之间是有HC(Headcount,俗称人头)差异的。如果A部门的项目缺人,又没有HC,怎么办?找有富余HC的B部门,借调。可以是直接调人,也可以是借HC自己招人,只不过招来的是挂在B部门的编制下。而A部门的预算,要支付给B部门「服务费」,我们部门的收费标准是50K。

    你没听错,一个50K的技术服务费,落到真正干活的外包手上,往往只有15~18K。

    那我们部门傻吗,花50K去招一个外包?项目的压力就摆在那里,干不完就影响年终绩效,反正花的是公司的预算,50K也收不到自己的腰包,而且对部门领导而言,这点钱都不够年终奖塞牙缝的。

    那公司傻吗,允许手底下这么做?因为要抢市场,或者是优化流程,这些带来的收益,往往能增加几千万利润或者节省几百万的成本。财报好看了,股票涨了,股东开心了,领导年终奖有着落了,皆大欢喜。区区50K一个的外包岗算什么,连服务器租赁费的零头都算不上,何况做完项目了还能优化掉。

    培训班与自研岗位的挑战

    那回到18K,为什么培训班出来的Web前端,大部分没法直接去自研?

    1. 薪资与技术要求:18K在深圳的自研公司算是比较高的薪水,对技术要求也比较高,而且岗位歧视严重,大部分公司宁可给JAVA岗20K,也不愿给前端18K。
    2. 简历包装:简历是包装过的,真正接手了18K的工作,往往会非常痛苦,待不久。
    3. 自研公司的市场地位:大部分自研公司都在吃市场的边角料,盘子/利润做不大,怎能提高员工待遇?老板又不是来做慈善的。

    内编与外包的选择

    为什么大公司都喜欢用外包?因为内编麻烦啊!一个月薪20K的内编,企业往往要付出远超20K的成本,招聘流程又臭又长,每年还要搞考核,还不能随意裁员。

    但还是因为利益问题,部门必须要有内编镇场,而且有些东西,外包就是做不了,比如核心算法、服务器部署权限等等,这些都要用合同和股票来捆绑。

    公司越大,岗位越重要,越是会弄A/B角备份机制,防止某些人权重过高,「功高震主」这句话不是开玩笑的,这点尤其体现在技术岗上。

    技术学习与个人恐惧感

    如果你只知道学技术,刷题,即便你的技术再好,内心深处仍然会有被别人支配的恐惧感。而且,你时常会疑问,技术到底学多少,才能没有恐惧感?答案是,越学技术,很可能你会越质疑自己。

    我先后待过N家世界五百强公司,可以明确地说,公司越大,用到的技术可能性越多,涉及的会议也越多,留给真正写代码的时间反而变少了。技术越好,责任越大,这种压力并不会因为技术水平的提升而减少,反而可能会加剧。

    从供需关系切入市场

    在思考职业发展时,不能仅仅依靠技术,必须从社会的供需关系切入市场。通过复利的原理来塑造和扩大一个模式,这个模式可能并不是高科技,但它能够解决实际问题,为别人创造价值。这种方法不仅适用于计算机行业,也适用于其他行业。

    复利思维的重要性

    复利思维指的是通过一次性投入,获取多次收益。比如,开发一个软件工具,虽然前期投入很大,但一旦开发完成,只要市场有需求,就能持续产生收益。这个工具可能只是一个简单的应用,但它解决了用户的痛点,满足了市场需求。

    实际案例

    例如,一位程序员开发了一款高效的任务管理工具,前期投入了大量时间和精力,但上线后,不断有用户购买和订阅。这款工具解决了很多人工作效率低的问题,因此获得了广泛的市场认可。通过复利效应,这位程序员不仅收回了前期的投入,还持续获得了丰厚的回报。

    建立自己的圈子

    在复杂的工作环境中,建立自己的圈子至关重要。通过建立自己的影响力和网络,可以掌握主动权,而不是被动地适应外部环境。

    圈子的力量

    一个强大的圈子不仅能够提供技术支持,还能在职业发展中提供宝贵的机会和资源。通过与业内人士交流,获取第一手的行业信息,了解最新的发展趋势,这些都能帮助你在职业道路上走得更远。

    如何建立圈子

    1. 参加行业活动:多参加行业会议、技术沙龙等活动,结识更多业内人士。
    2. 在线交流:利用社交媒体和专业论坛,积极参与讨论,分享自己的见解和经验。
    3. 持续学习:保持对新技术和行业动态的关注,不断提升自己的技能和知识储备。

    总结

    在职业发展的道路上,技术不能脱离市场单独存在。任何技术都需要与市场需求结合,才能真正创造价值。通过复利思维,实现持续增长,并通过建立自己的圈子,掌握职业发展的主动权。这些策略不仅适用于计算机行业,也适用于其他行业的发展。

    希望这些分析和建议能帮助更多人在职业选择和个人发展中做出明智的决策。无论你处于职业生涯的哪个阶段,这些原则都能为你提供有价值的指导和帮助。

  • 《德国电梯社会:一个欧洲心脏地区的危机》

    Reblog via Libgen中文新书速递

    《德国电梯社会:一个欧洲心脏地区的危机》
    作者:[德] 奥利弗·纳赫特威 (Oliver Nachtwey)等
    华东师范大学出版社 2023
    下載:libgen.is/book/index.php?md5=3

  • 在Android系统中,有时候应用程序或系统会发出“beep”声。要在代码中关闭这个声音,可以采取以下几种方法

    1. 禁用系统声音

    你可以通过编写代码来关闭特定的系统声音。以下是一个示例,展示了如何关闭按键声音:

    AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    audioManager.setStreamMute(AudioManager.STREAM_SYSTEM, true);

    请注意,这种方法会关闭所有系统声音,不仅仅是“beep”声。

    2. 调整音量

    你也可以通过调整音量来降低或关闭声音。以下是一个示例:

    AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    audioManager.setStreamVolume(AudioManager.STREAM_SYSTEM, 0, 0);

    3. 捕获并处理系统音效

    如果你只想在特定情况下关闭声音,例如按下某些按钮时,可以捕获这些事件并处理它们:

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_YOUR_KEY) {
            // 阻止系统发出声音
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    4. 禁用按键声音

    如果你的应用中有特定的UI组件(如按钮),你可以禁用它们的按键声音:

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click me"
        android:soundEffectsEnabled="false"/>

    或者通过代码:

    Button button = findViewById(R.id.your_button);
    button.setSoundEffectsEnabled(false);

    5. 修改音频焦点

    在某些情况下,你可以通过管理音频焦点来暂时关闭声音:

    AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    audioManager.requestAudioFocus(null, AudioManager.STREAM_SYSTEM, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);

    注意事项

    • 需要适当的权限来控制音频设置。
    • 请确保这种操作不会影响用户体验,特别是如果用户依赖某些声音提示。

    通过以上方法,你可以在代码中控制和关闭Android系统中的“beep”声音。

  • 《性心理学(专家伴读版)》

    Reblog via Libgen中文新书速递

    《性心理学(专家伴读版)》
    作者:【英】哈夫洛克·霭理士
    海南出版社 2024
    下載:libgen.is/book/index.php?md5=4