Softmax回归 — Softmax Regression

之前讲过,对于二分类问题我们可以采用逻辑回归。逻辑回归通过 Logit Function \text{Logit Function} Logit Function x i x^i xi映射到 ( 0 , 1 ) (0,1) (0,1)的一个区间,可解释为事件 x i x^i xi发生的概率 p ( x i ; θ ) = 1 1 + e − θ T x i p(x_i; \theta) = \frac {1}{1+e^{-\theta^Tx_i}} p(xi;θ)=1+eθTxi1。而对于多分类问题 y i ∈ { 1 , 2 , … , K } y^i \in \{1, 2, \dots, K\} yi{1,2,,K} Softmax Regression \text{Softmax Regression} Softmax Regression采用同样的思路,同样是将 x i x^i xi映射到 ( 0 − 1 ) (0-1) (01)的区间上,计算 x i x^i xi发生的概率。不过, p ( x i ; θ ) p(x_i; \theta) p(xi;θ)的定义稍有不同:
p ( x i ; θ ) = P r ( y i = k ∣ x i ; θ ) = e θ ( k ) T x i ∑ j = 1 K e θ ( j ) T x i p(x_i; \theta) = Pr(y^i = k \vert x^i; \theta) = \frac {e^{{\theta^{(k)}}^T x^i}}{\sum\nolimits_{j=1}^K e^{{\theta^{(j)}}^T x^i}} p(xi;θ)=Pr(yi=kxi;θ)=j=1Keθ(j)Txieθ(k)Txi

其中,分子表示数据 x i ​ x^i​ xi属于类 k ​ k​ k的概率,分母表示其属于不同类的概率之和, p ( x i ; θ ) ∈ ( 0 , 1 ) ​ p(x_i; \theta) \in (0,1)​ p(xi;θ)(0,1)。为加快程序运行速度,在代码实现中通常会向量化上式:
p ( x i ; θ ) = [ P r ( y i = 1 ∣ x i ; θ ) P r ( y i = 2 ∣ x i ; θ ) ⋮ P r ( y i = K ∣ x i ; θ ) ] = 1 ∑ j = 1 K e θ ( j ) T x i [ e θ ( 1 ) T x i e θ ( 2 ) T x i ⋮ e θ ( K ) T x i ] p(x_i; \theta) = \begin{bmatrix} Pr(y^i = 1 \vert x^i; \theta) \\ Pr(y^i = 2 \vert x^i; \theta) \\ \vdots \\ Pr(y^i = K \vert x^i; \theta) \end{bmatrix} = \frac {1}{\sum\nolimits_{j=1}^K e^{{\theta^{(j)}}^T x^i}} \begin{bmatrix} e^{{\theta^{(1)}}^T x^i} \\ e^{{\theta^{(2)}}^T x^i} \\ \vdots \\ e^{{\theta^{(K)}}^T x^i} \end{bmatrix} p(xi;θ)=Pr(yi=1xi;θ)Pr(yi=2xi;θ)Pr(yi=Kxi;θ)=j=1Keθ(j)Txi1eθ(1)Txieθ(2)Txieθ(K)Txi

Softmax Regression \text{Softmax Regression} Softmax Regression最大似然函数为:
L ( θ ) = ∏ i = 1 m p ( x i ; θ ) 1 { y i = k } L(\theta) = \prod\limits_{i=1}^m p(x_i; \theta)^{1\{y^i=k\}} L(θ)=i=1mp(xi;θ)1{yi=k}

其中, 1 { ⋅ } 1\{ \cdot \} 1{}是指示函数, 1 { T r u e } = 1 ; 1 { F a l s e } = 0 1\{ True \} = 1; 1\{ False\} = 0 1{True}=1;1{False}=0。对数似然函数为:
l ( θ ) = log ⁡ L ( θ ) = ∑ i = 1 m 1 { y i = k } log ⁡ e θ ( k ) T x i ∑ j = 1 K e θ ( j ) T x i l(\theta) = \log L(\theta) = \sum\limits_{i=1}^m 1\{ y^i=k \} \log \frac {e^{{\theta^{(k)}}^T x^i}}{\sum\nolimits_{j=1}^K e^{{\theta^{(j)}}^T x^i}} l(θ)=logL(θ)=i=1m1{yi=k}logj=1Keθ(j)Txieθ(k)Txi

成本函数 J ( θ ) J(\theta) J(θ)定义为:
J ( θ ) = − l ( θ ) = − ∑ i = 1 m 1 { y i = k } log ⁡ e θ ( k ) T x i ∑ j = 1 K e θ ( j ) T x i J(\theta) = - l(\theta) = - \sum\limits_{i=1}^m 1\{ y^i=k \} \log \frac {e^{{\theta^{(k)}}^T x^i}}{\sum\nolimits_{j=1}^K e^{{\theta^{(j)}}^T x^i}} J(θ)=l(θ)=i=1m1{yi=k}logj=1Keθ(j)Txieθ(k)Txi

J ( θ ) J(\theta) J(θ) θ ( k ) \theta^{(k)} θ(k)求偏导:
∂ J ( θ ) ∂ θ ( k ) = ∂ ∂ θ ( k ) [ − ∑ i = 1 m 1 { y i = k } log ⁡ e θ ( k ) T x i ∑ j = 1 K e θ ( j ) T x i ] = ∂ ∂ θ ( k ) [ − ∑ i = 1 m 1 { y i = k } ( log ⁡ e θ ( k ) T x i − log ⁡ ∑ j = 1 K e θ ( j ) T x i ) ] = − ∑ i = 1 m ( 1 { y i = k } x i − e θ ( j ) T x i ∑ j = 1 K e θ ( j ) T x i x i ) = − ∑ i = 1 m x i ( 1 { y i = k } − e θ ( j ) T x i ∑ j = 1 K e θ ( j ) T x i ) = − ∑ i = 1 m x i ( 1 { y i = k } − P r ( y i = k ∣ x i ; θ ) ) \begin{aligned} & \frac {\partial J(\theta)}{\partial \theta^{(k)}} = \frac {\partial}{\partial \theta^{(k)}} [- \sum\limits_{i=1}^m 1\{ y^i=k \} \log \frac {e^{{\theta^{(k)}}^T x^i}}{\sum\nolimits_{j=1}^K e^{{\theta^{(j)}}^T x^i}}] \\ & = \frac {\partial}{\partial \theta^{(k)}} [- \sum\limits_{i=1}^m 1\{ y^i=k \} (\log e^{{\theta^{(k)}}^T x^i} - \log {\sum\nolimits_{j=1}^K e^{{\theta^{(j)}}^T x^i}})] \\ & = - \sum\limits_{i=1}^m (1\{ y^i=k \} x^i - \frac {e^{{\theta^{(j)}}^T x^i}}{\sum\nolimits_{j=1}^K e^{{\theta^{(j)}}^T x^i}} x^i) \\ & = - \sum\limits_{i=1}^m x^i(1\{ y^i=k \} - \frac {e^{{\theta^{(j)}}^T x^i}}{\sum\nolimits_{j=1}^K e^{{\theta^{(j)}}^T x^i}}) \\ & = - \sum\limits_{i=1}^m x^i(1\{ y^i=k \} - Pr(y^i = k \vert x^i; \theta)) \end{aligned} θ(k)J(θ)=θ(k)[i=1m1{yi=k}logj=1Keθ(j)Txieθ(k)Txi]=θ(k)[i=1m1{yi=k}(logeθ(k)Txilogj=1Keθ(j)Txi)]=i=1m(1{yi=k}xij=1Keθ(j)Txieθ(j)Txixi)=i=1mxi(1{yi=k}j=1Keθ(j)Txieθ(j)Txi)=i=1mxi(1{yi=k}Pr(yi=kxi;θ))

最后,通过梯度下降求 J ( θ ) J(\theta) J(θ)最小化时 θ ( k ) \theta^{(k)} θ(k)的近似解:
θ ( k ) : = θ ( k ) − α ∂ J ( θ ) ∂ θ ( k ) \theta^{(k)} := \theta^{(k)} - \alpha \frac {\partial J(\theta)}{\partial \theta^{(k)}} θ(k):=θ(k)αθ(k)J(θ)

将上式写成向量形式,即: θ = θ − α ▽ J ( θ ) \theta = \theta - \alpha \bigtriangledown J(\theta) θ=θαJ(θ)

PyTorch是一个流行的深度学习框架,用于实现各种机器学习模型,包括softmax回归softmax回归常用于分类任务,它将每个输入映射到概率分布上,表示样本属于各个类别的可能性。 以下是在PyTorch中实现简单softmax回归的基本步骤: 1. 导入所需库: ```python import torch from torch import nn ``` 2. 定义模型:创建一个只有一个权重的线性层,然后跟一个Softmax函数作为激活, Softmax函数会把输出转换成概率分布。 ```python class SoftmaxRegression(nn.Module): def __init__(self, input_size, output_size): super(SoftmaxRegression, self).__init__() self.linear = nn.Linear(input_size, output_size) def forward(self, x): out = self.linear(x) return torch.softmax(out, dim=1) # dim=1 表示沿着第二个维度(列)计算softmax ``` 3. 初始化模型和优化器: ```python input_size = ... # 根据数据集特征确定 output_size = ... # 类别数 model = SoftmaxRegression(input_size, output_size) optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 使用随机梯度下降优化器 ``` 4. 训练过程: ```python for epoch in range(num_epochs): # Forward pass: 前向传播计算预测值 outputs = model(inputs) # Compute loss loss = nn.CrossEntropyLoss()(outputs, labels) # Backward and optimize optimizer.zero_grad() # 清零梯度 loss.backward() optimizer.step() # 更新参数 ``` 5. 测试模型: ```python with torch.no_grad(): # 禁止追踪梯度,仅用于测试阶段 predictions = model(test_data) _, predicted_labels = torch.max(predictions.data, 1) # 获取最大概率对应的类别 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值