在学习并实现强化学习算法中, 我发现累积奖励的计算通常是倒序计算的. 究其原因, 我明白了, 这么计算其实是一种递推算法, 也和其奖励折扣机制有关.

奖励折扣机制

强化学习例如策略梯度算法中, 奖励是折扣的. 折扣因子 $\gamma$ 用于衡量未来奖励对当前决策的重要性. 其数学表示如下:

\[G_t = R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + ...\]

其中:

  • $G_t$: 表示从时间步 $t$ 开始的累积奖励

  • $R_{t+1}$: 于时间步 $t+1$ 获得的奖励

  • $\gamma$: 折扣因子, 取值范围 $\gamma \in [0, 1]$

折扣因子 $\gamma$ 则是算法的核心超参数, $\gamma$ 越小, 则在指数 $n$ 不断增加的情况下, $\gamma ^ n$ 越来越小, 这表示未来的奖励被 $\gamma$ 权重系数缩小到越来越小的值, 即权重更小或影响更小.

程序实现中, 奖励为什么要反向计算

假设智能体轨迹 $\tau$ 共涉及 4 个时间步, 在时间步 1 的累积奖励计算可以表示为如下形式:

\[G_1 = R_2 + \gamma \cdot (R_3 + \gamma \cdot R_4) \\ G_2 = R_3 + \gamma \cdot R_4 \\ G_3 = R_4\]

可以得出:

\[G_1 = R_2 + \gamma \cdot G_2 \\ G_2 = R_3 + \gamma \cdot G_3\]

所以上述计算过程可以用递推式表示:

\[G_{t-1} = R_t + \gamma \cdot G_t\]

在程序上可以如此实现:

cumulative_reward = 0
for reward in reversed(episode_rewards):
    cumulative_reward = reward + gamma * cumulative_reward