class TorchModel(nn.Module): def __init__(self, input_size): super(TorchModel, self).__init__() self.linear = nn.Linear(input_size, 1) # 线性层 self.activation = torch.sigmoid # nn.Sigmoid() sigmoid归一化函数 self.loss = nn.functional.mse_loss # loss函数采用均方差损失
分析这个
这个模型就像是一个「简易天气预报员」,
这个模型的核心功能是:输入一组特征,输出一个 0~1 之间的概率值,用于二分类任务。
- 输入:今天的温度、湿度、气压等特征。
- 输出:明天下雨的概率(0.7 表示 70% 概率下雨)。
- 用途:判断是否属于某个类别(例如下雨 / 不下雨)。
- 作用:给输入特征打分。
- 计算:
分数 = 特征1×权重1 + 特征2×权重2 + ... + 偏置。
- 类比:
- 输入:[温度 25℃, 湿度 80%, 气压 1010hPa]。
- 线性层计算:
分数 = 25×0.1 + 80×0.2 + 1010×(-0.001) + 0.5 = 16.9。
- 这里的权重(0.1, 0.2, -0.001)和偏置(0.5)是模型学习的参数。
- 作用:把分数压缩成 0~1 的概率。
- 计算:
概率 = 1 / (1 + e^(-分数))。
- 类比:
- 输入分数 16.9 →
e^(-16.9) 约等于 0 → 概率 = 1/(1+0) ≈ 1(接近 100%)。
- 若分数是 - 3 →
e^(3) 约等于 20 → 概率 = 1/(1+20) ≈ 0.05(5% 概率)。
- 作用:衡量模型预测的「不准程度」。
- 计算:
损失 = (预测概率 - 真实标签)²。
- 类比:
- 真实标签:明天下雨(标签 = 1)。
- 模型预测:0.7(70% 概率)。
- 损失:
(0.7-1)² = 0.09(预测越离谱,损失越大)。
这个模型用 MSE(均方误差) 作为损失函数,这在二分类任务中不太常见。通常二分类会用 BCE(二元交叉熵)。
| 损失函数 | 惩罚机制 | 适合场景 |
| MSE |
按「预测值和真实值的距离」惩罚 |
回归任务(如预测温度、房价) |
| BCE |
按「预测概率的对数」惩罚 |
分类任务(如预测下雨概率) |
- 梯度消失:当预测概率接近 0 或 1 时,MSE 的梯度非常小,导致模型学习缓慢。
- 对「自信错误」惩罚不足:例如模型预测 0.9(非常自信),但真实标签是 0,MSE 的损失是 0.81;而 BCE 会给更高的惩罚(约 2.3),让模型更重视这种「离谱错误」。
- 当你的二分类问题更像「回归问题」时(例如预测概率值本身有实际意义,而非单纯分类)。
- 示例:预测用户点击广告的概率(概率值用于计算 CTR)。
如果是标准二分类任务,建议改为 BCE 损失:
class BetterTorchModel(nn.Module):
def __init__(self, input_size):
super().__init__()
self.linear = nn.Linear(input_size, 1)
- 数值稳定性:避免直接用 sigmoid+MSE 导致的梯度消失问题。
- 训练效率:对「自信错误」的惩罚更合理,加速模型学习。
这个模型就像是一个「新手天气预报员」:
- 线性层:根据今天的天气特征(温度、湿度等)计算一个「下雨分数」。
- Sigmoid:把分数转换成「下雨概率」(0~1)。
- MSE 损失:用「预测概率和实际结果的差距平方」来评估预测的准确性。
但如果是专业的天气预报,会用更科学的方法(类似 BCE 损失)来评估预测,避免对极端错误的「宽容」~