折扣因子的引入实际上就是为了能够收敛
在强化学习中,状态价值函数$V(s)$和动作价值函数$Q(s,a)$的递推方程中,折扣因子$\gamma$(或$\lambda$)用于对未来奖励进行加权:
状态价值函数:
$V(s) = \mathbb{E}\left[R_t + \gamma R_{t+1} + \gamma^2 R_{t+2} + \cdots \mid S_t = s\right]$
动作价值函数:
$Q(s,a) = \mathbb{E}\left[R_t + \gamma R_{t+1} + \gamma^2 R_{t+2} + \cdots \mid S_t = s, A_t = a\right]$
在无限时间序列的MDP中,如果不对未来奖励进行折扣,可能出现以下问题:
几何级数收敛性:
引入折扣因子$\gamma$后,即使奖励序列有界,无限和也会收敛:
$\sum_{t=0}^{\infty} \gamma^t R_t \leq R_{\max} \sum_{t=0}^{\infty} \gamma^t = \frac{R_{\max}}{1-\gamma}$
路径收益重新定义:
| 类型 | 公式 | 特点 |
|---|---|---|
| 原始路径收益 | $G_t = \sum_{k=0}^{\infty} R_{t+k}$ | 可能发散 |
| 折扣路径收益 | $G_t = \sum_{k=0}^{\infty} \gamma^k R_{t+k}$ | 保证收敛 |
实际意义:
无折扣情况的问题:
$V(s) = \sum_a \pi(a|s) \sum_{s'} P(s'|s,a) \left[ R(s,a,s') + V(s') \right]$
引入折扣因子后的Bellman方程:
$V(s) = \sum_a \pi(a|s) \sum_{s'} P(s'|s,a) \left[ R(s,a,s') + \gamma V(s') \right]$
| $\gamma$值 | 适用场景 | 特点 |
|---|---|---|
| $0.9 \sim 0.99$ | 大多数强化学习应用 | 标准选择 |
| $0.95$ | 平衡短期和长期收益 | 常用值 |
| $< 0.8$ | 需要快速收敛的简单任务 | 短期导向 |
值迭代算法中的折扣因子应用:
def value_iteration(P, R, gamma=0.95, theta=1e-6):
n_states = len(P)
V = np.zeros(n_states)
while True:
delta = 0
for s in range(n_states):
v_old = V[s]
V[s] = max([np.sum(P[s][a] * (R[s][a] + gamma * V))
for a in range(len(P[s]))])
delta = max(delta, abs(v_old - V[s]))
if delta < theta:
break
return V
对应的数学更新公式为:
$V_{k+1}(s) = \max_a \sum_{s'} P(s'|s,a) \left[ R(s,a,s') + \gamma V_k(s') \right]$
变折扣因子的数学表示:
$G_t = \sum_{k=0}^{\infty} \left( \prod_{i=0}^{k-1} \gamma_{t+i} \right) R_{t+k}$
其中$\gamma_{t+i}$为时间步$t+i$的折扣因子
折扣因子是强化学习中的关键超参数,其核心作用是: