强化学习笔记: 应用举例

Posted UQI-LIUWJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了强化学习笔记: 应用举例相关的知识,希望对你有一定的参考价值。

这里举几个RL的应用场景(当然有更多的)

1 RL & 调参(神经网络结构性参数)

假设我们搭建 20 个 卷积层,每个层有 3 个超参数,那么一共有 60 个超参数。 如果用grid search的话,计算量过大

1.1 策略网络

[1611.01578] Neural Architecture Search with Reinforcement Learning (arxiv.org) (ICLR 2017)设计一种强化学习方法,用于学习神经网络结构。(神经网络结构性参数调参)

 

策略网络是一个循环神经网络 (RNN) 输入向量 x t 是对上一个超参数 Embedding 得到的。[ 向量 x 0 是例外; x 0 是用一种特殊的方法随机生成的。] 循环层的向量 h t 可以看做从序列 [ x1 , · · · , x t] 中提取的特征 可以把看做第 t 个状态。

策略网 络的输出向量 f t 是一个概率分布。根据 f t 做随机抽样,得到动作 a t ,即第 t 个超参数。

对我们这20个卷积层 ,依次生成每一层的卷积核数量、卷积核大小、步长大小。

在 RNN 运 行 60 步之后,得到 60 个超参数,也就确定了 20 个卷积层的结构。

 1.1.1 训练策略网络

为了训练策略网络,我们需要定义奖励
在前 59 步,奖励全都是零: 在第 60 步之后,得到了全部的超参数,确定了神经网络结构。然后搭建神经网络,在训练集上学习神经网络参数,直到梯度算法收敛。 在验证集上评价神经网络,得到验证准确率,作为奖励 由回报的定义有:

 

然后可以用REINFORCE算法更新策略网络参数θ

强化学习笔记:policy learning_UQI-LIUWJ的博客-CSDN博客

 

1.2 一定要用强化学习吗?

为什么一定要用强化学习方法来训练 RNN 策略网络?是不是因为强化学习比传统监督学习更有优势? 答案恰恰相反,强化学习并不好,只是此处不得不用而已。 如果想要做传统的监督学习,那么奖励或损失必须关于 RNN 策略网络参数 θ 可微 ;本节介绍的方法显然不符合这个条件,所以不能用监督学习训练 RNN 策略 网络。 强化学习的奖励可以是任意的,无需关于 θ 可微,因此在这里适用。 应用强化学习的代价是需要大量的训练样本,至少上万个奖励,即从初始化开始训练几万个 CNN才可能收敛 这种强化学习 自动调参 方法的计算量非常大 在这种强化学习 方法提出之后,很快就有更好的 方法出现(DARTS),无需使用强化学习。

2 RL+SQL 生成

SQL 用于管理关系数据库。 它支持数据插入、查询、更新、删除。 将人的语言转化成 SQL 是自然语言处理领域的一个 重要问题。解决这个问题的方法类似于机器翻译,即用 Transformer 等 Seq2Seq 模型将一句自然语言翻译成 SQL 语言

 2.1 监督学习的局限性

该如何训练图 19.5 这样的 Seq2Seq 机器翻译模型呢? 最简单的方式就是用监督学习。 事先准备一个数据集,由人工将自然语言逐一翻译成 SQL 语句。训练的目标是鼓励解码器输出的 SQL 语句接近人工标注的 SQL 语句。把解码器的输出、人工标注的 SQL 两者的区别作为损失函数,通过最小化损失函数的方式训练模型。 这种单词匹配的训练方式是可行的,然而其 存在一些局限性 与标准机器翻译问题相比, SQL 语句的生成有其特殊性。如果是将一句汉语译作英语,那么个别单词的翻译错误、顺序错误不太影响人类对翻译结果的理解。对于汉语翻译英语,可以把单词的匹配作为评价机器翻译质量的标准。 但是这种评价标准不适用于SQL 语句。
  • 即便两个 SQL 语句高度相似,它们在数据库中执行得到的结果可能完全不同。即便是一个字符的错误,也可能导致生成的 SQL 语法错误,无法执行。
  • 哪怕两个 SQL 语句看似区别很大,它们的作用是完全相同的,它们在数据库中执行得到的结果是相同的。
  • SQL 的写法会影响执行的效率,而从 SQL 语句的字面上难以看出它的效率。只有真正在数据库中执行,才知道 SQL 语句究竟花了多长时间。
以上论点说明不该用单词的匹配来衡量生成 SQL 语句的质量,而 应该看 SQL 语言实际执行的结果是否符合预期

2.2 RL+SQL生成

https://faculty.cc.gatech.edu/~jarulraj/courses/8803-f18/papers/seq2sql.pdf

提出一种强化学习的方法训练 Seq2Seq 模型,如图 19.6 所示。

 

可以把 Seq2Seq 模型看做策略网络,把输入的自然语言看做状态,把生成的 SQL 看做动作。他们这样定义奖励:

 

有了奖励,可以用任意的策略学习算法。 强化学习笔记:policy learning_UQI-LIUWJ的博客-CSDN博客

3 网约车调度

3.0 引子:两个具体的例子

 对于图 19.8 中的例子,假如不考虑目的地的热门程度(即附近接单的容易程度),则应该给司机派发上面蓝色目的地的订单,这样可以让司机在较短的时间内取得更高的收入。

但是这样其实不利于司机的总收入:在司机到达冷门地点之后,需要等待较长的时间才会有新的订单。

假如给司机派发下面热门目的地的订单,司机在完成这笔订单后,立刻就能接到下一笔订单;这样虽然单笔收入低,但是总收入高。

对于图 19.9 中的例子,很显然应该把订单派送给冷门地点的司机更合适。 热门地点的司机得不到这笔订单几乎没有损失,因为在很短的时间之后就会有新的订单。 而这笔订单对冷门地点的司机比较重要,如果没有这笔订单,司机还需要空等很久才有下一笔订单。

3.1 价值学习

把司机每一笔订单的收入作为奖励,把折扣回 报的期望作为状态价值函数 ,其中s=(地点,时间)是状态, π 是派单的策略。 可以衡量一个地点在具体某个时间的热门程度。比如在早高峰,车流从居民区开往商业区,导致商业区是冷门地点,附近空车多,订单少。而到了晚高峰,商业区是热门地点,此时下班回家的需求大,订单数量多。

3.2 订单派单机制

         在学到状态价值函数之后,可以用它来预估任意地点、时间的网约车的价值,并利用这一信息来给网约车派发订单。

        主要想法是用负的 TD 误差来评价一个订单给一个网约车带来的额外收益

        在同一时刻,某区域内有 m 笔订单,有 n 个空车,那么计算所有(订单,空车)二元组的 TD 误差,得到一个 m × n 的矩阵。用二部图 (Bipartite Graph) 匹配算法,找订单—空车的最大匹配,完成订单派发。

 简单起见,此处设折扣率 γ = 1,那么TD 目标等于:

 

 可以这样理解 TD 目标:

  • 假设给该空车派发该订单,那么该笔订单的价值 r = 40 加上未 来的状态价值,一共等于520.
  • 但是司机接这笔订单是有机会成本的;假如不接这笔订单,马上就会有别的订单,可能会获得更高的 TD 目标。这里机会成本是500
  • TD 目标减去机会成本,即负的 TD 目标
  • ——>这意味着接这笔订单,司机的收入高于期望收入 20 元。  

 举个例子,在某个区域,当前有 3 笔订单, 有 4 辆空车。计算每个(订单,空车)二元组的 TD 误差,得到图 19.11 中大小为 3 × 4 矩阵。

 

 有了上面的矩阵,可以调用二部图匹配算法(比如匈牙利算法)来匹配订单和空车。 图 19.12() 是最大匹配,三条边的权重之和等于 31。图 19.12() 也是一种匹配方式,但是三条边的权重之和只有 30,说明它不是最大匹配,因此不会这样派发订单。

以上是关于强化学习笔记: 应用举例的主要内容,如果未能解决你的问题,请参考以下文章

强化学习笔记:noisy DQN

强化学习目录

强化学习笔记-01强化学习介绍

强化学习笔记-01强化学习介绍

强化学习笔记1:强化学习概述

强化学习笔记:强化学习的约束