智能体(在这种情况下是电机的控制器)对环境(电机和杆)采取动作(指示电机的旋转方向),并在获得奖励并获得一些观察结果的条件下学习最优策略。 奖励
r
r
r 是从电机上看到的杆尖的高度
h
h
h 的函数
r
(
h
)
=
{
5
h
,
h
≥
0
h
,
h
<
0
r(h)=\begin{cases} 5h,h\ge 0 \\ h,h<0 \end{cases}
r(h)={5h,h≥0h,h<0 我偏向于积极的一面,但这可能是额外的小心。为了观察,在ATARI示例中,直接输入屏幕的图像,但这次我输入了摆的角度本身。 假设仿真的四个参数的数组序列可以作为一个数组得到。 下面是曲线图。横轴是实验次数,纵轴是实验中获得的总分。蓝点是每一代的结果,红线是最高分。
我之前提到的 DQN 博客也展示了实现,但这次我尝试重新造轮子来理解。我把我根据 这篇论文(Playing Atari with Deep Reinforcement Learning) 实现的内容放在 https://github.com/ashitani/DQN_pendulum。仅仅通过阅读论文,我并没有完全理解如何构建和更新基本的深度网络。我会解释一下。 深度Q网络是一个神经网络,当您输入一系列状态观察结果时,它输出每个动作值。在这种情况下,动作值是一个向量,指示“在输入角度序列指示的情况下将电机左右转动有多少奖励”。 当然在学习初期,这个网络是随机的,所以会返回荒谬的结果。从现在开始按照说明的顺序更新的话,将来会训练为能得到很多总奖励的好网络。 假设对状态
s
t
s_t
st 执行某个动作
a
t
a_t
at 以获得报酬
r
t
r_t
rt,并将其更改为
s
t
+
1
s_{t+1}
st+1。此时,在输入
s
t
s_t
st 时的
Q
Q
Q 输出的动作价值向量
Q
(
s
t
)
Q(s_t)
Q(st) 中,只按照下面的式子改写了相当于
a
t
a_t
at 的动作价值,记作
y
t
y_t
yt(符号与原始论文相比已更改很多)
y
t
=
Q
(
s
t
)
y
t
[
a
t
]
←
r
t
+
γ
max
Q
(
s
t
+
1
)
y_t=Q(s_t) \\ y_t[a_t]\leftarrow r_t+\gamma\max Q(s_{t+1})
yt=Q(st)yt[at]←rt+γmaxQ(st+1) 为了让
Q
(
s
t
)
Q(s_t)
Q(st) 接近这个
y
t
y_t
yt,一步更新网络的权重。这次的奖励和下一步得到的最优动作价值要加上一定的折扣率
γ
\gamma
γ。加上 batch size 之前的动作价值的和,决定这次动作的价值是理想的,但是在运算时间上也有困难,所以只进行下一步。如果重复无限次此更新过程,您将从状态中获得基于总报酬的行为价值。真的吗?至少我是这么理解的,就这么表达吧。 深度网络本身的组成并没有太多的试错,但我认为把它加深没有错。包含 Dropout 和 Batch Normalization 以提高泛化性能真的更好吗?我认为这取决于不同的问题。