Softmax回归

161 阅读1分钟

Softmax函数

softmax回归这个名字虽然有回归二字,其实是用于分类问题的。softmax函数能够将未规范化的预测变换为非负数并且总和为1,同时让模型保持可导的性质。

  • 我们首先对每个未规范化的预测求幂,这样可以确保输出非负
  • 为了确保最终输出的概率值总和为1,我们再让每个求幂后的结果除以它们的总和。
y=softmax(o), 其中yj=exp(oj)kexp(ok)y^{\prime} = softmax(o), \ 其中y_j^{\prime} = \frac{exp(o_j)}{\sum_{k}exp(o_k)}

尽管softmax是一个非线性函数,但softmax回归的输出仍然由输入特征的仿射变换决定。 因此,softmax回归是一个线性模型

交叉熵损失函数

表达式

二分类

L=1Niyilog(pi)+(1yi)log(1pi)L = -\frac{1}{N}\sum_{i}y_i * log(p_i) + (1-y_i) * log(1-p_i)
  • yiy_i: 样本i的label, 1 or 0
  • pip_i: 样本i的为1的概率

多分类

L=1Nic=1Myiclog(pic)L = -\frac{1}{N}\sum_{i}\sum_{c=1}^{M}y_{ic} * log({p_{ic}})
  • yicy_{ic}: 样本i是否为类别c
  • picp_{ic}: 样本i为类别c的概率
  • MM: 类别总数

Softmax的手工实现

import torch

def softmax(X):
    X_exp = torch.exp(X)
    partition = X_exp.sum(dim=1, keepdim=True)
    return X_exp / partition
    
def cross_entropy(y_hat, y):
    return - torch.log(y_hat[range(len(y_hat)), y])