正则化逻辑回归的随机梯度下降

机器算法验证 机器学习 正则化 梯度下降
2022-04-10 00:52:13

该视频的 8:30, Andrew Ng 提到逻辑回归的随机梯度下降(对于单个观察)的成本函数是

yiloghw(xi)(1yi)loghw(1xi)+λ2||w||2

我的问题(一个相当技术性的问题)是关于正则化术语的。如果所有观测的成本函数是

i=1n{yiloghw(xi)(1yi)loghw(1xi)}+λ2||w||2

单个观察的成本函数应该是

yiloghw(xi)(1yi)loghw(1xi)+λ2n||w||2

? 换句话说,正则化项除以n; 它在所有观察中“分散”。我知道它相当技术性λ可以很容易地改变,但我想确保我的概念是正确的。

3个回答

首先,我建议您先检查我在这篇文章中的答案。

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

Andrew Ng. 的公式是正确的。我们不应该使用λ2n关于正则化项。

原因如下:

正如我在回答中所讨论的,SGD 的想法是使用数据子集来近似目标函数的梯度来优化这里的目标函数有两个术语,成本值和正则化。

成本值有总和,但正则化项没有。这就是为什么正则化项不需要除以n以新元计。


编辑:

在查看另一个答案后。我可能需要修改我所说的。现在我认为两个答案都是正确的:我们可以使用λ2n或者λ2,各有利弊。但这取决于我们如何定义目标函数。让我以回归(平方损失)为例。

如果我们将目标函数定义为Axb2+λx2N那么,我们应该将正则化除以N以新元计。

如果我们将目标函数定义为Axb2N+λx2(如代码演示所示)。那么,我们不应该将正则化除以N以新元计。

这是一些代码演示,我们使用的是 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

看起来您正在询问如何在随机梯度更新的情况下应用正则化,即一次更新一个训练示例。

您将正则化项除以数据点数的想法N(你用n) 是正确的。我也检查了这篇论文,它似乎也是这么说的。损失或成本定义为Eq.2在第 3 节(参见第 3 节中的第一个等式)中,它们显示了权重的更新w对于单个训练示例,他们清楚地将正则化项划分为N. 因此,单个示例的损失也除以N.

我总是将正则化器与损失分开看待。大多数机器学习问题都以“正则化器+经验风险”的形式出现,其中经验风险是指每个训练样本的损失总和的算术平均值。

您所说的“分散在所有观察中”的意思可能是,当您采用单个样本相对于权重的随机梯度时,您还必须考虑不会“分散”/平均的正则化器。

比较正则化 GD 的梯度:

w λ Regularizer(w)+wn1i=1nlossi(w)

到正则化的 SGD(只考虑总和的一个元素):

w λ Regularizer(w)+wlossi(w)

简短:在我看来,将术语“正则化”和“成本”分开是有意义的(我将完整数据命名为“经验风险”,将一个样本命名为“损失”)