Answers:
如果您提供有关梯度下降效率不高的说法的上下文,将有所帮助。相对而言效率低下?
我想这里缺少的上下文是机器学习中随机或批量梯度下降的比较。这是在这种情况下如何回答问题的方法。您正在优化模型的参数,甚至是超参数。因此,您具有成本函数,其中您的数据,参数向量, -损失函数。为了最小化此成本,您可以对参数使用梯度下降:
因此,您看到需要获取所有数据的总和。这很不幸,因为这意味着您将不断循环浏览梯度下降的每个步骤的数据。这就是批量和随机梯度下降的方式:如果我们从数据集中采样并计算样本而不是整个集合的梯度怎么办? 在这里,是样本中观测值的数量。因此,如果您的样本是总数的1/100,则可以将计算速度提高100倍!显然,这会引入噪声,从而延长学习时间,但噪声以速率减小
另外,也可以等到计算出总和,再将其拆分为多个批次,并对每个批次执行一个步骤。这样,到计算整个数据集的总和时,您将完成M步。这些步骤会比较吵,但是随着时间的流逝,噪音会逐渐消失。
有两种方法可以降低梯度下降的效率。有趣的是,它们各自导致了自己的修复方法,这几乎是相反的解决方案。两个问题是:
(1)需要太多的梯度下降更新。
(2)每个梯度下降步骤都太昂贵。
关于(1),将梯度下降与考虑了二阶导数信息的方法进行比较,就改善每次迭代的损失而言,梯度下降往往效率很低。牛顿法是一种非常标准的方法,收敛所需的迭代次数要少得多,即,对于逻辑回归,牛顿法的10次迭代通常比5,000次梯度下降迭代所提供的解决方案损失更低。对于线性回归,这甚至更为极端。有一个封闭式解决方案!但是,随着预测变量的数量变得非常大(即500+),每次迭代的牛顿方法/直接求解线性回归可能会变得过于昂贵 由于所需的矩阵运算量较大,而梯度下降的每次迭代成本将大大降低。
关于(2),可能有一个很大的数据集,以至于每次梯度下降的迭代都过于昂贵而无法计算。计算梯度将需要运算( =样本大小, =协变量数)。尽管对于值,现代计算机上根本不是问题,但是肯定会像,。在这种情况下,基于数据的较小子集近似导数的方法更具吸引力,例如随机梯度下降。
我说这些修复方法几乎是相反的,因为像牛顿方法这样的方法每次更新成本更高,但效率更高(就损失变化而言),而随机梯度下降实际上效率较低,但每次更新的计算成本却低得多。
首先让我建议对您的符号进行改进。特别地,让我们用而不是表示损失函数。使用字母只是我个人的喜好,因为它提醒我我们正在处理L oss。更实质性的变化表明,损失是权重的函数,而不是数据。重要的是,梯度是相对于 not。因此 其中是您的尺寸数据。d
尽管我们应该将损失视为权重的函数,但任何合理的损失函数仍将取决于整个数据集(如果不是,则无法从数据中学习任何信息! )。例如,在线性回归中,我们通常使用平方和损失函数 因此,针对特定权重评估梯度将需要数据集所有个点的总和。如果,那么梯度下降优化中的每个增量步骤将需要进行大约一百万次运算,这是非常昂贵的。x L (w )= N ∑ i = 1(y i - w T x i )2。∇ 大号(瓦特)瓦特Ñ X Ñ = 10 6
简短答案:计算梯度需要对所有数据点求和。如果我们有大量数据,则需要很长时间。
我在这里有详细的答案。
另一方面,请始终记住,除了迭代方法(梯度不错)之外,还有其他直接方法。如果要解决最小二乘问题,直接方法可能会非常有效。例如,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