← Voltar pra playlist

Erro Quadrático Não Serve Aqui: a Perda Logística

Toda a base de regressão linear até aqui usou o erro quadrático como função de custo, uma tigela lisa e bem-comportada onde gradiente descendente sempre acha o fundo. A tentação óbvia é reaproveitar a mesma ideia pra regressão logística: pega a saída da sigmoide e mede o erro quadrático dela contra o rótulo. Esse lab mostra, com número real, por que essa tentação é uma armadilha.

Reaproveitando o erro quadrático (e uma pista de que vai dar ruim)

J(w,b)=12m∑i=0m−1(fw,b(x(i))−y(i))2,fw,b(x(i))=sigmoid(wx(i)+b)J(w,b) = \frac{1}{2m}\sum_{i=0}^{m-1}\left(f_{w,b}(x^{(i)})-y^{(i)}\right)^2, \quad f_{w,b}(x^{(i)}) = \text{sigmoid}(wx^{(i)}+b)

Mesma fórmula de sempre, só que agora f já passou pela sigmoide antes de entrar na conta. Fixei b=-3 (perto de onde um ajuste bom pra esse dado acaba caindo) e variei w:

wcusto (erro quadrático + sigmoide)
1.00.0354
1.10.0284
1.20.0247
1.30.0235
1.40.0243
1.60.0304
2.00.0509
5.00.1480
10.00.1667
15.00.1669
20.00.1669

Repara nas últimas linhas: de w=10 até w=20, o custo praticamente não muda (0.1667 → 0.1669). Não é coincidência, é a sigmoide saturando: pra w grande, sigmoid(wx+b) já está tão perto de 0 ou 1 que aumentar w ainda mais quase não move a saída, e por tabela quase não move o custo. O gradiente nessa região é minúsculo. Gradiente descendente, se cair aí, mal se mexe.

Gira o gráfico abaixo e compara com a tigela lisa da regressão linear: não é mais uma superfície simétrica com um fundo único e bem definido, tem dobras e um platô extenso onde a inclinação quase some.

Erro quadrático não é uma má ideia em si, ele só assume implicitamente que o ruído nos dados é bem-comportado (gaussiano), o que faz sentido pra prever um número contínuo. Colado numa sigmoide, essa suposição quebra, e a superfície de custo perde a garantia de ser uma tigela única. Precisa de uma função de perda pensada especificamente pra classificação.

A perda logística: pune forte quando erra com convicção

A ideia por trás da perda logística é simples de explicar sem fórmula nenhuma primeiro: se o rótulo certo é 1, eu quero punir pesado quando o modelo disse "quase certeza que é 0", e quase não punir quando ele disse "quase certeza que é 1". E vice-versa pro rótulo 0. A fórmula, em duas partes:

loss(fw,b(x(i)),y(i))={−log⁡(fw,b(x(i)))se y(i)=1−log⁡(1−fw,b(x(i)))se y(i)=0loss(f_{w,b}(x^{(i)}), y^{(i)}) = \begin{cases} -\log\left(f_{w,b}(x^{(i)})\right) & \text{se } y^{(i)}=1 \\ -\log\left(1-f_{w,b}(x^{(i)})\right) & \text{se } y^{(i)}=0 \end{cases}

Olha a curva azul (y=1): quando f está perto de 1 (modelo acertou com confiança), a perda cai pra quase 0. Quando f está perto de 0 (modelo errou feio, disse "quase certeza que não" pro caso que era sim), a perda explode, tende a infinito. A curva vermelha (y=0) é o espelho exato, virada ao contrário. Diferente da parábola do erro quadrático, essas curvas nunca ficam achatadas: sempre têm inclinação, então gradiente descendente sempre tem uma direção clara pra seguir, por pior que a previsão esteja.

Uma linha só, pra programar

Duas fórmulas separadas por if são chatas de programar. Como y só vale 0 ou 1, dá pra combinar as duas num único código, usando y e (1-y) como interruptores que ligam e desligam cada termo:

loss=−y(i)log⁡(fw,b(x(i)))−(1−y(i))log⁡(1−fw,b(x(i)))loss = -y^{(i)}\log\left(f_{w,b}(x^{(i)})\right) - (1-y^{(i)})\log\left(1-f_{w,b}(x^{(i)})\right)

Quando y=1, o segundo termo zera (1-1=0) e sobra só -log(f). Quando y=0, o primeiro termo zera e sobra só -log(1-f). A mesma linha de código cobre os dois casos, sem if nenhum.

Fechando

O que eu já sabiaO que essa aula assentou
Erro quadrático dá uma tigela lisa pra regressão linearErro quadrático + sigmoide não dá mais uma tigela, tem platôs onde o gradiente quase some
Uma função de perda mede o erro de um exemplo sóA perda logística pune forte erro confiante e quase nada acerto confiante, sem nunca ficar achatada
if/else separa casosy e (1-y) como interruptores combinam os dois casos numa fórmula só, sem if

Aplicação Prática

Usando o modelo logístico já ajustado no lab da sigmoide (w=3.9565, b=-1.1326, variável worst concave points), calculo a perda de três pacientes reais do conjunto de teste, escolhidos pra mostrar os dois extremos e o meio:

for nome, x, y_real in pacientes:
    f = sigmoid(w*x + b)
    loss = -y_real*np.log(f) - (1-y_real)*np.log(1-f)
    print(f"{nome}: f={f:.4f} loss={loss:.4f}")

Saída:

Pacienteworst concave pointsy realf(x)perda
Maligno claro0.286710.99990.0001
Benigno claro0.000000.00030.0003
Ambíguo0.133500.50970.7127

Os dois primeiros pacientes o modelo acerta com convicção total, a perda deles é praticamente zero. O terceiro é o caso ambíguo, bem em cima da fronteira de decisão (o modelo achou 51% de chance de ser maligno, mas o paciente era benigno), e a perda dele sozinho (0.7127) já é maior que a soma dos outros dois juntos. É exatamente esse tipo de ponto, perto da fronteira e classificado errado, que mais empurra o ajuste durante o treino, porque é ele que carrega a perda alta.