∑saya( ysaya- y^saya)2 memang cembung di . Tetapi jika itu mungkin tidak cembung dalam , yang merupakan situasi dengan sebagian besar model non-linear, dan kami benar-benar peduli tentang konveksitas dalam karena itulah yang kami optimalkan pada fungsi biaya berakhir. y i=f(xi;θ)θθy^sayay^saya= f( xsaya; θ )θθ
Sebagai contoh, mari kita pertimbangkan sebuah jaringan dengan 1 lapisan tersembunyi unit dan lapisan output linier: fungsi biaya kami adalah
mana dan (dan saya menghilangkan istilah bias untuk kesederhanaan). Ini tidak harus cembung bila dilihat sebagai fungsi dari (tergantung pada : jika fungsi aktivasi linier digunakan maka ini masih bisa cembung). Dan semakin dalam jaringan kita, semakin sedikit hal-hal yang cembung.g ( α , W ) = ∑ i ( y i - α i σ ( W x i ) ) 2 x i ∈ R p W ∈ R N × pN
g( α , W) = ∑saya( ysaya- αsayaσ( Wxsaya) )2
xsaya∈ RhalW∈ RN× pσ( α , W)σ
Sekarang tentukan fungsi oleh mana adalah dengan atur ke dan atur ke . Ini memungkinkan kita untuk memvisualisasikan fungsi biaya karena dua bobot ini berbeda-beda. h ( u , v ) = g ( α , W ( u , v ) ) W ( u , v ) W W 11 u W 12 vh : R × R → Rh ( u , v ) = g( α , W( kamu , v ) )W( kamu , v )WW11kamuW12v
Gambar di bawah menunjukkan ini untuk fungsi aktivasi sigmoid dengan , , dan (jadi arsitektur yang sangat sederhana). Semua data (baik dan ) adalah iid , seperti halnya bobot yang tidak bervariasi dalam fungsi plot. Anda dapat melihat kurangnya konveksitas di sini.p = 3 N = 1 x y N ( 0 , 1 )n = 50p = 3N= 1xyN(0,1)
Inilah kode R yang saya gunakan untuk membuat gambar ini (meskipun beberapa parameter berada pada nilai yang sedikit berbeda sekarang daripada ketika saya membuatnya sehingga mereka tidak akan sama):
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])))