O que está acontecendo aqui, quando uso perda ao quadrado na configuração de regressão logística?

16

Estou tentando usar a perda ao quadrado para fazer a classificação binária em um conjunto de dados de brinquedo.

Estou usando o mtcarsconjunto de dados, use milhas por galão e peso para prever o tipo de transmissão. O gráfico abaixo mostra os dois tipos de dados do tipo de transmissão em cores diferentes e o limite de decisão gerado por diferentes funções de perda. A perda ao quadrado é que é o rótulo de verdade fundamental (0 ou 1) e é a probabilidade prevista . Em outras palavras, substituo a perda logística pela perda ao quadrado na configuração de classificação, outras partes são iguais.i(yipi)2yipipi=Logit1(βTxi)

Para um exemplo de brinquedo com mtcarsdados, em muitos casos, recebi um modelo "semelhante" à regressão logística (veja a figura a seguir, com semente aleatória 0).

insira a descrição da imagem aqui

Mas em algumas situações (se o fizermos set.seed(1)), a perda ao quadrado parece não estar funcionando bem. insira a descrição da imagem aqui O que esta acontecendo aqui? A otimização não converge? A perda logística é mais fácil de otimizar em comparação com a perda ao quadrado? Qualquer ajuda seria apreciada.


Código

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
fonte
1
Talvez o valor inicial aleatório seja ruim. Por que não escolher um melhor?
whuber
1
A perda logística do @whuber é convexa, portanto, iniciar não importa. e quanto à perda ao quadrado em p e y? é convexo?
Haitao Du
5
Não consigo reproduzir o que você descreve. optimdiz que não terminou, é tudo: está convergindo. Você pode aprender muito reexecutando seu código com o argumento adicional control=list(maxit=10000), plotando seu ajuste e comparando seus coeficientes com os originais.
whuber
2
@amoeba obrigado por seus comentários, eu revisei a pergunta. espero que seja melhor.
Haitao Du
@amoeba Vou revisar a lenda, mas esta declaração não irá corrigir (3)? "Estou usando o conjunto de dados mtcars, use milhas por galão e peso para prever o tipo de transmissão. O gráfico abaixo mostra os dois tipos de dados do tipo de transmissão em cores diferentes e o limite de decisão gerado por diferentes funções de perda."
Haitao Du

Respostas:

19

Parece que você resolveu o problema em seu exemplo específico, mas acho que ainda vale a pena um estudo mais cuidadoso da diferença entre mínimos quadrados e regressão logística de máxima probabilidade.

Vamos fazer uma anotação. Seja e . Se estivermos fazendo a máxima probabilidade (ou mínima probabilidade de log negativo como estou fazendo aqui), teremos com sendo nossa função de ligação .LS(yi,y^i)=12(yiy^i)2LL(yi,y^i)=yilogy^i+(1yi)log(1y^i) β G:=argminb R p- n i=1yi

β^L:=argminbRpi=1nyilogg1(xiTb)+(1yi)log(1g1(xiTb))
g

Como alternativa, temos como a solução dos mínimos quadrados. Assim, minimiza e da mesma forma para .

β^S: =argminbRp12Eu=1n(yEu-g-1(xEuTb))2
β SGSGGβ^SeuSeueu

Seja e as funções objetivas correspondentes à minimização de e respectivamente, como é feito para e . Finalmente, deixe so . Observe que, se estivermos usando o link canônico, temos fSfeueuSeueuβ S β L h = g - 1 y i = h ( x t i b ) H ( z ) = 1β^Sβ^euh=g-1y^Eu=h(xEuTb)

h(z)=11+e-zh(z)=h(z)(1-h(z)).


Para regressão logística regular, temos Usando , podemos simplificar isso para então

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

Em seguida, vamos fazer as derivadas secundárias. The Hessian

HL:=2fLbjbk=i=1nxijxiky^i(1y^i).
Isso significa que onde . depende dos valores atuais ajustados mas caiu, e é PSD. Portanto, nosso problema de otimização é convexo em .HL=XTAXA=diag(Y^(1Y^))HLY^YHLb


Vamos comparar isso com mínimos quadrados.

fSbj=-Eu=1n(yEu-y^Eu)h(xEuTb)xEuj.

Isso significa que temos Este é um ponto vital: o gradiente é quase o mesmo, exceto por todos os portanto, basicamente estamos nivelando o gradiente em relação a . Isso tornará a convergência mais lenta.

fS(b)=-XTUMA(Y-Y^).
Eu y^i(1y^i)(0,1)fL

Para o Hessiano, primeiro podemos escrever

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

Isso nos leva a

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

Seja . Agora temos B=diag(yi2(1+yi)y^i+3y^i2)

HS=XTABX.

Infelizmente para nós, não é garantido que os pesos em sejam negativos: se então que é positivo se . Da mesma forma, se então que é positivo quando (também é positivo para mas isso não é possível). Isso significa que não é necessariamente PSD, então não apenas estamos esmagando nossos gradientes, o que tornará o aprendizado mais difícil, mas também confundimos a convexidade do nosso problema.Byi=0yi2(1+yi)y^i+3y^i2=y^i(3y^i2)y^i>23yEu=1yEu-2(1+yEu)y^Eu+3y^Eu2=1-4y^Eu+3y^Eu2y^Eu<13y^Eu>1HS


Em suma, não é nenhuma surpresa que a regressão logística dos mínimos quadrados às vezes lute, e no seu exemplo você tem valores ajustados suficientes próximos de ou para que possa ser bem pequeno e, portanto, o gradiente é bastante achatado.0 01y^Eu(1-y^Eu)

Conectando isso a redes neurais, mesmo que seja apenas uma humilde regressão logística, acho que com a perda ao quadrado, você está experimentando algo como o que Goodfellow, Bengio e Courville estão se referindo em seu livro Deep Learning quando escrevem o seguinte:

Um tema recorrente no design de redes neurais é que o gradiente da função de custo deve ser grande e previsível o suficiente para servir como um bom guia para o algoritmo de aprendizado. As funções que saturam (tornam-se muito planas) minam esse objetivo porque tornam o gradiente muito pequeno. Em muitos casos, isso acontece porque as funções de ativação usadas para produzir a saída das unidades ocultas ou as unidades de saída saturam. A probabilidade de log negativa ajuda a evitar esse problema em muitos modelos. Muitas unidades de saída envolvem uma função exp que pode saturar quando seu argumento é muito negativo. A função de log na função de custo de probabilidade de log negativo desfaz a exp de algumas unidades de saída. Discutiremos a interação entre a função de custo e a escolha da unidade de saída no segundo. 6.2.2

e, em 6.2.2,

Infelizmente, o erro quadrado médio e o erro absoluto médio geralmente levam a resultados ruins quando usados ​​com a otimização baseada em gradiente. Algumas unidades de saída que saturam produzem gradientes muito pequenos quando combinadas com essas funções de custo. Esse é um dos motivos pelos quais a função de custo da entropia cruzada é mais popular que o erro médio quadrático ou o erro absoluto médio, mesmo quando não é necessário estimar uma distribuição inteira .p(y|x)

(ambos os trechos são do capítulo 6).

jld
fonte
1
Eu realmente gosto que você me ajudou a derivar o derivado e o hessian. Vou verificar com mais cuidado amanhã.
Haitao Du 02/02
1
@ hxd1011, de nada, e obrigado pelo link dessa sua pergunta mais antiga! Eu tenho realmente o que significa que passar por isso com mais cuidado, que foi uma ótima desculpa :)
JLD
1
Eu li atentamente a matemática e verifiquei com o código. Eu achei Hessian para perda ao quadrado não corresponde à aproximação numérica. Pode verificar? Fico feliz em mostrar o código, se você quiser.
Haitao Du
@ hxd1011 Acabei de passar pela derivação novamente e acho que há um erro de sinal: para , acho que em todos os lugares que tenho , deve ser . Você poderia verificar novamente e me dizer se isso corrige? Muito obrigado pela correção. HSyEu-2(1-yEu)y^Eu+3y^Eu2yEu-2(1+yEu)y^Eu+3y^Eu2
JLD
@ hxd1011 feliz que corrigiu isso! obrigado novamente para descobrir que
JLD
5

Agradeço a @whuber e @Chaconne pela ajuda. Especialmente @Chaconne, essa derivação é o que eu queria ter há anos.

O problema está na parte de otimização. Se definirmos a semente aleatória como 1, o BFGS padrão não funcionará. Mas se alterarmos o algoritmo e alterar o número máximo de iterações, ele funcionará novamente.

Como o @Chaconne mencionou, o problema é que a perda ao quadrado da classificação não é convexa e é mais difícil de otimizar. Para adicionar à matemática de @ Chaconne, gostaria de apresentar algumas visualizações sobre a perda logística e a perda ao quadrado.

Mudaremos os dados de demonstração de mtcars, uma vez que o exemplo original de brinquedo possui coeficientes, incluindo a interceptação. Usaremos outro conjunto de dados de brinquedo gerado a partir de , nesse conjunto de dados, parâmetros, o que é melhor para visualização.3mlbench2

Aqui está a demo

  • Os dados são mostrados na figura da esquerda: temos duas classes em duas cores. x, y são dois recursos para os dados. Além disso, usamos a linha vermelha para representar o classificador linear da perda logística, e a linha azul representa o classificador linear da perda ao quadrado.

  • A figura do meio e a figura à direita mostram o contorno da perda logística (vermelho) e da perda ao quadrado (azul). x, y são dois parâmetros que estamos ajustando. O ponto é o ponto ideal encontrado pelo BFGS.

insira a descrição da imagem aqui

A partir do contorno, podemos ver facilmente como é mais difícil otimizar a perda ao quadrado: como Chaconne mencionou, é não convexo.

Aqui está mais uma visão do persp3d.

insira a descrição da imagem aqui


Código

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
fonte
2
Eu não vejo nenhuma não-convexidade na terceira subtrama da sua primeira figura ...
ameba diz Reinstate Monica
@amoeba Eu pensei que o contorno convexo é mais parecido com elipse, duas curvas em forma de U de costas para trás não são convexas, certo?
Haitao Du
2
Não por que? Talvez seja parte de um contorno maior como uma elipse? Quero dizer, pode muito bem não ser convexo, estou apenas dizendo que não o vejo nesta figura em particular.
Ameba diz Reinstate Monica