分类与回归
回归可以用于预测多少的问题。 比如预测房屋被售出价格,或者棒球队可能获得的胜场数,又或者患者住院的天数。事实上,我们也对分类问题感兴趣:不是问“多少”,而是问“哪一个”。
机器学习实践者用分类这个词来描述两个有微妙差别的问题:
-
- 我们只对样本的“硬性”类别感兴趣,即属于哪个类别;
-
- 我们希望得到“软性”类别,即得到属于每个类别的概率。 这两者的界限往往很模糊。其中的一个原因是:即使我们只关心硬类别,我们仍然使用软类别的模型。
Softmax 回归是一个多类分类模型使用, Softmax 操作子得到每个类的预测置信度,使用交叉熵来来衡量预测和标号的区别。
这里的真实概率分别为0和1:
损失函数
L2 loss 蓝色线是loss函数本身,绿色线是似然函数,橘红色是loss函数的梯度。梯度说明越远离准确估计,则梯度下降越快,权重更新快,这也是它的特性
L1 Loss 绝对值。三条线同上。同样,在远离0点的梯度下降速度一致,权重更新稳定。但是缺点是在真实值附近时,这个就不会很稳定
huber鲁棒loss,当预测值和真实值差距大的时候是一个绝对值误差,当预测值和真实值靠的近的时候,就是一个平方误差。这个loss就结合了两者的优势又避免了两者的劣势。
交叉熵损失函数: 表示为 ,这是一个衡量两个概率分布 和 差异的函数。公式是:
这里 是真实概率分布, 是预测概率分布,索引 遍历所有可能的类别。对于每个类别 ,将真实概率 与预测概率 的对数相乘,并对所有类别进行求和,然后取负数。
分类问题的损失函数: 用 表示,这是在实际的分类问题中用来计算单个样本损失的函数。公式是:
其中 是实际的标签的独热编码表示,而 是模型预测的概率分布。这个表达式计算的是真实标签对应的类别的预测概率的负对数。由于 是独热编码,因此除了正确类别的项,其他项因为 为0都不会对和产生贡献。所以,这个表达式简化为对单个正确类别的预测概率的负对数,即 ,其中 是正确类别的索引。
softmax代码
在softmax函数中,输入X
是一个二维张量(或者说矩阵),其中每一行代表一个样本,每一列代表一个类别。
在你的例子中,X
的形状是(2, 3)
,意味着有2个样本,每个样本有3个类别。
当你对X_exp
进行求和操作时:
X_exp.sum(1, keepdim=True)
:这是沿着列方向(即第1维,索引从0开始)进行求和,结果的形状是(2, 1)
。这意味着对每个样本的所有类别进行求和。
在softmax函数的最后,X_exp/partition
是对每个样本的所有特征值进行归一化,使得每个样本的所有特征值的和为1。这使得softmax的输出可以被解释为每个样本属于每个类别的概率。
代码实现:
1 | def softmax(X): |
花式索引:"
y
是一个包含两个类别标签的张量,而 y_hat
是一个包含两个样本对每个类别的预测概率的张量。
y_hat[[0, 1], y]
这行代码的作用是选择 y_hat
中对应于真实标签的预测概率。具体来说:
[0, 1]
是样本的索引。y
是每个样本的真实标签。
因此,y_hat[[0, 1], y]
选择了第0个样本的类别0的预测概率和第1个样本的类别2的预测概率,即 [y_hat[0,0], y_hat[1,2]]
。
1 | y = torch.tensor([0, 2]) |