è infatti convessa y i . Ma se y i = f ( x i , θ ) non può essere convessa in θ , che è la situazione con la maggior parte dei modelli non-lineari, e in realtà cura di convessità in θ perché è quello che stiamo ottimizzando la funzione di costo al di sopra di.Σio( yio- y^io)2y^ioy^io= f( xio; θ )θθ
Ad esempio, consideriamo una rete con 1 strato nascosto di unità e uno strato di uscita lineare: la nostra funzione di costo è
g ( α , W ) = ∑ i ( y i - α i σ ( W x i ) ) 2
dove x i ∈ R p e W ∈ R N × p (e sto omettendo termini di bias per semplicità). Questo non è necessariamente convesso se visto come una funzione di ( α , W )N
g( α , W) = ∑io( yio- αioσ( WXio) )2
Xio∈ RpW∈ RN× p( α , W)(a seconda di
: se si utilizza una funzione di attivazione lineare, questa può essere ancora convessa). E più profonda diventa la nostra rete, meno le cose sono convesse.
σ
Ora definisci una funzione per h ( u , v ) = g ( α , W ( u , v ) ) dove W ( u , v ) è W con W 11 impostato su u e W 12 impostato su v . Questo ci consente di visualizzare la funzione di costo al variare di questi due pesi.h : R × R → Rh ( u , v ) = g( α , W( u , v ) )W( u , v )WW11uW12v
La figura seguente mostra questo per la funzione di attivazione sigmoid con , p = 3 e N = 1 (quindi un'architettura estremamente semplice). Tutti i dati (sia x che y ) sono iid N ( 0 , 1 ) , così come i pesi che non vengono variati nella funzione di stampa. Puoi vedere la mancanza di convessità qui.n = 50p = 3N= 1XyN( 0 , 1 )
Ecco il codice R che ho usato per fare questa figura (anche se alcuni dei parametri ora hanno valori leggermente diversi rispetto a quando l'ho fatto, quindi non saranno identici):
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])))