là thực sự lồi trong y i . Nhưng nếu y i = f ( x i ; θ ) nó có thể không lồi trong θ , đó là tình hình với hầu hết các mô hình phi tuyến tính, và chúng tôi thực sự quan tâm đến lồi trong θ vì đó là những gì chúng tôi đang tối ưu hóa các chức năng chi phí kết thúc.∑i(yi−y^i)2y^iy^i=f(xi;θ)θθ
Ví dụ, chúng ta hãy xem xét một mạng lưới với 1 lớp ẩn của đơn vị và một lớp đầu ra tuyến tính: hàm chi phí của chúng tôi là
g ( α , W ) = Σ i ( y i - α i σ ( W x i ) ) 2
nơi x i ∈ R pN
g(α,W)=∑i(yi−αiσ(Wxi))2
xi∈Rp và
(và tôi bỏ qua điều kiện thiên vị vì đơn giản). Điều này không nhất thiết là lồi khi được xem như là một hàm của
( α , W )W∈RN×p(α,W)(tùy thuộc vào
: nếu một chức năng kích hoạt tuyến tính được sử dụng thì đây vẫn có thể lồi). Và mạng lưới của chúng ta càng sâu thì càng ít thứ lồi lõm.
σ
Bây giờ hãy xác định hàm bởi h ( u , v ) = g ( α , W ( u , v ) ) trong đó W ( u , v ) là W với W 11 được đặt thành u và W 12 được đặt thành v . Điều này cho phép chúng ta hình dung hàm chi phí vì hai trọng số này khác nhau.h:R×R→Rh(u,v)=g(α,W(u,v))W(u,v)WW11uW12v
n=50p=3N=1xyN(0,1)
Đây là mã R mà tôi đã sử dụng để tạo ra con số này (mặc dù bây giờ một số tham số có giá trị hơi khác so với khi tôi tạo nó để chúng không giống nhau):
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])))