在RL里面重要且比较容易被忽视的一环是ENv,为什么重要,因为env是对实际情况的理解,尤其是输入特征和reward的定义直接影响最终的结果。而网上的很多关于RL的知识点,都主要在涉及agent上,所以对这个基础的东西是忽略掉了的。
迷宫游戏
游戏规则:探索者从红色的初始位置以最少的step到达天堂
Env提供的数据
Initial:在红色位置为初始化位置
States: 当前位置【observation可以看成是state的函数】
Obrvations:[x, y] x,y属于[0~1],例如[0.25, 0.25]代表第一个红色的方格位置
Actions:[left, up, down, right],
Done: 到达黄色或者黑色位置表示结束
Reward:到达黄色位置表示天堂,到达黑色位置表示地狱。
state是最原始的环境内部的表示,observation则是state的函数。好比我们所看见的东西并不一定就是它们在世界中的真实状态,而是经过我们的大脑加工过的信息
判断游戏是否达到比较好的效果:
- loss值
关于这点,网上找到的说法如下:
“可以看出曲线并不是平滑下降的, 这是因为 DQN 中的 input 数据是一步步改变的, 而且会根据学习情况, 获取到不同的数据. 所以这并不像一般的监督学习, DQN 的 cost 曲线就有所不同了”
- 根据规则来定义
显然下面这个更加能够判定我们最终基本上找到了次优解,这里如果最后掉进了地狱,我就认为走的step为负数。
我们再来看看动作的价值:
逐渐升高,也就是说每个action的价值在逐步的提升。
迷宫游戏和棋盘游戏差不多,仿真环境都很好搭建,规则奖励等也很好定义。忽然觉得deep mind选择棋类游戏来证明机器人的智能真的好明智。
倒立摆
规则:钟摆以随机位置开始,向上摆动使其直立。
Initial:初始化随意位置
States:角度和角速度
Observation:
Actions:电机的力矩
介于电机最大和最小力矩之间的数据,一般会归一化处理为【-2, 2】
Done:normal状态下,直立起来我们视为finish,但如果我们设计不好,一直立不起来,岂不是要等到地老天荒。所以一般在达到一定的step_counts时就结束[30000]。
Reward :
Reward = -costs
angle_normalize(th)**2:与目标角度差的惩罚项
.1*thdot**2:角速度的惩罚项
.001*(u**2):输入力矩的惩罚
这里有一个有趣的现象是给出了在choose_actions时候的q值
" Natural DQN 学得差不多后, 在立起来时, 大部分时间都是 估计的 Q值 要大于0, 这时就出现了 overestimate, 而 Double DQN 的 Q值 就消除了一些 overestimate, 将估计值保持在 0 左右."
在一个episode里面可以看到loss值下降是很明显的。
从reward的角度来看:
这次我们看看累积奖励 reward, 杆子立起来的时候奖励 = 0, 其他时候都是负值, 所以当累积奖励没有在降低时, 说明杆子已经被成功立了很久了.
不用看累积的奖励,直接看即时reaward不就可以了吗!但这个我试过去看他的即时reaward很不好看
所以后面可以借鉴一下他的累积奖励的方式。
然后是AC和RNN实现的查看的正则化之后的reward的值
或者这样:
连续动作的小车上山
规则:小车由中间开始位置开始,跑上右边的山顶旗子标志的位置
Initial:位于-0.6和-0.4之间,无速度
State&observation:这里二者是一致的
Action:
我看的传统的V0的模型,里面action的值是0,1,2。不知道哪个是往左边走,哪个是往右边走。
if done: reward = 10,在结束的时候给了一个10的reward
Done:目标位于汽车右侧的山顶上。 如果汽车到达或超出,则剧集终止
Reward:
奖励为到达右侧山丘目标的100,减去从开始到目标的动作平方总和。这个奖励函数提出了一个探索挑战,因为如果代理人没有尽快到达目标,它将会发现最好不要移动,并且不再找到目标。
请注意,对于大多数已发表的作品而言,这种奖励是不寻常的,其目标是尽可能快地达到目标,因此有利于爆炸战略
我看的传统的V0的模型,里面reward一直是-1
下面是用 MountainCar-v0 模型得到的结果,可以看到后面步数是逐渐减少的。
从累积的效果上来看,单看每一个episode效果还是不好。
再看看他的loss值的曲线,但是为什么最后会有一个突起呢?
DQN修改reward的值之后的实验结果如下:
在策略梯度里面的另一种角度如下:
“
这张图在说: “请重视我这回合最后的一系列动作, 因为这一系列动作让我爬上了山. 而且请惩罚我开始的一系列动作, 因为这些动作没能让我爬上山”.
也是通过这些 vt
来诱导梯度下降的方向.
”
策略梯度里面的loss值的变化情况:
车摆游戏
规则:游戏里面有一个小车,上有竖着一根杆子。小车需要左右移动来保持杆子竖直。如果杆子倾斜的角度大于15°,那么游戏结束。小车也不能移动出一个范围(中间到两边各2.4个单位长度)
Initial:所有的观测值都被指定为±0.05之间的随机值
Observation:位置、小车的速度、角度、角度变化率
Action:
Done: 到达200个reward之后,游戏也会结束;角度超过15度;超出移动范围则结束
Reward: 左移或者右移小车的action之后,env都会返回一个+1的reward
x, x_dot, theta, theta_dot = observation_
r1 = (env.x_threshold - abs(x))/env.x_threshold - 0.8
r2 = (env.theta_threshold_radians - abs(theta))/env.theta_threshold_radians - 0.5
reward = r1 + r2
下面是DQN的学习结果
在策略梯度算法中我们看到了一个新的角度,就是正则化的累积回报,此时不对reaward进行处理
可以看出, 左边一段的 vt
有较高的值, 右边较低, 这就是 vt
在说:
“请重视我这回合开始时的一系列动作, 因为前面一段时间杆子还没有掉下来. 而且请惩罚我之后的一系列动作, 因为后面的动作让杆子掉下来了” 或者是
“我每次都想让这个动作在下一次增加被做的可能性 (grad(log(Policy))
), 但是增加可能性的这种做法是好还是坏呢? 这就要由 vt
告诉我了, 所以后段时间的 增加可能性
做法并没有被提倡, 而前段时间的 增加可能性
做法是被提倡的.”
这样 vt
就能在这里 loss = tf.reduce_mean(log_prob * self.tf_vt)
诱导 gradient descent 朝着正确的方向发展了.