RL Token 学习笔记
前置知识:
\(\pi_{0.5}:\) 一款泛化能力较好(能较好地适应全新的场景)的模型:
论文:https://www.pi.website/download/pi05.pdf
Pre-training :
这一步训练的 VLM , 主要是训练的它语义理解的能力并且对 diverse robotic tasks 有一些了解 & 生成动作 token 的能力。
这里给了 VLM 许多多模态数据(很多不在目标任务范围内),也就使得它覆盖了真实世界的更多可能,提升了它的泛化能力。
Post-training:
这部分训练的是给 VLA high-level prompt 让他有能将其拆分为若干 specific tasks 的能力,以及训练 action expert 通过 flow matching 去噪生成连续动作
(预测未来 \(H\) (这里 \(H=50\)) 步内的动作 \(a_t,a_{t+1},...,a_{t+H-1}\) , 每个 \(a_i\) 用一个向量来表示 )的能力。
RLT: 一款用于处理精细化程度高的任务的方法
主要优势:
- 通过 Actor-Critic 得出最佳精确的 action chunk
- 在 VLM 对周遭的画面场景进行了识别后,会生成一段 prefix hidden states : \([z_1,z_2,...,z_M]\) , 是 \(M\) 个 tokens, 每个大概 2048 维(?)表示了抽象化的关于 "我看到了什么、任务是什么、当前状态如何" 的信息。而正常 VLA 中,它需要你生成许多有可能的 ref-chunks ,对固有信息的保留程度要求较高,以避免丢失细节。但 RLT 中要求没那么高,所以可以精简一下,变成单一 token \(z_{rl}\) , 大大加快效率。
大致流程:
- 生成了 \([z_1,z_2,...,z_M]\)
- VLA 负责通过 \([z_1,..,z_M]\) 由 action expert 提出推荐的 ref-chunks
- transformer 通过 Encoder 将 \([z_1,...,z_M]\) 压缩为 \(z_{rl}\)
- Actor-Critic 在 ref-chunk 的基础上做进一步地调整,得到最终地动作。
具体步骤:
Stage1: 训 VLA & transformer:
VLA:
定义一个 VLA_loss 表示损失值。训练时,模型预测地动作块为 \(â_{1:H}\) 而 人类示范地标准动作是 \(a_{1:H}\) ,则 \(VLA\)_\(loss=(â_{1:H}-a_{1:H})^2\)
transformer:
prefix states 中 引入一个可学习的特殊 token \(e_{rl}\) , 变成 \([z_1,...,z_M,e_{rl}]\) . 然后交由 transformer 去寻找内部关联,得出 Encoder 函数,其中 \(z_{rl}=Encoder([Z_{1:M},e_{rl}])_{M+1}\) . 那怎么知晓压缩得正确与否?再引入 \(Decoder\) 函数,让 \(z_{rl}\) 解码为(可能不太对的)原序列 \([z^`_1,...,z^`_M]\) , 进行比对,算出损失值 \(rlt\)_\(loss=\sum (z_i-z^`_i)^2\)
那么最终的总损失为:total_loss = rlt_loss + rlt_alpha * vla_loss,这个 total_loss 越小越好。
Stage2: 训 Actor-Critic 策略:
Actor:
提供给它 \(z_{rl}\) ,\(proprio\) (自身状态,比如关节角度等),\(ref-chunk\) ,它输出优化之后的 action chunk
Critic:
负责测算这个动作的价值。
首先,每一个动作块单独的 reward 可以这样算:\(discounted_chunk_reward = r₁ + γ·r₂ + γ²·r₃ + ... + γ^(H-1)·r_H\) ,其中 \(r_i\) 表示第 \(i\) 步的 reward, \(H\) 为块长,\(γ\) 为一个接近 1 但小于 1 的数,因为未来的步骤会具有不确定性 所以,当前这一步的动作做完对未来产生的影像中,每一个未来可能做的动作要乘以 \(γ\)。(但是我感觉也可以理解为,\(γ\) 为每个步骤执行的概率,而 \(r_1\) 是当前进行的步骤,所以确定能发生。比如 \(r_3\) 这个价值能产生的前提是 \(2\) 动作进行了,且 \(3\) 动作进行了,整个 \(chunk_reward\) 式子算出来是这一系列动作发生后得到的期望价值。?)
那么,要算好多个动作块的总共 reward ,就可以直接递推:Q_target(obs,action) = discounted_chunk_reward + γ^H\times Q_target(next_obs, next_action), 其中 obs 为当前状态,而 action 为actor再当前状态下选的动作。
所以,actor-critic 的总共 loss=-qweight * Q(obs, \pi(obs)) + bcweight * BC(\pi(obs), target_action) ,此处 weight 为权重(一般为了使actor的动作与vla偏差小一点,bc 的权重会更大),\(\pi(obs)\) 为 actor 选的动作。 这个loss 不是越小越好(比如到了负数),否则如果critic错误估计了价值,loss变为负数,则会产生偏差,导致偏向某个错误类型的动作。
一些模式(×2):
Franka:
按 \(b\) 键→执行 actor 的动作,并且以 (约 50%) 的概率清除 ref-chunk, 为了使 actor 能保持独立生成能力,不过度依靠 ref-chunk
Maniskill:
前期大动作用 VLA 提供的,到最最后才换用 actor 的。
浙公网安备 33010602011771号