强化学习-项目经验汇总

文章目录

  • 一些闲话
  • 关于项目
  • 要解决的问题
  • 环境建模
    • 状态
    • 动作
    • 状态转移
  • 奖励设置
    • 不同版本的游戏规则
  • 数据仿真大法
  • 一些技巧和经验
    • 动作选择
    • 学习率
    • 模型主体
    • 经验回放
    • 考虑结合集成学习
  • 其他

一些闲话

距离上一次更新已经过去三个月了。

记得大学养生通识课上说,春发,夏长,秋收,冬藏。果然,天一冷,精力没有春夏秋那么旺盛了,天一晚脑子就木,步也不怎么跑了,博客也不怎么更了,看书效率也低了。好在前面几个季度,减肥效果还是比较有成效的,冬天空气也不太好,暂且修养一段时间,等天暖和之后继续跑步和更新博客。

近期,某个项目用到了强化学习的思路,趁热打铁,把经验简单梳理总结一下,免得时间久了又忘了。

关于项目

大概一两个月之前,开始着手一个新项目。经过一番调研,还是强化学习的思路比较合适。然后试到今天。初见眉目。

最近回了趟学校,顺便交流了下,非常巧,发现实验室也有个非常像的项目,不过应用场景不一样。实验室在探索知识图谱的思路,因为有数据,开展的也很顺利。我们各种资源有限,只能另辟蹊径。

不过话又说回来,抛开应用场景和数据支持谈算法,都是假大空。。。具体用什么思路和算法,还是要以自己高效、好用、实用为准。

要解决的问题

简单描述一下问题模型,项目细节略过。

一个有向无环图,节点上有异常信号和其他信号,异常信号和相邻节点上的信号相关,异常信号定义成一个0~1的标量。
需要解决的问题或问题的目标是,从一个节点开始,沿有向图搜寻出一条链路,链路上的异常节点的比例尽量多,链路尽量长。
有点像贪吃蛇。

搞明白大概要做什么事情之后,先是一波调研

  • 搞了本图神经网络的书,花了大概一周,差不多刷了一遍;除了图卷机的一些公式推了一两天,其他地方相对比较水。

  • 搞了本知识读谱的书,又花了两天时间,挑有用的读了两章。

整体感觉这两套思路都不太合适。主要还是数据的原因

  • 图神经网络,能得到每个节点的推荐概率,但需要监督数据。这个我们没有。即便有,最后输出也只是点的概率,不是一条链路,搞不好还要后处理什么的,可能更麻烦。这个思路先往后排;

  • 知识图谱也是一样,需要监督数据。我们的数据没有标签,而且太杂太乱,感觉不适用。这个思路也先往后排;

比来比去,强化学习的思路会比较好。

  • 人在解决这个问题的时候,也是根据节点信号和邻域节点信号,一步步决策、搜索、再决策的交互过程。
  • 对数据的要求相对较低,节点上的异常信号,可以作为奖励的一个依据;

然后就是环境建模的问题。状态空间,动作空间、状态转移怎么定义。

环境建模

状态

对于图数据,一个难点就是它的结构信息很重要,但不好编码,不像图片和语音信号那么规整,因此难以编码成固定长度的信号,输入到学习模型里,比方说神经网络。这也是为什么专门有图神经网络,以及图信号处理。

在看图神经网络的时候。提到过一个随机游走编码的思路。本来是用来举反例的,说这样编码会破坏掉部分结构信息,而图神经网络可以很好地保留结构信息。

但在这个问题模型里,随机游走编码好像就比较合适了,一方面信息足够用,另一方面动作空间也比较好定义。

所以最后定义的状态,通过随机游走几条路径,得到一个规整的张量,或者说一个多通道的矩阵

  • 矩阵的:对应一条路径
  • 矩阵的: 对应随机游走的深度
  • 矩阵的通道:对应单个节点的不同信号

动作

沿着第i条路径前进一步;

状态转移

沿着第i条路径前进一步,在新节点上继续随机游走,对状态编码;

奖励设置

最开始,这里想的太简单了。后来发现,智能体很容易找到规则的漏洞,投机取巧,钻空子。奖励的设置,还是要多考虑、多调整,和智能体斗志斗勇。

插一句,之前和还在做HR的cindy姐的一次聊天中,有感而发:还是和机器打交道比较轻松,和人打交道比较累,尤其是和一个team的人打交道,要考虑的太多,还容易费力不讨好。。。

现在想收回这句话了。。。

当机器有一定的智能之后,尤其是在机器组成的一个team里(后面提到的集成学习),总有那么一两个机器最先学会钻游戏规则的空子,然后教给其他的机器,最后整个team都学会了投机取巧。。。

和机器打交道也要斗智斗勇了。。。

不同版本的游戏规则

基本采取了 奖励= 移动方向奖励 + 移动效果奖励 的规则

  • 移动效果奖励
    • 移动后,节点的异常度,最大1,最小0
  • 移动方向奖励
    • 第1版
      • 前进1,后退-1,不动0;
      • 问题:智能体经常在节点之间来回走动,因为只要两个节点中有异常节点,奖励就会越来越多;
    • 第2版
      • 前进1,后退-2,不动-1;
      • 智能体不在两个异常节点之间来回走动了,因为奖励会有消耗。
      • 问题:智能体会倾向选择长的链路,即便链路上的节点不存在异常;
    • 第3版
      • 前进-1,后退-3,不动-2
      • 吸取之前的教训,前进需要有负奖励,否则智能体容易不劳而获;
      • 尝试中…

数据仿真大法

天下武功,唯快不破。快的奥义,在于厚积薄发,无用之用,慢中求快,快中求准 →_→

  1. 数据还没到位的时候,先建个数学模型,生成一波仿真数据;
  2. 基于仿真数据,把代码写好,相关模块设计好,参数调一下熟悉一下;
  3. 数据到位之后,数据接口模块需要重写一下,其他模块基本不用变;
  4. 根据真实数据,调参训练模型。好的情况下,参数不会变太多;
  5. 参数基本确定后,就是漫长的训练。人的工作基本结束,偶尔看下训练效果,调一调。
  6. 训练期间,可以着手做一些其他事,比方说写写总结文档,想想下一步计划。

一些技巧和经验

动作选择

ϵ \epsilon ϵ-贪婪 + 规则启发

  • ϵ \epsilon ϵ-贪婪:用来平衡探索-开发问题
  • 规则启发:可以有重点地探索,训练效果明显提速

学习率

  • 模拟退火比较好用, c o s ( 2 π t T ) ⋅ e − t cos(2\pi\frac {t} {T}) ·e^{-t} cos(2πTt)et,再缩放到指定范围
  • 一个batch的数据要多训练几个epoch,充分学习,否则会太仓促,智能体来不及学会,就换学习下一个batch了;

模型主体

对于强化学习,模型不能太复杂,神经网络层数不能太多,够用就行,太复杂的难收敛;

经验回放

  • 循环队列实现经验的储存
  • 经验容量不能太少,避免抽样时一个batch里样本的相关性;
  • 经验容量不能太多,尤其在奖励设置还有可能修改的时候;
  • 经验容量可以参考 容量=每个episode的动作次数平均值 × batch_size × 某个常数

考虑结合集成学习

一些好处

  • 多个智能体并行训练,经验回放使用同一个经验库,这样可以快速得到很多经验
  • 多个智能体之间可以相互学习,尤其在某个智能体训练发散或过拟合之后,通过其他智能体得到纠正
  • 单一模型复杂度可以适当降低

但是不能违背集成学习的 “好而不同” 原则;

  • 共性:单一模型的能力都不能太低,有一定下限,至少要>50%正确率;
  • 个性:智能体之间的相关学习,不能太频繁,还是要保持各自的 “个性”,否则容易太像;

另外:

  • 多个智能体相互学习,需要它们有相同的神经网络结构;
  • 可以使用不同算法训练智能体,比如SARSA,Q-learning, Double Q-learning,效果不好的智能体投票权重低;

综合比较:

  • SARSA稳定但收敛慢,
  • Q-learning相对不稳定,但学习速度很快;
  • Double Q-learning暂时感觉相对折中;

考虑可能的原因

  • 两者都是通过“自举”的思想,估计动作价值函数。

  • 两者的差异在于,

    • SARSA属于同策,直接把后一状态的价值估计 q ( s ′ , a ′ ) q(s', a') q(s,a)拿来用,里面有更多的 ϵ − \epsilon- ϵ贪婪的因素,导致更新目标相对真实值较远:
      q ( s , a ) ← r + γ ⋅ q ( s ′ , a ′ ) q(s, a)\leftarrow r + \gamma·q(s', a') q(s,a)r+γq(s,a)

    • Q-learning属于异策,对 q ( s ′ , a ′ ) q(s', a') q(s,a)取了最大值,导致更新目标过度乐观,但距离真实值更近
      q ( s , a ) ← r + γ ⋅ arg max ⁡ a ′ q ( s ′ , a ′ ) q(s, a)\leftarrow r + \gamma·\argmax_{a'}q(s', a') q(s,a)r+γaargmaxq(s,a)

    • 在训练好之前, q ( s ′ , a ′ ) q(s', a') q(s,a)毕竟还是有很多误差的,但 Q-learning对误差的容忍度更低,只要 q ( s ′ , a ′ ) q(s', a') q(s,a)的最大值尽量准可以;但SARSA还要求 q ( s ′ , a ′ ) q(s', a') q(s,a)必须在正确的 a ′ a' a位置取得尽量准确的最大值;

其他

未完待续,想起一点补一点。。。

你可能感兴趣的:(强化学习,强化学习,机器学习,算法,人工智能)