学习这个算法有一段时间了,但是因为自己犯懒一直没有整理。现整理一下,一方面有刚入门的同学可以参考,另一方面哪里写错或者理解不深的还请大家及时指正。
首先列出一些强化学习中的基本概念,主要是为了帮助自己回忆起学习这个算法的过程。
智能体的状态值函数和状态行为值函数之间存在一种递推关系。下图给出四种递推关系:
Q-Learning算法是一种基于表格的值函数迭代的强化学习算法。这个方法最大的特点就是建立一张Q值表(Q-Table),算法迭代时Q值表不停地被更新,直至最后表中数据收敛。等到Q值表收敛后,智能体可以根据每个状态的行为值函数的大小来确定最优策略。Q值表示意如下:
Q − T a b l e Q-Table Q−Table | a 1 a_{1} a1 | a 2 a_{2} a2 | ⋯ \cdots ⋯ | a m a_{m} am |
---|---|---|---|---|
s 1 s_{1} s1 | q ( s 1 , a 1 ) q\left(s_{1}, a_{1}\right) q(s1,a1) | q ( s 1 , a 2 ) q\left(s_{1}, a_{2}\right) q(s1,a2) | q ( s 1 , ⋯ ) q\left(s_{1}, \cdots\right) q(s1,⋯) | q ( s 1 , a m ) q\left(s_{1}, a_{m}\right) q(s1,am) |
s 2 s_{2} s2 | q ( s 2 , a 1 ) q\left(s_{2}, a_{1}\right) q(s2,a1) | q ( s 2 , a 2 ) q\left(s_{2}, a_{2}\right) q(s2,a2) | q ( s 2 , ⋯ ) q\left(s_{2}, \cdots\right) q(s2,⋯) | q ( s 2 , a m ) q\left(s_{2}, a_{m}\right) q(s2,am) |
⋮ \vdots ⋮ | q ( ⋯ , a 1 ) q\left(\cdots, a_{1}\right) q(⋯,a1) | q ( ⋯ , a 2 ) q\left(\cdots, a_{2}\right) q(⋯,a2) | ⋱ \ddots ⋱ | q ( ⋯ , a m ) q\left(\cdots, a_{m}\right) q(⋯,am) |
s n s_{n} sn | q ( s n , a 1 ) q\left(s_{n}, a_{1}\right) q(sn,a1) | q ( s n , a 2 ) q\left(s_{n}, a_{2}\right) q(sn,a2) | q ( s n , ⋯ ) q\left(s_{n}, \cdots\right) q(sn,⋯) | q ( s n , a m ) q\left(s_{n}, a_{m}\right) q(sn,am) |
智能体在探索时,按照下式的方式来更新Q-Table:
N e w Q ( s , a ) = Q ( s , a ) + α R ( s , a ) + γ max a ′ ∈ A Q ( s ′ , a ′ ) − Q ( s , a ) ⏟ Δ Q ( s , a ) NewQ\left(s,a\right)=Q\left(s,a\right)+\alpha\underbrace{R\left(s,a\right)+\gamma\max_{a'\in A}Q\left(s',a'\right)- Q\left(s,a\right)}_{\Delta Q\left(s,a\right)} NewQ(s,a)=Q(s,a)+αΔQ(s,a) R(s,a)+γa′∈AmaxQ(s′,a′)−Q(s,a)
下面举一个例子来简单说明Q-Table的更新过程:
例:有一智能体,状态集合为 { 0 , 1 } \left\{0,1\right\} {0,1},动作集合为 { + , − } \left\{+,-\right\} {+,−},即时奖励 R ( s , a ) = − 1 R\left(s,a\right)=-1 R(s,a)=−1,折扣因子 γ = 0.8 \gamma=0.8 γ=0.8,学习率 α = 0.1 \alpha=0.1 α=0.1,环境的规则为: 0 → + 1 0\xrightarrow{+}1 0+1, 0 → − 0 0\xrightarrow{-}0 0−0, 1 → + 1 1\xrightarrow{+}1 1+1, 1 → − 0 1\xrightarrow{-}0 1−0,执行某一动作之后的状态转移概率是1,初始状态是0,初始化Q-Table为:
Q | + | - |
---|---|---|
0 | 0.0 | 0.0 |
1 | 0.0 | 0.0 |
智能体执行动作 + + +之后, Q ( 0 , + ) Q\left(0,+\right) Q(0,+)会被更新为:
Q ( 0 , + ) = 0.0 + 0.1 × [ − 1 + 0.8 max ( Q ( 1 , + ) , Q ( 1 , − ) ) − 0.0 ] = − 0.1 Q\left(0,+\right)=0.0+0.1\times\left[-1+0.8\max\left(Q\left(1,+\right),Q\left(1,-\right)\right)-0.0\right]=-0.1 Q(0,+)=0.0+0.1×[−1+0.8max(Q(1,+),Q(1,−))−0.0]=−0.1
进而Q-Table会被更新为:
Q | + | - |
---|---|---|
0 | -0.1 | 0.0 |
1 | 0.0 | 0.0 |
Q-Learning算法是有自己的局限性的,主要体现在以下几点:
可以使用网上莫烦Python大神的代码,在OpenAI Gym下做仿真;也可以自己使用图形显示平台自己编写各种简单的仿真环境,然后编写代码测试。我使用的是OpenCV+PyTorch平台,代码一方面稍微有些长(因为还有绘图和调试程序),另一方面网上各种大神的代码,相比之下我的真的是没啥价值,如果有小伙伴想交流,可以私信。贴上一幅图,自己的仿真结果(Low得很…)。
迭代回合数:356
最优路径: [ 0 , 0 ] → [ 1 , 0 ] → [ 2 , 0 ] → [ 3 , 0 ] → [ 4 , 0 ] → [ 4 , 1 ] → [ 5 , 1 ] → [ 6 , 1 ] → [ 6 , 2 ] → [ 6 , 3 ] → [ 6 , 4 ] → [ 6 , 5 ] → [ 6 , 6 ] → [ 7 , 6 ] → [ 7 , 7 ] \left[0,0\right]\rightarrow\left[1,0\right]\rightarrow\left[2,0\right]\rightarrow\left[3,0\right]\rightarrow\left[4,0\right]\rightarrow\left[4,1\right]\rightarrow\left[5,1\right]\rightarrow\left[6,1\right]\rightarrow\left[6,2\right]\rightarrow\left[6,3\right]\rightarrow\left[6,4\right]\rightarrow\left[6,5\right]\rightarrow\left[6,6\right]\rightarrow\left[7,6\right]\rightarrow\left[7,7\right] [0,0]→[1,0]→[2,0]→[3,0]→[4,0]→[4,1]→[5,1]→[6,1]→[6,2]→[6,3]→[6,4]→[6,5]→[6,6]→[7,6]→[7,7]。