梯度下降:我们是否在GD中的每一步迭代所有训练集?或者我们是否为每个训练集更改GD?

Ter*_*how 7 machine-learning gradient-descent

我已经通过一些在线资源教自己机器学习,但我有一个关于梯度下降的问题,我无法弄清楚.

梯度下降的公式由以下物流回归给出:

Repeat {
    ?j = ?j??/m?(h?(x)?y)xj
}
Run Code Online (Sandbox Code Playgroud)

?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,因此对于所有10个训练样例,hθ(x)= 0
  • 步骤2:使用所有10个训练样例执行梯度下降的1个步骤.系数将与第一种方式不同,因为求和项包括所有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
Run Code Online (Sandbox Code Playgroud)

Raf*_*ard 7

您描述它的第二种方式是执行渐变下降的正确方法.真实梯度取决于整个数据集,因此梯度下降的一次迭代需要使用所有数据集.(对于任何可以采用渐变的学习算法都是如此)

"第一条道路"接近于被称为随机梯度下降的东西.这里的想法是,将整个数据集用于一次更新可能会过度,特别是如果某些数据点是冗余的.在这种情况下,我们从数据集中选择一个随机点 - 主要是设置m = 1.然后,我们根据数据集中单个点的连续选择进行更新.通过这种方式,我们可以以与Gradient Descent的一次更新大致相同的成本进行更新.但是每次更新都有点嘈杂,这使得最终解决方案难以收敛.

这些方法之间的妥协称为"MiniBatch".采用整个数据集的梯度是一整轮的"批处理"处理,因为我们需要手头的整个数据集.相反,我们将做一个小批量,只选择整个数据集的一小部分.在这种情况下,我们设置k,1 <k <m,其中k是迷你批次中的点数.我们选择k个随机数据点来从每次迭代创建梯度,然后执行更新.重复直到收敛.显然,增加/减少k是速度和准确度之间的权衡.

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