当前位置: 首页 > 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.jsqmd.com/news/918496/

相关文章:

  • 告别排版焦虑:西安交大LaTeX论文模板让你专注学术创新
  • 【电赛保姆级教程】别再用L298N了!电赛电机驱动与高阶控制(带FOC扫盲)硬核避坑指南
  • LabVIEW与外部设备通信秘籍:用DLL传递复杂结构体(含数组/嵌套结构)的完整配置流程
  • 端渲染与流渲染的融合之道:数字孪生应用开发套件的工程选型思路
  • windows 常见的cmd备忘录
  • 从Remy到3D空间影像壁纸,鸿蒙3DGS的差异性体验,凭什么得到消费者的认可?
  • Windows Defender彻底移除终极指南:2025免费工具完整教程
  • 那些年,我追Google Trends追到精疲力尽的故事
  • YOLOv11地铁站台与候车室行李目标检测数据集-153张-suitcase-1_6
  • 「斯隆奖」得主戴亮全职加盟复旦
  • 2026年郑州企业AI获客难?盘点5家GEO优化服务商特点 - 资讯快报
  • 多塔柱混凝土矮塔斜拉桥结构解析方案【附数据】
  • Transformer架构深度解析:从原理到实践的全面指南
  • AI工具学习不是学软件,而是重构工作流:1套可迁移能力框架+5类岗位适配方案
  • 【多模态评测】图生文/文生图模型怎么测?多模态评测集 CLIP Score 介绍
  • 188、运动控制中的行业应用:电子装配与贴片机
  • 口袋神器!Arduino 创客必备,可接入 DeepSeek、Qwen 等 AI 大模型,通过 GPIO 串口控制 IoT 智能设备
  • 深入FIO引擎:除了libaio,这些ioengine(如sync, psync, mmap)在Linux下到底怎么选?性能差多少?
  • 终极键盘连击修复指南:Keyboard Chatter Blocker 专业防抖工具完全教程
  • NoFences:免费开源的Windows桌面分区神器终极指南
  • C++之父开撕AI Coding:资深开发者宁愿退休也不愿伺候AI生成的代码
  • C# 泛型
  • Rusted PackFile Manager:全面战争MOD开发的终极效率工具完整教程
  • 为什么你的论文参考文献格式总是不对?3个GB/T 7714 BibTeX样式终极解决方案
  • IF=10.0!浙大博士一作再登柳叶刀子刊!
  • 如何快速修改暗黑破坏神2存档:5分钟掌握d2s-editor完整使用指南
  • 2026年徐州甲级写字楼集中区揭秘,锁定这三大板块
  • Linux权限进阶:从passwd命令到SUID/SGID,搞懂那些‘s’和‘t’到底怎么用
  • 187、运动控制中的行业应用:机械臂力控打磨
  • 如何告别图片格式烦恼?Save Image as Type让网页图片一键转换