什么是价值函数?

价值函数(Value Function)是强化学习中的一个重要概念。它定义为某个状态(或状态-动作对)的预期累积奖励。

价值函数为找到最优策略提供了指导。根据贝尔曼方程,我们可以通过价值函数来迭代地计算出最优策略。

主要有两种类型的价值函数:

  • 状态价值函数(State Value Function):定义为在某个状态下,遵循当前策略得到的预期累积奖励。用V(s)表示。
  • 动作价值函数(Action Value Function):定义为在某个状态下选择某个动作,并遵循当前策略得到的预期累积奖励。用Q(s,a)表示。

价值函数的计算主要通过两种方法:

  • 迭代法(Iterative Methods):如价值迭代和策略迭代。逐步逼近最优价值函数。
  • 采样法(Sampling Methods):如Q学习等Off-policy方法。通过采样和重weighting更新价值函数。

迭代法基于贝尔曼方程,逐步计算最优价值函数。但效率较低,难以扩展到高维或连续状态空间。

采样法通过采样学习价值函数,效率较高但可能学习结果次优。

示例:

python
import numpy as np

# 环境状态空间和动作空间  
states = [0, 1, 2]  
actions = [0, 1]

# 状态转移概率和即时奖励  
P = {0: {0: 0.5, 1: 0.5},  
     1: {2: 1.0},  
     2: {1: 1.0}}
R = {0: {0: 1, 1: 1},  
     1: {2: 10},  
     2: {1: 5}}

# 初始化价值函数  
V = {0: 0, 1: 0, 2: 0}  

# 迭代法-价值迭代
while True:  
    delta = 0
    for s in states:
        v = V[s]  # 当前状态价值  
        new_v = 0  # 新状态价值

        # 根据状态转移概率和奖励计算新状态价值  
        for a in actions:
            for next_s in P[s]:  
                new_v += P[s][next_s] * (R[s][a] + 0.9 * V[next_s]) 

        # 更新价值函数并计算差分  
        V[s] = new_v
        delta = max(delta, np.abs(v - V[s]))

    # 如果差分足够小,则收敛,结束迭代
    if delta < 1e-4:
        break

print(V)
# {0: 9.5, 1: 10.0, 2: 5.0}

在这个示例中,我们实现了价值迭代算法。定义了一个简单的MDP环境,设置状态转移概率和奖励。然后通过迭代计算最优的状态价值函数V。