即刻App年轻人的同好社区
下载
App内打开
汉松
96关注237被关注0夸夸
大厂大模型应用开发 | AI实践者 | 终身学习者
汉松
1天前
DeepSeek的论文每篇都是精品,R1养活了一批研究强化学习的人,OCR这篇意味CV研究员的春天到来了。用图片替代文本输入,确实是很有开创性的想法。DeepSeek真是开源菩萨,换做CloseAI估计要藏一辈子。

大模型在处理长文章时,消耗的计算量会爆炸性增长。

但如果把文字“画成图片”,模型只需要很少的“视觉 token”就能理解同样内容。

就像人看书一样,我们也是靠视觉来阅读文字,如果这个方向靠谱,那么我们就相当于用OCR技术给大模型装上了眼睛。

GitHub - deepseek-ai/DeepSeek-OCR: Contexts Optical Compression

04
汉松
3天前
从零实现 vLLM 的第四篇文章,我们将目光转向 Transformer 架构中另一个看似简单、却至关重要的组件:RMSNorm(均方根归一化)。

我们先来看看什么是归一化,假设你刚考完期末考试,三门课的成绩出来了:
数学:120分(满分150)
英语:80分(满分100)
物理:160分(满分200)

哪门课考得最好?如果你直接比较 120、80、160,会得出物理最好的结论。但真实情况是:三门课其实考得一样好。
数学:120/150 = 80%
英语:80/100 = 80%
物理:160/200 = 80%

这就是归一化的核心思想:把不同量纲、不同范围的数据转换到统一的标准下进行比较。

为什么神经网络需要归一化?

想象一下,你在玩传话游戏。第一个人说"我喜欢苹果",传到第十个人那里变成了"我喜欢菠萝"。这就是深度神经网络面临的问题。

每一层网络都会对输入做一些计算,然后把结果传给下一层。问题是,随着层数增加,这些数值会变得越来越不可控——要么爆炸式增长,要么消失得无影无踪。就像传话游戏一样,信息在传递过程中逐渐失真。

在模型中加入归一化层,能够降低梯度爆炸或者消失的概率,模型的训练过程变得更加稳定。归一化技术从一开始的 BatchNorm 先演进到 LayerNorm,最后进化到了 RMSNorm,成为大模型的标配。

我的文章会带大家走进归一化技术的演进史,感兴趣的可以查看原文。

https://mp.weixin.qq.com/s/07TP9WaBImHHJfis0_Y05A

00
汉松
5天前
Claude Agent Skills 本质上是一种“上下文卸载”,把冗长的技能信息移出上下文,按需加载。巧的是最近 Manus Peak 也分享一些“上下文卸载”的技巧。Manus 有很多工具,但是并不会把这些工具的完整定义告诉模型。那它怎么知道有哪些工具,又怎么调用它们呢?想象一下,给你一台新电脑,你怎么知道有哪些工具能用?普通用户会打开应用程序的列表,程序员会 `ls /usr/bin` 看一下有哪些命令可以用。

同样的,Manus 的解法是在系统提示词中,告诉模型在某个特定文件夹里,有许多预装的命令行实用工具。那些最常用的工具(ls、grep、cat、less、more等),就默认内置在系统提示里面的。不需要告诉模型如何使用这些工具,只需要列出工具名,然后告诉它可以使用 --help 参数来了解如何使用工具。最妙的是这些 shell 操作模型都是学过的,所以它的泛化能力很强,要加新的工具只需要往文件夹里面放一个命令就行。

我发现 Manus 真的是把 Unix 哲学贯彻到底了:KISS(Keep It Simple, Stupid)。
00
汉松
15天前
Sutton 最近跟 Dwarkesh 有个访谈,老爷子认为 LLM 并不是通向 AGI 的正确道路。搞笑的是:LLM 支持者 Dwarkesh 认为 LLM 是符合 “The Bitter Lesson” (通用计算方法加大规模数据终将战胜人工设计的策略)的,却被 Sutton 无情打脸。我看完访谈的最大感受是 Sutton 的观点有点抽象,后来我读了《智能简史》这本书,才完全理解了 Sutton 的观点。

Sutton 在访谈里面提到:大模型只是在模仿人类,而不是真的理解了世界。大模型智能预测人类会说什么,而不能预测会发生什么。这个观点说实话很抽象,但我从《智能简史》的一个例子中理解了他的意思。

大脑有一种神奇的能力,它可以想象未来会发生什么,《智能简史》用老鼠迷宫实验非常形象的介绍了这种能力。

实验过程大致如下:研究人员将一只老鼠放进一个T型迷宫,迷宫的右臂尽头有食物。经过几次尝试,老鼠学会了右转去获取食物。但接下来,实验者将迷宫旋转了180度,入口和岔路口的位置都变了,但食物仍然在房间的同一个绝对位置。此时,如果老鼠只是学会了“右转”这个动作,那它应该还会右转,但这样它就会走向错误的方向。然而,实验中的老鼠在路口停下来左右摇头思考了一下,最终选择了左转,并成功找到了食物。

这个实验说明,老鼠并不是死记硬背了向右转的动作,而是在大脑中建立了一个关于迷宫和食物位置的空间地图,一个“世界模型”。当迷宫被旋转后,老鼠能够利用这个内在的地图,在大脑中想象食物的位置,以达到获取食物的目的。它理解了目标(食物)在空间中的位置,而不是机械地重复之前被奖励的行为。后来的研究者通过监测老鼠的大脑神经活动,证明了它确实在脑中分别演练了两种选择的结果。

相比之下,鱼就没有这么聪明了。取一条鱼放入水箱,箱中设有透明隔板。在隔板一角开个小孔,使鱼能从一侧游至另一侧。让鱼自由探索水箱,找到小孔并花些时间来回游动。数日后进行新操作:将鱼置于水箱一侧,在透明隔板的另一侧放置食物。结果发现鱼花了跟第一次一样的时间才找到小孔位置,也就是说鱼并没有建立世界模型。

这些实验可以用来解释Sutton的观点。Sutton认为,真正的智能,需要像老鼠一样,能够在内在建立一个世界模型,并利用这个模型去灵活地适应和解决问题,而不仅仅是在已有的数据中寻找最优的“下一个词”。现在的大语言模型,本质上是在一个极其庞大的“语言迷宫”里,通过海量的数据训练,学会了在某个“路口”(当前上下文),选择最有可能的下一个“方向”(下一个词)。它能够预测人类会说什么,因为它已经“看”过了无数人类在相似情境下的选择。

然而,一旦我们稍微改变“迷宫”的结构,提出一个它从未见过的、需要真正理解世界才能回答的问题,或者要求它根据现实世界的变化做出预测,它可能就会像那只鱼一样,暴露出其死记硬背的本质。比如有研究者发现,当使用 LLM 作为评判工具时,只需要加一个“解”,甚至只是空格、冒号等符号,就能让毫无意义的回答骗得高分。

Sutton 看来,仅仅通过扩大数据和计算量来训练大模型,只是在让模型更擅长模仿人类的语言模式,而无法真正地理解世界,因此 LLM 不是通向AGI的正确道路。

虽然我赞成 Sutton 的说法,LLM 相比大脑确实不够“智能”,但是从实用主义的角度看,即使 LLM 只会模仿人类,如果它确实能完成人类的工作,那么这算不算实现了 AGI?俗话说得好:“当一个东西走路像鸭子、叫声像鸭子,那它就是鸭子。”我自己是不纠结技术路线的,我只关心 AI 是不是真的能解决我的问题,而且我认为 LLM 可以帮助我们更快破解大脑智能之谜。

最后也推荐大家可以读一下《智能简史》这本书,作者是搞 AI 出身的,为了研究 AI 学习了很多神经科学的知识,他将神经科学的研究成果跟机器学习的知识串联起来。所以我读的非常爽:就像飞机是从鸟类的飞行得到启发一样,AI 的很多突破都源于我们对大脑的研究。
11
汉松
24天前
小米 17 pro 到手,我最喜欢的一个功能就是用眼习惯提醒。眼睛离手机太近,躺着玩手机,光线太暗等情况都会提醒我注意。早点有这个功能我眼睛度数应该能降低不少。
10
汉松
28天前
Meta 最近一直在研究无监督的提升模型效果的方法,最近发了一篇《Compute as Teacher》,主要就是在研究怎么在强化学习的时候没有答案也能给模型提供奖励。

CaT 的核心解法可以概括为一种 “自监督循环”。它的运作方式是:

1. 探索 :首先,让当前的模型针对一个问题,并行生成多个(比如 8 个)不同的答案(rollout)

2. 综合:接着,让一个“冻结”的、初始版本的模型(被称为“anchor”)读取这所有的 rollouts,最终“合成”出一个全新的、质量更高的参考答案

3. 监督:最后,用这个合成的答案作为标准答案,来为第一步中生成的各个 rollouts 打分,通过强化学习(RL)来优化当前模型

这个方案其实有点像 Best of N 的变种。虽然看起来很 make sense ,但是我觉得可能对于大部分公司是不适用的。因为如果我有一个更强的教师模型的话,我其实不需要去自监督。前面的 anchor 模型完全可以换一个更强的模型去对答案进行综合打分。我觉得最后得出来的答案效果应该是更好的。可惜论文里面也没有做相关的对比实验。

可能这个方法更适用 OpenAI,Google 这种模型厂商,因为他们的模型已经足够强了,没有其他教师模型可以教他们,这时候自监督才有用。
00
汉松
29天前
DeepResearch Agent 有一个很大的问题就是多次的搜索阅读很容易就把上下文窗口用光了,常规的做法是像 Claude Code 一样,超过阈值就触发记忆压缩。通义的论文《ReSum》提出了一种在 RL 中让模型学会更好地利用压缩内容的方法。

这个方法我们之前也考虑过,但这样做在强化学习的时候会有一个问题:一旦触发记忆压缩,整个历史记录都会变成压缩后的内容,此时模型就只能看到压缩后的 token,压缩前的就丢掉了,此时模型就学不到压缩前的动作了。我们当时没想到好的解法,而 ReSum 提出一种可行的方案:把压缩前和压缩后的轨迹分成两条分别给奖励。类似于老板让小明去找资料,小明找了一天没找到,但是小明把有价值的结果或线索整理成了一份简单的报告,第二天小红接手了这个任务,基于小明的报告继续找找到了。老板同时奖励了小明小红。

举个例子:

正常的轨迹是这样的:“用户查询 AI 助手 工具调用 AI 助手 →... AI 助手 答案”

加入了 summary 工具之后,当轨迹接近上下文窗口的时候,系统就会触发总结。

接近上下文窗口长度的轨迹 A:“用户查询 AI 助手 工具调用 AI 助手 →... AI 助手 summary”

新的轨迹 B:“用户查询 + 摘要 AI 助手 工具调用 AI 助手 答案”

关键点来了,当 B 答对时,B 的奖励会复制给 A。为什么要这样做?

尽管 A 没有直接得出答案,但它找到了一个有用的摘要,最终导向了正确的答案,所以 A 中的所有动作也得到了正向的激励。这样模型能通过 A 学会收集能够产生优质摘要的关键信息。而模型则通过 B 学会了利用摘要信息来高效地完成任务。这就是一箭双雕。
00
汉松
1月前
通义发布的 DeepResearch Agent 六篇论文我都看完了,最喜欢的一篇是《WebWeaver》,它压缩上下文的方法非常有启发,所有需要 AI 长文写作的场景都可以参考。

一般让 AI 写长文都是把资料一股脑放到上下文里面,这会导致模型注意力错乱,因为参考的资料太多,上下文太长,模型不可避免会忽略一些重要信息或者被无关信息误导。

WebWeaver 的解法是分而治之,在写作大纲里面放入引用的资料 id,然后让模型一个个章节写,写每个章节的时候都只提供当前这个章节的资料,这样就避免了上下文太长的问题,保护了模型的注意力。

上面的写作过程也是 Agentic 的,不需要硬编码让模型按顺序写,而是直接把整个大纲提供给它,让它自己调用查询资料的工具一步步写出来。这里还有个压缩上下文的技巧是在写最新的章节的时候,把之前的章节的资料都隐藏,只保留写作结果,这样模型既有全局的信息,又能节省上下文。

大纲示例
```
1. Hoehn and Yahr Scale Classifications <citation>id_2, id_6, id_9, id_12, id_13, id_14, id_15, id_17, id_20, id_21</citation>
```
资料查询工具示例
```
{"name": "retrieve", "arguments": {"url_id": ["id_2", "id_6", "id_9", "id_12", "id_13", "id_14", "id_15",
"id_17", "id_20", "id_21"], "goal": "Gather comprehensive information about Hoehn and Yahr scale
classifications and disease staging systems for Parkinson’s disease"}}
```

这种利用查询工具传递 id 的方式来压缩上下文,我在 DeepResearch 的阅读工具里面也用过,主要是用来减少模型生成 url 比较慢的问题,但用在写报告的阶段我确实没想到,对我很有启发。

但这种 Agentic 的方式相比用 Workflow 的方式效果好多少,我是存疑的,因为你让模型自己调用FunctionCall 可能会有幻觉,用代码的方式手动解析大纲然后用 Workflow 的方式可能更可靠。后续我也会做实验对比看看。
01
汉松
1月前
从零实现 vLLM 的第三篇文章,我们来了解如何加速 Attention 计算,学习 FlashAttention 的原理。

要理解 FlashAttention 的巧妙,我们必须先理解传统注意力机制的“笨拙”之处。

匹配度计算(QK):你(Query)拿着一个“科幻小说”的主题清单,去比对图书馆里成千上万本书的标签(Key),得出一个巨大的“匹配度”分数表。

权重分配(Softmax):你将这张分数表转化为百分比,告诉你应该投入多少“注意力”到每一本书上。

内容加权(AV):最后,你根据这些百分比,将所有书的内容摘要(Value)融合,得到一份为你量身定制的、关于“科幻小说”的综合信息。

这个流程在理论上无懈可击,但在实际的硬件执行中,却隐藏着一个致命的性能瓶颈。

想象一下GPU的内存结构:它有一小块速度飞快的“片上内存”(SRAM),就像你手边的工作台;也有一大块容量巨大但速度较慢的“全局内存”(DRAM/HBM),如同一个需要长途跋涉才能到达的中央仓库。

传统的注意力计算,就像一个效率极低的工匠。他在工作台(SRAM)上完成第一步,计算出那张巨大的“匹配度”分数表后,并不直接进行下一步。相反,他必须先把这张巨大的、还只是“半成品”的表,辛辛苦苦地运送到遥远的中央仓库(DRAM)存放。接着,为了进行第二步Softmax计算,他又得从仓库把这张表取回来。计算完成后,得到的“注意力权重”表,又是一个半成品,他再次将其送回遥远的仓库。最后,为了完成第三步,他需要同时取回“权重”表和所有书籍的“内容”,才能在工作台上完成最终的融合。

这个过程中,真正的计算(点积、Softmax)或许耗时并不长,但来回搬运这些巨大中间产物(匹配度矩阵和注意力矩阵)的时间,却成了无法忍受的开销。 这就是I/O瓶颈——当序列长度N增加时,这些中间矩阵的大小会以 N 平方 的速度急剧膨胀,频繁的读写操作会让GPU的大部分时间都浪费在等待数据上,而非真正的计算。

FlashAttention的革命:合并工序,一步到位

FlashAttention的作者们洞察到了问题的本质:我们需要的只是最终的结果O,中间过程的矩阵其实根本不必“留档”。

于是,他们进行了一场工作流程的革命。他们没有发明新的工具或公式,而是彻底改造了生产线,将三个独立的工序融合成一个在高速工作台(SRAM)上一气呵成的“超级工序”。

这场革命的核心武器有两个:分块(Tiling) 在线Softmax(Online Softmax)。

1. 分块处理:

FlashAttention不再试图一次性处理所有书籍(整个K和V矩阵)。而是像一位聪明的工匠,把任务分解。他每次只从仓库中取一小批书的标签(K块)和内容(V块)到他的工作台上。

2. 在线Softmax的魔法:

这是整个流程中最精妙的部分。传统的Softmax需要“总览全局”才能计算,这也是为什么它难以被分块的原因。但FlashAttention通过一种巧妙的递推算法,实现了“在线”更新。

想象一下,工匠在处理完第一批书后,会得到一个临时的、局部的结果,并记录下两个关键的“全局统计数据”:到目前为止见过的最高匹配分(m)和当前结果的归一化因子(d')。当第二批书的数据被取到工作台上时,他不需要回头看第一批书的细节。他只需利用新一批书的数据和之前存下的那两个“全局统计数据”,就能计算出一个更新后的、融合了前两批书信息的新结果,并再次更新这两个统计数据。

这个过程不断重复,每一批新的K/V数据块都被加载到高速SRAM中,与Q进行计算,然后用来迭代更新最终的输出O以及那几个关键的统计量。自始至终,那张庞大的、完整的注意力分数矩阵从未在任何地方被完整地构建出来。 它就像一个在计算过程中短暂存在的“幽灵”,用完即逝,从而彻底消除了对慢速全局内存的读写瓶颈。

FlashAttention的成功,给我们带来了远超于算法本身的启示。它证明了,在AI的“摩天大楼”越建越高的今天,地基:计算机体系结构,它的重要性从未改变。

它的巧妙之处,不在于发明了更复杂的数学公式来拟合数据,而在于深刻理解了硬件的工作原理,并用最经典、最基础的计算优化思想:减少内存访问,去解决一个看似前沿的AI问题。

一个为 Attention 计算带来极大加速的技术,其内核只不过是一场计算机体系结构的大师级实践课。它证明了,最深刻的优化往往不是发明新事物,而是熟练掌握最基本原则,并应用于新的硬件之上。

山川地貌会变,但万有引力定律亘古不变。

对技术细节感兴趣的可以阅读公众号的原文,算法公式比较抽象,我画了很多图来辅助理解,链接在回复中。
10
汉松
2月前
我们团队最近一个月的成果终于开源了,MedResearcher-R1 是一个医学领域的 DeepResearch Agent 模型,我们不仅开源了模型,还开源了合成数据的 pipeline,搭配开箱即用的前端页面。而且这个框架是通用的,并不局限于医学领域。用这个框架训练出来的模型在开源的榜单上面取得了不错的成绩。

一开始,我们想做一个能回答复杂医学问题的AI。听起来很简单,对吧?给模型一些工具,写点提示词,让它学会搜索和阅读。但很快我们就发现,这种方法是有上限的。你很难用 Prompt 去把所有的业务逻辑都告诉模型。

真正的突破来自一个反直觉的认识:训练模型的过程就是构建产品的过程。模型即产品,这个说法已经出现很久了。但直到我们亲手做了一遍,才真正理解这句话的分量。

大多数人以为AI产品是这样做的:先训练一个通用模型,然后在上面搭建应用。但实际上,最好的AI产品是反过来的:你需要先把整个产品系统搭好,然后在这个系统里训练模型。模型不是产品的一个组件,模型就是产品。

这个认识改变了我们的整个方法。我们开始构建复杂的问题生成系统,不是为了测试模型,而是为了用强化学习训练模型。我们发现,用模型合成高质量的训练数据是一条可行的路径。

最有趣的部分是问题的复杂度。我们发现,太简单的问题模型学不到东西,太难的问题模型也学不到东西。就像教小孩一样,你需要找到那个"刚好有点难"的甜蜜点。这让我想起了维果茨基的"最近发展区"理论——学习发生在已知和未知的边界上。

四个人,一个月,从零开始。我们花了两周时间搭基础设施,很多人觉得这是浪费时间。但这是我们做过的最正确的决定。当你有了好的工具,后面的迭代就像魔法一样快。因为慢就是快。

现在回头看,我们解决的其实不是"如何训练一个医学AI"的问题,而是"如何让AI学会像人一样思考复杂问题"的问题。这个问题比我们想象的要根本得多,也有趣得多。

杨植麟说:“这也正是它有意思的地方——你总有新问题去解决,而每当解决一个问题,技术就能再往上攀登几百米。也许有一天会发现,这座雪山没有尽头——我不知道——我希望它一直没有尽头。The Beginning of Infinity的意思,就是这样:它是一座无限的山。”

我们在做 MedResearcher-R1 的过程也是一样的,不停地在解决问题。解决完一个问题,又会有新的问题出现。而且现在的结果也只是下一个问题的起点,我们还有很多的问题要继续去解决。比如说,我们现在的上下文只能做到 32K ,但要支持更长上下文的思考扩展,还需要去突破长上下文的训练。另外就是现在我们提供的工具只有两个。后面如何给模型提供更多、更强的工具,也是一个重要的课题。

办法总比困难多。不管怎么样,我们已经在路上了。

公众号文章:mp.weixin.qq.com

arxiv paper: arxiv.org

github(数据合成 pipeline): github.com

huggingface(模型):huggingface.co
46