强化学习——Q-Leaning算法原理

强化学习——Q-Leaning算法原理

一、什么是Q-leaning?

Q-learning是一种经典的强化学习算法,用于解决马尔可夫决策过程(Markov Decision Process,MDP)中的控制问题。它是基于值迭代(Value Iteration)的思想,通过估计每个状态动作对的价值函数Q值来指导智能体在每个状态下选择最佳的动作。

其算法的基本思想跟主要优势如下:

Q-Learning是强化学习算法中value-based的算法,Q即为Q(s,a),就是在某一个时刻的state状态下,采取动作a能够获得收益的期望,环境会根据agent的动作反馈相应的reward奖赏,所以算法的主要思想就是将stateaction构建成一张Q_table表来存储Q值,然后根据Q值来选取能够获得最大收益的动作。

Q-learning的主要优势就是使用了时间差分法(融合了蒙特卡洛和动态规划)能够进行off-policy的学习,使用贝尔曼方程可以对马尔科夫过程求解最优策略.

二、Q-leaning的具体例子

1、做作业

(这里引用https://zhuanlan.zhihu.com/p/74225549这篇文章的图片)

我们做事情都会有自己的一个行为准则,比如小时候爸妈常说“不写完作业就不准看电视”。所以我们在写作业的状态(state)下,好的行为就是继续写作业,直到写完它,我们还可以得到奖励(reward),不好的行为就是没写完作业就跑去看电视了,被爸妈发现就会被惩罚,这种事情做的多了,也变成了我们不可磨灭的记忆,这其实就是一个Q-learning的决策过程。

img

首先这张图片我们可以看到s1,a2,s2代表写作业,a1代表看电视,Q表中的值代表着在某一状态下做某一件事能够得到的奖赏reward,我们可以随意设置Q表中的数值,但是我们会发现Q(s1,a1)=-2要小于Q(s1,a2)=1,所以我们判断要选择a2写作业作为我们的下一个行为。现在我们的状态更新成s2,我们还是有两个同样的选择,重复上面的过程,在行为准则Q-table中寻找Q(s2,a1)Q(s2,s2)的值,并比较他们的大小,选取较大的一个。接着根据a2我们到达s3并重复上述的决策过程,Q-learning的方法就是这样抉择的。那我们的Q-table这张行为决策表又是如何决策的呢?我们来看看。

img

回到之前,根据Q表的估计,因为在s1中,a2的值比较大,通过之前的决策方法我们在s1选择了a2,并到达s2,这时我们开始更新用于决策的Q表,接着我们并没有在实际中采取任何行为,而是在想象自己在s2上采取了a1,a2两个行为,分别看看两种行为哪一个的Q值大,比如说Q(s2,a2)的值比Q(s2,a1)的大,所以我们把大的Q(s2,a2)乘上一个衰减值gamma(eg 0.9)并加上到达s2时所获得的奖励Reward(这里没有获取到我们的棒棒糖,所以奖励为0),因为会获取实实在在的奖励Reward,所以我们将这个作为我们现实中Q(s1,a2)的值,但是我们之前是根据Q表估计Q(s1,a2)的值。所以有了现实值和估计值,我们就可以更新Q(s1,a2)的值,变成新的值。但时刻记住,我们虽然用maxQ(s2)估算了一下s2的状态,但还没有在S2做出任何行为,s2的行为决策要等到更新完了以后再重新另外做,这就是off-policyQ-learning是如何决策和学习优化决策过程。

img

参数介绍:
  • Epsilon greedy:是用在决策上的一个策略,以概率ε选择随机动作,以概率1-ε选择当前最优动作,比如epsilon = 0.9的时候,就说明百分之90的情况我会按照Q表的最优值选择行为,百分之10的时间随机选择行为。

  • alpha:学习率,决定这次的误差有多少是要被学习的。

    • 学习率控制着每次更新Q值时所采用的步长。较大的学习率会导致Q值函数的快速更新,可能会使算法更快地收敛,但也可能导致不稳定性和震荡。

    • 如果学习率过大,会导致Q值函数不稳定,可能会导致算法无法收敛或者在局部最优解处震荡。

    • 如果学习率过小,会导致算法收敛速度变慢,可能需要更多的迭代次数才能达到收敛。

  • gamma:对未来reward的衰减值。gamma越接近1,机器对未来的reward越敏感

    • 折现因子控制着未来奖励的折现程度。它决定了智能体对未来奖励的重视程度,越大表示越重视未来奖励。较小的折现因子会导致智能体更多地关注即时奖励,而较大的折现因子会使智能体更多地关注未来奖励。
    • 如果折现因子过小,智能体可能会过于贪婪地选择立即奖励最大的动作,而忽视了长期的累积奖励。
    • 如果折现因子过大,可能会导致智能体过于关注远期奖励,可能会影响算法的收敛速度和稳定性。

这个算法公式也形象的说出了Q表的更新过程,总而言之四句话

  • 初始化Q值函数Q(s, a)。
  • 不断与环境交互,根据当前策略选择动作,并观察环境的反馈。
  • 根据贝尔曼方程更新Q值函数,Q(s, a) ← Q(s, a) + α * [r + γ * max(Q(s’, a’)) - Q(s, a)]
  • 不断迭代直到收敛或达到最大迭代次数。

2、走迷宫

(来自对http://mnemstudio.org/path-finding-q-learning-tutorial.htm 的翻译)

img

img

img

img

img

img

img

img

代码示意
import numpy as np  
import os
import random

def random_action(V):
    # 找出V中非负元素对应的索引
    index_list = []
    for index, s in enumerate(list(V)):
        if s >= 0:
            index_list.append(index)
    # 从索引列表中随机选择一个索引作为动作
    return random.choice(index_list)

def reward_setting(state_num, action_num):
    # 定义奖励矩阵R
    R = -1 * np.ones((state_num , action_num))
    # 设置特定状态的奖励
    R[0,4] = 0  # 当前状态为0,动作为4时的奖励
    R[1,3] = 0  # 当前状态为1,动作为3时的奖励
    R[1,5] = 100  # 当前状态为1,动作为5时的奖励
    R[2,3] = 0  # 当前状态为2,动作为3时的奖励
    R[3,1] = 0  # 当前状态为3,动作为1时的奖励
    R[3,2] = 0  # 当前状态为3,动作为2时的奖励
    R[3,4] = 0  # 当前状态为3,动作为4时的奖励
    R[4,0] = 0  # 当前状态为4,动作为0时的奖励
    R[4,3] = 0  # 当前状态为4,动作为3时的奖励
    R[4,5] = 100  # 当前状态为4,动作为5时的奖励
    R[5,1] = 0  # 当前状态为5,动作为1时的奖励
    R[5,4] = 0  # 当前状态为5,动作为4时的奖励
    R[5,5] = 100  # 当前状态为5,动作为5时的奖励
    return R 

if __name__ == '__main__':
    action_num = 6  # 动作数量
    state_num = 6  # 状态数量
    gamma = 0.8  # 折现因子
    epoch_number = 200  # 迭代轮数
    condition_stop = 5  # 终止条件

    Q = np.zeros((state_num , action_num))  # 初始化Q值矩阵
    R = reward_setting(state_num , action_num)  # 初始化奖励矩阵

    for epoch in range(epoch_number):
        for s in range(state_num):
            loop = True
            while loop:
                # 获取随机动作a
                a = random_action(R[s,:])
                # 计算最大Q值
                q_max = np.max(Q[a,:]) 
                # 使用Bellman最优迭代方程更新Q值
                Q[s,a] = R[s,a] + gamma * q_max
                s = a
                if s == condition_stop:
                    loop = False
    # 将Q值除以5并转换为整数类型,以便显示
    Q = (Q / 5).astype(int)
    print(Q)

在这里插入图片描述

实验结果如下所示,大约训练200轮之后Q 矩阵就可以收敛到理论值,并且理论推导与实验结果一致。

三、Q-Learning总结

  1. 基于值迭代:Q-learning是基于值迭代的强化学习算法,通过学习状态动作对的Q值来指导智能体的决策。Q值表示在特定状态下执行特定动作所能获得的累积奖励。
  2. Bellman最优方程:Q-learning算法利用贝尔曼最优方程更新Q值,该方程表明当前状态动作对的Q值应等于立即奖励加上未来状态的最大Q值的折现值。通过迭代更新Q值,智能体可以逐渐学习到最优的策略。
  3. ε-greedy策略:在Q-learning中通常采用ε-greedy策略进行动作选择。该策略以概率ε选择随机动作,以概率1-ε选择当前最优动作,以便在探索与利用之间取得平衡。
  4. 奖励设置:Q-learning算法依赖于环境给出的奖励信号来进行学习。智能体通过与环境交互,观察状态转移和奖励信号,并根据奖励信号更新Q值函数。
  5. 超参数调优:Q-learning算法中包括一些重要的超参数,如学习率、折现因子等,需要仔细调优以获得最佳性能。
  6. 适用范围:Q-learning适用于离散动作空间和有限状态空间的问题,特别适用于小规模问题和简单的控制任务。
  7. 局限性:Q-learning算法在面对大规模状态空间和连续动作空间时可能面临挑战,如状态空间爆炸、维度灾难等问题。同时,Q-learning算法对于初始Q值的选择比较敏感,可能需要更多的探索策略来保证收敛性。

四、Q-Learning之后的变种算法

  1. Deep Q Network (DQN):DQN是一种结合了深度学习和Q-learning的算法,旨在解决Q-learning在高维状态空间和连续动作空间中的应用限制。DQN使用深度神经网络来近似Q值函数,通过经验回放和目标网络等技术来稳定训练过程。
  2. Double Q-learning:Double Q-learning旨在减少Q-learning中过估计(Overestimation)的问题。在Q-learning中,由于采用最大化操作选择Q值,可能会导致对Q值的过度估计。Double Q-learning通过使用两个独立的Q值函数来解决这个问题,一个用于选择动作,另一个用于评估动作的值。
  3. Dueling Q Network (Dueling DQN):Dueling DQN是一种改进的DQN算法,旨在更好地处理状态值函数和动作优势函数之间的关系。它将Q值函数分解为状态值函数和动作优势函数两部分,通过这种方式来提高学习的效率和稳定性。
  4. Prioritized Experience Replay:Prioritized Experience Replay是一种改进的经验回放方法,用于提高DQN算法的训练效率和样本利用率。它根据TD误差(Temporal Difference Error)对经验进行优先级排序,并以优先级高的经验更频繁地被采样用于训练。
  5. Deep Deterministic Policy Gradient (DDPG):DDPG是一种结合了策略梯度方法和DQN的算法,用于解决连续动作空间中的强化学习问题。DDPG使用一个连续动作的确定性策略和一个Q值函数来学习策略,通过深度神经网络来近似这两个函数。
  6. Twin Delayed DDPG (TD3):TD3是对DDPG算法的改进,旨在进一步提高算法的稳定性和收敛速度。TD3引入了双Q值网络、延迟更新和噪声调整等技术来减少算法的方差,使其更适用于现实世界的复杂环境中。

此博客仅用于学习使用,并无其他用途
参考:https://zhuanlan.zhihu.com/p/74225549
https://zhuanlan.zhihu.com/p/643431408

  • 51
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值