在该视频的 8:30, Andrew Ng 提到逻辑回归的随机梯度下降(对于单个观察)的成本函数是
我的问题(一个相当技术性的问题)是关于正则化术语的。如果所有观测的成本函数是
单个观察的成本函数应该是
? 换句话说,正则化项除以; 它在所有观察中“分散”。我知道它相当技术性可以很容易地改变,但我想确保我的概念是正确的。
在该视频的 8:30, Andrew Ng 提到逻辑回归的随机梯度下降(对于单个观察)的成本函数是
我的问题(一个相当技术性的问题)是关于正则化术语的。如果所有观测的成本函数是
单个观察的成本函数应该是
? 换句话说,正则化项除以; 它在所有观察中“分散”。我知道它相当技术性可以很容易地改变,但我想确保我的概念是正确的。
首先,我建议您先检查我在这篇文章中的答案。
Andrew Ng. 的公式是正确的。我们不应该使用关于正则化项。
原因如下:
正如我在回答中所讨论的,SGD 的想法是使用数据子集来近似目标函数的梯度来优化。这里的目标函数有两个术语,成本值和正则化。
成本值有总和,但正则化项没有。这就是为什么正则化项不需要除以以新元计。
编辑:
在查看另一个答案后。我可能需要修改我所说的。现在我认为两个答案都是正确的:我们可以使用或者,各有利弊。但这取决于我们如何定义目标函数。让我以回归(平方损失)为例。
如果我们将目标函数定义为那么,我们应该将正则化除以以新元计。
如果我们将目标函数定义为(如代码演示所示)。那么,我们不应该将正则化除以以新元计。
这是一些代码演示,我们使用的是 SGD 中的所有数据,所以它应该是精确的梯度:
# ------------------------------------------------------
# data, and loss function, and gradient
# ------------------------------------------------------
set.seed(0)
par(mfrow=c(2,1))
n_data=1e3
n_feature=2
A=matrix(runif(n_data*n_feature),ncol=n_feature)
b=runif(n_data)
sq_loss<-function(A,b,x,lambda){
e=A %*% x -b
v=crossprod(e)
return(v[1]/(2*n_data)+lambda*crossprod(x))
}
sq_loss_gr<-function(A,b,x,lambda){
e=A %*% x -b
v=t(A) %*% e
return(v/n_data+2*lambda*x)
}
# ------------------------------------------------------
# sgd: approximate gradient using subset of data
# ------------------------------------------------------
sq_loss_gr_approx_1<-function(A,b,x,nsample,lambda){
# sample data and calculate gradient
i=sample(n_data,nsample)
gr=t(A[i,] %*% x-b[i]) %*% A[i,]
v=matrix(gr/nsample,ncol=1)
return(v+2*lambda*x)
}
sq_loss_gr_approx_2<-function(A,b,x,nsample,lambda){
# sample data and calculate gradient
i=sample(n_data,nsample)
gr=t(A[i,] %*% x-b[i]) %*% A[i,]
v=matrix(gr/nsample,ncol=1)
return(v+2*lambda*x/nsample)
}
x=matrix(runif(2),ncol=1)
sq_loss_gr(A,b,x,lambda=3)
sq_loss_gr_approx_1(A,b,x,nsample=n_data,lambda=3)
sq_loss_gr_approx_2(A,b,x,nsample=n_data,lambda=3)
功能sq_loss_gr_approx_1
是对的。因为损失函数是v[1]/(2*n_data)+lambda*crossprod(x)
但不是(v[1]+lambda*crossprod(x))/(2*n_data)
> sq_loss_gr(A,b,x,lambda=3)
# [,1]
# [1,] 3.317703
# [2,] 4.969016
> sq_loss_gr_approx_1(A,b,x,nsample=n_data,lambda=3)
# [,1]
# [1,] 3.317703
# [2,] 4.969016
> sq_loss_gr_approx_2(A,b,x,nsample=n_data,lambda=3)
# [,1]
# [1,] 0.1325575
# [2,] 0.1597326
看起来您正在询问如何在随机梯度更新的情况下应用正则化,即一次更新一个训练示例。
您将正则化项除以数据点数的想法(你用) 是正确的。我也检查了这篇论文,它似乎也是这么说的。损失或成本定义为在第 3 节(参见第 3 节中的第一个等式)中,它们显示了权重的更新对于单个训练示例,他们清楚地将正则化项划分为. 因此,单个示例的损失也除以.
我总是将正则化器与损失分开看待。大多数机器学习问题都以“正则化器+经验风险”的形式出现,其中经验风险是指每个训练样本的损失总和的算术平均值。
您所说的“分散在所有观察中”的意思可能是,当您采用单个样本相对于权重的随机梯度时,您还必须考虑不会“分散”/平均的正则化器。
比较正则化 GD 的梯度:
到正则化的 SGD(只考虑总和的一个元素):
简短:在我看来,将术语“正则化”和“成本”分开是有意义的(我将完整数据命名为“经验风险”,将一个样本命名为“损失”)