介绍
什么是强化学习(Reinforcement Learning)呢?想象自己在一个迷宫中, 你需要走到出口,但你完全不知道迷宫是什么样的,你能得到的环境信息就是4各方向上的情况,我们称这个迷宫为一个环境(environment)。
下面你需要踏出一步,有4各方向可以选择,因为我们对于迷宫总体结构未知,所以这时候走任何一个方向是随意的。我们称这样移动一步为动作(action)。
在迷宫里乱跑一定不是一个好的建议,我们应该当探索迷宫的过程中获得更多关于迷宫的信息,从而在动作的时候做出更好的判断(比如,之前来过这个位置,选择了向上走,很快就碰到了死路,所以选择其他方向会比较好),这就是说,要有一个反馈的机制——奖励(reward)。比如下一步就是出口了,应当给一个很大奖励(10000);而下一步是墙,应当给一个很大的负奖励(-10000)。而正常迷宫探索的时候,给一个正常的奖励就可以(1)。
奖励是探索过程得到的经验,他将怎么指导我们新的探索呢?首先,对于在迷宫中我们每次要做出决策的时候,我们需要从自己的状态(state)进行判断,状态的表示方式很多,在迷宫中我们可以认为是位置坐标;在倒立摆中可以是位置和角度以及他们的加速度。
那么,我们在迷宫中每次做出决策的时候,相关的就是当前状态和可以做的动作,设Q(s,a)为状态-动作函数,即在每个状态下,做每个动作的Q值(和reward相关),探索的过程中,我们要做的,就是把Q-Table填满。
下面我们要做的就很明确了,我们在一个环境中,对于当前状态,我们根据经验(Q),做出一个动作,接着我们到了下一个状态,并基于状态得到一个奖励,拿到奖励后我们再更新经验(Q)。这样,通过很多次迭代的探索后,我们呢就能得到一个最优的走出迷宫的策略,这是一个由状态和动作构成的马尔科夫决策过程(Markev Decision Process)(什么是马尔科夫链?)
伪代码
我们呢了解了强化学习的基本思想,下面用一段伪代码表述整个强化学习的过程:
Initialize Q arbitrarily //随机初始化Q值
Initialize S //处于起点
Repeat (for each episode):
//每一次探索
Repeat (for each step of episode):
//探索中的每一步
根据当前Q和位置S,使用一种策略,得到动作A
//这个策略可以是ε-greedy或者softmax等
做了动作A,到达新的位置S2,并获得奖励R
//奖励可以是1,50或者-1000
Q(S,A) ← (1-α)*Q(S,A) + α*[R + γ*maxQ(S2,a)]
//在Q中更新S
S ← S2
找到终点
下面具体讲两个问题:
1. 策略选择函数
这个策略有很多,也诞生了n多论文,我讲一下比较简单常用的三种,一会matlab代码中也正是用的这三种。
1. 贪婪(greedy)算法
贪婪算法简单来说就是选择最好的,你是一个极其贪婪的人,永远向着眼前最好的方向前进。具体选择方法是:
action=find(Q(S,A)==max(Q(S,A)))action=find(Q(S,A)==max(Q(S,A)))
2. ϵ−greedyϵ−greedy算法
对于贪婪算法,我们能想象到一点,如果每次都按着最好的方向前进,那也只能更新该方向的Q,即过度的利用过去的经验,没有对未知环境的探索,这样肯定是不够好的,所以这个ϵ−greedyϵ−greedy算法就是每次以 ϵϵ的概率进行探索(随机选择一个方向),以1−ϵ1−ϵ的概率进行利用(选择最好的方向)。
actionSet = find(Q == max(Q));
action = actionSet(1); %处理冲突,如果最大的q值相同,会导致action返回一个向量,导致switch错误
tmp = rand(1);
if tmp < e
tmp2 = randi(4);
while(tmp2 == action)
tmp2 = randi(4);
end
action = tmp2;
end
#这是matlab代码orz,比较混乱莫介意,意会吧
3. softmax算法
可以发现,ϵ−greedyϵ−greedy算法在一开始固定了进行探索和利用的概率,事实上,我们可以想到,一开始应当进行大量的探索,随着探索的继续,而应该逐渐增加利用的概率。也就是说,ϵϵ的值应该与max(Q)max(Q)有关,于是,产生了softmax算法。
他基于Boltzman分布
P(k)=eQ(k)τ∑i=1KeQ(i)τP(k)=eQ(k)τ∑i=1KeQ(i)τ
把ττ看作温度,当温度较小时,倾向于利用;当温度较高时,倾向于探索。
代码中我们使Boltzman系数线性下降,直至设定的最小值。
if (Boltzmann > 0.3)
Boltzmann = Boltzmann - 0.999/iteration;
else
Boltzmann = 0.3;
end
2. Q值更新公式
可以看到,前面伪代码里Q值更新的公式是:
Q(S,A)←(1−α)∗Q(S,A)+α∗[R+γ∗maxQ(S′,a)]Q(S,A)←(1−α)∗Q(S,A)+α∗[R+γ∗maxQ(S′,a)]
下面解释一下里面两个参数:
对于α,他代表我们学习的速度,如果α为1,则是完全学习,舍弃现有的值。
对于γ,代表折扣因子,γ越大的时候,maxQ(S’,a)起到的作用就越大,那么他是什么呢?
max_aQ(S’, a)指的便是记忆中的利益,即下一个状态中Q的最大值。想像一下如果下一步可以走到终点,他就会有一个很大的Q值,这个很大的Q可以帮助我们呢提前走到这个方向上。γ越大,越重视经验中的利益;γ越小,越重视眼前的利益。