摘要: FF91 于 12017 年 1 月 4 日在美国拉斯维加斯成功首发, 拉开了互联网生态电动汽车的序幕. 自动泊车使得停车也成为了一种享受, 新手司机再也不用担心该如何见缝插针了. 但是如果在车水马龙的繁忙环境下, 无人驾驶还能得心应手吗? 本文将站在机器学习的角度和大家分享学习型避障小车的设计思路.
作者简介: Boyang Dai, 是 NYC 数据科学院的数据学家, 在美弗吉尼亚大学担任实验室导师.
项目综述
整个项目由三个部分组成:
训练场设计
包括: 随机障碍, 固定障碍, 边界碰撞检测
汽车模型
包括: 传感器, 规则学习
学习的算法
包括: 基于表的算法和基于神经网络的算法
项目组成示意图:
依赖和代码概述
Python 依赖
该项目是在 Python 环境中开发的, 用到 5 个关键 Python 模块:
numpy
matplotlib
sklearn
keras
pygame
前三个模块用于执行基本的数学计算, 例如距离测量, 碰撞检测, 角位移等. "keras" 模块用于神经网络算法, 使用 "Tensorflow" 后端. "pygame" 模块用于创建训练内容和汽车对象以获取用于学习的数据.
代码概述
本项目代码基构成如下:
关键组件
a. 训练场
训练场的最终设计具有两种不同类型的障碍物.
固定移动方向的障碍物
在轨道上的一个点周围有 4 个较大的正方形, 其以训练场中心作为盘中心. 这些方块以固定的角速度和固定的模式移动.
- 随机移动障碍物
在训练场中以不同的速度在随机方向上运动的 20 个较小的正方形. 靠近训练场的边缘之后, 会拉回训练场中.
一开始, 训练场只有固定的障碍物. 这时汽车学得非常快, 它的生存时间在 3 万多次试验后能超越 3 小时. 但是这并不意味它已毕业. 因为单调的驾驶模式远不能被应用到更复杂的训练场. 因此还要增添更复杂的障碍设计.
b. 训练小车
模拟车具有如图 (a) 所示的圆形形状. 为了将汽车附近的环境转换成数字并将它们存储到 Python 字典中, 这里将使用十个传感器来探测汽车到任何对象的距离, 包括 5 个前传感器和 5 个后传感器, 从而尽可能接近真实环境的复杂路况. 汽车有五种移动模式:
- 向前
- 右前
- 左前
- 右转
- 左转
图 (a)
五向运动示意图:
训练脚本的规则学习可作如下改进:
- 汽车围绕训练场逐帧移动.
- 每当汽车碰到周边或障碍物, 它将被重置, 并回到它的原始点.
- 汽车有三个动作: 左转, 右转, 直走.
- 10 个传感器的探测区域将向外扩展以感知汽车和障碍物之间的距离, 组成状态空间.
C. 学习算法
我在这里用来训练小车的方法是增强学习. 增强学习是借鉴于动物学习研究, 也与控制工程学习自动机的理论有关. 它是一种基于试验和错误的学习技术, 核心是通过与环境的重复交互以解决复杂的任务, 系统原理如下:
基本的增强学习模型包括:
- 一组环境和代理状态 S
- 代理的一组动作 A
- 从状态过渡到行动的政策
- 确定转换的标量即时反馈的规则
- 描述代理观察到的规则
学习系统通过汽车上的传感器接收关于环境的状态信息, 并且通过推理过程使用状态信息以确定在给定状态下做出的动作. 执行动作之后, 学习系统从环境接收增强信号以反馈其结果. 强化学习代理的目的是收集尽可能多的反馈, 以便最大化数字累积回报信号.
Q 型学习
Q 学习是用于训练机器人以开发解决任务为策略的增强学习示例. 它使用动作值函数来计算在离散状态下执行特定动作的期望效用, 并遵循最优策略. 数据表用于在训练场中存储汽车驱动器的效用数据.
Q 学习是一种无模型的强化学习技术, 包括代理, 状态 S 和每个状态 A 的一组动作. 在特定状态下执行动作并向代理提供反馈. 每次代理在时间 t 中以状态 S 执行动作 A 时, 代理将获得反馈 r, 代表应如何接近于解决任务. 然后根据更新规则更新用于执行此操作的应用程序:
其中:
- S 是当前状态
- A 是 S 中的最优动作
- S'是下一个状态
- A'是 S'中的最优动作
- r 是反馈
- α是学习率
- γ是折现因子
解释:- 状态 (S and S')
汽车上的传感器被设计成获得汽车所处的当前状态的表示. 因此, 状态是汽车感知的环境的总结. 在环境表示中, 状态被表示为 4 元组(w,x,y,z). 变量 w 与传感器信号相关联. 如果左传感器中的读数和和与右侧的传感器的读数和相同, 则 w 被赋值 0. 如果右传感器接收更大的读数和, 则 w 被设置为 1; 如果左传感器接收更大的读数和, 则 w 被设置为 2. 变量 x 是监视与汽车前方障碍物接近度的二进制变量. 如果汽车附近的传感器感知到任何信号, 则 x 被设置为 1. 除了后传感器之外, 相同的规则适用于 y. 最终变量 z 是一个二进制变量, 如果汽车周围的传感器在时间步中没有被感知到, 则激活该二进制变量. 因此, 整个状态空间由 3×2×2×2 的感知组合或 24 个唯一状态 (如下表) 组成.
- 动作(A 和 A')
对于每个时间步, 汽车能够找到其在当前状态下执行特定动作所授予的增强值 (r). 汽车将需要选择在任何状态下具有最大 q 值的动作, 使得汽车可以遵循完全优化的策略. 当 q 值函数已经收敛到状态和动作对(Q(S,A)) 的真实收益时, 则汽车做出的策略将是最优的. 汽车在任何给定状态下可以采取的动作被表示为一个变量(p). 总动作空间下表所示.
为了在探索和开发之间保持平衡, 并允许汽车在早期学习阶段有效地学习, 引入 "epsilon", 这是作为 epsilon 贪婪的政策. 每次汽车做出决定时, 将产生一个数字 (z), 范围从 0 到 1. 在执行下一动作之前, 将比较 z 和ε, 如果 z 小于ε, 我们将随机地做出探测决定; 如果 z 大于ε, 我们找到与 maxQ(剥削) 的动作. ε的值的范围从 0 到 1, 该值越大, 在 q 学习代理的决策中将附加更多的随机性.
- 反馈(r)
反馈计划是整个 q 学习算法的核心. 为了实现强化学习, 关键是汽车能够在执行某个状态的动作之后立即确定动作的近似值. 由于汽车的目标是尽可能长地在训练场中生存, 所以不接收来自传感器信号的反馈是有意义的. 如果传感器没有感知到, 汽车获得 100 的反馈; 如果传感器感知到任何东西, 那么汽车会得到 - 20 的反馈, 如果汽车碰到任何东西, 它将被给予 - 500 的惩罚反馈.
- 学习率(α)
学习率表示新获取的信息用于覆盖旧信息的程度. 值为 0 时表示代理不学习任何东西, 而值为 1 时表示代理只考虑最近的信息.
- 折现因子(γ)
折现因子决定未来反馈的重要性. 值为 0 将使代理仅通过考虑当前的反馈, 而值为 1 时代理会努力获得长期的更高的反馈值.
基于表的 Q 学习
基于表的 Q 学习使用 Q 表来存储 Q 值. 对于我们的训练场环境, 我们有 24 个状态 x 3 个动作, 共获得 72 个条目表. 其学习过程可以描述如下.
基于神经网络的 Q 学习
为了克服由于状态空间复杂性所带来的问题, 可以使用神经网络作为近似 Q 值的函数来开发 Q 学习.
神经网络使用互连节点来实现信号的跨越. 节点之间的每个连接点包含权重参数. 然后通过将输出目标与输入进行比较从而产生用于训练神经网络的误差. 该误差用于更新神经网络中的连接和 (或) 连接的权重参数. 使用该数据表时的学习过程可以描述如下.
建立一个具有 8 个输入节点 (6 个用于状态表示和 2 个用于移动动作),4 个隐藏节点和 1 个输出节点的神经网络, 从而形成一个具隐藏层的网络结构. 神经网络接以状态和动作作为输入, 并输出该状态 - 动作对(Q(S,A)) 的近似 Q 值. Qtarget(S,A)由主方程产生并用于训练网络, 如下图所示.
小结:
这个项目的目标是鼓励汽车学习一个驱动策略, 以躲避障碍和尽可能长时间的存活. 为了实现这一点, 允许汽车在训练场中行驶和学习, 直到它接近学会了一个成功的目标方法. 相关训练方法的实验结果如下:
可见, 在接近现实世界的模拟训练场中, 基于神经网络的 Q 学习方法更可靠.
最后附上实验的演示结果:
本文由阿里云云栖社区组织翻译.
文章原标题《Reinforcement Q-Learning Car》译者: 伍昆
来源: http://www.jianshu.com/p/82064492bc2e