当前位置:   article > 正文

(4-1)Q-learning与贝尔曼方程:Q-learning算法原理

(4-1)Q-learning与贝尔曼方程:Q-learning算法原理

Q-learning是一种强化学习算法,用于解决马尔可夫决策过程(MDP)中的问题。贝尔曼方程则是MDP的核心概念之一,与Q-learning密切相关。在本章的内容中,将详细讲解Q-learning与贝尔曼方程的知识,为读者步入后面知识的学习打下基础。

4.1  Q-learning算法原理

Q-learning是一种基于贝尔曼方程的强化学习算法,用于学习在MDP中的最优策略。Q-learning通过不断地在MDP中进行尝试和学习,逐渐收敛到最优Q值函数,从而使智能体能够选择最优策略来实现其目标。这个过程利用了贝尔曼方程来估计未来奖励的重要性,以及如何根据当前的奖励和估计的未来奖励来更新Q值。

4.1.1  Q-learning的动作值函数

Q-learning是一种强化学习算法,用于学习动作值函数(Action-Value Function)Q(s, a),也称为Q函数或Q值函数。动作值函数Q(s, a)表示在给定状态s下执行动作a所获得的期望回报(或累积奖励)。Q-learning通过不断地更新和优化Q值来学习最优策略,使智能体可以在MDP(马尔可夫决策过程)环境中做出最优决策。

Q(s, a) 表示在状态s下采取动作a的值,即在状态s时选择动作a的期望累积奖励。Q-learning的主要思想是使用贝尔曼方程来迭代地更新Q值,以逼近最优Q值函数。Q-learning的Q值更新规则如下:

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

其中:

  1. Q(s, a)是当前状态-动作对 (s, a) 的Q值。
  2. α 是学习率,控制着每次更新的幅度。
  3. R(s, a)表示在状态s下执行动作a后获得的即时奖励。
  4. γ是折扣因子,衡量未来奖励的重要性。
  5. max(Q(s', a')) 表示在下一个状态s' 中选择最大Q值的动作a'。
  6. Q(s', a')表示在状态s'下执行动作a'的Q值。

Q-learning的目标是通过不断地执行动作、观察奖励并更新Q值,使Q值函数逼近最优Q值函数,从而智能体可以根据Q值函数选择最佳的动作以实现其目标。这个过程通常需要大量的训练迭代,以确保Q值函数能够充分地收敛到最优值。一旦Q值函数收敛,智能体就可以使用它来制定最优策略,即选择在每个状态下具有最高Q值的动作,这种方式使智能体能够在不断的决策过程中最大化累积奖励。

下面是一个简单的Python示例,演示了实现Q-learning中的Q值函数更新的过程。在这个例子中,我们使用一个小的状态空间和动作空间来说明Q-learning的基本概念。

实例4-1:实现Q-learning中的Q值函数更新(源码路径:daima\4\q.py

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

  1. import numpy as np
  2. # 定义状态空间和动作空间
  3. num_states = 6
  4. num_actions = 2
  5. # 初始化Q值函数为0
  6. Q = np.zeros((num_states, num_actions))
  7. # 定义参数
  8. learning_rate = 0.1 # 学习率
  9. discount_factor = 0.9 # 折扣因子
  10. num_episodes = 1000 # 训练的迭代次数
  11. # Q-learning算法
  12. for episode in range(num_episodes):
  13. state = 0 # 初始状态
  14. done = False # 游戏结束标志
  15. while not done:
  16. # 选择动作 - ε-greedy策略
  17. epsilon = 0.2 # ε的值,控制探索策略
  18. if np.random.rand() < epsilon:
  19. action = np.random.randint(num_actions) # 随机选择动作
  20. else:
  21. action = np.argmax(Q[state, :]) # 根据Q值选择最佳动作
  22. # 执行动作并观察奖励
  23. if state == num_states - 1: # 达到最终状态
  24. reward = 1
  25. done = True
  26. else:
  27. reward = 0
  28. # 选择下一个状态
  29. next_state = state + 1 if not done else state
  30. # 使用贝尔曼方程更新Q值
  31. Q[state, action] = (1 - learning_rate) * Q[state, action] + \
  32. learning_rate * (reward + discount_factor * np.max(Q[next_state, :]))
  33. state = next_state # 更新状态
  34. # 打印学习后的Q值函数
  35. print("Learned Q-values:")
  36. print(Q)

上述代码是一个简单的Python示例,演示了如何使用Q-learning算法来学习一个小型环境中的最优策略,其中包括状态和动作空间。对上述代码的具体说明如下:

  1. 状态空间和动作空间定义:代码首先定义了状态空间和动作空间。在这个示例中,状态空间包括6个状态,动作空间包括2个动作。这个示例中状态空间和动作空间都比较小,以便说明Q-learning的基本概念。
  2. Q值函数初始化:使用一个二维NumPy数组Q来表示Q值函数。初始时,所有Q值被初始化为零。
  3. 参数定义:定义了学习率(learning_rate)、折扣因子(discount_factor)、以及训练的迭代次数(num_episodes)等超参数。这些参数控制了Q-learning算法的行为。
  4. Q-learning算法:代码通过一个循环来执行Q-learning算法的多个训练周期(episodes)。每个周期内,智能体从初始状态开始,根据当前的Q值函数和探索策略(ε-greedy策略)选择动作并执行。然后观察奖励,更新Q值函数。
  5. 动作选择:在每个状态下,根据 ε-greedy 策略选择动作。以概率 ε 随机选择一个动作,以概率 1-ε 选择具有最大 Q 值的动作。
  6. 奖励观察:根据当前状态是否为最终状态,获得即时奖励。如果当前状态是最终状态,奖励为1,否则为0。
  7. Q值函数更新:使用贝尔曼方程,通过更新 Q 值函数来逼近最优 Q 值函数。这里使用了 Q 值函数的更新规则,其中包括学习率和折扣因子。
  8. Q值函数输出:在所有训练周期完成后,打印学习后的Q值函数。这些Q值函数将包含关于每个状态和动作的估计价值,可以用于提取最优策略。

执行后会输出:

  1. Learned Q-values:
  2. [[5.89942501 5.90362855]
  3. [6.55374056 6.55971818]
  4. [7.28308586 7.28870475]
  5. [8.09443786 8.09872121]
  6. [8.99870349 8.9953045 ]
  7. [9.9987089 9.99229232]]

在上面的输出结果中,Learned Q-values是学习后的Q值函数的值。这个矩阵的每一行代表一个状态,每一列代表一个动作。例如,第一行表示在状态0下采取动作0和动作1的Q值,第二行表示在状态1下采取动作0和动作1的Q值,依此类推。这些Q值是在训练过程中逐渐更新和优化的,用于估计每个状态-动作对的累积奖励期望值。需要注意的是,这只是一个简化的Q-learning演示例子,状态空间和动作空间都非常小。在实际应用中,状态空间和动作空间通常更大,需要更多的训练和参数调整来使Q-learning收敛到最优策略。

4.1.2  Q-learning中 的贪婪策略与探索策略

在Q-learning中,智能体采用两种不同的策略来选择动作:贪婪策略(Greedy Policy)和探索策略(Exploration Policy)。这些策略决定了在每个状态下智能体如何选择动作,平衡了利用已知信息和探索未知情况之间的关系。

1. 贪婪策略(Greedy Policy)

贪婪策略是一种基于已知Q值的策略,它总是选择具有最高Q值的动作,以最大化当前已知的价值。具体地说,对于给定的状态s,贪婪策略会选择动作a,使得Q(s, a) 最大化,即 a = argmax(Q(s, a))。贪婪策略旨在利用已经学到的知识,以确保在已知情况下做出最佳的动作选择。在Q-learning中,有如下两种常见的探索策略:

(1)ε-greedy策略

在Q-learning中,一种常见的探索策略是ε-greedy策略,其中ε(epsilon)是一个小于1的正数,表示探索的概率。具体来说:

  1. 以概率ε选择一个随机动作(探索)。
  2. 以概率1-ε选择一个贪婪动作(利用,即选择具有最高Q值的动作)。

ε-greedy策略平衡了对已知最佳动作的利用和对未知情况的探索。通过逐渐减小ε的值,可以使智能体在学习过程中逐渐减少探索,更多地依赖贪婪策略。

(2)Softmax策略

Softmax策略是一种用于在强化学习中选择动作的概率性策略。与ε-greedy策略不同,Softmax策略允许智能体以一种更加平滑的方式从多个动作中进行概率性选择,而不是硬性地选择一个动作。Softmax策略的核心思想是基于每个动作的估计价值来分配动作的选择概率,同时引入一个称为温度参数的参数来调整这些概率的分布。

Softmax策略的数学表达如下:

P(a) = exp(Q(a) / τ) / Σ[exp(Q(a') / τ)]

其中:

  1. P(a)表示选择动作a的概率。
  2. Q(a)是动作a的估计价值。
  3. τ(tau)是温度参数,控制了动作选择概率的分散程度。较高的τ会导致概率分布更均匀,较低的τ会导致更大的概率差异。
  4. Σ 表示对所有可能的动作a'求和。

2. 探索策略(Exploration Policy)

探索策略是一种用于探索未知情况的策略,它有助于智能体发现潜在的高价值动作或状态。为了探索,智能体必须偶尔选择非贪婪的动作,而不是始终选择贪婪的动作。常见的探索策略包括随机选择动作或按一定的概率选择非贪婪动作。

总之,Q-learning中的贪婪策略用于最大化已知价值,而探索策略用于发现新的有价值的信息。平衡这两种策略是Q-learning算法成功学习最优策略的关键。例如下面是一个使用Python实现Q-learning的简单例子,其中包括贪婪策略和探索策略的演示。在这个例子中,将使用ε-greedy策略来平衡探索和利用。

实例4-2:使用ε-greedy策略来平衡探索和利用(源码路径:daima\4\tantan.py

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

  1. import numpy as np
  2. # 定义状态空间、动作空间和初始Q值函数
  3. num_states = 6
  4. num_actions = 2
  5. Q = np.zeros((num_states, num_actions))
  6. # 定义参数
  7. learning_rate = 0.1 # 学习率
  8. discount_factor = 0.9 # 折扣因子
  9. epsilon = 0.2 # ε-greedy策略中的ε
  10. num_episodes = 1000 # 训练的迭代次数
  11. # Q-learning算法
  12. for episode in range(num_episodes):
  13. state = 0 # 初始状态
  14. done = False # 游戏结束标志
  15. while not done:
  16. # 使用ε-greedy策略选择动作
  17. if np.random.rand() < epsilon:
  18. action = np.random.randint(num_actions) # 随机选择动作
  19. else:
  20. action = np.argmax(Q[state, :]) # 根据Q值选择最佳动作
  21. # 执行动作并观察奖励
  22. if state == num_states - 1: # 达到最终状态
  23. reward = 1
  24. done = True
  25. else:
  26. reward = 0
  27. # 选择下一个状态
  28. next_state = state + 1 if not done else state
  29. # 使用贝尔曼方程更新Q值
  30. Q[state, action] = (1 - learning_rate) * Q[state, action] + \
  31. learning_rate * (reward + discount_factor * np.max(Q[next_state, :]))
  32. state = next_state # 更新状态
  33. # 提取最优策略
  34. optimal_policy = np.argmax(Q, axis=1)
  35. # 打印最优策略
  36. print("Learned Q-values:")
  37. print(Q)
  38. print("Optimal Policy:")
  39. print(optimal_policy)

在上述代码中使用了ε-greedy策略来选择动作,ε-greedy策略以概率ε随机选择一个动作,以概率1-ε选择具有最大Q值的动作。这种策略平衡了探索(随机选择动作)和利用(选择最佳动作)。执行后输出:

  1. Learned Q-values:
  2. [[5.90359498 5.89789005]
  3. [6.55966837 6.55487247]
  4. [7.28866829 7.28497419]
  5. [8.09865867 8.09406536]
  6. [8.99641953 8.99866964]
  7. [9.99865594 9.99622585]]
  8. Optimal Policy:
  9. [0 0 0 0 1 0]

上述输出表明Q-learning算法在训练过程中逐渐学到了最优策略,并且最终估计的Q值函数和最优策略都收敛到了一个良好的状态。这是Q-learning算法的一个成功示例,用于解决一个简单的强化学习问题。在实际问题中,通常需要更大的状态空间和动作空间以及更多的训练迭代来处理更复杂的任务。

4.1.3  Q-learning的收敛性与收敛条件

Q-learning是一种强化学习算法,用于学习在马尔可夫决策过程(MDP)中的最优策略。关于Q-learning的收敛性有一些理论结果和条件,接下来将进行详细讲解。

1. Q-learning的收敛性

Q-learning被证明在以下条件下是收敛的:

  1. 有限状态空间:Q-learning的状态空间必须是有限的,否则收敛性可能不成立。这是因为在无限状态空间中,Q-learning可能永远无法覆盖所有状态。
  2. 贴近无限探索:理论上,为了保证Q-learning的收敛性,每个状态-动作对应至少要被访问无限多次。这可以通过一定的探索策略来实现,例如ε-greedy策略,其中ε在足够的时间内逐渐减小以确保渐近无限的探索。
  3. 满足折扣条件:MDP必须满足一个折扣条件,折扣因子γ必须小于1。这是因为γ控制了未来奖励的衰减,确保累积奖励的总和是有限的。
  4. 平稳学习率:学习率α(更新步长)必须逐渐减小,以确保Q值的更新不会发散。通常,学习率随时间t按照某个规定的衰减率减小,例如α_t = 1 / t。
  5. 状态-动作对的足够探索:在任何状态s下,每个动作a都要在足够多的时间步内被探索到。这可以通过合适的探索策略(例如ε-greedy)来满足。

2. 收敛条件

收敛性是在满足上述条件的情况下得到保证的。具体来说,当Q-learning算法运行足够长的时间,经过足够的探索,并且适当地调整了学习率和探索率,Q值函数将收敛到最优Q值函数。

Q-learning的收敛性证明通常是基于强化学习理论的一般性结果,例如收敛定理。这些理论提供了一定的保证,但实际应用中的情况可能会更加复杂。在实际问题中,选择合适的参数和策略以确保收敛是至关重要的。Q-learning的收敛性与收敛条件能够确保算法在训练过程中最终能够学到最优策略,下面是一个简单的Python示例,演示了Q-learning的收敛性和收敛条件的用法。

实例4-3:使用ε-greedy策略来平衡探索和利用(源码路径:daima\4\shou.py

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

  1. import numpy as np
  2. # 定义状态空间、动作空间和初始Q值函数
  3. num_states = 6
  4. num_actions = 2
  5. Q = np.zeros((num_states, num_actions))
  6. # 定义参数
  7. learning_rate = 0.1 # 学习率
  8. discount_factor = 0.9 # 折扣因子
  9. epsilon = 0.2 # ε-greedy策略中的ε
  10. num_episodes = 1000 # 训练的迭代次数
  11. # 初始化 prev_Q
  12. prev_Q = np.copy(Q)
  13. # Q-learning算法
  14. for episode in range(num_episodes):
  15. state = 0 # 初始状态
  16. done = False # 游戏结束标志
  17. while not done:
  18. # 使用ε-greedy策略选择动作
  19. if np.random.rand() < epsilon:
  20. action = np.random.randint(num_actions) # 随机选择动作
  21. else:
  22. action = np.argmax(Q[state, :]) # 根据Q值选择最佳动作
  23. # 执行动作并观察奖励
  24. if state == num_states - 1: # 达到最终状态
  25. reward = 1
  26. done = True
  27. else:
  28. reward = 0
  29. # 选择下一个状态
  30. next_state = state + 1 if not done else state
  31. # 使用贝尔曼方程更新Q值
  32. Q[state, action] = (1 - learning_rate) * Q[state, action] + \
  33. learning_rate * (reward + discount_factor * np.max(Q[next_state, :]))
  34. state = next_state # 更新状态
  35. # 检查收敛条件
  36. if episode % 100 == 0:
  37. # 计算Q值函数的变化
  38. delta_Q = np.max(np.abs(Q - prev_Q))
  39. prev_Q = np.copy(Q)
  40. # 如果Q值函数变化足够小,认为已经收敛
  41. if delta_Q < 0.01:
  42. print(f"Converged after {episode} episodes")
  43. break
  44. # 提取最优策略
  45. optimal_policy = np.argmax(Q, axis=1)
  46. # 打印最优策略
  47. print("Learned Q-values:")
  48. print(Q)
  49. print("Optimal Policy:")
  50. print(optimal_policy)

在这个示例中我们引入了收敛条件的概念,收敛条件是指当Q值函数的变化足够小时,认为Q-learning已经收敛到最优策略。在每个训练周期结束后,计算Q值函数的变化(delta_Q),并与一个阈值(例如0.01)进行比较。如果变化小于阈值,就认为Q-learning已经收敛。在示例中,Q-learning的收敛条件是在每个100个训练周期后检查Q值函数的变化,并在满足条件时输出收敛信息。这个条件可以根据实际问题和需求进行调整。执行后输出:

  1. Learned Q-values:
  2. [[5.90389431 5.89898145]
  3. [6.55430319 6.5599918 ]
  4. [7.28900466 7.28613939]
  5. [8.09899731 8.09667651]
  6. [8.99901767 8.99692772]
  7. [9.98242215 9.99902647]]
  8. Optimal Policy:
  9. [0 1 0 0 0 1]

注意:Q-learning通常在合适的条件下是收敛的,但要注意在实际问题中,需要谨慎地设置参数和策略以确保算法的稳定性和性能。不同的环境和任务可能需要不同的调整。

未完待续

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/465514
推荐阅读
相关标签
  

闽ICP备14008679号