前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >研究了一堆Q-learning资料后,写了这份指南

研究了一堆Q-learning资料后,写了这份指南

作者头像
mixlab
发布2018-07-25 12:18:22
4090
发布2018-07-25 12:18:22
举报

先来个名言,日本著名设计师山本耀司曾说:

“我从来不相信什么懒洋洋的自由,我向往的自由是通过勤奋和努力实现的更广阔的人生,那样的自由才是珍贵的、有价值的;我相信一万小时定律,我从来不相信天上掉馅饼的灵感和坐等的成就。做一个自由又自律的人,靠势必实现的决心认真地活着。

本文继续好久之前断更的一篇文章《 你该掌握的AI技能:强化学习01 》,结合上期的《 如何构建个人的技术思维 》提出的4个步骤:了解原理,动手编程,反复实验,实际应用,一步步带你入门强化学习中的 Q-learning 。本文使用 Javascript 基于tensorflow.js,在 chrome 浏览器中进行实验。浏览器打开 https://js.tensorflow.org/api/0.9.0 ,在 console 面板中即可实验。

1

了解原理

我们先了解下心理学行为主义学习理论的中泛化律。别问我为什么一篇技术文章为何突然跑心理学理论,这是 mixlab 的文章特色:一篇文章尽量涉及2个以上不同领域的内容,跨界思考之间的关联性

1.1 心理学行为主义学习理论

巴甫洛夫在研究狗的进食行为时发现,当铃声和喂食反复配对后,只给狗听铃声,不呈现食物,狗也会分泌唾液。根据这一实验现象,巴甫洛夫提出经典性条件作用,其中的泛化律条件反射一旦确立,其他类似最初条件刺激的刺激也可引起条件反射。例如,谚语“一朝被蛇咬,十年怕草绳”,人见到蛇感到害怕是以往建立的条件反射,而由于草绳类似蛇这个条件刺激,因此当见到与蛇类似的草绳也会引起条件反射。

1.2 行为主义学习理论在教育领域

行为主义学习在教育领域的案例,例如,父母不断给孩子关心和鼓励,孩子就会把学习和愉快的体验联系起来,然后,更加喜欢学习。当孩子有强烈的“问问题”意愿时,父母如果没有满足他们,他们的积极性就会不断被磨灭。

1.3 Q-learning 的原型

此部分的理解先要对强化学习的 Environment、 Agent、Actions、Observation、Reward 、Policy有基础的认识,才可继续。

Q-learning 从行为主义学习理论启发而来,最早由 Watkins 在 1989 提出核心思想原型,当时提出记忆矩阵 W(a,s) 记忆了“智能体”以往的经验,当新的外部刺激时,“智能体”会产生对应的条件反射,W(a,s) 类似于我们今天所说的 Q-learning 中的 Q-table

核心思想:

1 智能体 Agent 在状态 st ,采取行为 at;

2 后移至下一个状态 st+1;

3 估计价值 v(st+1);

4 更新记忆矩阵,见上图;

5 反复1-4过程,更新记忆矩阵。

我们继续第一篇文章所提到的“小孩学走路”的例子,孩子是一个 Agent ,她在状态 st (即,她走的每一步)采取了行为 at ( 步行的姿势 ),移动到下一个 st+1 。当她完成每一个任务的时,孩子会获得奖励 Reward(比如,一些糖果),她以此来估计价值 v(st +1) ,然后她更新她的经验,即记忆矩阵,更新方式见上图。Agent 不断地练习,重复1-4步,直至学会走路的方法 Policy 为止,这里的 Policy 指的是记忆矩阵 W(a,s)。

1.4 Q-learning 的核心公式

把上文提到的记忆矩阵 W(a,s) 用 Q 动作效用函数 action-utility function 替换。Q 用于评价在特定状态下采取某个动作的优劣,可以将之理解为智能体 Agent 的大脑,常称为 Q-table ,一般是个矩阵,用 tensorflow.js 的代码试下:

代码语言:javascript
复制
tf.zeros([3,4]).print();

/*
3代表3种state,4代表4种action,Q-table 如下:

Tensor
    [[0, 0, 0, 0],
     [0, 0, 0, 0],
     [0, 0, 0, 0]]

*/

算法就是要训练出最终的 Q-table ,最终的 Q-table 有可能长下面这样:

代码语言:javascript
复制
/*
代表了各个state及action 对应的“价值”:
Tensor
    [[0, 0.2, 12.3, 0],
     [2.1, 0, 4.5, 0],
     [0, 12, 1, 0.5]]

*/

我们把上文更新记忆矩阵的公式细化下,主要增加学习率 learning rate 及折扣因子 discount factor:

其中,学习速率越大,保留之前训练的效果就越少;学习率=0,不考虑之前的训练结果;折扣因子越大,更多地考虑远期收益;折扣因子越小,更多地考虑眼前的收益

1.5 应用举例

我们结合示例,看下 Q-learning 适合运用的场景,有3种常见的:

1)1维空间:

0代表智能体,它只能向左或向右移动,最右边是宝藏的位置,最左边是陷井,于是states有6个,分别是智能体可能出现的位置,如果智能体在state为0,采取 action 为 Left 将落入陷阱,我们设置收益为-10,如果智能体在state 为4的位置,采取action 为Right ,则获得宝藏,收益为100,这是把1维空间的问题对应为 Q-learning 算法的过程。其他代码详见莫烦的教程。

2)房间:

老外举的例子,state代表智能体在哪个房间,action代表从一个房间达到另一个房间的动作,接下来定义收益,例如在房间1的时候,采取移动到房间5的动作,则收益为100。更多详见网上相关文章。

3)2维迷宫:

这类的例子是用的最多的,state代表智能体在哪个方块内,action 可以是向上、向下、向左、向右、停留,state为2时,掉入陷阱,收益为-10,state为3时,获得奖励,收益为20,下文会以此为例子进行代码示例。

1.6 Deep Q Network

2013年 DeepMind 在 NIPS 上发表 Playing Atari with Deep Reinforcement Learning 一文,提出了 DQN(Deep Q Network)算法,实现端到端学习玩 Atari 游戏,即只有像素输入,看着屏幕玩游戏。卷积神经网络 CNN 被用于替代上文中提到的 Q 函数,CNN 输出层的神经元个数等于所有允许的动作数。卷积神经网络或者全连接神经网络都可以用来压缩状态空间,构造近似的 Q 函数 Q(s, a)。关于 Deep Q Network ,留待下一篇再详细展开。

2

动手编程

继续以迷宫为例,位置2为陷阱,位置3为奖励所在。

2.1 初始化训练参数

代码语言:javascript
复制
const GAMMA = 0.7, 
//折扣因子
  EPISODES_MAX = 100, 
//最大回合数
  ALPHA = 0.1; 
//学习率

2.2 定义actions,states,rewards

代码语言:javascript
复制
const actions_array = [0, 1, 2, 3, 4],
  actions_labels = ['UP', 'DOWN', 'LEFT', 'RIGHT', 'NONE'],
  actions_byState = [
    [1, 3, 4],
    [1, 2, 4],
    [0, 3, 4],
    [0, 2, 4]
  ],
  states_array = [0, 1, 2, 3],
  rewards_array = [0, 0, -10, 20];

var actions = new Actions(actions_labels, actions_array, actions_byState);

var states = new States(states_array, rewards_array);

2.2 初始化 Q-table 矩阵

代码语言:javascript
复制
var Q = new QTable(states_array.length, actions_array.length);

2.2 选择起始 state

代码语言:javascript
复制
var state = states.randomChooseOne();
//随机选取一个state

2.3 选择当前 state 下的一个可能 action

代码语言:javascript
复制
var action = actions.randomChooseOne(state);

目前选择 action 的策略是随机的, Q-learning 并非每次迭代都沿当前 Q 值最高的路径前进。

2.4 换移到下一个state ( s’ )

代码语言:javascript
复制
var state_n = states.nextState(action, state);

2.5 使用 Bellman Equation ,更新 Q-table

代码语言:javascript
复制
 var reward = states.getReward(state_n);
 
 var actions_n = actions.actionsByState[state_n];
  
 var futureValue = Q.getFutureValue(state_n, actions_n);

  Q.update(state, action, reward, futureValue);

其中,学习率代码里用 ALPHA 表示,折扣因子用 GAMMA 表示。learned value 代码为:

代码语言:javascript
复制
learnedValue=reward+GAMMA*max(qs)

用于更新 Q-table 的值:

代码语言:javascript
复制
var value = (1 - ALPHA) * q_table.get(state, action) + ALPHA * (reward + GAMMA * tf.tensor1d(qs).max().dataSync()[0]);

可以对照下公式:

2.6 将下一个 state 作为当前 state

代码语言:javascript
复制
  state = state_n;
  action = actions.randomChooseOne(state);

2.7 重复2.3-2.6步骤

代码语言:javascript
复制
var episode = 0;

while (state != 3 || episode < EPISODES_MAX) {
  …

    Q.update(state, action, reward, futureValue);
  …    

  episode++;

};

3

反复实验

主要是修改 ALPHA 及 GAMMA ,还有修改迷宫的维度,增加各种陷阱及奖励等类型,此部分不一一展开,请根据自身情况进行实验。

4

应用场景

强化学习用于游戏比较多,因为我们可以枚举清楚 state 及 action ,reward 也可以量化清楚。太过复杂的场景或维度较多的数据,我们可以尝试用 Deep Q Network 来解决。回到平面设计问题,我们可以尝试配色方案的生成,布局排版数据的生成。

鉴于篇幅,第3-4部分可以在知识星球交流。完整代码,可留言后获取。

相关资料推荐

https://github.com/SarvagyaVaish/FlappyBirdRL/blob/master/README.md

https://planktonfun.github.io/q-learning-js

https://blog.csdn.net/itplus/article/details/9361915

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-04-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 无界社区mixlab 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档