为什么大数据集的梯度下降效率不高?


13

假设我们的数据集包含一百万个示例,即,并且我们希望使用梯度下降对这些数据集执行逻辑或线性回归。x1,,x106

梯度下降法使效率低下是什么?

回想一下在时间处的梯度下降步长为:t

wt+1=wt+ηtf(x)

其中是损失函数。f

我没有发现上述步骤导致算法效率低下的任何异常情况。它是的计算吗?不能预先计算此操作,即已经计算出每个,并只是在每个数据点对其求值f(x)fxxi?


1
相对于...效率低下?大型数据集的效率即使是最小二乘也是如此。您需要使用大O表示法,以了解对算法的影响。并非所有GD算法都具有相同的大O(是吗?)n
AdamO

Answers:


7

如果您提供有关梯度下降效率不高的说法的上下文,将有所帮助。相对而言效率低下?

我想这里缺少的上下文是机器学习中随机或批量梯度下降的比较。这是在这种情况下如何回答问题的方法。您正在优化模型的参数,甚至是超参数。因此,您具有成本函数,其中您的数据,参数向量, -损失函数。为了最小化此成本,您可以对参数使用梯度下降: i=1nL(xi|Θ)xiΘL() θj

θji=1nL(Θ|xi)

因此,您看到需要获取所有数据的总和。这很不幸,因为这意味着您将不断循环浏览梯度下降的每个步骤的数据。这就是批量和随机梯度下降的方式:如果我们从数据集中采样并计算样本而不是整个集合的梯度怎么办? 在这里,是样本中观测值的数量。因此,如果您的样本是总数的1/100,则可以将计算速度提高100倍!显然,这会引入噪声,从而延长学习时间,但噪声以速率减小xi=1,,n

θjk=1nsL(Θ|xk)
nssn而计算量在增加,因此此技巧可能有效。n

另外,也可以等到计算出总和,再将其拆分为多个批次,并对每个批次执行一个步骤。这样,到计算整个数据集的总和时,您将完成M步。这些步骤会比较吵,但是随着时间的流逝,噪音会逐渐消失。i=1ns=1Mis=1ns


19

有两种方法可以降低梯度下降的效率。有趣的是,它们各自导致了自己的修复方法,这几乎是相反的解决方案。两个问题是:

(1)需要太多的梯度下降更新。

(2)每个梯度下降步骤都太昂贵。

关于(1),将梯度下降与考虑了二阶导数信息的方法进行比较,就改善每次迭代的损失而言,梯度下降往往效率很低。牛顿法是一种非常标准的方法,收敛所需的迭代次数要少得多,即,对于逻辑回归,牛顿法的10次迭代通常比5,000次梯度下降迭代所提供的解决方案损失更低。对于线性回归,这甚至更为极端。有一个封闭式解决方案!但是,随着预测变量的数量变得非常大(即500+),每次迭代的牛顿方法/直接求解线性回归可能会变得过于昂贵 由于所需的矩阵运算量较大,而梯度下降的每次迭代成本将大大降低。

关于(2),可能有一个很大的数据集,以至于每次梯度下降的迭代都过于昂贵而无法计算。计算梯度将需要运算( =样本大小, =协变量数)。尽管对于值,现代计算机上根本不是问题,但是肯定会像,。在这种情况下,基于数据的较小子集近似导数的方法更具吸引力,例如随机梯度下降O(nk)nkn=106k<100n=1012k=103

我说这些修复方法几乎是相反的,因为像牛顿方法这样的方法每次更新成本更高,但效率更高(就损失变化而言),而随机梯度下降实际上效率较低,但每次更新的计算成本却低得多。


感谢您的惊人回答。 =协变量数是什么意思?我不熟悉此术语k
卡洛斯-猫鼬-危险

2
@Learningonepageatatime:协变量=预测变量。
Cliff AB

10

首先让我建议对您的符号进行改进。特别地,让我们用而不是表示损失函数。使用字母只是我个人的喜好,因为它提醒我我们正在处理L oss。更实质性的变化表明,损失是权重的函数,而不是数据。重要的是,梯度是相对于 not。因此 其中是您的尺寸数据。L(w)f(x)Lwxwxd

L(w)=(Lw1,,LwD),
D

尽管我们应该将损失视为权重的函数,但任何合理的损失函数仍将取决于整个数据集(如果不是,则无法从数据中学习任何信息! )。例如,在线性回归中,我们通常使用平方和损失函数 因此,针对特定权重评估梯度将需要数据集所有个点的总和。如果,那么梯度下降优化中的每个增量步骤将需要进行大约一百万次运算,这是非常昂贵的。x L w = N i = 1y i - w T x i 2大号瓦特瓦特Ñ X Ñ = 10 6wx

L(w)=i=1N(yiwTxi)2.
L(w)wNxN=106

3

简短答案:计算梯度需要对所有数据点求和。如果我们有大量数据,则需要很长时间。

我在这里有详细的答案。

与标准梯度下降相比,随机梯度下降如何节省时间?


另一方面,请始终记住,除了迭代方法(梯度不错)之外,还有其他直接方法。如果要解决最小二乘问题,直接方法可能会非常有效。例如,QR分解。如果我们没有太多功能,那就太快了。

当您对其进行验证时,您可能会感到惊讶:具有2个特征的500万个数据点,求解线性回归/最小二乘法需要几秒钟!

x=matrix(runif(1e7),ncol=2)
y=runif(5e6)
start_time <- Sys.time()
lm(y~x)
end_time <- Sys.time()
end_time - start_time
# Time difference of 4.299081 secs

1

尽管您提到的两个示例通常都是凸的,但我将对非凸问题加一点。在我看来,(批次)梯度下降可能被认为“效率低”有两个主要原因。在其他答案中已经非常清楚地概述了有关计算“大”函数之和的梯度的计算工作量的第一点。但是对于非凸问题,GD存在通常卡在“接近的”局部最小值中的问题。与全局最小值相比,该最小值可能非常糟糕。SGD或小批量GD具有(至少部分地)随机游荡的“优势”,因此可能有机会找到更好的局部最小值。在这里查看此简历答案。或其他简历 概述了随机性如何会带来好处。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.