为什么神经网络的成本函数是非凸的?

机器算法验证 机器学习 神经网络 优化 损失函数 凸的
2022-02-15 18:45:28

这里有一个类似的线程(神经网络的成本函数是非凸的?)但我无法理解那里的答案中的要点以及我再次询问的原因,希望这能澄清一些问题:

如果我使用平方差成本函数的总和,我最终会优化一些形式Σi=1N(yiyi^)2在哪里y是训练阶段的实际标签值,并且y^是预测的标签值。由于这是一个正方形,这应该是一个凸成本函数。那么是什么让它在 NN 中成为非凸的呢?

1个回答

i(yiy^i)2确实是凸的y^i. 但如果y^i=f(xi;θ)它可能不是凸的θ,这是大多数非线性模型的情况,我们实际上关心的是θ因为这就是我们优化成本函数的原因。

例如,让我们考虑一个具有 1 个隐藏层的网络N单位和线性输出层:我们的成本函数是

g(α,W)=i(yiαiσ(Wxi))2
在哪里xiRpWRN×p(为了简单起见,我省略了偏见项)。当被视为一个函数时,这不一定是凸的(α,W)(根据σ:如果使用线性激活函数,那么这仍然可以是凸的)。我们的网络越深,凸的东西就越少。

现在定义一个函数h:R×RR经过h(u,v)=g(α,W(u,v))在哪里W(u,v)WW11设置uW12设置v. 这使我们能够可视化成本函数,因为这两个权重不同。

下图显示了 sigmoid 激活函数n=50,p=3, 和N=1(所以是一个非常简单的架构)。所有数据(两者xy) 是独立同住者N(0,1),在绘图函数中没有变化的任何权重也是如此。你可以在这里看到缺乏凸性。

损失面

这是我用来制作这个图的 R 代码(尽管现在一些参数的值与我制作它时的值略有不同,因此它们不会相同):

costfunc <- function(u, v, W, a, x, y, afunc) {
  W[1,1] <- u; W[1,2] <- v
  preds <- t(a) %*% afunc(W %*% t(x))
  sum((y - preds)^2)
}

set.seed(1)
n <- 75  # number of observations
p <- 3   # number of predictors
N <- 1   # number of hidden units


x <- matrix(rnorm(n * p), n, p)
y <- rnorm(n)  # all noise
a <- matrix(rnorm(N), N)
W <- matrix(rnorm(N * p), N, p)

afunc <- function(z) 1 / (1 + exp(-z))  # sigmoid

l = 400  # dim of matrix of cost evaluations
wvals <- seq(-50, 50, length = l)  # where we evaluate costfunc
fmtx <- matrix(0, l, l)
for(i in 1:l) {
  for(j in 1:l) {
    fmtx[i,j] = costfunc(wvals[i], wvals[j], W, a, x, y, afunc)
  }
}

filled.contour(wvals, wvals, fmtx,plot.axes = { contour(wvals, wvals, fmtx, nlevels = 25, 
                                           drawlabels = F, axes = FALSE, 
                                           frame.plot = FALSE, add = TRUE); axis(1); axis(2) },
               main = 'NN loss surface', xlab = expression(paste('W'[11])), ylab = expression(paste('W'[12])))