∑i(yi−y^i)2 वास्तव में में उत्तल है । लेकिन अगर यह इन द में उत्तल नहीं हो सकता है , जो कि अधिकांश गैर-रेखीय मॉडल के साथ स्थिति है, और हम वास्तव में in the बारे में परवाह करते हैं क्योंकि हम इसे अनुकूलित कर रहे हैं लागत समारोह।y^iy^i=f(xi;θ)θθ
उदाहरण के लिए, आइए एक नेटवर्क पर विचार करें जिसमें इकाइयों की 1 छिपी हुई परत और एक लीनियर आउटपुट परत है: हमारी लागत फ़ंक्शन
जहाँ और (और मैं सादगी के लिए पूर्वाग्रह शब्द छोड़ रहा हूँ)। यह जरूरी नहीं है कि जब कार्य के रूप में देखा जाता है पर निर्भर करता है : यदि एक रैखिक सक्रियण फ़ंक्शन का उपयोग किया जाता है, तो यह अभी भी उत्तल हो सकता है)। और जितना गहरा हमारा नेटवर्क मिलता है, उतने कम उत्तल चीजें होती हैं।N
g(α,W)=∑i(yi−αiσ(Wxi))2
xi∈RpW∈RN×p(α,W)σ
अब एक समारोह को परिभाषित द्वारा जहां है के साथ सेट और सेट to । यह हमें लागत फ़ंक्शन की कल्पना करने की अनुमति देता है क्योंकि ये दो वजन भिन्न होते हैं।h:R×R→Rh(u,v)=g(α,W(u,v))W(u,v)WW11uW12v
नीचे दिया गया आंकड़ा इसे , , और (इसलिए एक अत्यंत महत्वपूर्ण वास्तुकला) के साथ सिग्मॉइड सक्रियण फ़ंक्शन के लिए दिखाता है । सभी डेटा ( और दोनों ) iid , क्योंकि प्लॉटिंग फ़ंक्शन में कोई भी वज़न विविध नहीं हैं। आप उत्तलता की कमी को यहाँ देख सकते हैं।n=50p=3N=1xyN(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])))