写在前面
最近刚接触强化学习,系统的学习资料感觉很少,不过好像最近有一本强化学习的书要出来,还是蛮期待的。结合师兄给的一些资料和网络资源进行“艰难”的摸索过程,任重道远。将学习过程中的一些知识记录在这里,加深印象,特别感谢这个专栏。
强化学习
强化学习目前越来越火,从AlphaGo到AlphaZero让大家见识到了强化学习的力量,有很多AI大牛也公开表示强化学习是改变未来重要的工具。这里就以及不专业的理解说一下对强化学习的理解吧。假如我们训练一只狗狗,希望它能按照我们的要求坐下、站着等等,起先它会很笨,老是做不对。后来随着训练时间和训练次数的增加,10000次中终于有一次做对了,我们就给它一根骨头奖励它,再后来,它变聪明了,知道做对了就有骨头,所以时间再增加,次数再增多,它便每次都很听话,每一次都能按照我们的要求做动作。强化学习类似于这样的过程,我们对系统每一步都会给一个奖励来刺激它获取更大的奖励,直到总的奖励最大,这个系统也就变成了我们想要的东西。这是个人对强化学习的比较直观的理解,马尔科夫决策过程是一个简单的强化学习模型,我们就从它开始下手吧!!
马尔科夫随机过程
大学概率统计中有过马尔科夫随机过程的描述,这里只是简单的对这些概念进行回顾,若需要详细了解可以找本概率的书本或者百度一下,相对还是比较简单的一个知识,作用很大。
马尔科夫性
马尔科夫性简单来说就是指在一个随机过程中,下一时刻的状态只和当前状态有关,与之前的状态无关。用数学语言描述是:
P(st+1|st,st−1...s1)=P(st+1|st)
<script type="math/tex; mode=display" id="MathJax-Element-57603">P(s_{t+1}|s_t,s_{t-1}...s_1)=P(s_{t+1}|s_t)</script>如果一个随机过程中,任意两个状态之间都满足马尔科夫性,那么该随机过程就是一个马尔科夫随机过程。一个马尔科夫过程可以用一个二元组
(S,P) <script type="math/tex" id="MathJax-Element-57604">(S,P)</script>描述,
S <script type="math/tex" id="MathJax-Element-57605">S</script>是该过程的有限状态集合,
P<script type="math/tex" id="MathJax-Element-57606">P</script>是这些状态之间的转移概率矩阵。这个矩阵并不是一定对称的,也就是说
si−>sj <script type="math/tex" id="MathJax-Element-57607">s_i->s_j</script>的转移概率并不一定等于
sj−>si <script type="math/tex" id="MathJax-Element-57608">s_j->s_i</script>的转移概率。
以上面这副图为例,该图中的状态有:{娱乐,课1,课2,课3,考过,论文,睡觉},边上面的数字就是这些状态之间的转移概率,例如:
p(课1|娱乐)=0.1,p(课2|课1)=0.5 <script type="math/tex" id="MathJax-Element-57609">p(课1|娱乐)=0.1,p(课2|课1)=0.5</script>。
马尔科夫决策过程
马尔科夫决策过程(Markov Decision Process, MDP)以马尔可夫随机过程为理论基础,马尔科夫决策过程也可以用一个元组 (S,A,P,R,γ) <script type="math/tex" id="MathJax-Element-57610">(S,A,P,R,\gamma)</script>来表示。 S <script type="math/tex" id="MathJax-Element-57611">S</script>是决策过程中的状态集合;A<script type="math/tex" id="MathJax-Element-57612">A</script>是决策过程中的动作集合; P <script type="math/tex" id="MathJax-Element-57613">P</script>是状态之间的转移概率;R<script type="math/tex" id="MathJax-Element-57614">R</script>是采取某一动作到达下一状态后的回报(也可看作奖励)值; γ <script type="math/tex" id="MathJax-Element-57615">\gamma</script>是折扣因子。特别地,这里的转移概率与马尔科夫随机过程不同,这里的转移概率是加入了动作 A <script type="math/tex" id="MathJax-Element-57616">A</script>的概率,如果当前状态采用不同动作,那么到达的下一个状态也不一样,自然转移概率也不一样。转移概率形式化描述是:
pass^=p(s^|s,a)=p(St+1=s^|St=s,At=a)
<script type="math/tex; mode=display" id="MathJax-Element-57617">p_{s\hat s}^a=p(\hat s|s,a)=p(S_{t+1}=\hat s| S_t=s,A_t=a)</script>意思是:在t时刻所处的状态是s,采取a动作后在t+1时刻到达
s^ <script type="math/tex" id="MathJax-Element-57618">\hat s</script>的概率。以上面的图为例,不过我们改变了图中的形式:
图中的状态集变成了
{s1,s2,s3,s4,s5} <script type="math/tex" id="MathJax-Element-57619">\{s_1,s_2,s_3,s_4,s_5\}</script>,动作集合为
{玩,退出,学习,睡觉,发表} <script type="math/tex" id="MathJax-Element-57620">\{玩,退出,学习,睡觉,发表\}</script>,图中红色的字就是回报。
这里可以这样来看,在马尔科夫随机过程中我们专注于状态之间的改变,而状态之间是怎么改变的我们并不关心,往往是通过转移概率来衡量不同状态之间转移的可能性大小;而在马尔科夫决策过程中,多了一个决策,这个决策也就是我们前面所说的动作,在采用什么动作后,到达下一时刻的状态,并且给这个决策一个回报值来衡量该决策的好坏。
在MDP中,决策可以用 π(a|s)=p(At=a|St=s) <script type="math/tex" id="MathJax-Element-57621">\pi(a|s)=p(A_t=a|S_t=s)</script>来表示,意思是在t时刻处于状态s的情况下,选用a动作的概率。可以看到,在每个状态s采取的动作a并不确定,那么状态序列也不一样,用上图来说明,当初始状态处于 s1 <script type="math/tex" id="MathJax-Element-57622">s_1</script>时,那么整个状态序列可以是:
s1−>s1,a1=退出
<script type="math/tex; mode=display" id="MathJax-Element-57623">s_1->s_1,a_1=退出</script>或者
s1−>s2−>s3−>s4−>s5,a1=退出,a2=学习,a3=学习,a4=睡觉
<script type="math/tex; mode=display" id="MathJax-Element-57624">s_1->s_2->s_3->s_4->s5,a_1=退出,a_2=学习,a_3=学习,a_4=睡觉</script>同样可以是:
s1−>s2−>s3−>s5,a1=退出,a2=学习,a3=睡觉
<script type="math/tex; mode=display" id="MathJax-Element-57625">s_1->s_2->s_3->s_5,a_1=退出,a_2=学习,a_3=睡觉</script>那么对于整个过程,我们怎么去衡量中间状态
st <script type="math/tex" id="MathJax-Element-57626">s_t</script>的好坏呢?我们可以这样来看,状态
st <script type="math/tex" id="MathJax-Element-57627">s_t</script>到
st+1 <script type="math/tex" id="MathJax-Element-57628">s_{t+1}</script>会有一个回报,
st+1 <script type="math/tex" id="MathJax-Element-57629">s_{t+1}</script>到
st+2 <script type="math/tex" id="MathJax-Element-57630">s_{t+2}</script>同样会有一个回报,以此类推。但
st <script type="math/tex" id="MathJax-Element-57631">s_t</script>对
st+1 <script type="math/tex" id="MathJax-Element-57632">s_{t+1}</script>的影响很大,但对于
st+2,st+3... <script type="math/tex" id="MathJax-Element-57633">s_{t+2},s_{t+3}...</script>会越来越小,所以提出了一个折扣因子
γ <script type="math/tex" id="MathJax-Element-57634">\gamma</script>来减小后面状态的回报对当前状态衡量的影响。于是我们得出所谓的累计回报函数:
Gt=Rt+1+γRt+2+...=∑k=0∞γkRt+k+1
<script type="math/tex; mode=display" id="MathJax-Element-57635">G_t=R_{t+1}+\gamma R_{t+2}+...=\sum_{k=0}^{\infty}\gamma^kR_{t+k+1}</script>由于
Gt <script type="math/tex" id="MathJax-Element-57636">G_t</script>并非一个确定值(中间涉及到概率选择动作),所以采用期望来计算这个累计回报函数,也叫做状态值函数,也就是:
vπ(s)=Eπ[Gt]=Eπ[∑k=0∞γkRt+k+1|St=s]
<script type="math/tex; mode=display" id="MathJax-Element-57637">v_\pi(s)=E_\pi[G_t]=E_\pi[\sum_{k=0}^{\infty}\gamma^kR_{t+k+1}|S_t=s]</script>在这个式子中,状态值函数
vπ(s) <script type="math/tex" id="MathJax-Element-57638">v_\pi(s)</script>仅仅和策略
π <script type="math/tex" id="MathJax-Element-57639">\pi</script>有关,也就是说策略唯一确定了状态值函数的分布。而策略由动作
a <script type="math/tex" id="MathJax-Element-57640">a</script>确定,所以将动作加入其中:
qπ(s,a)=Eπ[∑k=0∞γkRt+k+1|St=s,At=a]
<script type="math/tex; mode=display" id="MathJax-Element-57641">q_\pi(s,a)=E_\pi[\sum_{k=0}^{\infty}\gamma^kR_{t+k+1}|S_t=s,A_t=a]</script>
qπ(s,a) <script type="math/tex" id="MathJax-Element-57642">q_\pi(s,a)</script>又叫做状态-动作函数。可以发现
vπ(s) <script type="math/tex" id="MathJax-Element-57643">v_\pi(s)</script>存在如下关系:
vπ(s)=E[Gt|St=s]=E[Rt+1+γRt+2+...|St=s]
<script type="math/tex; mode=display" id="MathJax-Element-57644">v_\pi(s)=E[G_t|S_t=s] =E[R_{t+1}+\gamma R_{t+2}+...|S_t=s]</script>
=E[Rt+1+γ(Rt+2+γRt+3)|St=s]
<script type="math/tex; mode=display" id="MathJax-Element-57645">=E[R_{t+1}+\gamma(R_{t+2}+\gamma R_{t+3})|S_t=s]</script>
=E[Rt+1+γGt+1|St=s]
<script type="math/tex; mode=display" id="MathJax-Element-57646">=E[R_{t+1}+\gamma G_{t+1}|S_t=s]</script>
=E[Rt+1+γvπ(St+1)|St=s]
<script type="math/tex; mode=display" id="MathJax-Element-57647">=E[R_{t+1}+\gamma v_\pi(S_{t+1})|S_t=s]</script>这个关系叫做贝尔曼方程,同样可以得到状态—行为函数的贝尔曼方程:
qπ(s,a)=Eπ[Rt+1+γqπ(St+1,At+1)|St=s,At=a]
<script type="math/tex; mode=display" id="MathJax-Element-57648">q_\pi(s,a)=E_\pi[R_{t+1}+\gamma q_\pi(S_{t+1},A_{t+1})|S_t=s,A_t=a]</script>
由于状态值函数是以期望定义的,根据期望的计算规则,状态值函数应该是:
vπ(s)=∑a∈Aπ(a|s)qπ(s,a)
<script type="math/tex; mode=display" id="MathJax-Element-57649">v_\pi(s)=\sum_{a \in A}\pi(a|s)q_\pi(s,a)</script>
粗略的理解是在t时刻的状态
s <script type="math/tex" id="MathJax-Element-57650">s</script>,以某以概率选择动作
a<script type="math/tex" id="MathJax-Element-57651">a</script>,动作
a <script type="math/tex" id="MathJax-Element-57652">a</script>产生的状态—动作值是
qπ(s,a)<script type="math/tex" id="MathJax-Element-57653">q_\pi(s,a)</script>,于是也就有上面的期望计算式。再将
qπ(s,a) <script type="math/tex" id="MathJax-Element-57654">q_\pi(s,a)</script>改写成:
qπ(s,a)=Ras+γ∑s^∈SPass^vπ(s^)
<script type="math/tex; mode=display" id="MathJax-Element-57655">q_\pi(s,a)=R_{s}^a+\gamma \sum_{\hat s \in S}P_{s\hat s}^av_\pi(\hat s)</script>所以:
vπ(s)=∑a∈Aπ(a|s)(Ras+γ∑s^∈SPass^vπ(s^))
<script type="math/tex; mode=display" id="MathJax-Element-57656">v_\pi(s)=\sum_{a \in A}\pi(a|s)\big(R_{s}^a+\gamma \sum_{\hat s \in S}P_{s\hat s}^av_\pi(\hat s) \big)</script> 而:
vπ(s^)=∑a^∈Aπ(a^|s^)qπ(s^,a^)
<script type="math/tex; mode=display" id="MathJax-Element-57657">v_\pi( \hat s)=\sum_{ \hat a \in A}\pi(\hat a| \hat s)q_\pi(\hat s,\hat a)</script>
定义最优的状态值函数
v∗(s)=maxπvπ(s) <script type="math/tex" id="MathJax-Element-57658">v^*(s)=\max_\pi v_\pi(s)</script>,也就是所有策略中最大的状态值函数;同理最优的抓状态—动作函数
q∗(s,a)=maxπq(s,a) <script type="math/tex" id="MathJax-Element-57659">q^*(s,a)=\max_\pi q(s,a)</script>,所有策略中最大的状态-动作值函数值。根据上面的式子有:
v∗(s)=maxRas+γ∑s^∈SPass^v∗π(s^)
<script type="math/tex; mode=display" id="MathJax-Element-57660">v^*(s)=\max R_s^a+\gamma \sum_{\hat s \in S}P_{s\hat s}^av^*_\pi(\hat s)</script>
q∗(s,a)=Ras+γ∑s^∈SPass^maxa^q∗π(s^,a^)
<script type="math/tex; mode=display" id="MathJax-Element-57661">q^*(s,a)=R_{s}^a+\gamma \sum_{\hat s \in S}P_{s\hat s}^a max_\hat a q^*_\pi(\hat s,\hat a)</script> 这里的符号很多,容易混,细心看一下。
强化学习的目的
通过上面的说明,强化学习的目的就是找到最优的策略,使累计回报函数最大,同时,如果累计回报函数最大时,采用的策略也是最优的。所以强化学习的优化有两种方法:(1)基于策略的优化;(2)基于累计回报函数的优化。另外,强化学习算法根据策略是否是随机的,分为确定性策略强化学习和随机性策略强化学习。根据转移概率是否已知可以分为基于模型的强化学习算法和无模型的强化学习算法。另外,强化学习算法中的回报函数 R <script type="math/tex" id="MathJax-Element-57662">R</script>十分关键,根据回报函数是否已知,可以分为强化学习和逆向强化学习。逆向强化学习是根据专家实例将回报函数学出来。
过程理解总结
整体来说,强化学习是一个最优化的过程:根据初始状态,一步一步的寻找一个状态动作轨迹,从而使累计回报最大。根据状态t时刻的状态s<script type="math/tex" id="MathJax-Element-57663">s</script>,随机选择一个动作 a <script type="math/tex" id="MathJax-Element-57664">a</script>,跳转到下一时刻的某一个状态s^<script type="math/tex" id="MathJax-Element-57665">\hat s</script>,这一步跳转由于涉及随机性,所以不能直接用回报值来决定选择下一步的去向,所以根据期望值来决定。再来说状态值函数和状态—动作值函数的关系,状态—动作值函数意思是才用了某一动作 a <script type="math/tex" id="MathJax-Element-57666"></script>后的回报,但是该动作是随机性的,所以状态—动作值函数乘以选择动作的概率,这就是状态—动作值函数的期望,也就是状态函数值了。而状态值函数以及状态—动作函数的贝尔曼方程将两者从理论上联系到了一起,并且可以看作是递归计算方式。最后是折扣因子,越往后,折扣因子的乘积越小,其实可以这样理解,如果第一步走错了,那么后面可能会越走越错,所以后面的影响相对开始会较小。这是目前个人的理解,希望指正。
所有评论(0)