(4-2)Q-learning与贝尔曼方程:贝尔曼方程在Q-learning中的应用

4.2  贝尔曼方程在Q-learning中的应用

贝尔曼方程在Q-learning中扮演着关键的角色,它用于更新Q值函数,从而帮助Q-learning学习最优策略。贝尔曼方程在Q-learning中的应用是通过不断更新Q值函数来学习最优策略,它将当前状态下的即时奖励与未来可能的最大估计奖励结合起来,以更新Q值。这个过程通过迭代进行,直到Q值逐渐收敛到最优Q值函数,智能体可以根据这个函数选择最佳动作来实现其目标,这是Q-learning算法的核心思想。

4.2.1  Q-learning与贝尔曼最优性方程的关系

Q-learning与贝尔曼最优性方程(Bellman Optimality Equation)之间存在紧密的关系。贝尔曼最优性方程描述了最优策略的性质,而Q-learning是一种强化学习算法,用于学习最优策略。

1. 贝尔曼最优性方程

贝尔曼最优性方程描述了最优策略下的状态值函数(V*)和动作值函数(Q*)之间的关系。贝尔曼最优性方程通常分为两种形式:

  1. 对于状态值函数V*:
V*(s) = max_a Σ[P(s, a, s') * (R(s, a) + γ * V*(s'))]

其中,V*(s) 表示在最优策略下状态s的值,P(s, a, s')表示从状态s执行动作a后转移到状态s'的概率,R(s, a)表示在状态s执行动作a后的即时奖励,γ是折扣因子,max_a表示选择具有最大值的动作a。

  1. 对于动作值函数Q*:
Q*(s, a) = Σ[P(s, a, s') * (R(s, a) + γ * max_a' Q*(s', a'))]

其中,Q*(s, a) 表示在最优策略下状态s执行动作a的值,P(s, a, s')表示从状态s执行动作a后转移到状态s'的概率,R(s, a)表示在状态s执行动作a后的即时奖励,γ是折扣因子,max_a'表示在状态s'下选择具有最大值的动作a'。

2. 与Q-learning的关系

Q-learning是一种用于学习最优策略的强化学习算法。它使用Q值函数(Q(s, a))来估计在状态s下执行动作a的价值。Q-learning的Q值更新规则基于贝尔曼方程,用于逼近最优Q值函数(Q*)。

Q-learning的Q值更新规则如下:

Q(s, a) ← (1 - α) * Q(s, a) + α * [R(s, a) + γ * max_a' Q(s', a')]

这个更新规则的右侧部分非常类似于贝尔曼最优性方程中的动作值函数Q的定义。实际上,Q-learning的目标是通过迭代地更新Q值函数,使其逼近最优Q值函数Q,从而学习到最优策略。Q-learning的收敛性和正确性可以被理论上证明,确保了它在足够的训练迭代后能够学到最优策略。

请看下面的例子,演示了Q-learning与贝尔曼最优性方程的关系。Q-learning通过迭代更新Q值函数,逐渐逼近满足贝尔曼最优性方程的Q值函数。

实例4-4:Q-learning算法迭代更新Q值函数(源码路径:daima\4\qbei.py

实例文件qbei.py的具体实现代码如下所示。

import numpy as np

# 定义状态空间、动作空间和初始Q值函数
num_states = 6
num_actions = 2
Q = np.zeros((num_states, num_actions))

# 定义参数
learning_rate = 0.1  # 学习率
discount_factor = 0.9  # 折扣因子
epsilon = 0.2  # ε-greedy策略中的ε
num_episodes = 1000  # 训练的迭代次数

# Q-learning算法
for episode in range(num_episodes):
    state = 0  # 初始状态
    done = False  # 游戏结束标志

    while not done:
        # 使用ε-greedy策略选择动作
        if np.random.rand() < epsilon:
            action = np.random.randint(num_actions)  # 随机选择动作
        else:
            action = np.argmax(Q[state, :])  # 根据Q值选择最佳动作

        # 执行动作并观察奖励
        if state == num_states - 1:  # 达到最终状态
            reward = 1
            done = True
        else:
            reward = 0

        # 选择下一个状态
        next_state = state + 1 if not done else state

        # 使用贝尔曼最优性方程更新Q值
        best_next_action = np.argmax(Q[next_state, :])
        Q[state, action] = (1 - learning_rate) * Q[state, action] + \
                           learning_rate * (reward + discount_factor * Q[next_state, best_next_action])

        state = next_state  # 更新状态

# 打印学习后的Q值函数
print("Learned Q-values:")
print(Q)

在这个示例中,Q-learning算法通过迭代更新Q值函数,更新规则与贝尔曼最优性方程一致。具体来说,Q值的更新部分代码如下:

Q[state, action] = (1 - learning_rate) * Q[state, action] + \
                   learning_rate * (reward + discount_factor * Q[next_state, best_next_action])

这个更新规则基于贝尔曼最优性方程的思想,表示Q值应该等于当前的即时奖励(reward)加上未来的最大估计奖励(discount_factor * Q[next_state, best_next_action]),学习率(learning_rate)用于平衡新估计值和旧值之间的权衡。

通过这种方式,Q-learning逐渐逼近满足贝尔曼最优性方程的最优Q值函数,从而使得智能体能够学到最优策略。这个示例演示了Q-learning与贝尔曼最优性方程之间的关系,以及如何使用Q-learning来学习最优策略。执行后会输出:

Learned Q-values:
[[5.89837978 5.90385495]
 [6.55993687 6.55029523]
 [7.28506966 7.28892525]
 [8.09893454 8.09353746]
 [8.99890735 8.99481613]
 [9.99891168 9.99130269]]

由此可见,执行后输出了学习后的Q值函数。这些Q值反映了每个状态-动作对的估计价值。随着训练的进行,Q-learning逐渐逼近最优Q值函数,最终学习到了一个良好的策略,对每个状态都有合适的动作选择,这个结果表明Q-learning成功地学到了问题的最优策略。

总之,贝尔曼最优性方程描述了最优策略的性质,而Q-learning是一种基于贝尔曼方程的算法,用于学习最优策略的近似。通过不断更新Q值函数,Q-learning可以逐渐逼近最优策略所对应的最优Q值函数。这种关系使得Q-learning成为了解决强化学习问题的有力工具。

4.2.2  贝尔曼方程的迭代计算与收敛

贝尔曼方程的迭代计算是一种用于估计值函数的方法,通常在强化学习中应用。贝尔曼方程是一组方程,描述了值函数(状态值函数或动作值函数)之间的关系,它在马尔可夫决策过程(MDP)中起着关键作用。迭代计算值函数的过程可以用于逐步逼近最优值函数,以获得最优策略。这个过程通常被称为"迭代策略评估"或"迭代值函数优化"。

迭代计算贝尔曼方程的基本步骤如下:

(1)初始化:首先,需要初始化值函数的估计值。可以将所有状态或状态-动作对的值初始化为任意的值,通常使用随机值或零值。

(2)迭代:迭代计算是一个重复的过程,直到值函数收敛到最优值函数或足够接近最优值函数为止。通常,使用以下更新规则来更新值函数的估计:

  1. 对于状态值函数V(s)的更新:
V(s) ← Σ[P(s, a, s') * (R(s, a, s') + γ * V(s'))]

其中,P(s, a, s')表示从状态s执行动作a后转移到状态s'的概率,R(s, a, s')表示在状态s执行动作a后从状态s到状态s'的即时奖励,γ是折扣因子,V(s')表示下一个状态s'的值函数估计。

  1. 对于动作值函数Q(s, a)的更新:
Q(s, a) ← Σ[P(s, a, s') * (R(s, a, s') + γ * max_a' Q(s', a'))]

其中,P(s, a, s')表示从状态s执行动作a后转移到状态s'的概率,R(s, a, s')表示在状态s执行动作a后从状态s到状态s'的即时奖励,γ是折扣因子,max_a'表示在状态s'下选择具有最大值的动作a'。

(3)收敛条件:迭代计算的停止条件通常是当值函数的变化非常小,或者在连续迭代中达到一定的迭代次数时停止。常见的收敛条件包括:

  1. 值函数变化小于某个小的阈值ε,即|V_new - V_old| < ε,其中V_new是新估计的值函数,V_old是旧估计的值函数。
  2. 设定最大迭代次数,当达到最大迭代次数时停止迭代。

(4)最优策略提取:一旦值函数收敛,可以通过贪婪策略(对于状态值函数)或选择具有最高值的动作(对于动作值函数)来提取最优策略。最优策略将基于最终的值函数估计。

贝尔曼方程的迭代计算方法确保值函数逐步逼近最优值函数,并且最终会达到或接近最优解。然而,收敛速度和精度可能取决于MDP的性质、初始化和算法参数的选择。在实践中,通常需要仔细调整参数和监视值函数的变化,以确保算法能够收敛到令人满意的解。

下面是一个使用Python演示贝尔曼方程的迭代计算和收敛的简单示例,在示例中,将使用价值迭代算法来逐步逼近贝尔曼方程的解,以找到最优值函数。

实例4-5:使用价值迭代算法逐步逼近贝尔曼方程的解(源码路径:daima\4\diedai.py

实例文件diedai.py的具体实现代码如下所示。

import numpy as np

# 定义状态空间、动作空间和初始值函数
num_states = 5
num_actions = 2
V = np.zeros(num_states)  # 初始化值函数为0

# 定义参数
discount_factor = 0.9  # 折扣因子
theta = 0.0001  # 收敛阈值
max_iterations = 1000  # 最大迭代次数

# 定义状态转移概率和奖励函数(这里是示例,可以根据具体问题定义)
# P[state, action, next_state] 表示从状态state执行动作action后转移到状态next_state的概率
P = np.array([
    [[0.9, 0.1, 0.0, 0.0, 0.0], [0.0, 0.0, 0.9, 0.1, 0.0]],
    [[0.1, 0.9, 0.0, 0.0, 0.0], [0.0, 0.0, 0.1, 0.9, 0.0]],
    [[0.0, 0.0, 0.9, 0.1, 0.0], [0.0, 0.0, 0.0, 0.1, 0.9]],
    [[0.0, 0.0, 0.0, 0.9, 0.1], [0.0, 0.0, 0.0, 0.0, 1.0]],
    [[1.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0]]
])

# 定义奖励函数
R = np.array([1.0, 1.0, 1.0, 1.0, 0.0])

# 进行值迭代
for iteration in range(max_iterations):
    delta = 0  # 用于判断收敛的变量
    for s in range(num_states):
        v = V[s]  # 当前状态的值函数估计

        # 计算状态s下采取不同动作的估计值
        action_values = []
        for a in range(num_actions):
            action_value = np.sum(P[s, a, :] * (R + discount_factor * V))
            action_values.append(action_value)

        # 更新值函数
        V[s] = max(action_values)

        # 计算值函数的变化
        delta = max(delta, abs(v - V[s]))

    # 如果值函数的变化小于阈值,认为收敛
    if delta < theta:
        print(f"Converged after {iteration} iterations")
        break

# 打印学习后的值函数
print("Learned Value Function:")
print(V)

在上述代码中使用了价值迭代算法,该算法反复计算和更新状态的值函数,直到值函数不再发生显著变化(根据设定的阈值)。值函数的更新基于贝尔曼方程,通过计算不同动作的估计值来逼近最优值函数。在迭代计算的过程中,如果值函数的变化小于指定的阈值 theta,则认为已经收敛。执行后会输出:

Converged after 84 iterations
Learned Value Function:
[9.99916057 9.99920579 9.74984863 9.47288571 9.99924451]

上述代码成功地执行并输出了结果。在这个示例中,值迭代算法经过84次迭代后达到了收敛条件,值函数的变化小于指定的阈值 theta。学习后的值函数表示了在每个状态下的最优估计值,以及相应的最优策略。这个结果表明值迭代成功地找到了问题的最优解。

4.2.3  Q-learning中贝尔曼方程的实际应用

Q-learning中的贝尔曼方程在实际应用中扮演着关键的角色,它用于更新Q值函数,从而帮助智能体学习最优策略。以下是Q-learning中贝尔曼方程的实际应用:

  1. Q值的初始化:Q-learning开始时,通常会初始化Q值函数的所有条目。这可以是随机初始化或者根据先验知识进行初始化。初始Q值并不重要,因为Q-learning会在学习过程中不断更新它们。
  2. Q值的更新:贝尔曼方程用于更新Q值函数中的每个条目,以确保它们逐渐逼近最优Q值函数。
  3. 策略改进:一旦Q值函数逐渐收敛,可以通过贪婪策略来根据Q值选择最佳动作,以制定最优策略。即,在每个状态s中选择动作a,使得Q(s, a) 最大化。
  4. 实际应用:Q-learning的应用非常广泛,包括机器人控制、游戏玩法、自动驾驶、资源管理、网络优化等各个领域。Q-learning的核心思想是通过不断地执行动作、观察奖励并更新Q值,使Q值函数逐渐逼近最优Q值函数,从而智能体可以在实际环境中做出最优决策,以实现其目标。

总之,Q-learning中的贝尔曼方程在实际应用中用于更新Q值函数,从而帮助智能体学习最优策略,这使得Q-learning成为了解决强化学习问题的有力工具。例如下面的例子演示了Q-learning中贝尔曼方程的实际应用过程。在这个示例中将解决一个简单的迷宫问题,使用Q-learning来学习最优路径,演示贝尔曼方程在强化学习中的应用。下面是对该迷宫问题的介绍:

  1. 迷宫是一个4x4的方格世界,共有16个状态(方格)。
  2. 每个状态可以采取四个动作:上、下、左、右,以尝试从起始位置到达目标位置。
  3. 在迷宫中,有一些方格是障碍物(表示为1),智能体不能通过它们。
  4. 目标是从起始位置(左上角)尽可能快地到达目标位置(右下角),并且在移动过程中要避开障碍物。

实例4-6:使用Q-learning解决迷宫问题(源码路径:daima\4\mi.py

实例文件mi.py的具体实现代码如下所示。

import numpy as np

# 定义迷宫的状态空间和动作空间
num_states = 16  # 迷宫共有16个状态
num_actions = 4  # 上、下、左、右四个动作

# 定义迷宫的结构,0表示可通行,1表示障碍物
maze = np.array([
    [0, 0, 0, 0],
    [0, 1, 1, 0],
    [0, 0, 0, 0],
    [0, 1, 1, 0],
    [0, 0, 0, 0],
    [0, 1, 1, 0],
    [0, 0, 0, 0],
    [0, 1, 1, 0],
    [0, 0, 0, 0],
    [0, 1, 1, 0],
    [0, 0, 0, 0],
    [0, 1, 1, 0],
    [0, 0, 0, 0],
    [0, 1, 1, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0]
])

# 定义Q值函数和初始化为零
Q = np.zeros((num_states, num_actions))

# 定义参数
learning_rate = 0.1
discount_factor = 0.9
epsilon = 0.1
num_episodes = 1000

# Q-learning算法
for episode in range(num_episodes):
    state = 0  # 初始状态为迷宫的起始位置
    done = False

    while not done:
        # 使用ε-greedy策略选择动作
        if np.random.rand() < epsilon:
            action = np.random.randint(num_actions)  # 随机选择动作
        else:
            action = np.argmax(Q[state, :])  # 根据Q值选择最佳动作

        # 执行动作并观察奖励和下一个状态
        if action == 0:  # 上
            next_state = state - 4 if state >= 4 else state
        elif action == 1:  # 下
            next_state = state + 4 if state < 12 else state
        elif action == 2:  # 左
            next_state = state - 1 if state % 4 != 0 else state
        else:  # 右
            next_state = state + 1 if state % 4 != 3 else state

        reward = -1 if maze[next_state // 4, next_state % 4] == 0 else -5  # 奖励:到达目标位置奖励-1,撞到障碍物奖励-5

        # 使用贝尔曼方程更新Q值
        Q[state, action] = (1 - learning_rate) * Q[state, action] + \
                           learning_rate * (reward + discount_factor * np.max(Q[next_state, :]))

        state = next_state  # 更新状态

        # 判断是否达到目标状态
        if state == num_states - 1:
            done = True

# 提取学习到的最优策略
optimal_policy = np.argmax(Q, axis=1)

# 打印最优策略
print("Learned Q-values:")
print(Q)
print("Optimal Policy:")
print(optimal_policy)

对上述代码的具体说明如下:

(1)初始化迷宫的状态空间和动作空间,以及定义了迷宫的结构(哪些位置是障碍物)。

(2)初始化Q值函数为零,每个状态-动作对都有一个初始的Q值估计。

(3)定义了Q-learning算法中的参数,如学习率(learning_rate)、折扣因子(discount_factor)、贪婪策略中的ε(epsilon)、训练迭代次数(num_episodes)等。

(4)使用Q-learning算法,循环训练多个迭代周期(episodes):

  1. 在每个迭代周期中,从起始位置开始,在每个状态下选择动作,执行动作并观察奖励以及下一个状态。
  2. 根据贝尔曼方程,使用奖励和下一个状态的Q值来更新当前状态-动作对的Q值。
  3. 通过贪婪策略或随机策略来选择动作,以平衡探索和利用。
  4. 当智能体达到目标位置时,结束该迭代周期。

(5)在训练完成后,提取了学习到的最优策略,这是根据最终的Q值函数计算出的。最优策略告诉我们在每个状态下应该采取哪个动作以获得最大的累积奖励。

(6)打印输出了=学习到的Q值函数和最优策略:

Learned Q-values:
[[-5.14281673 -4.68559    -5.16611024 -4.68559   ]
 [-4.43843372 -5.99035058 -4.79994206 -4.0951    ]
 [-3.86786837 -5.2922263  -4.34867915 -3.439     ]
 [-3.30980935 -2.71       -3.48680425 -3.27523684]
 [-4.73485993 -4.0951     -4.50752547 -7.01763787]
 [-3.28037102 -3.25549543 -3.33919043 -3.56333276]
 [-2.50306706 -2.41865231 -2.61269853 -2.40133358]
 [-3.15487346 -1.9        -6.02418156 -2.50362824]
 [-4.35973489 -4.24857624 -3.99288306 -3.439     ]
 [-6.16913308 -5.63225627 -3.78548204 -2.71      ]
 [-5.47328328 -4.71567367 -3.18954033 -1.9       ]
 [-2.65539484 -1.         -2.52850561 -1.78416936]
 [-3.99128936 -4.00926425 -3.9973867  -4.25311405]
 [-2.42584094 -2.45049751 -2.58609972 -2.50055634]
 [-0.90398014 -0.995      -1.11318868 -0.83322818]
 [ 0.          0.          0.          0.        ]]
Optimal Policy:
[1 3 3 1 1 1 3 1 3 3 3 1 0 0 3 0]

在本实例的迷宫问题中,最优策略将帮助智能体找到从起始位置到达目标位置的最短路径,避开障碍物。这个示例演示了Q-learning算法如何应用于解决一个简单的强化学习问题。

未完待续

  • 30
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农三叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值