Что здесь происходит, когда я использую квадрат потерь в настройке логистической регрессии?

16

Я пытаюсь использовать квадратичные потери, чтобы выполнить двоичную классификацию для набора данных игрушек.

Я использую mtcarsнабор данных, использую милю на галлон и вес, чтобы предсказать тип передачи. На приведенном ниже графике показаны два типа данных типа передачи в разных цветах и ​​границы решения, сформированные различными функциями потерь. Квадратный убыток равен где - метка истинности земли (0 или 1), а - прогнозируемая вероятность . Другими словами, я заменяю логистические потери квадратом потерь в настройках классификации, остальные части такие же.y i p i p i = Logit - 1 ( β T x i )Σя(Yя-пя)2yipяпязнак равноLogit-1(βTИкся)

Для игрушечного примера с 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))
Haitao Du
источник
1
Возможно, случайное начальное значение плохое. Почему бы не выбрать лучший?
whuber
1
@whuber логистические потери выпуклые, поэтому запуск не имеет значения. как насчет квадрата потерь на р и у? это выпукло?
Haitao Du
5
Я не могу воспроизвести то, что вы описываете. optimговорит вам, что это еще не закончено, вот и все: это сходится. Вы можете многому научиться, перезапустив свой код с дополнительным аргументом control=list(maxit=10000), построив график его подгонки и сравнив его коэффициенты с исходными.
whuber
2
@amoeba спасибо за ваши комментарии, я пересмотрел вопрос. надеюсь, это лучше.
Haitao Du
@amoeba Я пересмотрю легенду, но это утверждение не исправит (3)? «Я использую набор данных mtcars, использую милю на галлон и вес, чтобы предсказать тип передачи. На приведенном ниже графике показаны два типа данных типа передачи в разных цветах и ​​граница решения, сгенерированная различными функциями потерь».
Haitao Du

Ответы:

19

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

Давайте получим некоторые обозначения. Пусть LS(yi,y^i)=12(yiy^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^ but Y has dropped out, and HL is PSD. Thus our optimization problem is convex in b.


Let's compare this to least squares.

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).

jld
источник
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 параметры, которые лучше для визуализации.

Вот демо

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

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

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

Из контура мы можем легко увидеть, почему оптимизация квадрата потерь сложнее: как уже упоминал Чакон, он не выпуклый.

Вот еще один вид из 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')
Haitao Du
источник
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