LOADING

加载过慢请开启缓存 浏览器默认开启

关于 UAFA 算法的笔记

论文地址:

1. 什么是 Universal Value Function Approximator(UVFA)?

Universal Value Function Approximator(通用值函数逼近器)是强化学习中对传统 Q函数 的一个扩展。

在传统的强化学习中,Q函数 Q(s, a) 表示在状态 $s$ 下采取动作 $a$ 能获得的期望回报。但这个函数只能处理单一任务/目标

而 UVFA 允许我们同时处理 多个目标(multi-goal)或多个任务(multi-task) 的问题。


1.1 核心思想

🔁 从 Q(s, a) → Q(s, a, g)

UVFA 把“目标 $g$” 作为一个额外的输入引入 Q 函数中:

$$
Q(s, a, g) = \mathbb{E}[R_t | s_t = s, a_t = a, g]
$$

其中:

  • $s$:当前状态;
  • $a$:动作;
  • $g$:目标(goal)或任务的编码;
  • $R_t$:未来累计回报。

✅ 本质上是学习一个可以泛化到多个目标的 Q 函数。


1.2 应用场景

UVFA 非常适合处理 目标可变的任务,比如:

任务 目标 g 表示什么?
迷宫导航 终点位置坐标
抓取物体 抓取目标物体的 ID
控制机器人到达某个位置 目标位置坐标

在这种情况下,我们可以用一个统一的 Q 函数,训练出能够适应不同目标的策略。


1.3 UVFA 的训练方式

UVFA 可以和常规的强化学习算法(如 DQN、DDPG)结合使用。其训练方式与标准 Q-learning 类似,只是将目标 $g$ 一并作为输入。

Bellman 更新形式:

$$
Q(s, a, g) \leftarrow r + \gamma \cdot \max_{a’} Q(s’, a’, g)
$$

这里的目标 $g$ 在整个 episode 中保持不变。


1.4 神经网络实现方式

你可以将状态 $s$、目标 $g$、动作 $a$ 作为神经网络的输入之一,例如:

input = concat(state, goal)
Q_value = Q_network(input, action)

目标 $g$ 可以是:

  • 坐标(如 [x, y, z]);
  • 离散编码(如 one-hot);
  • 图像(可用 CNN 编码);
  • 语言(可用 BERT/Transformer 编码)等。

1.5 UVFA 的优势

优点 说明
多目标统一建模 一个模型适应多个任务或目标
目标泛化能力强 可以学习未见过的新目标
适用于 sparse reward 可与 HER 等方法联合使用,提高学习效率

1.6 与 HER 的关系

HER(Hindsight Experience Replay)正是构建在 UVFA 之上的。

  • HER 的 replay buffer 中,不仅记录状态和动作,还记录每一步的新目标;
  • 借助 UVFA,HER 可以处理目标变化带来的策略变化;
  • 因此 HER 能在稀疏奖励中快速学习达成目标的方法。

2. 示例任务:GridWorld 多目标导航

2.1 环境设定

  • 环境是一个 5×5 的二维网格

  • 状态 $s = (x, y)$,表示智能体当前位置

  • 目标 $g = (x_g, y_g)$

  • 动作空间:上、下、左、右(共 4 个动作)

  • 奖励:

    • 到达目标时:+0(成功)
    • 其他任何状态:-1(稀疏奖励)

2.2 UVFA 代码结构(基于 PyTorch)

1️⃣ 状态 + 目标 合并输入

import torch
import torch.nn as nn
import torch.nn.functional as F

class UVFA_QNetwork(nn.Module):
    def __init__(self, input_dim=4, hidden_dim=64, action_dim=4):
        super().__init__()
        self.fc1 = nn.Linear(input_dim, hidden_dim)
        self.fc2 = nn.Linear(hidden_dim, hidden_dim)
        self.q_out = nn.Linear(hidden_dim, action_dim)

    def forward(self, state, goal):
        x = torch.cat([state, goal], dim=-1)  # 拼接 s 和 g
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        q_values = self.q_out(x)
        return q_values

✅ 输入维度:状态 + 目标 = 2 + 2 = 4
✅ 输出维度:动作数(4个)


2️⃣ 示例输入

state = torch.tensor([[1.0, 2.0]])  # 当前在 (1,2)
goal = torch.tensor([[4.0, 4.0]])   # 目标在 (4,4)

q_net = UVFA_QNetwork()
q_values = q_net(state, goal)

print(q_values)
# 输出:tensor([[..., ..., ..., ...]]),代表4个动作的Q值

3️⃣ Q-Learning 更新(伪代码)

# 假设 transition (s, a, r, s', g)
q_values = q_net(s, g)
q_value = q_values.gather(1, a)  # 选中动作a对应的Q值

with torch.no_grad():
    q_next = q_net(s_next, g).max(1)[0].unsqueeze(1)
    q_target = r + gamma * q_next

loss = F.mse_loss(q_value, q_target)

4️⃣ 多目标训练示意

每次 episode:

  • 随机采样初始位置 $s$
  • 随机采样目标位置 $g$
  • 输入网络的是 $s$ 与 $g$,目标是到达 $g$

训练后:

  • 给定任意 $g$,都能导出一条通往目标的路径!

📈 效果与泛化能力

训练目标数 泛化目标
5 个目标 ✔ 部分未见目标可成功
所有位置作为目标 ✔ 全部目标都可导航
单目标训练 ✖ 无法泛化到其他目标

✅ 使用 UVFA 后,模型具备 目标泛化能力


🚀 小结

模块 内容
状态输入 s = (x, y)
目标输入 g = (xg, yg)
网络输入 [x, y, xg, yg]
输出 Q(s, a, g),每个动作的Q值
好处 一套模型,多目标导航、可泛化、支持 HER 等

📚 参考文献

  • Schaul et al., 2015 — Universal Value Function Approximators, ICML
  • Andrychowicz et al., 2017 — Hindsight Experience Replay, NeurIPS