∑yo( yyo- y^yo)2 es efectivamente convexo en . Pero si puede no ser convexo en , que es la situación con la mayoría de los modelos no lineales, y en realidad nos importa la convexidad en \ theta porque eso es lo que estamos optimizando. función de costo terminada. y i=f(xi;θ)θθy^yoy^yo= f( xyo; θ )θθ
Por ejemplo, consideremos una red con 1 capa oculta de norte unidades y una capa de salida lineal: nuestra función de costo es
sol( α , W) = ∑yo( yyo- αyoσ( WXyo) )2
donde
xi∈Rp y
W∈RN×p (y estoy omitiendo los términos de sesgo por simplicidad). Esto no es necesariamente convexo cuando se ve como una función de
(α,W) (dependiendo de
σ : si se usa una función de activación lineal, entonces todavía puede ser convexo). Y cuanto más se profundiza nuestra red, menos convexas son las cosas.
Ahora defina una función por donde es con establecido en y establecido en . Esto nos permite visualizar la función de costo ya que estos dos pesos varían. h ( u , v ) = g ( α , W ( u , v ) ) W ( u , v ) W W 11 u W 12 vh:R×R→Rh(u,v)=g(α,W(u,v))W(u,v)WW11uW12v
La figura siguiente muestra esto para la función de activación sigmoidea con , y (por lo que es una arquitectura extremadamente simple). Todos los datos (tanto como ) son iid , al igual que los pesos que no varían en la función de trazado. Puedes ver la falta de convexidad aquí.p = 3 N = 1 x y N ( 0 , 1 )n=50p=3N=1xyN(0,1)
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 para que no sean 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])))