1. 逻辑回归:深度学习的第一个台阶
第一次接触深度学习时,很多人会被各种复杂的神经网络结构吓到。其实从最基础的逻辑回归模型入手,才是正确的学习路径。逻辑回归虽然名字里带着"回归",但它实际上是解决二分类问题的利器。我在工业界做风控模型时,第一个上线的就是逻辑回归模型——简单、稳定、可解释性强。
这个算法之所以被放在深度学习系列的第一讲,是因为它包含了神经网络最核心的三个要素:加权求和、非线性变换和损失函数优化。理解清楚逻辑回归,后面学习全连接神经网络、CNN、RNN都会事半功倍。下面我就带大家拆解这个"最熟悉的陌生人"。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 逻辑回归的核心原理
2.1 从线性回归到逻辑回归
线性回归的公式大家应该很熟悉:
z = w₁x₁ + w₂x₂ + ... + wₙxₙ + b
这个公式输出的z值范围是(-∞, +∞)。但分类问题需要的是概率输出,范围应该在[0,1]之间。于是我们需要一个"压缩函数"把z映射到(0,1)区间——这就是sigmoid函数:
σ(z) = 1 / (1 + e⁻ᶻ)
这个函数的曲线呈S形,所以也叫Sigmoid函数。它的导数有个很好的性质:
σ'(z) = σ(z)(1 - σ(z))
这个性质在反向传播时会大大简化计算。
2.2 决策边界与概率输出
当σ(z) > 0.5时我们预测类别1,否则预测类别0。这个0.5的阈值对应的就是决策边界:
w₁x₁ + w₂x₂ + ... + wₙxₙ + b = 0
在实际应用中,阈值可以根据业务需求调整。比如在金融风控中,为了降低坏账率,可能会把阈值提高到0.7。
注意:sigmoid函数在z很大或很小时会出现梯度消失问题,这是后续改进模型(如ReLU)要解决的重点。
3. 损失函数与优化
3.1 交叉熵损失函数
为什么不用均方误差(MSE)?因为对于分类问题,MSE会导致损失函数非凸,容易陷入局部最优。交叉熵损失函数定义为:
L(y, ŷ) = -[y·log(ŷ) + (1-y)·log(1-ŷ)]
其中y是真实标签,ŷ是预测概率。这个函数的特点是:
- 当y=1时,L = -log(ŷ),预测越接近1损失越小
- 当y=0时,L = -log(1-ŷ),预测越接近0损失越小
3.2 梯度下降推导
通过链式法则可以求出损失函数对各个参数的梯度:
∂L/∂wᵢ = (ŷ - y)xᵢ
∂L/∂b = (ŷ - y)
这个简洁的梯度形式是选择交叉熵损失的重要原因。参数更新公式为:
wᵢ := wᵢ - α·∂L/∂wᵢ
b := b - α·∂L/∂b
其中α是学习率,控制每次更新的步长。
4. 代码实现与调参技巧
4.1 NumPy手写实现
python复制import numpy as np
class LogisticRegression:
def __init__(self, lr=0.01, n_iters=1000):
self.lr = lr
self.n_iters = n_iters
self.weights = None
self.bias = None
def sigmoid(self, z):
return 1 / (1 + np.exp(-z))
def fit(self, X, y):
n_samples, n_features = X.shape
self.weights = np.zeros(n_features)
self.bias = 0
for _ in range(self.n_iters):
linear = np.dot(X, self.weights) + self.bias
y_pred = self.sigmoid(linear)
dw = (1/n_samples) * np.dot(X.T, (y_pred - y))
db = (1/n_samples) * np.sum(y_pred - y)
self.weights -= self.lr * dw
self.bias -= self.lr * db
def predict(self, X):
linear = np.dot(X, self.weights) + self.bias
y_pred = self.sigmoid(linear)
return [1 if i > 0.5 else 0 for i in y_pred]
4.2 关键参数经验
- 学习率lr:一般从0.01开始尝试,太大容易震荡,太小收敛慢
- 迭代次数n_iters:配合early stopping使用效果更好
- 特征缩放:对数值型特征做标准化可以加速收敛
- 正则化:添加L1/L2正则项防止过拟合
实操技巧:在训练时记录损失函数值,如果发现损失震荡或上升,应该立即停止并调小学习率。
5. 工业级实现要点
5.1 数值稳定性优化
原始sigmoid实现可能在数值很大时溢出,改进版:
python复制def sigmoid(z):
mask = z >= 0
pos = 1 / (1 + np.exp(-z[mask]))
neg = np.exp(z[~mask]) / (1 + np.exp(z[~mask]))
return np.concatenate([pos, neg])
5.2 多分类扩展
两种主流方法:
- One-vs-Rest:训练K个二分类器
- Softmax回归:直接输出多类概率
Softmax公式:
P(y=k|x) = e^{z_k} / ∑_{j=1}^K e^
5.3 分布式训练
当数据量很大时,可以采用:
- 数据并行:不同worker处理不同batch
- 模型并行:将特征分片处理
- 参数服务器:集中管理参数更新
6. 常见问题排查
6.1 模型不收敛的可能原因
- 学习率过大/过小
- 特征尺度差异大
- 存在NaN或异常值
- 标签泄露(测试数据混入训练集)
- 特征工程不合理
6.2 预测结果全为同一类
- 检查样本是否严重不均衡
- 验证特征与标签的相关性
- 检查模型是否初始化失败
- 确认评估指标是否正确
6.3 部署时的注意事项
- 线上线下的特征处理必须完全一致
- 模型版本需要严格管理
- 监控预测结果的分布变化
- 定期用新数据重新训练
7. 逻辑回归的局限性
虽然逻辑回归简单有效,但也有明显局限:
- 无法自动学习特征交互
- 对非线性关系建模能力有限
- 需要精心设计特征工程
- 对异常值比较敏感
这些局限正是深度学习要解决的问题。但有意思的是,在大规模稀疏特征场景(如推荐系统),逻辑回归+特征交叉仍然是最主流的方案之一。
