Що відбувається тут, коли я використовую квадратичні втрати для налаштування логістичної регресії?


16

Я намагаюся використовувати збиток у квадраті, щоб зробити бінарну класифікацію набору даних про іграшки.

Я використовую mtcarsнабір даних, використовуйте милю на галон і вагу для прогнозування типу передачі. На графіку нижче показані два типи даних передачі різних кольорів та межа прийняття рішення, породжена різними функціями втрат. Збиток у квадраті - де - мітка правди (0 або 1), а - прогнозована ймовірність . Іншими словами, я замінюю логістичні втрати квадратними втратами в класифікаційній установці, інші частини - ті ж.y i p i p i = Logit - 1 ( β T x i )i(yipi)2yipipi=Логіт-1(βТхi)

Для іграшкового прикладу з mtcarsданими, у багатьох випадках я отримав модель, «подібну» до логістичної регресії (див. Наступну рисунок із випадковим насінням 0).

введіть тут опис зображення

Але в деяких випадках (якщо ми це зробимо set.seed(1)), збиток у квадраті, здається, не працює добре. введіть тут опис зображення Що тут відбувається? Оптимізація не сходиться? Логістичні втрати простіше оптимізувати порівняно із збитками у квадраті? Будь-яка допомога буде вдячна.


Код

d=mtcars[,c("am","mpg","wt")]
plot(d$mpg,d$wt,col=factor(d$am))
lg_fit=glm(am~.,d, family = binomial())
abline(-lg_fit$coefficients[1]/lg_fit$coefficients[3],
       -lg_fit$coefficients[2]/lg_fit$coefficients[3])
grid()

# sq loss
lossSqOnBinary<-function(x,y,w){
  p=plogis(x %*% w)
  return(sum((y-p)^2))
}

# ----------------------------------------------------------------
# note, this random seed is important for squared loss work
# ----------------------------------------------------------------
set.seed(0)

x0=runif(3)
x=as.matrix(cbind(1,d[,2:3]))
y=d$am
opt=optim(x0, lossSqOnBinary, method="BFGS", x=x,y=y)

abline(-opt$par[1]/opt$par[3],
       -opt$par[2]/opt$par[3], lty=2)
legend(25,5,c("logisitc loss","squared loss"), lty=c(1,2))

1
Можливо, випадкове початкове значення є поганим. Чому б не вибрати кращого?
whuber

1
@whuber логістичні втрати опуклі, тому починати значення не має. як щодо втрат у квадраті на p і y? це опуклий?
Haitao Du

5
Я не в змозі відтворити те, що ви описуєте. optimговорить вам, що він ще не закінчився, ось і все: це сходиться. Ви можете багато чого навчитися, скоригувавши свій код додатковим аргументом control=list(maxit=10000), побудувавши його відповідність та порівнявши його коефіцієнти з вихідними.
whuber

2
@amoeba дякую за ваші коментарі, я переглянув питання. сподіваємось, що краще.
Haitao Du

@amoeba Я перегляну легенду, але це твердження не виправить (3)? "Я використовую набір даних mtcars, використовуйте милю на галон і вагу для прогнозування типу передачі. На графіку нижче показані два типи даних передачі різних кольорів та межа прийняття рішення, породжена різною функцією втрати."
Haitao Du

Відповіді:


19

Схоже, ви вирішили цю проблему у вашому конкретному прикладі, але я думаю, що все-таки варто уважніше вивчити різницю між найменшими квадратами та максимально можливою логістичною регресією.

Давайте отримаємо деяке позначення. Нехай LS(уi,у^i)=12(уi-у^i)2 іLL(yi,y^i)=yilogy^i+(1yi)log(1y^i) . Якщо ми робимо максимальну ймовірність (або мінімальний журнал ймовірність негативногояк я роблю тут), ми маємо & beta ; L : = argmin б R

β^L:=argminbRpi=1nyilogg1(xiTb)+(1yi)log(1g1(xiTb))
причомуgє нашою функцією зв'язку.

Як альтернативи ми маємо & beta ; S : = argmin б R р 1

β^S:=argminbRp12i=1n(yig1(xiTb))2
як найменший розчин квадратів. Таким чином , β SмінімізуєLSі аналогічно дляLL.β^SLSLL

Нехай fS і fL - цільові функції, що відповідають мінімізації LS іLL , відповіднояк це робиться для бета S і & beta ; L . Нехайнарешті, ч = г - 1 , так у я = ч ( х Т я б ) . Зауважте, що якщо ми використовуємо канонічне посилання, у нас h ( z ) = 1β^Sβ^Lh=g1y^i=h(xiTb)

h(z)=11+ezh(z)=h(z)(1h(z)).


Для регулярної логістичної регресії ми маємо

fLbj=i=1nh(xiTb)xij(yih(xiTb)1yi1h(xiTb)).
Використовуючиh=h(1h)ми можемо спростити це до
fLbj=i=1nxij(yi(1y^i)(1yi)y^i)=i=1nxij(yiy^i)
тому
fL(b)=XT(YY^).

Далі зробимо другі похідні. Гессієць

HL:=2fLbjbk=i=1nxijxiky^i(1y^i).
Це означаєщоHL=XTAXде=Diag( У (1 - Y )). Нлдійсно залежить від поточних значеньA=diag(Y^(1Y^))HLY^ алеYвипало, аHL- PSD. Таким чином, наша проблема оптимізації випукла вb.


Порівняймо це з найменшими квадратами.

fSbj=i=1n(yiy^i)h(xiTb)xij.

This means we have

fS(b)=XTA(YY^).
This is a vital point: the gradient is almost the same except for all i y^i(1y^i)(0,1) so basically we're flattening the gradient relative to fL. This'll make convergence slower.

For the Hessian we can first write

fSbj=i=1nxij(yiy^i)y^i(1y^i)=i=1nxij(yiy^i(1+yi)y^i2+y^i3).

This leads us to

HS:=2fSbjbk=i=1nxijxikh(xiTb)(yi2(1+yi)y^i+3y^i2).

Let B=diag(yi2(1+yi)y^i+3y^i2). We now have

HS=XTABX.

Unfortunately for us, the weights in B are not guaranteed to be non-negative: if yi=0 then yi2(1+yi)y^i+3y^i2=y^i(3y^i2) which is positive iff y^i>23. Similarly, if yi=1 then yi2(1+yi)y^i+3y^i2=14y^i+3y^i2 which is positive when y^i<13 (it's also positive for y^i>1 but that's not possible). This means that HS is not necessarily PSD, so not only are we squashing our gradients which will make learning harder, but we've also messed up the convexity of our problem.


All in all, it's no surprise that least squares logistic regression struggles sometimes, and in your example you've got enough fitted values close to 0 or 1 so that y^i(1y^i) can be pretty small and thus the gradient is quite flattened.

Connecting this to neural networks, even though this is but a humble logistic regression I think with squared loss you're experiencing something like what Goodfellow, Bengio, and Courville are referring to in their Deep Learning book when they write the following:

One recurring theme throughout neural network design is that the gradient of the cost function must be large and predictable enough to serve as a good guide for the learning algorithm. Functions that saturate (become very flat) undermine this objective because they make the gradient become very small. In many cases this happens because the activation functions used to produce the output of the hidden units or the output units saturate. The negative log-likelihood helps to avoid this problem for many models. Many output units involve an exp function that can saturate when its argument is very negative. The log function in the negative log-likelihood cost function undoes the exp of some output units. We will discuss the interaction between the cost function and the choice of output unit in Sec. 6.2.2.

and, in 6.2.2,

Unfortunately, mean squared error and mean absolute error often lead to poor results when used with gradient-based optimization. Some output units that saturate produce very small gradients when combined with these cost functions. This is one reason that the cross-entropy cost function is more popular than mean squared error or mean absolute error, even when it is not necessary to estimate an entire distribution p(y|x).

(both excerpts are from chapter 6).


1
I really like you helped me to derive the derivative and hessian. I will check it more careful tomorrow.
Haitao Du

1
@hxd1011 you're very welcome, and thanks for the link to that older question of yours! I've really been meaning to go through this more carefully so this was a great excuse :)
jld

1
I carefully read the math and verified with code. I found Hessian for squared loss does not match the numerical approximation. Could you check it? I am more than happy to show you the code if you want.
Haitao Du

@hxd1011 I just went through the derivation again and I think there's a sign error: for HS I think everywhere that I have yi2(1yi)y^i+3y^i2 it should be yi2(1+yi)y^i+3y^i2. Could you recheck and tell me if that fixes it? Thanks a lot for the correction.
jld

@hxd1011 glad that fixed it! thanks again for finding that
jld

5

Я хотів би подякувати @whuber та @Chaconne за допомогу. Особливо @Chaconne, ця деривація - це те, що я хотіла роками.

Проблема полягає в оптимізаційній частині. Якщо ми встановимо випадкове насіння в 1, BFGS за замовчуванням не буде працювати. Але якщо ми змінимо алгоритм і змінимо максимальне ітераційне число, воно запрацює знову.

Як зазначалося @Chaconne, проблема класифікації втрат для класифікації не випукла і важче оптимізувати. Щоб додати математику @ Chaconne, я хотів би представити деякі візуалізації щодо логістичних втрат та втрат у квадраті.

Ми змінимо демо-дані mtcars, оскільки оригінальний приклад іграшки є3коефіцієнти, включаючи перехоплення. Ми будемо використовувати інший набір даних про іграшки, згенерований mlbenchу цьому наборі даних2 параметри, що краще для візуалізації.

Ось демонстрація

  • Дані показані на лівій фігурі: у нас є два класи у двох кольорах. x, y - це дві функції для даних. Крім того, ми використовуємо червону лінію для представлення лінійного класифікатора від логістичних втрат, а синя лінія - лінійний класифікатор від квадратних втрат.

  • Середня і права цифра показують контур логістичних втрат (червоний) та втрати у квадраті (синій). x, y - два параметри, які нам підходять. Крапка - оптимальна точка, знайдена BFGS.

введіть тут опис зображення

З контуру ми можемо легко зрозуміти, як оптимізувати втрати в квадраті складніше: як згадував Chaconne, він не випуклий.

Ось ще один погляд з persp3d.

введіть тут опис зображення


Код

set.seed(0)
d=mlbench::mlbench.2dnormals(50,2,r=1)
x=d$x
y=ifelse(d$classes==1,1,0)

lg_loss <- function(w){
  p=plogis(x %*% w)
  L=-y*log(p)-(1-y)*log(1-p)
  return(sum(L))
}
sq_loss <- function(w){
  p=plogis(x %*% w)
  L=sum((y-p)^2)
  return(L)
}

w_grid_v=seq(-15,15,0.1)
w_grid=expand.grid(w_grid_v,w_grid_v)

opt1=optimx::optimx(c(1,1),fn=lg_loss ,method="BFGS")
z1=matrix(apply(w_grid,1,lg_loss),ncol=length(w_grid_v))

opt2=optimx::optimx(c(1,1),fn=sq_loss ,method="BFGS")
z2=matrix(apply(w_grid,1,sq_loss),ncol=length(w_grid_v))

par(mfrow=c(1,3))
plot(d,xlim=c(-3,3),ylim=c(-3,3))
abline(0,-opt1$p2/opt1$p1,col='darkred',lwd=2)
abline(0,-opt2$p2/opt2$p1,col='blue',lwd=2)
grid()
contour(w_grid_v,w_grid_v,z1,col='darkred',lwd=2, nlevels = 8)
points(opt1$p1,opt1$p2,col='darkred',pch=19)
grid()
contour(w_grid_v,w_grid_v,z2,col='blue',lwd=2, nlevels = 8)
points(opt2$p1,opt2$p2,col='blue',pch=19)
grid()


# library(rgl)
# persp3d(w_grid_v,w_grid_v,z1,col='darkred')

2
I don't see any non-convexity on the third subplot of your first figure...
amoeba says Reinstate Monica

@amoeba I thought convex contour is more like ellipse, two U shaped curve back to back is non-convex, is that right?
Haitao Du

2
No, why? Maybe it's a part of a larger ellipse-like contour? I mean, it might very well be non-convex, I am just saying that I do not see it on this particular figure.
amoeba says Reinstate Monica
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.