$\sum_i (y_i- \hat y_i)^2$ es efectivamente convexo en $\hat y_i$ . Pero si $\hat y_i = f(x_i ; \theta)$ puede no ser convexo en $\theta$ que es la situación con la mayoría de los modelos no lineales, y realmente nos importa la convexidad en $\theta$ porque eso es lo que estamos optimizando la función de coste.
Por ejemplo, consideremos una red con 1 capa oculta de $N$ y una capa de salida lineal: nuestra función de coste es $$ g(\alpha, W) = \sum_i \left(y_i - \alpha_i\sigma(Wx_i)\right)^2 $$ donde $x_i \in \mathbb R^p$ y $W \in \mathbb R^{N \times p}$ (y omito los términos de sesgo para simplificar). Esto no es necesariamente convexo cuando se ve como una función de $(\alpha, W)$ (dependiendo de $\sigma$ (si se utiliza una función de activación lineal, ésta puede seguir siendo convexa). Y cuanto más profunda sea nuestra red, menos convexas serán las cosas.
Ahora define una función $h : \mathbb R \times \mathbb R \to \mathbb R$ por $h(u, v) = g(\alpha, W(u, v))$ donde $W(u,v)$ es $W$ con $W_{11}$ ajustado a $u$ y $W_{12}$ ajustado a $v$ . Esto nos permite visualizar la función de costes al variar estos dos pesos.
La figura siguiente lo muestra para la función de activación sigmoidea con $n=50$ , $p=3$ y $N=1$ (así que una arquitectura extremadamente simple). Todos los datos (tanto $x$ y $y$ ) son iid $\mathcal N(0,1)$ como los pesos que no varían en la función de trazado. Aquí se puede ver la falta de convexidad.
![loss surface]()
Aquí está el código R que usé para hacer esta figura (aunque algunos de los parámetros están en valores ligeramente diferentes ahora que cuando lo hice, así que no serán idénticos):
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])))