它都能经过今后的求学找到最正确的道路,强化学习的目的是读书3个行为策略π

机器学习中的强化学习:Q-learning学习指南

1、Q-learning例子

假如有那样的屋子

图片 1

万一将屋子表示成点,然后用房间之间的对接关系表示成线,如下图所示:

图片 2

那就是房间对应的图。大家先是将agent(机器人)处于任何3个职位,让她协调交往,直到走到5屋子,表示成功。为了可以走出来,大家将各样节点之间设置一定的权重,能够一贯抵达5的边安装为100,其余无法的装置为0,那样网络的图为:

图片 3

Qlearning中,最关键的正是“状态”和“动作”,状态表示处于图中的哪个节点,比如2节点,3节点等等,而动作则意味着从二个节点到另1个节点的操作。

率先大家转移二个记功矩阵矩阵,矩阵中,-1意味不可以由此,0表示能够因而,100象征平素到达终点:

图片 4

与此同时,大家创立一个Q表,表示学习到的经验,与Kuga表同阶,初步化为0矩阵,表示从1个state到另一个state能收获的总的奖励的折现值。

图片 5

image.png

Q表中的值依照如下的公式来展开翻新:

图片 6

在下面的公式中,S表示近日的景况,a表示近年来的动作,s表示下一个状态,a表示下1个动作,λ为贪婪因子,0<λ<1,一般设置为0.8。Q表示的是,在气象s下接纳动作a能够获得的希望最大受益,Evoque是当时收获的收益,而现在一期的纯收入则在于下一阶段的动作。

据此,Q-learning的学习步骤能够总结为如下:

图片 7

在迭代到没有之后,大家就能够依据Q-learning来选取大家的路径走出屋子。
看三个实际上的例证,首先设定λ=0.8,奖励矩阵奇骏和Q矩阵分别起先化为:

图片 8

图片 9

随机选用三个情景,比如1,查看情形1所对应的锐界表,也便是1方可抵达3或5,随机地,大家选择5,遵照转移方程:

图片 10

于是,Q表为:

图片 11

这么,到达指标,二次尝试甘休。
接下去再选取一个无限制状态,比如3,3对应的下叁个气象有(1,2,4都以状态3对应的非负状态),随机地,大家挑选1,那样依照算法更新:

图片 12

这样,Q表为:

图片 13

透过不停的迭代,最后大家的Q表为:

图片 14

我们不妨将Q表中的数转移到大家一开头的示意图中:

图片 15

在获得Q表之后,大家得以依照如下的算法来抉择大家的门径:

图片 16

举例来说来说,假若大家的起来状态为2,那么依据Q表,我们挑选2-3的动作,然后到达状态3随后,大家能够选择1,2,4。然则依据Q表,大家到1能够高达最大的价值,所以选拔动作3-1,随后在气象1,我们按市场总值最大的取舍采纳动作1-5,所以路径为2-3-1-5.

算法

加重学习的对象是学习3个作为策略π:S→A,使系统挑选的动作能够赢得环境奖赏的累计值最大,也使得外部环境对学习系统在某种意义下的评论(或任何种类的运营品质)最佳。
Q学习算法可从有延期的报恩中赢得最优控制策略。
伪码如下
1.Set parameter, and environment reward matrixR
2.Initialize matrixQ as zero matrix
3.For each episode:

  • Select random initial state
  • Do while not reach goal state

    • Select one among all possible actions for the current state

    • Using this possible action, consider to go to the next state

    • Get maximum Q value of this next state based on all possible
      actions

    • Compute

    ![](https://upload-images.jianshu.io/upload_images/4210147-2cee864f6ae85e63.png)

-   Set the next state as the current state
  • End Do
    End For
    读书周密取值范围是[0,1),借使值接近0,那么表示的是Agent更趋向于珍重即时的环境反馈值。反之,则Agent越发考虑的是前景处境的恐怕奖励值。

所谓强化学习正是智能种类从环境到作为映射的上学,以使奖励信号(强化信号)函数值最大。如果Agent的某部行为策略导致环境正的奖励(强化信号),那么Agent以往发生那个作为策略的主旋律便会升高-《百科》

贰 、代码实现

上面的例证可以用上面包车型地铁代码来落到实处,万分的简易,直接贴上全体的代码吧:

import numpy as np
import random

r = np.array([[-1, -1, -1, -1, 0, -1], [-1, -1, -1, 0, -1, 100], [-1, -1, -1, 0, -1, -1], [-1, 0, 0, -1, 0, -1],
              [0, -1, -1, 0, -1, 100], [-1, 0, -1, -1, 0, 100]])

q = np.zeros([6,6],dtype=np.float32)

gamma = 0.8

step = 0
while step < 1000:
    state = random.randint(0,5)
    if state != 5:
        next_state_list=[]
        for i in range(6):
            if r[state,i] != -1:
                next_state_list.append(i)
        next_state = next_state_list[random.randint(0,len(next_state_list)-1)]
        qval = r[state,next_state] + gamma * max(q[next_state])
        q[state,next_state] = qval

print(q)

print(q)
# 验证

for i in range(10):
    print("第{}次验证".format(i + 1))
    state = random.randint(0, 5)
    print('机器人处于{}'.format(state))
    count = 0
    while state != 5:
        if count > 20:
            print('fail')
            break
        # 选择最大的q_max
        q_max = q[state].max()

        q_max_action = []
        for action in range(6):
            if q[state, action] == q_max:
                q_max_action.append(action)

        next_state = q_max_action[random.randint(0, len(q_max_action) - 1)]
        print("the robot goes to " + str(next_state) + '.')
        state = next_state
        count += 1

代码的输出为:

图片 17

参考资料:
http://mnemstudio.org/path-finding-q-learning-tutorial.htm
https://www.zhihu.com/question/26408259
https://zhuanlan.zhihu.com/p/29213893

思路

景况转换图如下

图片 18

开头化矩阵为

图片 19

每一episode的经过为

  1. 随机选拔起来初步状态AF(05)
  2. 循环直到抵达指标状态
  • 将如今景况可做的动作存为3个一时列表
  • 从中随机选用多个动作,作为下一情景
  • 基于公式总括新Q值
  • 更新Q矩阵

终极学习结果为

图片 20

获取最优路径 C->D->E->F

粗略的话固然给你2头小白鼠在迷宫里面,假设他走出了天经地义的脚步,就会给它正面与反面馈(糖),不然给出负反馈(点击),那么,当它走完全体的征程后。无论比把它放到何地,它都能经过未来的求学找到最科学的征途。

本子使用办法

创造prim,将脚本附在上边。
迭代次数固定为13遍,经测试能够学习出6*6矩阵的结果。
打字与印刷出最优路径。

上面直接上例子:

代码及注释

list Q;
list R = [-1,-1,-1,-1,0,-1,-1,-1,-1,0,-1,100,-1,-1,-1,0,-1,-1,-1,0,0,-1,0,-1,0,-1,-1,0,-1,100,-1,0,-1,-1,0,100];
float alpha = 0.8;

// 初始化Q矩阵全零
initQ() {
integer s;
integer a;
Q = [];
for (s = 0; s < 6; s++) {
for (a = 0; a < 6; a++) {
Q = Q + [0];
}
}
}

// 打印Q矩阵
reportQ() {
integer s;
for (s = 0; s < 6; s++)
{
llOwnerSay("State " + (string)s + ": " + llDumpList2String(llList2List(Q, s * 6, s * 6 + 5), ", "));
}
}

// 获取特定状态-动作对的Q值,即Q[s,a]
integer getQ(integer s, integer a) {
return llList2Integer(Q, s * 6 + a);
}

// 获取特定状态-动作对的R值,即R[s,a]
integer getR(integer s, integer a) {
return llList2Integer(R, s * 6 + a);
}

// 获取MaxQ值
integer getMaxQ(integer s) {
integer a;
integer max = 0;
for (a = 0; a < 6; a++)
{
if(llList2Integer(Q, s * 6 + a)>max)
{
max = llList2Integer(Q, s * 6 + a);
}
}
return max;
}

// 更新特定状态-动作对的Q值
setQ(integer s, integer a, integer newQ) {
integer index = s * 6 + a;
Q = llListReplaceList(Q, [newQ], index, index);
}

// 打印结果路径
reportResult(integer s) {
integer currentS = s;
llOwnerSay((string)currentS + " -> ") ;
while(currentS!=5)
{
integer a;
integer max = 0;
integer nextS;
for (a = 0; a < 6; a++)
{
if(llList2Integer(Q, currentS * 6 + a)>max)
{
max = llList2Integer(Q, s * 6 + a);
nextS = a;
}
}
llOwnerSay((string)nextS + " -> " );
currentS = nextS;
}

}

default
{
state_entry()
{
initQ();
integer episodeCount = 10;
while(episodeCount--)
{
// 随机选择初始初始状态0~5
integer currentS = (integer)llFrand(6);
integer nextS;
integer newQ;
// 循环直到到达目标
while(currentS!=5)
{
// 随机选择当前状态可做的动作
integer a;
list actions = [];
for (a = 0; a < 6; a++)
{
if(getR(currentS,a)!=-1)
{
actions = actions + [a];
}
}
integer index = (integer)llFrand(llGetListLength(actions));
nextS = llList2Integer(actions,index);
// 根据公式
newQ = (integer)((float)getR(currentS,nextS) + alpha * (float)getMaxQ(nextS));
setQ(currentS,nextS,newQ);
currentS = nextS;
}

reportQ();
}
reportResult(2);
}
}

一经我们有5间房,如下图所示,那5间房有个别房间是想通的,大家独家用0-4进展了标注,在那之中5象征了是是出口。

咱俩选择一副图来代表,就是底下那几个样子

在那几个例子里,大家的靶子是力所能及走出房间,正是到达5的岗位,为了能更好的高达那一个指标,大家为每二个门设置三个记功。比如假设能立时到达5,那么我们赋予100的嘉奖,其它无法到5的我们不授予记功,权重是0了,如下图所示

5因为也足以到它自身,所以也是给100的褒奖,此外方向到5的也都以100的奖赏。
在Q-learning中,指标是权重值累加的最大化,所以假使达到5,它将会平素保持在此时。

想像下我们有一个虚构的机器人,它对环境一窍不通,但它要求通过本人学习掌握怎样到外围,正是到达5的地方。

好啊,现在可以引出Q-learning的概念了,“状态”以及“动作”,大家可以将种种房间作为3个state,从3个屋子到此外一个房间的动作叫做action,state是三个节点,而action是用一个剪头表示。

当今假若我们在状态2,从气象2得以到状态3,而一筹莫展到状态0、一 、4,因为2没办法直接到0、① 、4;从气象3,可以到① 、4大概2;而4能够到0、③ 、5;其余依次类推。

从而大家可以把这个用一个矩阵来代表:

以此矩阵便是风传中的Q矩阵了,这一个矩阵的列表表示的是现阶段意况,而行标表示的则是下1个处境,比如第1行的行标是2,假设取第五列,比如说2,4就代表了从2->4的受益是0,而-1就意味着了迫不得已从3个情景到其余三个情景。

Q矩阵初阶化的时候全为0,因为它的情事大家早就全副领会了,所以我们知道总的状态是6。如若我们并不知道有微微个状态,那么请从一个情景起先,一旦发觉新的景况,那么为那个矩阵添加上新的行和列。

于是乎大家就搜查缴获了如下的公式:

Q(state, action) = R(state, action) + Gamma * Max[Q(next state, all
actions)]

基于那些公式,Q矩阵值 = 汉兰达的此时此刻值 +  Gamma(周密)*
Q最大的action(看不懂不要紧,后边有例子)

大家的杜撰机器人将通过环境来读书,机器人会从一个动静跳转到另一个气象,直到我们到达最后状态。我们把从开头意况先导一贯达到最终状态的那些进程称之为四个现象,机器人会从1个肆意的起来境况出发,直到抵达最终状态达成五个意况,然后立时重新开首化到1个初阶情状,从而进入下二个光景。

故此,大家得以将算法归咎如下

Q-learning算法如下:

1 设置gamma相关周详,以及奖励矩阵LAND

2 将Q矩阵开端化为全0

3 For each episode:

  设置随机的初使状态

  Do While 当没有到达指标时 

   选拔一个最大恐怕的action(action的选项用二个算法来做,后边再讲)

   依照这些action到达下3个意况

   依照总结公式:Q(state, action) = Wrangler(state, action) + Gamma *
Max[Q(next state, all actions)]测算那个情景Q的值

   设置当前情况为所到达的地方

  End Do

End For

内部Gamma的值在0,1中间(0 <= Gamma
<1)。即使Gramma接近0,对及时的褒奖更管用。假使类似1,整个种类会更考虑今后的奖励。

以上就是成套算法了,并不是很难的,下边来看个一段人肉算法操作,让你根本理解那一个算法。

人肉算法步骤

首先将Q伊始化一个全为0的矩阵,Q是大家目的矩阵,大家期待能够把这一个矩阵填满

接下来开端化我们的帕杰罗矩阵,假诺那些值我们都以明白的,如下图所示

方今,若是大家的伊始地方是state1,首先检查一下大家的翼虎矩阵,在奔驰M级矩阵中发觉从state1能够到2个岗位:state三 、state5,大家随便选择1个势头,比如我们今后从1到5,大家可以用公式

Q(state, action) = R(state, action) + Gamma * Max[Q(next state, all
actions)]

Q(1, 5) = R(1, 5) + 0.8 * Max[Q(5, 1), Q(5, 4), Q(5, 5)]= 100 + 0.8
* 0 = 100

来计量出Q(1,5), 因为Q矩阵是发端化为0,所以 Q(5,1),
Q(5,4),Q(5,5)都以0,所以Q(1,5)的值为100,今后5变成了现阶段事态,因为5已经是最终状态了,所以,那几个情景就过逝鸟,Q矩阵变成如下

下一场大家再随便的挑选1个景况,比如以往选了情况3为我们的伊始状态,好啊,来看大家陆风X8矩阵;有1个大概的壹 、② 、4我们随便的选用1,继续用公式总括:

Q(state, action) = R(state, action) + Gamma * Max[Q(next state, all
actions)]

Q(3, 1) = R(3, 1) + 0.8 * Max[Q(1, 2), Q(1, 5)]= 0 + 0.8 * Max(0,
100) = 80

接下来,更新矩阵,矩阵变成了这些样子

我们的当前情景变为了1,1并不是最终状态,所以算法依旧要往下执行,此时,观看奥德赛矩阵,1有1->3,
1->5三个选项,子那里大家挑选
1->5这么些action有着较高回报,所以大家选择了1->5, 重新计算Q(1,5)的值

Q(state, action) = R(state, action) + Gamma * Max[Q(next state, all
actions)]

Q(1, 5) = R(1, 5) + 0.8 * Max[Q(1, 2), Q(1, 5)]= 0 + 0.8 * Max(0,
100) = 80

为啥要重复总计呢?因为有些值或者会发生变化,总结完后立异矩阵

因为5早正是终极状态了,所以甘休我们此次场景迭代。

透过循环迭代,大家得出了最后结果,是这么些样子的

经过正则化处理,矩阵最终会化为那么些样子

加重学习到此截止。大家的机器人自动学习到了最优的路径,就是依据最大奖励值的门径就能够啊

如图红线所示,代表了各样点到达顶峰的最优路径

那是1个级简的算法,隐藏了不少细节,出去吹NB是够了,实践上落实起来依旧有为数不少题材的。

上面正是细节代码了,对贯彻刚兴趣的连续往下看。

大家事先说了,采用动作的基于是“选用一个最大大概的action”,那么这几个动作要怎么选呢?

大家挑选最大收入的至极值,比如在R矩阵中,总是挑三拣四值最大的百般

算法大家能够经过代码来代表正是这么

世家想转手那样是还是不是会设相当吧?当然有,借使有多少个最大值怎么处理啊?,假如有多少个最大值的话大家就肆意的取二个呗

是还是不是那般就足以了啊?大家想转手,万一在近期动作收益相当的小,小受益到达的气象的后续action恐怕会更大,所以,大家不能够间接采用最大的低收入,而是需求选择一个新的技术来探索,在此间,大家应用了epsilon,首先大家用爆发三个肆意值,固然这么些随机值小于epsilon,那么下贰个action会是随便动作,否则选取组大值,代码如下

但事实上那种做法照旧有题指标,难题是就是我们已经学习实现了,已经知道了最优解,当大家选取三个动作时,它依然会持续应用随机的动作。有无数艺术能够制服这些,相比盛名称之为mouse
learns:
没循环3次就裁减epsilon的值,那样随着学习的进展,随机越来越不简单触及,从而裁减自由对系统的震慑,常用的压缩方法有以下两种,大家能够依据情形选取

(本文完)

相关文章