研究者用布尔电路与锁存器在神经网络中实现状态机
来源标题:Embedding a state machine in a neural network
研究者展示了如何将状态机嵌入神经网络,每个状态用一个锁存器表示,状态转移由布尔条件触发。该实现基于此前已完成的布尔电路和锁存器工作,假设网络中的神经元只输出硬0或1。这一组件是其构建基于Qwen的v2版本所需最后环节。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
每个状态是一个锁存器。每条箭头将一个布尔条件连接到 SET 和 RESET。 点击神经元可切换并发送其信号。示例探针使用 activation > 1。 热水 ∧ 有茶AND 等待计时器完成AND 泡茶杯已倒空AND 就绪等待q = 1SET 0 · RESET 0浸泡q = 0SET 0 · RESET 0就绪q = 0SET 0 · RESET 0每个状态一个锁存器布尔条件热水 AND 有茶0 →AND 源状态位等待:1 ∧ 条件:0· →一个信号,两个连接RESET 等待 0SET 浸泡 0 q(t) = [1, 0, 0] → q(t + 1) = [1, 0, 0]恰好一个活跃锁存器 初始状态将等待初始化为 1。另外两个锁存器从 0 开始。 好了。我想这是我尝试基于 Qwen 的“满洲候选人”第二版所需的最后一个组件。 在一些匆忙写就的博客文章中,我们已经搞定了布尔电路和锁存器。 在这篇文章中,我们讨论状态机。 如果你已经能够创建布尔电路和锁存器,那么状态机应该只是这些概念的简单组合: 我们假设这是在网络的某个区域内实现的,其中每个神经元输出硬性的 0 或 1。 让我们用一个泡茶的运行示例来展开这两点。 每个状态都有一个锁存器,表示该状态是否活跃。 对于我们的茶示例,假设我们有三个状态: state Waiting # 等待 HotWater 和 TeaPresent state Steeping # 等待 TimerDone state Ready # 终止状态 我们允许在任意给定时间只有一个锁存器为 1,共同使状态向量成为独热表示。 换句话说,我们将 [Waiting, Steeping, Ready] 的有效可能性限制为 [1, 0, 0]、[0, 1, 0] 和 [0, 0, 1]。 这种独热强制将在下面的转换中完成。 等待q = 1浸泡q = 0就绪q = 0[1, 0, 0]每个状态一个锁存器:等待为 1,浸泡和就绪为 0。每一位反馈给自身。恰好一个状态处于活跃。等待q = 1浸泡q = 0就绪q = 0每个状态是一个被记住的位。恰好一个锁存器开启。 建模状态转换 每个状态转换是一个从 S 到 S' 的布尔电路,形式如下: S and Condition 换句话说,转换所源自的状态必须处于活跃,并且某个其他条件也必须求值为 1。 该其他条件中的子句可以是布尔电路内部的信号,也可以是插入到神经网络中的探针,将某个激活值转换为布尔值。 因此,例如,从等待到浸泡的转换可能要求热水存在且茶存在: Condition = HotWater and TeaPresent 这两个项,HotWater 和 TeaPresent,可以是电路输出本身、锁存器输出或神经探针。 该条件在许多情况下会求值为真,但状态转换仅在等待的锁存器同时也为真时才会执行。 Transition[Waiting -> Steeping] = Waiting AND condition 当该位变为 1 时,我们必须同时设置状态浸泡的锁存器,并重置旧状态等待的锁存器,以强制互斥属性。 布尔规则热水 AND 有茶条件 = 1源状态q_等待 = 1AND1触发 = 1RESET 等待1 → 0SET 浸泡0 → 1一个布尔规则 AND 等待锁存器驱动 RESET 等待和 SET 浸泡。热水 AND 有茶与活跃的等待位结合。其输出在同一次更新中清除等待并设置浸泡。布尔规则热水 AND有茶条件 = 1源状态等待q = 1AND1触发 = 1RESET 等待1 → 0SET 浸泡0 → 1规则为真 AND 源状态活跃。一个信号同时更新两个锁存器。 注意事项 这里有几个注意事项。 我在这里不太确定。 就像锁存器博客文章中的时钟频率问题一样,这正是网络的这种抽象表示可能碰上 GPU 中事物实际流动机制的潜在问题所在。 理想情况下,第一个匹配的规则会禁用其他规则。 在实践中,时钟频率会造成不同步的情况,禁用信号会以某种方式追赶转换重置信号,如果不预先了解规则就无法预测。 我内心中的还原论者倾向于将这视为“编译器问题”:找出计算最复杂转换规则所需的计算步骤,然后确保所有规则具有相同的计算成本。 这将保证所有状态转换意图都同时准备好被读取。然后对意图实现全局排序,始终作为优先级决定者。 这将建立清晰的转换顺序,并在协调冲突信号时防止抖动。 (假设我是对的,感觉自己重新发现了 CPU 时钟至关重要的原因有点奇怪……但这是从神经网络的视角来看。) 我们的锁存器实现假设锁存器的默认值为 0,但对于状态机,我们需要一种设置起始状态的方法。 我们不能简单地将某个神经元硬编码为始终向起始状态发送设置信号,因为它会不断地将该状态重新打开。 相反,我们可以定义一个特殊的入站转换规则,在所有状态都关闭时触发。 这会有一次更新周期的延迟,但会导致每当整个状态表都关闭时,起始状态就会翻转打开。 在我们用来描述这些概念的行话中,我们可以用星号定义起始状态: state Waiting* state Steeping state Ready 自转换 由于锁存器实现优先处理重置信号而非设置信号,编译器必须对自转换进行特殊处理。 要么干脆不做这些转换,要么在 S 与 S' 相同时移除重置信号。 最后这三篇文章只是为了思考我们如何将控制电路附加到 LLM 中的人格上。
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。