梯度下降:我们是否在每次GD步骤中迭代整个训练集?还是针对每个训练集改变GD?

我通过一些在线资源自学了机器学习,但关于梯度下降有一个问题我无法解答。

梯度下降的公式如下所示的逻辑回归给出:

Repeat {    θj = θj−α/m∑(hθ(x)−y)xj}

其中θj是变量j上的系数;α是学习率;hθ(x)是假设;y是实际值,xj是变量j的值。m是训练集的数量。hθ(x)y是针对每个训练集的(即这是求和符号的作用)。

这让我感到困惑的地方。

我不清楚求和是否代表我的整个训练集,或者我到那时为止进行了多少次迭代。

例如,假设我有10个训练样本。如果我在每个训练样本后执行梯度下降,我的系数将会与我在所有10个训练样本后执行梯度下降时大不相同。

请看下面的第一种方式和第二种方式的区别:

第一种方式

  • 步骤1:由于系数初始化为0,hθ(x)=0
  • 步骤2:对第一个训练样本执行梯度下降。求和项仅包括1个训练样本
  • 步骤3:现在对训练样本1和2使用新的系数…求和项包括前2个训练样本
  • 步骤4:再次执行梯度下降。
  • 步骤5:现在对训练样本1、2和3使用新的系数…求和项包括前3个训练样本
  • 继续直到收敛或使用所有训练样本。

第二种方式

  • 步骤1:由于系数初始化为0,hθ(x)=0对所有10个训练样本
  • 步骤2:使用所有10个训练样本执行一次梯度下降步骤。系数将与第一种方式不同,因为求和项包括所有10个训练样本
  • 步骤3:再次对所有10个训练样本使用新的系数。求和项包括所有10个训练样本
  • 步骤4:执行梯度下降并继续在所有样本上使用系数直到收敛

我希望这能解释我的困惑。有人知道哪种方式是正确的吗?

编辑:添加成本函数和假设函数

cost function = −1/m∑[ylog(hθ(x))+(1−y)log(1−hθ(x))]hθ(x) = 1/(1+ e^-z) and z= θo + θ1X1+θ2X2 +θ3X3...θnXn

回答:

你描述的第二种方式是执行梯度下降的正确方法。真正的梯度依赖于整个数据集,因此一次梯度下降迭代需要使用整个数据集。(这对于任何可以取梯度的学习算法都是正确的)

“第一种方式”接近于被称为随机梯度下降的东西。这里的想法是,对于一次更新使用整个数据集可能是过度的,尤其是如果一些数据点是冗余的。在这种情况下,我们从数据集中随机选择一个点——基本上是设置m=1。然后我们基于数据集中连续选择的单个点进行更新。这样我们可以以大约与一次梯度下降更新相同的成本进行m次更新。但每次更新都有点噪音,这可能使收敛到最终解决方案变得困难。

这两种方法之间的折衷被称为“小批量”。对整个数据集取梯度是一次完整的“批处理”轮次,因为我们需要手头有整个数据集。相反,我们将进行一个小批量,仅选择整个数据集的一个小子集。在这种情况下,我们设置k,1 < k < m,其中k是小批量中的点数。我们在每次迭代中选择k个随机数据点来创建梯度,然后执行更新。重复直到收敛。显然,增加/减少k是在速度和准确性之间的权衡。

注意:对于随机和小批量梯度下降,随机打乱/选择下一个数据点是很重要的。如果你对每个数据点使用相同的迭代顺序,你可能会得到非常奇怪/糟糕的结果——通常会偏离解决方案。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注