1. 为什么端到端驾驶需要强化学习#
Figure from AlphaDrive: GRPO-based RL for Autonomous Driving
监督学习——无论是通过模仿学习(imitation learning)还是行为克隆(behavior cloning)——只能将自动驾驶系统带到一定水平。其根本局限在于分布性:训练数据来自专家演示,训练与部署之间的任何分布偏移都会导致误差累积。更关键的是,监督目标与驾驶的真正目标存在错位。最小化与真实轨迹的 L2 距离会同等严厉地惩罚安全偏差和危险偏差,且没有机制让模型发现比数据集中更好 的轨迹。
强化学习提供了一个原则性的替代方案。RL 优化直接衡量驾驶质量的奖励信号 ——避碰、朝目的地推进、乘客舒适性、规则遵守——而非模仿特定动作。策略可以自由地发现能获得高奖励的新颖策略,即使它们与专家行为不同。这对于处理不存在演示的长尾场景尤其有价值。
然而,挑战在于驾驶并非标准的 MDP。在大多数基于 log-replay 数据的端到端系统中,模型在 t = 0 t=0 时生成完整的未来轨迹,并在评估后获得单一奖励——这是一种上下文赌博机(contextual bandit)结构,而非序列决策过程。这种结构性差异贯穿 RL 流水线的方方面面:如何估计优势、采样如何工作、损失函数如何设计。
2. 从 REINFORCE 到 PPO 到 GRPO:策略梯度谱系# 2.1 策略梯度定理# 考虑参数化策略 π θ ( a ∣ s ) \pi_\theta(a|s) 。目标为最大化期望回报:
J ( θ ) = E τ ∼ π θ [ R ( τ ) ] = E τ ∼ π θ [ ∑ t = 0 T γ t r ( s t , a t ) ] J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta}\left[R(\tau)\right] = \mathbb{E}_{\tau \sim \pi_\theta}\left[\sum_{t=0}^{T} \gamma^t r(s_t, a_t)\right] 策略梯度定理 [1] 给出了该目标的梯度:
∇ θ J ( θ ) = E τ ∼ π θ [ ∑ t = 0 T ∇ θ log π θ ( a t ∣ s t ) ⋅ R ( τ ) ] \nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta}\left[\sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t|s_t) \cdot R(\tau)\right] 这就是 REINFORCE 估计量 [2] 。直观上,它提高带来高回报的动作的对数概率,降低未带来高回报的动作的对数概率。下图展示了计算流程:
Policy Gradient Computation Flow 1. Sample τ ~ π_θ(a|s) 2. Return R(τ) = Σ γ^t r_t 3. Log-prob ∇ log π_θ(a_t|s_t) 4. Update θ ← θ + α ∇J REINFORCE Problem: High Variance R(τ) is a Monte Carlo estimate — single trajectory return has enormous variance Baseline: R(τ) - b Advantage: A(s,a) Group Relative: A_i 2.2 方差缩减:从回报到优势# 原始 REINFORCE 梯度使用 R ( τ ) R(\tau) 作为乘子。这存在问题,因为 R ( τ ) R(\tau) 方差很高——单条轨迹回报在真实期望回报周围剧烈波动。标准做法是用优势函数 替换 R ( τ ) R(\tau) :
A π ( s t , a t ) = Q π ( s t , a t ) − V π ( s t ) A^\pi(s_t, a_t) = Q^\pi(s_t, a_t) - V^\pi(s_t) 优势衡量动作 a t a_t 相比状态 s t s_t 下平均动作好多少 。由此得到**优势行动者-评判家(advantage actor-critic)**梯度:
∇ θ J ( θ ) = E [ ∑ t = 0 T ∇ θ log π θ ( a t ∣ s t ) ⋅ A π ( s t , a t ) ] \nabla_\theta J(\theta) = \mathbb{E}\left[\sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t|s_t) \cdot A^{\pi}(s_t, a_t)\right] 实践中,优势通过广义优势估计(Generalized Advantage Estimation, GAE) [3] 来计算,它在高方差蒙特卡洛估计和高偏置 TD(0) 估计之间通过参数 λ \lambda 进行插值:
A ^ t GAE = ∑ l = 0 T − t ( γ λ ) l δ t + l \hat{A}^{\text{GAE}}_t = \sum_{l=0}^{T-t} (\gamma\lambda)^l \delta_{t+l} 其中 δ t = r t + γ V ( s t + 1 ) − V ( s t ) \delta_t = r_t + \gamma V(s_{t+1}) - V(s_t) 为 TD 误差。GAE 需要一个学习的价值函数 V ψ V_\psi ,通常是与策略网络同步训练的神经网络。
2.3 PPO:裁剪替代目标# 近端策略优化(Proximal Policy Optimization, PPO)[4] 解决了大幅策略更新的不稳定性问题。核心思路是约束策略比率:
ρ t ( θ ) = π θ ( a t ∣ s t ) π θ old ( a t ∣ s t ) \rho_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)} 裁剪替代目标 为:
L PPO-clip ( θ ) = E t [ min ( ρ t ( θ ) A ^ t , clip ( ρ t ( θ ) , 1 − ε , 1 + ε ) A ^ t ) ] L^{\text{PPO-clip}}(\theta) = \mathbb{E}_t\left[\min\left(\rho_t(\theta) \hat{A}_t,\ \text{clip}(\rho_t(\theta), 1-\varepsilon, 1+\varepsilon) \hat{A}_t\right)\right] 裁剪消除了将比率推出 [ 1 − ε , 1 + ε ] [1-\varepsilon, 1+\varepsilon] 范围的动力,外层 min \min 确保裁剪版本是悲观的下界。结合 GAE 的优势估计器,PPO 在实践中提供稳定、单调的策略改进。
然而,PPO 有显著的架构成本:它需要一个与策略网络规模相当的价值网络 V ψ V_\psi 用于计算 GAE。在 LLM 场景下,这意味着需要训练和维护第二个等参数量的模型,内存占用翻倍,且使训练流水线复杂化。
2.4 GRPO:消除价值网络# 组相对策略优化(Group Relative Policy Optimization, GRPO)由 DeepSeekMath [5] 引入,完全去除了价值网络。核心思路简单而强大:对于给定输入,从旧策略中采样一组 G G 个输出,对全部输出打分,并用组统计量 作为基线。
Advantage Estimation: PPO (GAE) vs. GRPO (Group Relative) PPO: GAE Advantage Value Network V_ψ Learns state values TD Errors δ_t δ_t = r_t + γV-V GAE: Σ(γλ)^l δ_{t+l} Bias-variance tradeoff via λ Â_t = GAE_t Per-token advantage Requires separate V_ψ — 2x memory GRPO: Group Relative Advantage Sample G outputs o_1, ..., o_G ~ π_old Reward Model r_1, ..., r_G Group Normalize r̃_i = (r_i - mean) / std Â_i = r̃_i Per-output advantage No value network — 1x memory 给定问题(或场景)q q ,从 π θ old \pi_{\theta_{\text{old}}} 中采样 G G 个输出 { o 1 , o 2 , … , o G } \{o_1, o_2, \ldots, o_G\} 。每个输出从奖励模型获得奖励 r i r_i 。组相对优势为:
r ~ i = r i − mean ( r ) std ( r ) + ε \tilde{r}_i = \frac{r_i - \text{mean}(\mathbf{r})}{\text{std}(\mathbf{r}) + \varepsilon} A ^ i , t = r ~ i (output i 中所有 token 共享同一优势) \hat{A}_{i,t} = \tilde{r}_i \quad \text{(output } i \text{ 中所有 token 共享同一优势)} GRPO 目标随后采用与 PPO 相同的裁剪替代结构,但使用这些组相对优势:
J GRPO ( θ ) = E [ 1 G ∑ i = 1 G 1 ∣ o i ∣ ∑ t = 1 ∣ o i ∣ { min [ ρ i , t A ^ i , t , clip ( ρ i , t , 1 − ε , 1 + ε ) A ^ i , t ] − β D K L [ π θ ∥ π ref ] } ] \mathcal{J}_{\text{GRPO}}(\theta) = \mathbb{E}\left[\frac{1}{G}\sum_{i=1}^{G}\frac{1}{|o_i|}\sum_{t=1}^{|o_i|}\left\{\min\left[\rho_{i,t}\hat{A}_{i,t},\ \text{clip}(\rho_{i,t}, 1-\varepsilon, 1+\varepsilon)\hat{A}_{i,t}\right] - \beta \mathbb{D}_{KL}[\pi_\theta \| \pi_{\text{ref}}]\right\}\right] 其中 ρ i , t = π θ ( o i , t ∣ q , o i , < t ) / π θ old ( o i , t ∣ q , o i , < t ) \rho_{i,t} = \pi_\theta(o_{i,t}|q, o_{i,<t}) / \pi_{\theta_{\text{old}}}(o_{i,t}|q, o_{i,<t}) 。
GRPO 中一个关键设计选择是 KL 惩罚的位置。在 PPO 中,KL 项被嵌入每步奖励 中,这意味着它会影响优势计算。而在 GRPO 中,KL 惩罚被直接放入损失函数 中,与优势估计解耦。这使得优势计算保持清晰和可解释。
维度 PPO GRPO 价值函数 需要学习的 V ψ V_\psi 无;组均值作为基线 优势估计 通过 TD 误差的 GAE 组相对归一化 KL 惩罚 嵌入每步奖励 直接在损失函数中 采样 每个输入单个输出 每个输入一组 G G 个输出 内存开销 ~2x(策略 + 价值网络) ~1x(仅策略) 逐 token 优势 是(随位置变化) 否(整个输出共享)
2.5 GRPO 在自动驾驶中的应用:AlphaDrive# GRPO 首次应用于自动驾驶的是 AlphaDrive [6] ,它将基于 GRPO 的 RL 应用于视觉语言模型的规划任务。AlphaDrive 引入了四个针对驾驶场景定制的规划导向 RL 奖励,并采用两阶段训练流水线(SFT 后接 RL)。一个值得注意的发现是,RL 训练激发出涌现的多模态规划能力 ——模型学会提出多样化的可行轨迹,无需显式的多模态监督。这一点尤为重要,因为轨迹规划中的多模态性(例如决定从障碍物左侧还是右侧超车)是安全高效驾驶的核心要求。
3. 统一优化框架# 在 PPO、GRPO 及其变体中,策略方法的优化目标可以统一表达为:
L total = λ policy ⋅ L policy + λ reg ⋅ L reg + λ aux ⋅ L aux \mathcal{L}_{\text{total}} = \lambda_{\text{policy}} \cdot \mathcal{L}_{\text{policy}} + \lambda_{\text{reg}} \cdot \mathcal{L}_{\text{reg}} + \lambda_{\text{aux}} \cdot \mathcal{L}_{\text{aux}} 每一项各有明确目的:
L policy \mathcal{L}_{\text{policy}} :核心策略优化损失,驱动策略向更高奖励的动作靠近。即裁剪替代目标(PPO-clip 或 GRPO-clip)。L reg \mathcal{L}_{\text{reg}} :正则化项,约束策略偏离参考策略过远。包括 KL 散度 D K L [ π θ ∥ π ref ] \mathbb{D}_{KL}[\pi_\theta \| \pi_{\text{ref}}] 、用于探索的熵奖励、信任域约束。L aux \mathcal{L}_{\text{aux}} :辅助损失,保留预训练或有监督微调的能力。包括模仿学习(行为克隆)损失、重建损失(用于扩散解码器)、价值函数损失。在驾驶 RL 流水线中的具体映射:
抽象项 具体实现 L policy \mathcal{L}_{\text{policy}} L GRPO-clip \mathcal{L}_{\text{GRPO-clip}} 或 L PPO-clip \mathcal{L}_{\text{PPO-clip}} L reg \mathcal{L}_{\text{reg}} L KL + L entropy \mathcal{L}_{\text{KL}} + \mathcal{L}_{\text{entropy}} L aux \mathcal{L}_{\text{aux}} L BC + L value + ∑ m λ aux , m L aux , m \mathcal{L}_{\text{BC}} + \mathcal{L}_{\text{value}} + \sum_m \lambda_{\text{aux},m} \mathcal{L}_{\text{aux},m}
核心策略损失展开为:
L GRPO-clip = − E [ 1 G ∑ i = 1 G min ( ρ i ( θ ) A ^ i , clip ( ρ i ( θ ) , 1 − ε , 1 + ε ) A ^ i ) ] \mathcal{L}_{\text{GRPO-clip}} = -\mathbb{E}\left[\frac{1}{G}\sum_{i=1}^{G}\min\left(\rho_i(\theta)\hat{A}_i,\ \text{clip}(\rho_i(\theta), 1-\varepsilon, 1+\varepsilon)\hat{A}_i\right)\right] 其中 ρ i ( θ ) = π θ ( a i ∣ s ) / π θ old ( a i ∣ s ) = exp ( log π θ ( a i ∣ s ) − log π θ old ( a i ∣ s ) ) \rho_i(\theta) = \pi_\theta(a_i|s) / \pi_{\theta_{\text{old}}}(a_i|s) = \exp(\log \pi_\theta(a_i|s) - \log \pi_{\theta_{\text{old}}}(a_i|s)) 。
4. 采样:LLM vs. 自动驾驶# 采样步骤——从当前策略生成候选输出——是 LLM 与驾驶 RL 差异最显著的环节。两种情况下,优势估计的质量都取决于采样组的多样性和质量,但对"有效样本"的定义存在根本差异。
采样空间:LLM 圆 vs Driving 多边形
拖动温度滑块 T,左 panel(LLM)的散点在圆形 token 空间内均匀膨胀;右 panel(Driving)的散点同等扩散,但越出可行多边形的点(红色)随 T 上升迅速增加。两个面板使用相同的随机种子,关键差异在于约束形状。
LLM 采样 是无约束的。给定提示词,模型通过温度缩放、top-k 过滤或核采样(top-p)来采样 token 序列。任何合法 token 序列都是语法上有效的输出;唯一的问题在于它是否有语义上的实用价值。采样空间是完整词汇表提升到序列长度维度,样本多样性由温度参数控制。
驾驶采样 则受到基本约束。采样轨迹必须满足:
运动学可行性 :轨迹必须尊重车辆动力学——最大转向角、加速度限制、 jerk 约束。需要瞬时横向位移的轨迹在物理上是不可能的。场景一致性 :轨迹不得穿过观测到的障碍物、违反交通规则或离开可行驶区域。时间连贯性 :轨迹必须平滑连续,位置或航向不得有不连续跳变。这些约束意味着对轨迹进行朴素扰动(类似于 LLM 中的温度采样)会产生大量无效样本。微小扰动可能将轨迹推入障碍物区域;较大扰动可能产生物理上不可行的路径。采样策略必须精心设计以产生有意义的 多样性——轨迹在有趣的方式上有所不同(左侧超车 vs 右侧超车、激进汇入 vs 保守让行),同时保持物理可行性。
这正是基于扩散模型的轨迹解码器的天然优势所在。去噪过程可以被引导以满足约束条件,噪声调度则以物理上有意义的方式控制探索-利用权衡。
5. 损失设计:多目标组合# 生产级驾驶 RL 系统中的完整训练目标通常组合多个损失项:
L total = λ pg ⋅ L GRPO-clip + λ kl ⋅ L KL + λ vf ⋅ L value + λ ent ⋅ L entropy + λ bc ⋅ L BC + ∑ m λ aux , m ⋅ L aux , m \mathcal{L}_{\text{total}} = \lambda_{\text{pg}} \cdot \mathcal{L}_{\text{GRPO-clip}} + \lambda_{\text{kl}} \cdot \mathcal{L}_{\text{KL}} + \lambda_{\text{vf}} \cdot \mathcal{L}_{\text{value}} + \lambda_{\text{ent}} \cdot \mathcal{L}_{\text{entropy}} + \lambda_{\text{bc}} \cdot \mathcal{L}_{\text{BC}} + \sum_m \lambda_{\text{aux},m} \cdot \mathcal{L}_{\text{aux},m} 每一项发挥特定作用:
策略梯度损失 (L GRPO-clip \mathcal{L}_{\text{GRPO-clip}} ):策略改进的主要驱动力。裁剪机制防止破坏性的大幅更新,组相对优势则提供方差降低的梯度信号。
KL 散度 (L KL = D K L [ π θ ∥ π ref ] \mathcal{L}_{\text{KL}} = \mathbb{D}_{KL}[\pi_\theta \| \pi_{\text{ref}}] ):约束策略偏离参考策略(通常是 SFT 检查点)过远。缺少此项时,RL 训练可能导致模型"遗忘"预训练能力——这种现象被称为奖励黑客(reward hacking) ,即策略找到奖励函数漏洞从而获得高分但产生低质量轨迹。
熵奖励 (L entropy = − E [ H ( π θ ) ] \mathcal{L}_{\text{entropy}} = -\mathbb{E}[\mathcal{H}(\pi_\theta)] ):通过防止策略坍缩到确定性模式来鼓励探索。在驾驶场景中,这对维持多模态性至关重要:模型应继续提出多样化的合理轨迹,而非收敛到单一的平均解。
行为克隆损失 (L BC \mathcal{L}_{\text{BC}} ):在专家演示上计算的辅助模仿损失。作为正则化项,防止策略过度偏离安全的类人驾驶行为。在 RL 训练早期尤为重要,此时奖励信号可能嘈杂或稀疏。
价值函数损失 (L value \mathcal{L}_{\text{value}} ):当使用价值网络时(如 PPO),这是训练 V ψ V_\psi 的回归损失。在基于 GRPO 的系统中,该项不存在,但在结合 GRPO 优势与学习基线的混合方法中以进一步降低方差时仍可能出现。
其他辅助损失 (L aux , m \mathcal{L}_{\text{aux},m} ):领域特定项,如扩散解码器的重建损失、碰撞预测损失或舒适度正则化。这类项通常幅度较小但提供重要的归纳偏置。
系数 { λ } \{\lambda\} 是关键超参数。实践中,它们通过网格搜索和手动调参的组合来确定。一种常见做法是以较高的 λ bc \lambda_{\text{bc}} 开始(强模仿正则化),随着 RL 训练稳定逐渐退火,让策略梯度信号占据主导。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# Pseudocode: GRPO Training Loop for Driving
for each iteration:
# 1. Sample trajectories from old policy
for each scene s in batch:
trajectories = sample_G(π_θ_old, s, G=16) # G trajectories per scene
# 2. Score trajectories with reward model
for i in range(G):
r_i = reward_model(trajectories[i], scene)
# 3. Compute group-relative advantages
r_mean = mean(r_1, ..., r_G)
r_std = std(r_1, ..., r_G) + ε
for i in range(G):
Â_i = (r_i - r_mean) / r_std
# 4. Compute clipped surrogate loss
for i in range(G):
ρ_i = π_θ(a_i|s) / π_θ_old(a_i|s)
L_pg_i = -min(ρ_i * Â_i, clip(ρ_i, 1-ε, 1+ε) * Â_i)
L_pg = mean(L_pg_1, ..., L_pg_G)
# 5. Compute regularization losses
L_kl = D_KL[π_θ || π_ref]
L_ent = -H(π_θ)
L_bc = imitation_loss(π_θ, expert_data)
# 6. Total loss and update
L_total = λ_pg * L_pg + λ_kl * L_kl + λ_ent * L_ent + λ_bc * L_bc
θ = θ - α * ∇_θ L_total
6. 扩散、噪声与探索# 对于基于扩散模型的轨迹解码器,噪声与探索之间的关系值得特别关注。在标准扩散过程中,干净轨迹 x 0 x_0 经过 T T 步添加高斯噪声而被污染:
x t = α ˉ t x 0 + 1 − α ˉ t ϵ , ϵ ∼ N ( 0 , I ) x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon, \quad \epsilon \sim \mathcal{N}(0, I) 推理时,模型从 x T x_T (纯噪声)去噪回到 x 0 x_0 (干净轨迹)。初始噪声 ϵ \epsilon 决定了生成哪条轨迹。在 RL 语境下,该噪声扮演的角色类似于 LLM 采样中的温度——但有一个关键区别。
基于扩散的驾驶中的噪声远不止"采样随机性"。它直接决定:
探索范围 :噪声的大小和结构控制生成轨迹能偏离均值多远。较大噪声产生更多样化的候选轨迹。候选轨迹形态 :不同的噪声实现产生定性不同的轨迹形状——变道 vs 跟车道、激进 vs 保守、左转 vs 右转。噪声不仅平移一条轨迹,还可以改变其模式 。组分布质量 :对于 GRPO,优势估计依赖于采样组具有有意义的奖励方差。若噪声太小,几乎所有轨迹相同,组相对优势将被噪声主导而非信号。若噪声太大,大量轨迹变得物理无效,奖励信号失去信息量。这在噪声调度中形成了三方张力:
有效多样性 :噪声必须足够大以产生奖励有显著差异的轨迹,使组相对优势能够区分好坏。轨迹有效性 :噪声必须足够小(或去噪过程受到充分约束),以保持轨迹处于运动学可行且场景一致的范围内。与训练目标一致 :探索方向应与奖励函数实际衡量的内容一致。产生多样化但与奖励无关的变化(例如不影响碰撞安全的微小横向偏移)会浪费采样预算。实践中,这些问题通过以下方式解决:受限扩散(用运动学约束引导去噪过程)、自适应噪声调度(根据场景复杂性调整噪声水平)、拒绝采样(在计算奖励前丢弃违反硬约束的轨迹)的组合。
7. 总结# 组件 REINFORCE PPO GRPO 目标 最大化 J ( θ ) = E [ R ( τ ) ] J(\theta) = \mathbb{E}[R(\tau)] 裁剪替代目标 裁剪替代目标 优势 R ( τ ) R(\tau) (原始回报)通过学习的 V ψ V_\psi 的 GAE 组相对归一化 基线 无 学习的价值函数 组均值奖励 价值网络 无 有(与策略同规模) 无 方差 很高 低(GAE + 学习基线) 中等(组统计量) 更新约束 无 裁剪比率 [ 1 − ε , 1 + ε ] [1-\varepsilon, 1+\varepsilon] 裁剪比率 [ 1 − ε , 1 + ε ] [1-\varepsilon, 1+\varepsilon] KL 正则化 无 在奖励中(影响优势) 在损失中(独立于优势) 内存 1x ~2x ~1x 驾驶适用性 仅作基准 通用 VLM 规划、组采样场景
从 REINFORCE 到 PPO 到 GRPO 的演进代表了实用性效率不断提升的路径:REINFORCE 奠定理论基础,PPO 通过裁剪和学习基线引入稳定优化,GRPO 则利用采样过程的组结构消除了昂贵的价值网络。对自动驾驶而言,GRPO 尤具吸引力,因为轨迹规划的上下文赌博机结构天然产出组采样输出,且无价值网络简化了对本就复杂的端到端模型的训练流水线。
然而,GRPO 并非 PPO 的通用替代品。在逐 token 优势重要的场景下(如有意义中间状态的序列决策),GAE 提供的信号比 GRPO 的逐输出优势更为丰富。两者之间的选择应由问题结构来指导:带组采样的上下文赌博机倾向 GRPO;长视野的序列 MDP 倾向 PPO。
References# 1. Sutton, R.S., McAllester, D.A., Singh, S.P., & Mansour, Y. (2000). Policy gradient methods for reinforcement learning with function approximation. NeurIPS . Link
2. Williams, R.J. (1992). Simple statistical gradient-following algorithms for connectionist reinforcement learning. Machine Learning , 8(3-4), 229-256.
3. Schulman, J., Moritz, P., Levine, S., Jordan, M.I., & Abbeel, P. (2016). High-dimensional continuous control using generalized advantage estimation. ICLR .
4. Schulman, J., Wolski, F., Dhariwal, P., Radford, A., & Klimov, O. (2017). Proximal policy optimization algorithms. arXiv:1707.06347 .
5. Shao, Z., Wang, P., Zhu, Q., et al. (2024). DeepSeekMath: Pushing the limits of mathematical reasoning in open language models. arXiv:2402.03300 . GRPO is introduced in Section 4 of this paper.
6. Jiang, B., Chen, S., Zhang, Q., Liu, W., & Wang, X. (2025). AlphaDrive: Unleashing the power of VLMs in autonomous driving via GRPO-based reasoning and planning. arXiv:2503.07608 .