Omni-R1: Reinforcement Learning for Omnimodal Reasoning via Two-System Collaboration
https://arxiv.org/abs/2505.20256
这里 训练系统1 的时候,为什么最先想到的是 sft, 虽然最后被否决了?
SFT的逻辑为 “给模型看大量‘输入→正确输出’的例子,让它学会模仿”,对于 System 1,输入是 “长视频 + 全局指令”,输出是 “关键段选择 + 局部指令”,这看起来就是一个典型的序列到序列(seq2seq)生成任务,完全符合 SFT 的应用范式
从 ChatGPT 到 LLaMA、Qwen 等开源模型,几乎所有主流大模型的对齐流程都是:
预训练 → SFT(指令微调) → 强化学习(RLHF/GRPO 等)
SFT 是必经之路,它能快速让模型学会 “遵循指令”
System 1 的分层奖励设计 没有 将 最终任务目标(如分割 mIoU)作为唯一奖励;那么什么时候可以用端到端训练
端到端训练的核心前提是:从输入到最终输出的整个链路是可微分的,并且存在明确的监督信号。满足这两个条件,就可以用一个统一的损失函数(如交叉熵、IoU、MSE)直接训练所有参数
并且 有明确的 “输入 - 输出” 监督对;如 分类任务有 “图像 - 类别标签” 对;这些标注提供了直接的监督信号,模型可以通过梯度下降,自动学习到 “如何从输入得到正确输出” 的中间表示,不需要显式设计中间步骤的奖励
主要框架
痛点

解决方案:双系统协作架构 (Two-System Architecture)

Omni-R1 强化学习训练框架
由于很难人工定义或监督什么是“最优”的关键帧选择和任务重写,研究团队将系统 1 的优化过程转化为一个强化学习问题

sys1
任务输入与系统 1 推理 (Global Reasoning System)

系统 2 细节理解 (Detail Understanding System)

层次化奖励机制 (Hierarchical Rewards Feedback)

GRPO 策略更新

如何理解“系统一和系统二是强耦合的”这句话?

NitroGen: An Open Foundation Model for Generalist Gaming Agents
MOVIEDREAMER: HIERARCHICAL GENERATION FOR COHERENT LONG VISUAL SEQUENCES
Sora 相对于传统视频生成模型
采用时空Transformer,同时对空间维度(捕捉单帧图像内部的视觉特征)和时间维度(捕捉帧与帧之间的时序关联)进行建模;
Scaling Law
Diffusion Autoencoder 和 传统扩散模型 的区别(2022版本,还没用transformer)
核心架构

能做到什么?

论文中diffusion autoencoder核心架构

CLIP
训练方式:对比学习

训练细节




内部结构

意义

卷积神经网络
组成

强大之处

输入

输出(常见的)


卷积核是如何在矩阵中提取特征的?
具体动作

为什么乘加运算 就能提取特征?

more

transformer based token compressor 是什么
什么是token?

为什么需要压缩(compressor)?

为什么是基于 Transformer?

在本论文中 Q K V 是什么?

本文的 diffusion autoencoder 和原始版本有相差,原始版本的 zsem, 而SDXL的输入特殊,他接受一系列token;因此在这里 CLIP和 transformer压缩器将原始图像 压缩成一组序列token e;
为什么要冻结 CLIP?是因为CLIP的输出到 compressor之间 无法用链式法则来更新CLIP的参数吗?
防止灾难性遗忘;节省算力
SDXL(Stable Diffusion XL)其输入输出
输入端


内部程序

输出

SDXL在训练过程中其输入输出
原始数据

核心网络 (U-Net) 的输入端 (Inputs)


核心网络 (U-Net) 的输出端 (Outputs)

Loss 闭环学习

在 SDXL 训练的过程中,是以 预测的噪声 和 实际的噪声 的 差异 来计算loss的;但我在看那些普通的 MLP的分类器中,都是拿最终实际得出的分类结果进行softmax 再和 预期结果做比较算loss的;也就是说,MLP分类器的 训练 和 实际使用 的 结果 都是 分类结果;而这里 SDXL 训练中的 LOSS却是噪声,而实际使用中却要还原出图像;为何要用噪声当loss训练呢?

SDXL 在 使用过程中,往往要输入 一个完全 随机 的 噪声图和 一段文本描述转换而成的 token;既然是完全随机的,那为什么要加这个噪声图呢?这和训练 过程中 输入为 原本的图像加一个噪声,然后去预测这个噪声是什么,这个过程有什么关系?


选择用masking;是不是在舍弃一小部分 训练收敛速度 和 最终模型生成图形质量 的情况下,换取 对脸部细节的 更精密生成?

“This involves parameterizing the GMM with kd means, kd variances, and k mixing coefficients.” kd 个均值(Means)、kd 个方差(Variances)以及 k 个混合系数 具体是什么?
变量含义

具体含义

交叉熵的离散输出不再适用生成图像的训练
交叉熵损失函数如是计算分数 (ytrue是真实答案的概率, ypred是模型预测的概率,真实答案的概率为独热码分布,只有一项是0;因此在LLM输出结果中, 香蕉 和 汽车 相对于 苹果的正确度是一样的,尽管有水果这个共同特征;但是在模型内部,还是能意识到两者关系的)
Loss = -Σ(ytrue * log(ypred))
自回归

H<t即过去的经验, 根据过去的经验,外加剧本提示Mt, 在此条件下 计算p,即正确答案在 生成的概率分布 中的概率;
前面的 CLIP,compressor, decoder 训练 根据token生成图像,这里训练生成token
既然 人脸嵌入主要由 FARL 模型提取,并且FARL在训练中是冻结的,并且 FARL的输入只包含面部区域,那么案例来说输出的嵌入结果只和这个人有关啊,为什么还要防止和 场景信息有耦合呢?

MLP的内部神经网络架构长什么样
宏观层级结构 (Layer Structure)

神经元之间的连接 (Connections)

微观:单个神经元内部的数学魔法

数据的流动 (Data Flow)

Stamo
https://arxiv.org/html/2510.05057v1
DiT
之前 SDXL 去噪用的是 U-Net,他内部用CNN,擅长处理局部细节,难以看清全局信息
DiT训练时的输入输出
输入端


输出端

we can generate smooth, plausible, and dynamically consistent motion trajectories最终目的

Variational Autoencoder(VAE, 变分自编码器)
普通的 AutoEncoder是一个两头大、中间小的沙漏型神经网络;但他的隐空间是离散的、不连续的,如果你强行在隐空间里随机生成一个点丢给解码器,它大概率会输出一团乱码。
编码器 不会将一个图片处理成 若干个确定的数字,而是输出一组均值 和 方差
然后,系统会在概率云中随机抽取一个点
解码器拿到这个点,并把它还原成原图
两个损失函数

VAE 在 Sora 和 Stable Diffusion 中的作用
直接在 几十万像素的图片上加噪声和去噪 计算量过大

论文提出问题,对于大方差动作的学习,如果采用MSE 训练的话容易陷入均值回归,那么为何不采用dp策略?
dp输出连续,不适合与LLM相接;而前者输出两个token,适合LLM;前者算力需求低
VAE不将图片压缩成一个点,而是一个概率云
Where is Stamo?(figure)

X轴的“表现力”,表示数据有多丰富;Y轴的 “紧凑型”,表示数据的紧凑性,高紧凑型往往表示 数据维度低。
Flow Matching
传统扩散模型使用 随机微分方程,并且是根据不同时间步向里面加入随机噪声的;而flow matching在数学上定义了“向量场”,用较少的步骤就能生成清晰图片;

是如何用 mlp 将 大模型输出 转化为 连续数值的?
大模型输出原本是离散的
例如Llama 有32000 个词汇token,大模型最后一层输出的就是 一个 32000 长度的数组(打分),然后通过softmax将其和变为100%;VLA 的动作也如同词汇token,被离散化
如何化为连续数值
我们将大模型最后一步 查词汇表给删除,这是其输出是一个隐藏向量,例如有4096维;然后将其送入MLP,进行线性加权求和(wx+b)
如果我们要预测的未来状态 是 2048维的话,那么我们就设计一个MLP,将4096维压缩至2048维
论文中解决有标注的数据量太少的问题

E 即 Stamo压缩器,o为图像,相减得出 潜在运动m;
将 带真实物理动作标签的机器人数据,和带有 StaMo 生成的伪动作标签的视频数据 同时给policy训练
为什么需要 Action Linear Probing Experiment来证明 z_t 包含了有效的动作信息? 混合数据能训练出更好的 模型这一点 还不够有说服力吗?
如果把 Stamo压缩差值,Pooled Delta Image,Delta DINOv2 Features分别拿出去做 端到端训练的话,下游模型可能弥补特征的缺陷,使得模型能力相差没有那么明显
而使用轻量级MLP来进行线性探测,如果结果相差较大,则可以说明 Stamo 压缩差值 对应的 动作特征比较明显。
REASONING IN SPACE VIA GROUNDING IN THE WORLD
https://arxiv.org/pdf/2510.13800

看到这里,我不禁疑惑,为什么不把 external decoders 融入到 llm形成一个新的 能grounding 的 llm呢?是因为 这样会破坏原有结构,使得普通 对话性能下降吗?
是的,一点是灾难性遗忘,另一点是 物理坐标 是连续的,llm预测是离散的
Grounding 一词的含义
3D Visual Grounding,3D 视觉定位/视觉基准化
在这篇论文的语境下,Grounding 具体指的是:当用户用自然语言提到某个物体时,AI 能够准确地在 3D 空间中找出那个物体,并用一个“3D 边界框(3D bounding box)”把它框出来。
为何点云 不具有绝对物理坐标信息?
打乱顺序的点云 输入 普通神经网络 会造成大相径庭的结果

最大池化引出

最大池化



左边的 patch center 输出的是不是位置信息?这里 geometric encoder 已经通过 unpooling 获取 位置信息了,为什么还需要patch center?
并非;Geometric Encoder从 xyz rgb 提取局部信息之后,已经忘记了精确坐标;而unpooling 并非将所有点云的精确坐标还原,而是 为了与右边的 semantic encoder 的 patches对齐;把提炼出来的 3D 形状特征,重新映射、分配回对应的 2D 图像块格子里去。

对应这个

p'i 和 f'i 是一对一关系还是一对多关系?
是一对一关系,看起来fi 经过池化之后是多维的,但这多维的特征向量会映射到同一维度上进行比较,只剩下一个。
如何理解 Collecting pooled points from n' subsets yields the point set M' = ... for the next stage of encoding?

PointNet++
那么 上一层的pi,fi 和 下一层的 pi,fi是不是 多对一关系?然后这个多的倍数是|Mi|?
Yes
图片中 unpooling 这个地方没有 加上 “traniable“的图案,难道这个 unpooling 模块是个网上扒下来的现有的模型吗?它不用被训练吗?它天生就和隔壁的 Semantic Encoder对齐吗?
unpooling不是神经网络,无法被训练;


也就是说,在进行 pooling 的时候,其实丢失掉了一部分信息:无法通过高维输出恢复到 原始点云;但有一个信息没有丢失:即 高维特征对应的 点云坐标;这样子的说法对吗
Yes
前提提示:《Point Transformer V3: Simpler, Faster, Stronger》https://arxiv.org/pdf/2312.10035
空间填充曲线 (space-filling curves)

切分为子集 (partitions into subsets)

序列化注意力 (serialized attention)

Dual-Path Pooling:

position 信息 和 geometric 信息到底是怎么结合起来的?我们知道 geometric encoder 加上 unpooling 会得到不同layer的每个范围区域点云的局部和全局特征;patch center 输出的位置信息,是不是每个patch只对应一个position? 而根据这个patch的大小,我们选定 之前unpooling的某一层,其局部和全局特征就可以和position 信息对齐了 。这样的理解对吗?


2d 语义 Q 是怎么发现 自己和3D 几何 “把手”相近,而和 “墙面”特征相远的
投影

点积

训练过程


LoGoPlanner: Localization Grounded Navigation Policy with Metric-aware Visual Geometry
https://arxiv.org/pdf/2512.19629
端到端的优势和劣势
优势

劣势

前提提示:正交旋转矩阵
简单来说,如果你想在不改变物体形状和大小的情况下,让它绕着原点转动,你所使用的数学工具就是正交旋转矩阵
数学定义

几何特性

旋转矩阵举例

RoPE(Rotary Position Embedding,旋转位置编码)
痛点
Transformer 架构本身是个“路痴”。它的自注意力机制(Self-Attention)在计算时,是把所有词当成一个无序的集合。如果你不告诉它词的顺序,“狗咬人”和“人咬狗”对它来说没有任何区别
因此,我们需要一种方法把“位置信息”注入到模型中。RoPE 就是为了极其优雅地解决这个问题而诞生的。
传统位置编码的困境
method

RoPE的输入输出
输入

输出

内部


为什么不直接把橙色和绿色的结果扔给规划器?


前提提示:自注意力机制在训练时的输入输出
输入输出

QKV的产生

输出(特定语境下的苹果)

反向传播




使用过程中 W 冻结,输出预测头中最大概率的
Cross-Attention(交叉注意力)



QS QG这几个 没有什么关联的向量 为什么可以在最后直接拼接?这样做有什么数学原理吗?

训练过程中的 cross attention 及其输入输出
输入

生成跨界的 K Q V

输出

反向传播

这里产生 h^c. h^p 的ϕ_c ϕ_p 也可以被最终的crossattn反向传播更新吗?由最终的结果,一路更新到之前的 ϕ_c ϕ_p , 这就是端到端训练吗?为什么不进行分模块训练?是因为中间的模块 没有明确的监督数据吗?
是端到端
不是因为没有监督数据,在真实世界的机器人训练中,我们有大量的“中间监督数据”(比如极其精准的 3D 激光雷达点云图、高精度的相机定位坐标 Ground Truth)。传统的“分模块训练”正是利用这些数据,先把感知模块训练到 100 分,再把定位模块训练到 100 分。
既然各个模块都能考 100 分,为什么还要搞端到端?因为分模块训练存在两大无法逾越的死穴
LoGoPlanner的训练方法并非完全端到端
为什么 CrossAttn 的结果 是 Q_S 而不叫 V_S?
1. 在CrossAttn中,Q的长度往往和V的长度不一样,但输出中长度和 Q一样
2. CrossAttn有残差相加,提取出来的结果加到了原始Q身上

如何解释此公式
扩散模型

公式拆解

如何理解 “交替注意力机制在帧内注意力和帧间注意力之间交替,同时提高了局部保真度和长时段一致性”?



Fast-FoundationStereo: Real-Time Zero-Shot Stereo Matching
https://arxiv.org/pdf/2512.11130
对大模型的剪枝是如何进行的?
策略1,非结构化剪枝

结构化剪枝

Post Training Pruning

前提提示: Side-Tuning(旁路微调)https://arxiv.org/pdf/1912.13503
痛点

Side-Tuning 工作原理

优势

既然 S(x) 是为了 预测残差的,那么最终特征应该是 B(x) + S(x) 啊, 为什么是加权之后的呢
初始化时,我们不需要额外设计一个S(x)

让模型学会自适应

在第一刀(特征提取)拿到左右眼的特征后,系统要把它们放在一起“比对”,生成一个极其庞大的数学矩阵——代价体积(Cost volumn)

记录的是左眼和右眼在不同视差下的“匹配得分”
“DepthAnything V2 和 侧调CNN “的输出

也就是说,左眼图片 在经过整个 “DepthAnything V2 和 侧调CNN “(或者是后面的学生模型),进行特征提取的时候,是不包含右眼图片的信息的; 那最后 f(i) 属于 Ci H/i W/i 是怎么转化为 Vc 的?
是的, 无论是教师模型还是学生模型,它们执行的都是一元特征提取(Unary Feature Extraction)。这意味着在提取左图特征 fl 时,网络完全不知道右图的存在,反之亦然
将这些独立的特征转化为 代价体积(Cost Volume, VC) 的过程,本质上是一个“滑动窗口匹配”的过程。
ResNet
痛点
残差连接
优势
权重矩阵
适应非线性激活函数
文中提到的5个layers
(1) 3D conv layer with varying channel dimensions
类比2D conv layer,这里是 varying channel是因为:如果系统发现算力预算吃紧了,它可以自动挑一个“把通道数压缩一半”的 3D 卷积层,牺牲一丢丢精度来换取极大的速度提升。
(2) 3D deconv layer that doubles the spatial dimensions of the cost volume
为什么要放大?
如何将维度翻倍?
(3) APC layer that performs separate spatial and disparity convolution with different respective kernel sizes
痛点

APC卷积方法

可变的卷积核大小

(4) residually connected 3D conv layers, similar to ResNet

ConvGRU 输入输出

多尺度金字塔特征是 怎么 变成 初始视差图的?
构建代价体积

代价滤波与聚合 (Cost Filtering & Aggregation)

初始视差预测 (Initial Disparity Prediction)

ffs输出的 视差图作用?

V-Thinker: Interactive Thinking with Images
https://arxiv.org/pdf/2511.04460
V-Thinker 的整个训练框架
第一阶段:感知对齐 (Perception Alignment)

第二阶段:交互推理对齐 (Interactive Reasoning Alignment)

Cold-Start SFT 和 Reinforcement Learning对比


GRPO相对于PPO的优势
对比PPO

GRPO的工作原理

GRPO数学直觉

PPO 的四个模型的分别作用


在公式 (DK, Tˆ) = G(Combos(K)). 之中,是不是可以理解为 G 生产的 Dk 包含代码,然后先通过运行代码获得图片,然后根据图片中的信息进行 工具的挑选,生成;还是通过 code 直接生成 T
直接生成,而不是“先运行再挑选”的闭环
生成器 G 的工作逻辑

只有在这个时候才会运行代码并观察:

如何在这样一次次迭代中,防止最终得出的T或K和一开始输入的T和K大相径庭,从而产生问题?
扩张函数 phi :利用 BGE(一种文本嵌入模型)进行层次聚类,对新生成的元素进行过滤、合并和归一化 ; 如果生成的“新工具”只是对现有工具的重复描述或微小改动,聚类机制会将其合并;如果生成的“新知识”逻辑混乱,过滤器会将其剔除 。
协同校准中,生成的 Python 代码会在沙盒中真实运行 。如果模型构思出的“新工具”在几何逻辑上画不出来,或者渲染出的图像与问题答案对不上,检查器会直接判定该样本无效 。
论文认为这种从零开始的生成(From Scratch)并非漂移,而是一种正向的演化;通过限定工具来构思知识(或反之),模型能发现许多人类在标注数据时难以覆盖的正交 (Orthogonal) 知识组合 。例如,模型可能会发现一种结合了“偏微分方程”和“动态阻尼标注”的新型交互题型,这是单纯靠数据蒸馏(Distillation)无法得到的 。
ZED+FFS+GSFusion experiment
相机性质
焦距
物理定义:它是一段距离

像素焦距

决定视场角 (FOV)


很远 的 物体 发过来的光是平行的,这是一种理想化;汇聚到一个点,这实际上也是一种理想化;实际上感光片和这个点的大小相同,能拍到的最大物体经过镜面到达焦点是的大小和感光片相同;这样的说法对吗?
有一定偏差
内参矩阵
内参矩阵标准形式

参数物理含义

从3D到2D

计算机的矩阵形式

在 GSFusion 代码中的应用

三维和四维空间旋转
1. 基石——从二维到三维的跃迁




2. 灵魂——旋转矩阵的数学特性


3. 进阶——任意轴的 3D 旋转



内在旋转 vs. 外在旋转

神奇的结论: 绕固定轴执行 XYZ 旋转的结果,在数学上等同于绕随动轴执行 ZYX 旋转。这就是为什么不同的软件(如 Unity, Blender, SolidWorks)虽然定义的旋转顺序不同,但最终能达成一致。
4. 齐次坐标与 4x4 矩阵



进阶应用 —— 矩阵的拆解与逆转
假设你拿到了一个标准的仿射变换矩阵 M:



GSFusion main method
组成 map(Map 是 三维体素地图的入口:在固定 世界系(或地图系) 下的一块空间里,用 八叉树(Octree) 存每个体素里的 场数据(TSDF、占用等)以及可选的 颜色 / 语义。)
模板
template<Field FldT, Colour ColB, Semantics SemB, Res ResT, int BlockSize>
class Map<se::Data<FldT, ColB, SemB>, ResT, BlockSize> {
public:
typedef Data<FldT, ColB, SemB> DataType;
typedef DataConfig<FldT, ColB, SemB> DataConfigType;
typedef se::Octree<DataType, ResT, BlockSize> OctreeType;

// Representation enums
enum class Field { TSDF, Occupancy };
enum class Colour { On = true, Off = false };
/** \brief The enum used to select the semantic class set used in mapping.
* The value of each enumerator is the number of semantic classes including the background.
*/
enum class Semantics : int { Off = 0, NYUv2 = classes::nyuv2.size(), MP3D = classes::mp3d.size(), COCO = classes::coco.size(), Replica = classes::replica.size() };
// Other enums
enum class Res { Single, Multi };Map 的构造 (Line 601)
se::TSDFColMap<se::Res::Single> map(config.map, config.data);TSDFColData 和TSDFColDataConfig 的区别是什么?
TSDFColData=Data<Field::TSDF, Colour::On, Semantics::Off>TSDFColDataConfig=DataConfig<Field::TSDF, Colour::On, Semantics::Off>

TSDFColMap是Map<TSDFColData, ResT, BlockSize>的别名;TSDFColData固定,不可通过该别名替换。只有
ResT和BlockSize有模板默认值;在实例化类型时可以不写(用默认),也可以显式写TSDFColMap<Res::Multi, 16>这类。构造时只传
config.map、config.data(等),不传ResT/BlockSize
template<se::Res ResT = se::Res::Single, int BlockSize = 8>
using TSDFColMap = Map<TSDFColData, ResT, BlockSize>;
构造用的是
MapConfig/DataConfig(来自 YAML 的map、data),解决的是 地图多大、分辨率、截断、权重 等运行期配置,不改变ResT、BlockSize这两个编译期模板实参。
那为什么 @map_impl.hpp (30-31) 这里 Field FldT, Colour ColB, Semantics SemB又能写在template里呢?


如何构造?
template<Field FldT, Colour ColB, Semantics SemB, Res ResT, int BlockSize>
Map<Data<FldT, ColB, SemB>, ResT, BlockSize>::Map(const MapConfig& map_config, const DataConfig<FldT, ColB, SemB>& data_config) :
octree_ptr_(new Octree<DataType, ResT, BlockSize>(std::ceil(map_config.dim.maxCoeff() / map_config.res))),
resolution_(map_config.res),
dimension_(Eigen::Vector3f::Constant(octree_ptr_->getSize() * resolution_)),
T_MW_(map_config.T_MW),
T_WM_(se::math::to_inverse_transformation(T_MW_)),
lb_M_(Eigen::Vector3f::Zero()),
ub_M_(dimension_),
data_config_(data_config)
{
const Eigen::Vector3f t_MW = se::math::to_translation(T_MW_);
if (t_MW.x() < 0 || t_MW.x() >= dimension_.x() || t_MW.y() < 0 || t_MW.y() >= dimension_.y() || t_MW.z() < 0 || t_MW.z() >= dimension_.z()) {
std::cout << "World origin is outside the map" << std::endl;
}
}config.map

config.data
octree_ptr_(new Octree<...>(std::ceil(...))) 在算什么?
这是 初始化列表 里给
octree_ptr_赋值:在堆上new一棵Octree,交给shared_ptr管理。
Octree里还会再处理一次(至少2×BlockSize,并向上取成 2 的幂),得到最终的立方体边长size_
创建针孔相机数学模型
构造 PinholeCamera 时具体干了什么?参考 GSFusion/src/sensor/pinhole_camera.cpp
se::PinholeCamera::PinholeCamera(const PinholeCameraConfig& c) : se::SensorBase<se::PinholeCamera>(c), model(c.width, c.height, c.fx, c.fy, c.cx, c.cy, _distortion), scaled_pixel(1 / c.fx)
{
left_hand_frame = (c.fx < 0.0f) ^ (c.fy < 0.0f);
computeFrustumVertices();
computeFrustumNormals();
// ... asserts ...
horizontal_fov = 2.0f * atanf(c.width / (2.0f * c.fx));
vertical_fov = 2.0f * atanf(c.height / (2.0f * c.fy));
}这段代码详细过程
偏差




















