从论文Human level Control through DeepRL中,数据中的相关性在instability
网络中导致并可能导致网络中的相关性diverge
。我想了解这是什么instability
意思divergence
?以及为什么相关数据会导致这种不稳定性。
DQN 中数据集中相关性问题的原因
我想了解这是什么
instability
意思divergence
?
这些是参考神经网络的学习曲线。如果神经网络是stable
和converges
,则意味着误差或成本函数的值随着时间的推移不断减小,并达到最小误差的稳定点。
在实践中,这通常是一个嘈杂的过程,而且并不顺利。在解决实际问题时,存在一定程度的噪音是可以预期和可以接受的。但是,instable
学习曲线会剧烈振荡,并且divergent
学习曲线会在训练期间不断得到更差的误差函数。
典型的稳定、收敛的学习曲线、成本函数与消耗的训练数据的关系可能如下所示:
虽然一个不稳定的、发散的学习曲线可能看起来像这样:
这些没有使用相同的垂直刻度——不稳定曲线的最低点通常会高于大部分甚至所有稳定曲线。
以及为什么相关数据会导致这种不稳定性。
这是因为要使梯度下降起作用,它需要在每个权重更新步骤中使用的梯度样本来作为真实梯度的无偏估计。在 RL 中,你要么有一个在线学习过程,要么有非平稳目标(通常两者都有),所以你必须使用随机或小批量梯度下降,一次处理几个样本。您需要这些样本是独立的,彼此之间不相关,除非是随机的,否则梯度值将有偏差,梯度下降将始终以错误的整体方向进行更新。
说明差异的一个好方法是使用一个非常简单的示例,使用梯度下降更新来估计平均值(这大致相当于用一个神经元训练一个神经网络,权重固定为零并学习一个偏差值来表示目标的平均值 - 不需要实际输入)。
假设我们有一个从 0 到 200 的值数组(示例代码在 Python 中):
import numpy as np
train_y = np.arange(0, 201)
如果这个数组保持排序,那么顺序值是高度相关的。如果您将连续的对相互绘制,您将得到一条直线。
我们可以通过将“偏差”值设置为任意数字并运行基于 MSE 的更新规则(在当前偏差和观察值之间)来估计平均值:
mean_estimate = 0.0
alpha = 0.1
for y in train_y:
mean_estimate += alpha * (y - mean_estimate)
print(mean_estimate)
这打印(大致)作为对平均值的估计,几乎翻了一番。
但是,如果我们先打乱数组,它会消除相关性。如果您将连续的对相互绘制,您将得到一个没有明显模式的散点图。添加一行np.random.shuffle(x)
来执行此操作会从根本上改变结果:
mean_estimate = 0.0
alpha = 0.1
np.random.shuffle(x)
for y in train_y:
mean_estimate += alpha * (y - mean_estimate)
print(mean_estimate)
我们得到了更好的估计(通常在和),更接近真实值,并且不偏向更高或更低(运行足够多次,您会发现该算法的预期结果非常接近真实值)。
这是因为在代码的第一个版本中,错误的梯度没有被公平地采样 - 由于相关性,即使对于高估计,它也一直指向“向上”。在 shuffled 版本中,梯度可能在任一方向上仅取决于当前估计,并且将大致以找到正确值所需的比率出现。
作为练习,您可以使用小批量和重复的“时期”来扩展这个简单的示例,以表明效果随着这些变化而持续存在,并且改组是这里为了更好地估计而最重要的变化。