4

我的数据集具有m特征和n数据点。设w是一个向量(待估计)。我正在尝试使用随机更新方法实现梯度下降。我的最小化功能是least mean square.

更新算法如下图所示:

for i = 1 ... n data:
    for t = 1 ... m features:
         w_t = w_t - alpha * (<w>.<x_i> - <y_i>) * x_t

其中<x>m特征的原始向量,<y>是真实标签的列向量,并且alpha是常数。

我的问题:

  • 现在根据wiki,我不需要遍历所有数据点,当错误足够小时我可以停止。这是真的吗?

  • 我不明白这里的停止标准应该是什么。如果有人可以提供帮助,那就太好了。

  • 使用这个公式 - 我使用过for loop- 是否正确?我相信(<w>.<x_i> - <y_i>) * x_t是我的∆Q(w)

4

1 回答 1

8

现在根据wiki,我不需要遍历所有数据点,当错误足够小时我可以停止。这是真的吗?

当您拥有非常庞大的训练集并且遍历所有数据点非常昂贵时,尤其如此。然后,您将检查 K 个随机更新后的收敛标准(即在处理 K 个训练示例之后)。虽然这是可能的,但用一个小的训练集来做这件事并没有多大意义。人们做的另一件事是随机化处理训练示例的顺序,以避免在原始数据中有太多相关示例,这可能导致“假”收敛。

我不明白这里的停止标准应该是什么。如果有人可以提供帮助,那就太好了。

有几个选项。我建议尝试尽可能多的方法并根据经验结果做出决定。

  1. 训练数据的目标函数差异小于阈值。
  2. 保留数据(又名开发数据、验证数据)的目标函数差异小于阈值。保留的示例不应包括任何用于训练(即随机更新)的示例,也不应包括用于评估的测试集中的任何示例。
  3. 参数 w 的总绝对差小于阈值。
  4. 在上面的 1、2 和 3 中,您可以指定百分比,而不是指定阈值。例如,一个合理的停止标准是在 |squared_error(w) - squared_error(previous_w)| 时停止训练。< 0.01 * squared_error(previous_w) $$。
  5. 有时,我们不在乎是否有最优参数。我们只是想改进我们最初拥有的参数。在这种情况下,无论目标函数是否实际收敛,都可以在训练数据上预设多次迭代并在此之后停止。

使用这个公式 - 我在 for 循环中使用 - 是否正确?我相信(w.x_i - y_i) * x_t是我的 ΔQ(w)。

它应该是2 * (w.x_i - y_i) * x_t但这并不是什么大问题,因为无论如何你都在乘以学习率alpha

于 2013-01-23T04:15:11.680 回答