强化学习QLearning以及PongGame

QLearning是强化学习中的value-based方法,其思想是在当前奖励的衰减的最大估计和当前所得到的奖励当成这一步的现实。类似于动态规划中获取全局最优解可以通过每一步的局部最优完成迭代。

QLearning决策

Q Q Q Q ( s , a ) Q(s, a) Q(s,a) 在某一个状态 S S S 下采取动作 a a a 动作能够获得收益的期望[1],例如当前有两个状态 S 1 , S 2 S1, S2 S1,S2 分别表示同学玩游戏、写作业,对应的动作可以有 a 1 , a 2 a_1, a_2 a1,a2。为了成为好学生当然是写作业的状态设置高的奖励,可以定义一个Q表来表示状态 s s s 和动作 a a a 之间的关系

当前状态a1a2
s1-21
s2-42

在上述Q表中, Q ( s 1 , a 1 ) = − 2 Q(s_1, a_1)=-2 Q(s1,a1)=2 要小于 Q ( s 1 , a 2 ) = 1 Q(s_1, a_2)=1 Q(s1,a2)=1,所以为了获取更高的奖励分数,agent 选择采取 a 2 a_2 a2 动作,状态更新为 s 2 s_2 s2,然后还是有两个选择 Q ( s 2 , a 1 ) = − 4 , Q ( s 2 , a 2 ) = 2 Q(s_2, a_1)=-4,Q(s_2, a_2)=2 Q(s2,a1)=4Q(s2,a2=2,比较两者之间的大小,选择较大的一个,接着到下一个状态。

这就是QLearning的决策方式。那么问题是Q表如何得来的?

QLearning更新

a=1
a=2
a=3
a=N
S0
s1 r=r1, V1
s2 r=r2, v2
s3 r=r3, v3
sN r=rN, VN

要获得最大的结果,也就是当前状态转移之后获得的奖励 V 0 = r i + V i V_0=r_i+V_i V0=ri+Vi 最大[2],也就是
V 0 = max ⁡ a ∈ 1 … N ( r a + γ V a ) V_0=\max_{a \in 1 \dots N}(r_a + \gamma V_a) V0=a1Nmax(ra+γVa)
其中 γ \gamma γ 是一个衰减因子

这一点类似于贪婪算法,但是稍微有一点不同,我们不仅仅只是着眼于当前的即时奖励,还需要考虑长期的奖励。上述公式也可以称作为Bellman公式。

将其转换为Q值表现形式
Q ( s , a ) = r ( s , a ) + γ max ⁡ a ′ ∈ A Q ( s ′ , a ′ ) Q(s, a) = r(s, a) + \gamma \max_{a' \in A} Q(s', a') Q(s,a)=r(s,a)+γaAmaxQ(s,a)
但是在实际应用中,一半会考虑新Q值和之前Q值的平衡,设置一个平衡参数 α \alpha α
Q ( s , a ) ← ( 1 − α ) Q ( s , a ) + α ( r + γ max ⁡ a ′ ∈ A Q ( s ′ , a ′ ) ) Q(s, a)\leftarrow (1-\alpha) Q(s, a) + \alpha(r + \gamma \max_{a' \in A} Q(s', a')) \\ Q(s,a)(1α)Q(s,a)+α(r+γaAmaxQ(s,a))
也可以表示为
Q ( s , a ) ← Q ( s , a ) + α ( r + γ max ⁡ a ′ ∈ A Q ( s ′ , a ′ ) − Q ( s , a ) ) Q(s, a)\leftarrow Q(s, a) + \alpha(r + \gamma \max_{a' \in A} Q(s', a') - Q(s, a)) Q(s,a)Q(s,a)+α(r+γaAmaxQ(s,a)Q(s,a))

QLearning整体算法

整体的算法流程如下[2]

  1. 初始设置 Q ( s , a ) Q(s, a) Q(s,a) 表为空
  2. 从环境中获取 s , a , r , s ′ s, a, r, s' s,a,r,s
  3. 根据Bellman公式更新 Q ( s , a ) ← ( 1 − α ) Q ( s , a ) + α ( r + γ max ⁡ a ′ ∈ A Q ( s ′ , a ′ ) ) Q(s, a) \leftarrow (1-\alpha) Q(s, a) + \alpha(r + \gamma \max_{a' \in A} Q(s', a')) Q(s,a)(1α)Q(s,a)+α(r+γmaxaAQ(s,a))
  4. 查看是否达到收敛条件,如果没有继续重复2-4,否则停止迭代

DQN on Pong

这个是一个很老的雅达利游戏 PongGame,可以在这个网站尝试一下 PongGame

在这里插入图片描述

左边是游戏AI控制的,右边是玩家控制,游戏的内容很简单,控制板子击打对方打过来的球,谁没接住就算谁输。在OpenAI gym的规则中,获胜的一方获得1分,输掉的一方扣掉1分。

Wrappers

在OpenAI gym的Atari环境中,游戏图像大小为 210 × 160 × 3 210 \times 160 \times 3 210×160×3 的RGB图像,但是对于我们来说,不需要这么大的彩色图像,首先需要进行预处理,减少数据量,加快运算速度和减少内存消耗。

  • 编码:获取目标图片和其前一帧图片之中的像素最大值,消除flickering现象
  • 降维:降彩色图片灰度化处理,并且缩放尺寸,得到 84 × 84 × 1 84 \times 84 \times 1 84×84×1 大小的灰度图像

下图所示(a)为原始的Atari游戏图像,(b)为处理后的灰度图像
在这里插入图片描述

然后将预处理后的连续4张图片堆叠在一起,作为最终的输入。四张图片堆叠在一起是为了获取小球和拍的运动方向和速度,单张的图片无法获得这些信息。

DQN模型

对于之前理论中的Q值,状态列举的很少,可以用Q值表格进行迭代,但是对于PongGame这个环境,预处理之后也还是有 84 × 84 × 4 84 \times 84 \times 4 84×84×4个状态,如果用表格描述是十分繁琐和困难的。在这篇文献[3]中提出利用神经网络来近似Q值,这样就可以通过神经网络获得任意动作的Q值。

这里使用的神经网络的架构如下所示:

  • 84 × 84 × 4 84 \times 84 \times 4 84×84×4 输入层 (堆砌4张图片输入)
  • 32个尺寸为 8 × 8 8 \times 8 8×8 步长4的二维卷积层,加上一个非线性整流层
  • 64个尺寸为 4 × 4 4 \times 4 4×4 步长为2的二维卷积层,同样有非线性整流层
  • 64个尺寸为 4 × 4 4 \times 4 4×4 步长为1的二维卷积层
  • 全连接层,尺寸为卷积展平的输入,3136
  • 中间层,全连接层,512尺寸
  • 输出层,动作空间尺寸

如下为pytorch构建的模型架构:

import torch
import torch.nn as nn
import numpy as np


class DQN(nn.Module):
    def __init__(self, input_shape, n_actions):
        super(DQN, self).__init__()

        self.conv = nn.Sequential(
            nn.Conv2d(input_shape[0], 32, kernel_size=8, stride=4),
            nn.ReLU(),
            nn.Conv2d(32, 64, kernel_size=4, stride=2),
            nn.ReLU(),
            nn.Conv2d(64, 64, kernel_size=3, stride=1),
            nn.ReLU()
        )

        conv_out_size = self._get_conv_out(input_shape)
        self.fc = nn.Sequential(
            nn.Linear(conv_out_size, 512),
            nn.ReLU(),
            nn.Linear(512, n_actions)
        )

    def _get_conv_out(self, shape):
        o = self.conv(torch.zeros(1, *shape))
        return int(np.prod(o.size()))

    def forward(self, x):
        conv_out = self.conv(x).view(x.size()[0], -1)
        return self.fc(conv_out)

为了加快训练速度,在代理初始化的时候,存储了一些环境相关的经验缓存,这些经验缓存是当前观测和目前累积的奖励的集合。

然后开始训练,以下是训练的结果:

在这里插入图片描述

经过超过800k次的迭代,奖励稳定在20分左右,也就是完全能够战胜游戏的AI,以下是一个回放测试的视频

ponggame

参考

[1] 莫烦python-强化学习

[2]《Deep ReinforcementLearning Hands on Second Edition》

[3] Mnih V , Kavukcuoglu K , Silver D , et al. Playing Atari with Deep Reinforcement Learning[J]. Computer Science, 2013.

强化学习中的Q-Learning是一种记录行为值的方法,用于解决智能体在与环境交互过程中通过学习策略以达成回报最大化的问题。Q-Learning基于马尔可夫决策过程的假设,通过记录智能体在不同状态下采取不同动作所获得的收益的期望值,即Q值。算法的目标是寻找一个策略,使得智能体能够最大化未来获得的回报。Q-Learning的算法流程主要是通过构建一个Q-table来存储Q值,并根据Q值选择能够获得最大收益的动作。\[2\] 强化学习是一种通过与环境交互获得奖赏指导行为的学习方法。与监督学习不同,强化学习中的强化信号是环境提供的对动作好坏的评价,而不是告诉系统如何产生正确的动作。强化学习的目标是使智能体获得最大的奖赏。由于外部环境提供的信息有限,强化学习系统必须通过自身的经验进行学习。通过不断试错的方式,强化学习系统在行动-评价的环境中逐渐获得知识,并改进行动方案以适应环境。\[3\] 总结来说,强化学习是一种通过与环境交互获得奖赏指导行为的学习方法,而Q-Learning强化学习中的一种主要算法,用于记录行为值并寻找最优策略。 #### 引用[.reference_title] - *1* *3* [强化学习--QLearning](https://blog.csdn.net/wangaolong0427/article/details/124241284)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【强化学习】 Q-Learning](https://blog.csdn.net/haha0332/article/details/112967024)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值