用于实现RL算法的神经网络体系结构,能够设置同时运行的动作

用于实现RL算法的经典神经网络方案之一如下:


其中:输入-神经网络的输入; FC-(完全连接的)隐藏层体系结构或CNN-FC-体系结构隐藏层体系结构(取决于输入的内容); 输出-网络输出。 通常,网络输出是一个softmax层,它给出了所有可能动作集中该动作之一的概率。

这种体系结构的缺点是很难选择几个同时执行的动作。

为了解决这个问题,提出了一种具有掩模层的架构。 提议的体系结构如下:


该体系结构与经典体系结构完全一致,但还包括一个动作蒙版层。 这种架构只有一种方法-这是动作值(一组同时执行的动作)的值。 可以根据以下伪代码来实现操作掩码层:

import numpy as np class Layer: def __init__(self, items, item_size, extra_size): assert(items > 0) assert(item_size > 0) assert(extra_size >= 0) self.items = items self.item_size = item_size self.extra_size = extra_size def build(self): self._expand_op = np.zeros((self.items, self.items*self.item_size), \ dtype=np.float32) for i in range(self.items): self._expand_op[i,i*self.item_size:(i+1)*self.item_size] = np.float32(1.0) def call(self, inputs, ops): op_mask_part = inputs[:self.items*self.item_size] if self.extra_size > 0: ext_part = inputs[self.items*self.item_size:] else: ext_part = None # if ops in [-0.5, 0.5] or [-0.5 .. 0.5]: ops1 = np.add(ops, np.float(0.5)) # optional extended_op = np.matmul(ops1, self._expand_op) if self.extra_size > 0: return np.concatenate((np.multiply(op_mask_part, extended_op), ext_part)) else: return np.multiply(op_mask_part,extended_op) 

并使用此代码演示了以下代码片段:

 items = 5 item_size = 10 extra_size = 20 l = Layer(items=items, item_size=item_size, extra_size=extra_size) l.build() inputs = np.random.rand(items*item_size+extra_size) ops = np.random.randint(0, 2, (items,), dtype="int") ops = ops.astype(dtype=np.float32) - np.float32(0.5) result = l.call(inputs,ops) 

从层代码可以看出,对于每个动作,神经网络都会学习以一系列权重的形式来表示动作的某种表示形式。 这些表示或者在遮罩层之后进入网络,也可以不进入。 根据操作,这些权重可以在整个动作权重组中进行某些操作的任务来实现(不仅是乘以[0,1])。 因此,形成动作任务以计算由网络执行的动作组的值。 (在经典情况下,softmax层计算所有动作的值;在建议的体系结构中,神经网络计算所选动作组的值。)

(有关动作值的定义,请参见RS Sutton,EG Barto强化学习。)

使用建议架构的示例


俄罗斯方块游戏


使用此架构播放俄罗斯方块的想法如下。 在输入时,我们提交俄罗斯方块游戏玻璃的图像(一个像素一个正方形)。 我们将个人行动分为行动小组。 对神经网络的一个动作的评估是掩盖玻璃杯中人物的最终位置。 该数字由其在神经网络中动作蒙版层中的动作蒙版中的正方形设置。 要选择一组动作,我们从当前图形的所有末端位置列表中选择对动作(退出)的最大评估。


绘图。 显示了场(蓝色单元格)和下降形状(浅灰色单元格)。 人物的最终位置是人物根据游戏规则无法移动的所有可能位置(未显示)。

模拟汽车运动的代理


在这种情况下,将每个加速动作(多个加速加速度),制动(制动过程中可能的多个加速度)以及几个旋转程度建模为基本动作。 可以理解的是,可能同时涉及旋转和加速度之一,或者仅涉及一个旋转动作或一个加速度动作。 在这种情况下,该体系结构允许您同时指定几个基本操作以形成一个复杂的操作。


绘图。 除了用于执行汽车模型动作的字段(其停车目标由红线和绿线表示)之外,还显示了神经网络的输入(下方)以及该模型状态下所有可能动作的动作评估值。

架构的其他可能应用


类似地,通过在游戏中使用俄罗斯方块,该体系结构可以用于其他游戏,其中可以在战场上同时设置一系列人物和几个动作(例如,在运动场上移动)。

在机器人技术中,此体系结构可以用作将单个结构元素协调为一个整体的元网络。

同样,此体系结构允许您使用转移学习对CNN部分进行预训练,反之亦然,从一开始就对神经网络的RL部分进行训练,然后对已经训练好的RL网络上的模型数据进行CNN部分训练。 在该示例中,在对俄罗斯方块游戏进行编程时,将转移学习和训练在CNN部分和FC部分的开头应用于动作蒙版层(将什么转移到生成的网络)。 在停车问题上,我还计划在学习了RL部分(即第一枚樱桃)之后进行CNN培训。

→程序源代码示例可在此处找到

Source: https://habr.com/ru/post/zh-CN454916/


All Articles