当前位置:   article > 正文

2020-08-31_强化学习流程

强化学习流程

PYSC2强化学习(一)

最近接触到了强化学习领域的东西,于是就对近来解决强化学习问题的不同结构进行了了解,主要包括Q-learning,Deep Q-learning,Policy Gradients,AC模型,DDPG和PPO。

不过在深入了解强化学习之前,我们需要掌握一些必要的概念。
1.什么是强化学习?强化学习的核心思想是什么?
2.强化学习的三种方式
3.在强化学习中深度是怎样理解的?

在对上面的一些概念有充分理解之后,对强化学习的一个实现过程也会有更深的理解。

首先,强化学习是什么?
强化学习其实是一个智能体与它所处的环境进行交互,并且根据环境给出的奖励进行行为表现的一个过程。这种思想其实和我们从我们生活的环境中进行学习的思想相同,举个例子:
在这里插入图片描述
我们在一个房间里面,房间里面有一团火,我们将手靠近火的时候,会感觉到很温暖,很舒适的感觉,所以我们就会学习到,靠近火这种东西可以带给我们温暖,即一种正向的奖励。
在这里插入图片描述
但是当我们靠这个火焰太近之后,会被烧伤,会带给我们痛觉(负奖励),于是我们又学习到,火焰可以取暖,不过靠太近会受伤。这就是人类进行学习的一种过程,通过和环境进行交互然后学习。

强化学习的过程
强化学习的一个过程其实就和我们学习的方式相同,只不过他是一个通过计算来完成从环境进行学习的过程。
强化学习的流程图:

在这里插入图片描述
智能体(agent)根据当前的状态来生成一个动作(action),动作会对环境造成影响,根据影响的好坏,给与一个正/负奖励给agent,然后生成下一个状态,agent再根据当前状态再生成一个动作,以此类推,来完成最后的一个学习。

大家应该都玩过马里奥这个游戏,于是用马里奥这个游戏来进行一个形象的阐述:
在这里插入图片描述
首先,最开始的时候,agent会收到当前环境的一个状态s0的信息,
根据这个信息,生成动作a0,动作会随之改变环境,环境生成一个新的状态,环境给agent一个对于当前动作的奖励,来为他提供学习的判断,然后以此进行一个循环。

最终强化学习的这个流程的一个输出其实就是一系列的state,action,reward的集合,而我们的一个最终目标呢就是去将这个reward最大化。

说这个没意思,就随便记录一下
…(待补充)

Q-learning

什么是q-learning?
q-learning就是基于动作的价值进行学习的一个算法,即我们在每一个状态(时刻),我们会根据当前能够选择动作的价值来判断我们到底去选择哪一个动作,而当前的这个价值呢,就要用我们人为设置的reward和一个长期reward参数去进行迭代更新:
(emmm,其实简单的来说就是q-learing算法中,我们引入了一个table表,这个table表其实就存放了每一个环境状态下选择每个动作的所对应的值,我们进行交互的时候就会根据这个表,来进行动作的一个选择,一次来完成状态到动作,动作影响状态的交互过程,就和下面这个图一样,这个是我做星际争霸2时生成的表:)
在这里插入图片描述
这样看这个q-table也不是太清楚,到底q-table怎样实现,值又怎样更新?
在这里插入图片描述

(1).q-table其实就是用自定义的一个状态来当做纵向的一个索引值,而选择的动作作为横坐标来构建表,然后再将每一个状态下的值进行更新上去。

(2)值又是怎样更新的呢?
值更新的函数如下:
在这里插入图片描述
这个计算公式怎么去理解呢?
首先我们能够在Q-learning中一个时间获取到当前的状态,当前状态选择的动作,选择该动作的奖励还有下一个状态
在这里插入图片描述
在我们不断和环境进行交互的过程中,一个动作的新的价值就等于当前的价值+学习率*(当前动作的奖励+打折系数下一个状态下选择该动作的最大的价值-当前的价值)
学习率和打折系数都是自定义的超参数
虽然看起来有一些复杂,简单理解就是我们在这个状态选择这个动作的一个价值就可以用我们的当前价值和选择该动作所造成的收益影响来共同表示,造成的影响就用选择动作之后所得到的奖励加上(打折系数
下一个状态的最大值)再减去当前价值来表示,然后在进行更新就行,配了代码就很好理解了,嘻嘻嘻。

用星际争霸的小demo来实现以下,在初始化的时候,我们用pandas.DataFrame 来进行一个表格的建立,这个表格在现在暂时只有动作的横向标题,还没有状态的纵向实现。在进行学习过程中,分以下步骤去进行环境交互和学习:(要完成这个,需要对星际争霸地图制作和状态获取有了解)
1.首先获取到和环境进行交互的状态
2.人为设置的变化奖励
3.然后我们用当前获取到的环境信息去进行一个动作的选择,在动作选择的时候,分两种形式,最优选择和随机选择,通过阈值来增加随机性。
4.在选择时,我们会先判断这个状态是否在我们的q-table里面,如果存在就去取这个时刻动作价值最高的动作。如果不存在,就将这个动作添加到q-table中,然后在根据状态来返回一个动作
5。更新奖励,让q-table去学习的奖励时现在算出的reward和现在obs里面获取到的reward的一个总和
6.将当前状态,动作,价值和下一个状态传入q-table进行学习
7.学习时会判断是否存在该状态,存在就更新q-table中对应的一个函数值,如果不存在,就添加新状态,并更新reward添加到q-table中。

效果如下:
在这里插入图片描述

deep q-learning

DQN和Q-learning:
DQN是将q-learning中的表用神经网络来进行了替换,看下图就能看明白
在这里插入图片描述
q-learning中存在很大的问题就是对于每一个状态,我都要在表格中进行表示,在环境复杂度很高的时候,去构建状态和动作的对应列表,对计算机的内存要求非常高,(就拿这个小demo来说,32x32的地图,坐标位置为状态随便都能到2000x5大小的表格)而且在实际情况下,状态复杂度更高,所以在q-learning 的基础上引入深度学习的概念,引入了神经网络。
DQN主要有两种输入,(1)将状态作为输入,生成每个动作的价值分布,(2)输入动作各状态,生成动作价值:
在这里插入图片描述
这里实现的一种是第二种方式
在星际争霸中的实现:在这个游戏中的简单实现:
1.建立网络
使用的网络就是很简单的两个全连接网络,并初始化参数

class Net(nn.Module):
    def __init__(self):
        super(Net,self).__init__()
        self.fc1=nn.Linear(state_feature,64)
        self.fc1.weight.data.normal_(0,0.1)
        self.fc2 = nn.Linear(64, action_feature)
        self.fc2.weight.data.normal_(0, 0.1)

    def forward(self,x):
        x=self.fc1(x)
        x=F.relu(x)
        x=self.fc2(x)
        return x
class DQN(object):
    def __init__(self):
        self.q_net=Net()
        self.target_net=Net()
        self.learning_step_count=0
        self.memory_count=0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

2.该网络会被复制成两个网络,即一个作为对状态进行价值判断的网络,另一个作为
我们的目标网络,即需要用目标网络来和我们的输出网络进行loss计算,DQN中的LOSS使用的是MSEloss

 self.q_net=Net()
 self.target_net=Net()
  • 1
  • 2

3.引入了深度学习,就涉及到反向传播,反向传播就需要loss运算,所以我们需要大量的数据和标签
于是我们引入了缓冲池,缓冲池里面存放的数据就是当前状态,状态下选择的动作,当前奖励,和下一个状态的一个集合

4.刚开始通过于环境不断地交互,来获取到大量的数据,并更新缓冲池,缓冲池达到阈值之后,开始进行训练,但是在训练过程中,
还是会通过和环境交互,来更新缓冲池,然后通过随机的批次采样来进行训练,实现方式就是用一个计数的变量来控制

5.有了数据,标签哪里来?(fixed-target)
我们可以接用q-learning的思想,在q-learning中,用下一个状态的价值来当作我们的目标值
q-learning中下一个状态的价值等于当前价值加上学习率乘以(q-target-q-value)
而q-target=r+打折系数乘以下一个动作的最大价值

所以我们在DQN中也用下一个状态的值作为目标函数,在dqn中我们用的是一个和价值函数相同的网络来实现,这个网络
会在一定时间内复制价值网络里面的全部参数,然后保持不变,作为目标函数,而目的就是让这个target函数和价值函数的
值差距越来越小,即我随着训练,我发生的改变越小,即越靠近我们的最终结果。

DQN中用到的小trick:
Q-fixed:
q的价值评估和目标值的价值都是用一个网络来进行的,所以提出了用一个和原来网络结构相同的网络来进行目标的函数的计算,即减小数据之间的关联性

1.DDQN
DQN和Q-fixed都解决不了网络过度估计的问题,因为才采用的是对动作概率最大的值的选取操作。于是我们根据当前状态,生成一个动作,在根据这个动作和状态一起传到q-target中进行价值评估来进行目标价至的计算。

2.dueling dqn:
dueling dqn的提出是为了训练更容易,是在网络的结构上面进行的改进
我们最初始的网络是两个全连接,我们dueling dqn的目的就是在于将原来的输出q值的函数改成输出动作优势(advantage)和状态价值(v(s)),并且状态价值是一个平均数,动作优势的和为0,在状态价值改变的时候,每一个状态的价值都会随之改变,动作优势也会随之改变,这样能够更好的训练网络

3.优先经验回放(Prioritized Experience Replay )
用我们的Q-现实减去Q-估计作为一个优先级的判断,但是每一次有趣对优先级排序太耗资源,于是采用加和树来进行。

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

闽ICP备14008679号