每个θj:=θj+α∑(yi-h(xi))xji
批量渐变下降为:j
。
随机梯度下降是:
loop
{
for i=1 to m,
{
θj:=θj+α(yi-h(xi))xji for every j.
}
}
我很好奇两种算法之间的复杂性差异。我认为复杂性是一样的!两者都是O(m * n),但批量梯度是m * n,随机是n * m,只是一个不同的顺序,我是对的吗?
答案 0 :(得分:2)
A)你不会怎么做SGD。您可以随机选择“i”,也可以随机抽取每一轮的数据。
B)如果您决定只通过数据执行固定数量的纪元,那么您才是正确的。
实际上,您需要继续运行算法,直到您收敛到解决方案。 SGD and GD have different rates of convergences,并不像“运行时大O(f(x))”那么简单。每种方法都需要不同的时间来达到不同的目标。这些进一步改变取决于您的损失函数和其他因素。
GD在实践中并未使用,因为如果您每个纪元只执行一次更新,则有更好的选择。
C)“m * n,随机是n * m,只是一个不同的顺序,我是对的吗?”如果您的大O声明是正确的,这将是正确的。
D)你忘了在大O中包含问题的维度。
答案 1 :(得分:0)
这两种方法的渐近复杂性在某种意义上是相同的。如果对外循环的多次迭代都进行了两次迭代,则渐近地执行相同数量的工作。不同之处在于方法的实际行为。
通常,随机梯度下降用作处理非常大的训练集的方法。假设您的训练集中有十亿个项目。每次更新模型参数(theta)时,批量梯度下降需要经过所有十亿个项目。随机梯度下降在处理每个训练集项目的模型参数(尽管以较小的增量)拟合方面不断取得进展。
如果您的训练数据集非常大并且您的排序没有任何偏差,您可以(如您所示)按顺序重复循环遍历数据集。连续运行数据集的事实不使用不同的顺序,这在实践中不应该成为问题。