1.强化学习
强化学习是一类算法,是让计算机实现从一开始什么都不懂,通过不断地尝试并更新自己的行为准则。从错误中学习,最后找到规律,最终达到目的的方法。
在计算机中,可以为每一次的行为进行打分。分为高分和低分,有了打分的经验,就可以尽量去选择高分,而避免选到低分。所以强化学习具有分数导向性。
强化学习的算法:
(1)通过价值选行为:Q learning、Sarsa(使用表格学习)、Deep Q Network(使用神经网络学习)
(2)直接选行为:Policy Gradients(基于概率)
(3)想象环境并从中学习:Model based RL
2.强化学习方法汇总
Model free 和Model based
强化学习的方法分为不理解所处环境的model-free方法和理解model-based方法。
在Model-free中,Q-learning、Sarsa、Policy Gradients都是从环境中得到反馈然后学习。
而Model-based多出了一个虚拟环境,且比model-free多了想象力。
Model-free中,机器人智能等待真实世界的反馈,然后根据反馈做出行动。
Model-based,能够通过想象来判断接下来发生的状况,然后选择想象情况中最好的,然后采取下一步的策略。
【1】将强化学习分为基于概率和基于价值(分类方式)
基于概率是强化学习中最直接的一种,能通过感官分析所处环境,输出下一步要采取行动概率,然后根据概率采取行动,所以每种动作都有可能被选中。
基于价值的方法是输出所有动作的价值,它会直接选择价值最高的。
动作一般是不连续的,对于连续的动作,就能体现出基于概率的优势,而基于价值确实无能为力的。
通过基于概率的方法和基于价值的方法,又创造出了Actor-Critic.actor会基于概率做出动作,而critic会对动作给出价值,在原有的基于概率的policy gradients上加速了学习过程。
【2】另一种分类方式,回合更新和单步更新
类比于玩游戏,回合更新是在一局游戏结束后进行总结,一局游戏中所有的转折点,然后更新行为准则。
单步更新,游戏中每一步都在更新。边玩边学习。
Monte-Carlo learning和基础版的policy gradients等是回合更新
Qlearning,Sarsa,升级版的policy gradients等是单步更新。
现在大多数方法采用单步更新,因为单步更新更有效率。
【3】另一种分类方式,在线学习和离线学习
在线学习:本人在场,本人边玩边学习(on-policy)比如:Sarsa
离线学习:本人可以不在场,本人或者其他人玩,不必边玩边学习(off-policy)
Sarsa--在线学习
Q learning,Deep-Q-Network--离线学习
3.为什么要用强化学习
强化学习(Reinforcement Learning)是一个机器学习大家族的分支,由于近些年的技术的突破,和深度学习(Deep Learning)的整合,使得强化学习有了进一步的运用。强化学习是让我们的程序从对当前环境完全陌生,成长为一个在环境中游刃有余的高手。
Q-learning
为了得到最优策略policy,我们考虑估算每一状态下每一种选择的价值value有多大。然后我们通过分析发现,每一个时间片的Q(s,a)和当前得到的Reward以及下一个时间片的Q(s,a)有关。Q-learning建立在虚拟环境下无限次的实验。这意味着可把上一次实验计算得到的Q值进行使用。这样,就可以根据当前的r,reward以及上一次实验中下一个时间片的Q值来更新当前Q值。下面来具体分析。
Q-learning的算法过程:
初始化Q(s,a),任意s属于S,a属于A(s),任意的数值,并且Q(terminal-state,.)=0
重复(对每一节episode):
初始化状态S
重复(对episode的每一步):
使用某一个policy比如(伊布西龙-greedy)根据状态S选取一个动作执行
执行完动作后,观察reward和新的状态S'
Q(St,At)<--Q(St,At)+alpha(R(t+1)+lanmdamax(a)Q(S(t+1),a)-Q(St,At))
S<--S'
循环直到S终止
对于Q-learning,首先就是要确定如何存储Q值,最简单的想法就是矩阵,一个s一个a对应一个Q值,所以可以把Q值想象为一个很大的表格,横列代表S(STATE),纵列代表a(ACTION),里面的数字代表Q值,如下所示:
Q(1,1) |
Q(1,2) |
Q(1,3) |
Q(2,1) |
Q(2,2) |
Q(2,3) |
Q(3,1) |
Q(3,2) |
Q(3,3) |
这样就可以知道Q值是怎样的了,下面就是看Q表是如何更新的。
(1)初始化Q矩阵,比如说都设置为0
(2)开始实验。根据当前Q矩阵及伊布西龙-greedy方法获取动作。比如当前处在状态s1,那么在s1一列每一个Q值都是0,那么这个时候随便选择就可以。
0(s1,a1) |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0(s3,a3) |
假设为选择a2动作,然后得到的reward是1,并且进入到s3状态,接下来我们要根据
Q(St,At)<--Q(St,At)+alpha(R(t+1)+lanmdamax(a)Q(S(t+1),a)-Q(St,At))
来更新Q值,这里我们假设alpha=1,lamda=1,也就是每一次都把目标Q值赋给Q。那么公式变成:
Q(St,At)=R(t+1)+max(a)Q(S(t+1),a)
所以在这里,就是
Q(s1,a2)=1+max(a)Q(S(3),a)
那么对应的s3状态,最大值是0,所以Q(s1,a2)=1+0=1,Q表格就变成:
0(s1,a1) |
1(s1,a2) |
0 |
0 |
0 |
0 |
0 |
0 |
0(s3,a3) |
(3)接下来就是进入下一次动作,这次的状态是s3,假设选择动作a3,然后得到1的reward,状态变成s1,那么我们同样进行更新:
Q(s3,a3)=2+max(a)Q(s1,a)=2+1=3
所以Q表格就变成:
0(s1,a1) |
1(s1,a2) |
0 |
0 |
0 |
0 |
0 |
0 |
3(s3,a3) |
(4)重复上面的方法。
就是这样,Q值在实验的同时反复更新。直到收敛。
DQN
为什么会产生DQN呢,那当然是因为Q-learning也有他的不足之处。我们已经知道,Q表是用表格来表示的Q(s,a),但是这只适合于少量的状态空间和行为空间,如果出现大量的数据的话,用表格就显得格外不妥。所以我们需要对状态的维度进行压缩,解决办法就是价值函数近似。
价值函数近似(Value Function Approximation)
什么是价值函数近似,其实很简单,就是用一个函数来表示Q(s,a).即
Q(s,a)=f(s,a)
这里的f可以是任意类型的函数,比如线性函数:
Q(s,a)=w1s+w2a+b 其中w1,w2,b就是函数f的参数
通过函数的表示,我们就可以无所谓s到底是多大的维度,反正最后都会通过矩阵运算输出为单值的Q。这就是价值函数近似的思路。
如果我们就用w来统一便是函数f的参数,那么就有
Q(s,a)=f(s,a,w)
为什么叫近似,因为我们并不知道Q值的实际分布情况,本质上就是一个函数来近似Q值的分布,所以,也可以说是Q(s,a)≈f(s,a,w)
高维状态输入,低维动作输出的表示问题
对于海量(state,action)数据来说,这是一个高维状态输入,低维动作输出。那么怎么来表示这个函数f呢。最简单的尝试,把高维s和低维a加在一起作为输入。但实际确有一些不妥。我们只需要对高维的状态进行降维,而不需要对动作也进行降维处理。
Q(s)≈f(s,w),只把状态s作为输入,但是输出的时候输出每一个动作的Q值,也就是输出一个向量[Q(s,a1),Q(s,a2),Q(s,a3),...,Q(s,an)],记住这里输出是一个值,只不过是包含了所有动作的Q值的向量而已。这样我们就只要输入状态s,而且还同时可以得到所有的动作Q值,也将更方便的进行Q-learning中动作的选择与Q值更新。