当前位置: 首页 > news >正文

实习19-HRM

HRM-Text Method 阅读笔记

目标:解释论文中 H/L 两个模块、z_H/z_L的初始化和前向数据流,以及梯度与 loss 如何设计。下面的说明主要对照本仓库实现:models/baselines/hrm_nocarry_bp_warmup.pymodels/transformer.pymodels/layers.pymodels/lm_head.pypretrain.py

0. 一句话总览

HRM-Text 不是把一个普通 Transformer 从第 1 层跑到第 N 层,而是维护两个隐藏状态:

  • z_H:高层状态,初始化为 token embedding,最后也用它接 LM head 预测词。
  • z_L:低层状态,初始化为固定向量zL_init,在循环里被低层模块反复更新。

然后用两个 Transformer 模块按嵌套循环交替更新:

z_H=token_embedding(input_ids)z_L=zL_initforiinrange(H_cycles):forjinrange(L_cycles):z_L=L_level(z_L,z_H)# 等价于 L_Transformer(z_L + z_H)z_H=H_level(z_H,z_L)# 等价于 H_Transformer(z_H + z_L)logits=lm_head(z_H)loss=CE(logits,labels)

默认配置在config/arch/net/hrm.yaml中:

half_layers:TrueH_cycles:2L_cycles:3bp_warmup_ratio:0.2bp_max_steps:5

也就是说每次高层更新之前,低层会先更新 3 次;整个前向里低层更新2 * 3 = 6次,高层更新 2 次。

1. 示例:L 模块和 H 模块的数据流动

1.1 概念区别:快/慢不是指单层算子速度,而是指状态更新频率

论文里说:

  • L模块是 fast low-level module:快速低层模块
  • H模块是 slow high-level module:低速高层模块

这里的“快”和“慢”最重要的含义是循环频率

  • L_level在每个H_cycle内会连续运行L_cycles次,所以:更新更频繁(低速高层)
  • H_level只在每组低层循环结束后运行一次,所以:更新更慢(高层低速)

以默认H_cycles=2,L_cycles=3为例,顺序是:

初始化: z_H = embedding, z_L = zL_init 第 1 个 H cycle: L 更新 1: z_L <- L(z_L + z_H) L 更新 2: z_L <- L(z_L + z_H) L 更新 3: z_L <- L(z_L + z_H) H 更新 1: z_H <- H(z_H + z_L) 第 2 个 H cycle: L 更新 4: z_L <- L(z_L + z_H) L 更新 5: z_L <- L(z_L + z_H) L 更新 6: z_L <- L(z_L + z_H) H 更新 2: z_H <- H(z_H + z_L) 输出: final z_H

所以 L 的角色更像“在当前高层语义/计划z_H的指导下做多步局部细化”;H 的角色更像“吸收低层多步计算后的结果,再更新全局/高层表示”。

1.2 代码实现:H 和 L 都是 Transformer stack,但参数不同、调用频率不同

核心定义在models/baselines/hrm_nocarry_bp_warmup.py

classHierarchicalReasoningModel(nn.Module):def__init__(self,config_dict:dict)->None:super().__init__()config=HierarchicalReasoningModelConfig(**config_dict)ifconfig.half_layers:assertconfig.n_layers%2==0,"n_layers must be divisible by 2."config.n_layers//=2# Reasoning Layers# TODO: Asymmetric.self.H_level=HierarchicalReasoningModelRecurrentBlock(TransformerConfig(**(config.model_dump()|config.H_override)))self.L_level=HierarchicalReasoningModelRecurrentBlock(config)
  • H_level 和 L_level 的结构是一样的,16 层,参数可以不一致;
classHierarchicalReasoningModelRecurrentBlock(nn.Module):def__init__(self,config:TransformerConfig)->None:super().__init__()self.core=Transformer(config)defforward(self,hidden_states:Tensor,input_injection:Tensor,**kwargs)->Tensor:returnself.core(hidden_states+input_injection,**kwargs)

这说明每个 H/L 模块本质上都是一个Transformer(config),区别不在于 block 内部算子,而在于外层如何循环调用它们。

H/L 创建代码:

self.H_level=HierarchicalReasoningModelRecurrentBlock(TransformerConfig(**(config.model_dump()|config.H_override)))self.L_level=HierarchicalReasoningModelRecurrentBlock(config)

要点:

  • H_levelL_level是两个独立模块,参数不共享。
  • 默认H_override: {},所以 H 和 L 的网络结构一样。
  • 代码注释里也写了 TODO:未来可以让 H/L 非对称,比如不同层数、隐藏维度、注意力类型等。
  • 当前仓库默认还设置了half_layers: True:如果总层数是 32,则先把n_layers //= 2,因此 H 有 16 层,L 也有 16 层。不是 H+L 各 32 层,而是把配置层数拆成两半。

1.3 H 和 L 模块内部细节:TransformerBlock = Attention + SwiGLU MLP

H/L 的coremodels/transformer.py里的Transformer,代码如下:

classHierarchicalReasoningModelRecurrentBlock(nn.Module):def__init__(self,config:TransformerConfig)->None:super().__init__()self.core=Transformer(config)# Create cache functionself.create_cache=self.core.create_cachedefforward(self,hidden_states:Tensor,input_injection:Tensor,**kwargs)->Tensor:# Input injection (add)# TODO: Try better alternatives, such as GRU / gating in the following papers# Alternatively, "fixed" gating that does not depend on hidden state is also worth trying# E.g. only depends on position and index of hidden_states dimension# https://arxiv.org/pdf/1910.06764# https://arxiv.org/pdf/2202.10447# TODO: Asymmetric fusion is also worth trying. assign different number of tokens to H and L.returnself.core(hidden_states+input_injection,**kwargs)
  • hidden_states 和 input_injection 做了个简单的融合,代表低层高速和高层低速的 state;

Transformer模块代码如下:

  • 非常传统标准的 model,一共 16 层 layer,rope + layers ;
classTransformer(nn.Module):def__init__(self,config:TransformerConfig)->None:super().__init__()self
http://www.rkmt.cn/news/1429816.html

相关文章:

  • windows 常见的cmd备忘录
  • 从Remy到3D空间影像壁纸,鸿蒙3DGS的差异性体验,凭什么得到消费者的认可?
  • 「斯隆奖」得主戴亮全职加盟复旦
  • 终极键盘连击修复指南:Keyboard Chatter Blocker 专业防抖工具完全教程
  • 【多模态评测】图生文/文生图模型怎么测?多模态评测集 CLIP Score 介绍
  • AI工具学习不是学软件,而是重构工作流:1套可迁移能力框架+5类岗位适配方案
  • Linux权限进阶:从passwd命令到SUID/SGID,搞懂那些‘s’和‘t’到底怎么用
  • 如何告别图片格式烦恼?Save Image as Type让网页图片一键转换
  • 如何快速修改暗黑破坏神2存档:5分钟掌握d2s-editor完整使用指南
  • FanControl深度解析:Windows风扇控制从入门到精通的完整指南
  • Python 潮流周刊#152:编程智能体终于跨过质量门槛了?
  • 网盘直链下载助手:告别限速,解锁九大网盘高速下载方案
  • 为什么你的芯片离不开它?聊聊带隙基准在LDO、ADC里的那些事儿
  • Liquid AI 发布 LFM2.5-8B-A1B:38T 训练的 8B 稀疏 MoE 模型,128K 上下文,笔记本就能跑
  • 闽侯经济纠纷律师评测推荐:从胜诉实绩看服务靠谱度 - 速递信息
  • AI技能化落地:从对话式大模型到可生产、可复用的AI工程体系
  • MTKClient核心技术深度解析:联发科设备底层调试与修复实战指南
  • 如何从平台依赖者转变为数据主权者:WeChatMsg重塑你的数字记忆管理方式
  • 2026 年 Q2 江汉区空调回收公司排名:本地 TOP5 靠谱推荐及其电话 - 武汉宅到家
  • IFC文件除了在线预览,还能免费转成STL/OBJ?这个工具一步搞定
  • 【基础知识】Python入门:集合
  • 神奇的内存管家:Mem Reduct如何让你的Windows电脑重获新生
  • 2026 年中国 AI 创业风向转变:零一万物、百川智能转型,下半场聚焦产品与生存
  • 190、运动控制中的行业应用:半导体设备(晶圆搬运)
  • 踩坑实录:Win11系统下为Jupyter配置MATLAB内核,我遇到的3个报错及解决办法
  • 27考研杨攀|任燕翔|卢欣粉笔101公共课全程班网课讲义PDF
  • 告别资源焦虑:用USB转接芯片CH347在安卓电视盒上DIY一个多功能调试工具(SPI/I2C/GPIO监控与编程)
  • Go2 ROS2 SDK架构揭秘:构建四足机器人的分布式智能控制系统
  • 183、运动控制中的行业应用:工业机器人(六轴)
  • 如何在10分钟内训练专业级AI语音转换模型:Retrieval-based-Voice-Conversion-WebUI终极指南