神经网络中的回归详解
引言
神经网络(NeuralNetworks)是一种强大的机器学习模型,可用于分类和回归任务。本文聚焦于神经网络中的回归(Regression),即预测连续输出值(如房价、温度)。
回归问题:给定输入特征x⃗\vec{x}x,预测连续目标yyy。神经网络通过多层非线性变换学习复杂映射f:x⃗↦yf:\vec{x}\mapsto yf:x↦y。
基本概念回顾
神经元与层
神经元(Neuron):基本单元。输入x⃗=(x1,…,xn)\vec{x}=(x_1,\dots,x_n)x=(x1,…,xn),权重w⃗=(w1,…,wn)\vec{w}=(w_1,\dots,w_n)w=(w1,…,wn),偏置bbb。
计算:线性组合z=w⃗⋅x⃗+b=∑i=1nwixi+bz=\vec{w}\cdot\vec{x}+b=\sum_{i=1}^nw_ix_i+bz=w⋅x+b=∑i=1nwixi+b。
然后激活:a=σ(z)a=\sigma(z)a=σ(z),σ\sigmaσ为激活函数。层(Layer):多个神经元组成。
- 输入层:原始特征。
- 隐藏层:中间变换。
- 输出层:最终预测y^\hat{y}y^(回归中通常1个神经元,无激活或线性激活)。
前馈神经网络(FeedforwardNeuralNetwork,FNN):信息从输入到输出单向流动。也称多层感知机(MLP)。
激活函数
激活引入非线性。常见:
- Sigmoid:σ(z)=1/(1+e−z)\sigma(z)=1/(1+e^{-z})σ(z)=1/(1+e−z),输出[0,1]。
- Tanh:σ(z)=(ez−e−z)/(ez+e−z)\sigma(z)=(e^z-e^{-z})/(e^z+e^{-z})σ(z)=(ez−e−z)/(ez+e−z),输出[-1,1]。
- ReLU:σ(z)=max(0,z)\sigma(z)=\max(0,z)σ(z)=max(0,z),简单高效,避免梯度消失。
- Linear:σ(z)=z\sigma(z)=zσ(z)=z,用于回归输出层。
隐藏层常用ReLU,输出层线性以输出任意实数。
神经网络回归模型结构
数学表示
假设网络有LLL层。第lll层有mlm_lml个神经元。
输入:a⃗(0)=x⃗∈Rm0\vec{a}^{(0)}=\vec{x}\in\mathbb{R}^{m_0}a(0)=x∈Rm0。
第lll层:
z⃗(l)=W(l)a⃗(l−1)+b⃗(l) \vec{z}^{(l)}=W^{(l)}\vec{a}^{(l-1)}+\vec{b}^{(l)} z(l)=W(l)a(l−1)+b(l)
a⃗(l)=σ(l)(z⃗(l)) \vec{a}^{(l)}=\sigma^{(l)}(\vec{z}^{(l)}) a(l)=σ(l)(z(l))
其中W(l)∈Rml×ml−1W^{(l)}\in\mathbb{R}^{m_l\times m_{l-1}}W(l)∈Rml×ml−1为权重矩阵,b⃗(l)∈Rml\vec{b}^{(l)}\in\mathbb{R}^{m_l}b(l)∈Rml为偏置。输出:y^=a⃗(L)\hat{y}=\vec{a}^{(L)}y^=a(L)(标量)。
整个网络:y^=f(x⃗;θ)\hat{y}=f(\vec{x};\theta)y^=f(x;θ),θ={W(l),b⃗(l)}l=1L\theta=\{W^{(l)},\vec{b}^{(l)}\}_{l=1}^Lθ={W(l),b(l)}l=1L为参数。
示例结构
简单回归网络:输入2维,1隐藏层(3神经元),输出1维。
- 输入层:x⃗=(x1,x2)\vec{x}=(x_1,x_2)x=(x1,x2)。
- 隐藏层:W(1)∈R3×2W^{(1)}\in\mathbb{R}^{3\times2}W(1)∈R3×2,b⃗(1)∈R3\vec{b}^{(1)}\in\mathbb{R}^3b(1)∈R3,激活ReLU。
- 输出层:W(2)∈R1×3W^{(2)}\in\mathbb{R}^{1\times3}W(2)∈R1×3,b⃗(2)∈R\vec{b}^{(2)}\in\mathbb{R}b(2)∈R,激活线性。
损失函数
回归常用均方误差(MeanSquaredError,MSE):
L(y^,y)=12(y^−y)2 \mathcal{L}(\hat{y},y)=\frac{1}{2}(\hat{y}-y)^2 L(y^,y)=21(y^−y)2
批次样本:$ \mathcal{L}=\frac{1}{N}\sum_{i=1}N\frac{1}{2}(\hat{y}_i-y_i)2 $
其他:MAE(L=∣y^−y∣\mathcal{L}=|\hat{y}-y|L=∣y^−y∣),HuberLoss(对异常值鲁棒)。
训练过程:反向传播与梯度下降
前向传播
从输入计算到输出,得到y^\hat{y}y^和L\mathcal{L}L。
反向传播(Backpropagation)
计算梯度∂L/∂θ\partial\mathcal{L}/\partial\theta∂L/∂θ。
- 输出层误差:δ(L)=∂L/∂z⃗(L)=(y^−y)⋅σ(L)′(z⃗(L))\delta^{(L)}=\partial\mathcal{L}/\partial\vec{z}^{(L)}=(\hat{y}-y)\cdot\sigma^{(L)'}(\vec{z}^{(L)})δ(L)=∂L/∂z(L)=(y^−y)⋅σ(L)′(z(L))(线性激活时σ′=1\sigma'=1σ′=1,故δ(L)=y^−y\delta^{(L)}=\hat{y}-yδ(L)=y^−y)。
- 向后传播:δ(l)=(W(l+1))Tδ(l+1)⊙σ(l)′(z⃗(l))\delta^{(l)}=(W^{(l+1)})^T\delta^{(l+1)}\odot\sigma^{(l)'}(\vec{z}^{(l)})δ(l)=(W(l+1))Tδ(l+1)⊙σ(l)′(z(l)),⊙\odot⊙为逐元素乘。
- 梯度:
∂L∂W(l)=δ(l)(a⃗(l−1))T \frac{\partial\mathcal{L}}{\partial W^{(l)}}=\delta^{(l)}(\vec{a}^{(l-1)})^T ∂W(l)∂L=δ(l)(a(l−1))T
∂L∂b⃗(l)=δ(l) \frac{\partial\mathcal{L}}{\partial\vec{b}^{(l)}}=\delta^{(l)} ∂b(l)∂L=δ(l)
优化:梯度下降
更新参数:θ:=θ−η∇θL\theta:=\theta-\eta\nabla_\theta\mathcal{L}θ:=θ−η∇θL,η\etaη为学习率。
变体:
- SGD:随机梯度下降,每批次更新。
- Momentum:添加动量v:=βv−η∇v:=\beta v-\eta\nablav:=βv−η∇,θ:=θ+v\theta:=\theta+vθ:=θ+v。
- Adam:自适应学习率,结合动量和RMSProp。
完整训练算法
- 初始化θ\thetaθ(e.g.,Xavier初始化)。
- 对于每个epoch:
a. 前向:计算y^\hat{y}y^,L\mathcal{L}L。
b. 反向:计算梯度。
c. 更新θ\thetaθ。 - 监控验证损失,早停防止过拟合。
数学推导示例:简单网络
假设单隐藏层,输入1维xxx,隐藏1神经元,输出y^\hat{y}y^。
- 前向:
z(1)=w1x+b1z^{(1)}=w_1x+b_1z(1)=w1x+b1,a(1)=σ(z(1))a^{(1)}=\sigma(z^{(1)})a(1)=σ(z(1))(ReLU)。
z(2)=w2a(1)+b2z^{(2)}=w_2a^{(1)}+b_2z(2)=w2a(1)+b2,y^=z(2)\hat{y}=z^{(2)}y^=z(2)(线性)。 - 损失:L=12(y^−y)2\mathcal{L}=\frac{1}{2}(\hat{y}-y)^2L=21(y^−y)2。
- 梯度:
∂L/∂y^=y^−y\partial\mathcal{L}/\partial\hat{y}=\hat{y}-y∂L/∂y^=y^−y。
∂L/∂w2=(y^−y)a(1)\partial\mathcal{L}/\partial w_2=(\hat{y}-y)a^{(1)}∂L/∂w2=(y^−y)a(1)。
∂L/∂b2=y^−y\partial\mathcal{L}/\partial b_2=\hat{y}-y∂L/∂b2=y^−y。
∂L/∂a(1)=(y^−y)w2\partial\mathcal{L}/\partial a^{(1)}=(\hat{y}-y)w_2∂L/∂a(1)=(y^−y)w2。
∂L/∂z(1)=∂L/∂a(1)⋅σ′(z(1))\partial\mathcal{L}/\partial z^{(1)}=\partial\mathcal{L}/\partial a^{(1)}\cdot\sigma'(z^{(1)})∂L/∂z(1)=∂L/∂a(1)⋅σ′(z(1))(ReLU’:1 ifz(1)>0z^{(1)}>0z(1)>0,else0)。
∂L/∂w1=∂L/∂z(1)⋅x\partial\mathcal{L}/\partial w_1=\partial\mathcal{L}/\partial z^{(1)}\cdot x∂L/∂w1=∂L/∂z(1)⋅x。
∂L/∂b1=∂L/∂z(1)\partial\mathcal{L}/\partial b_1=\partial\mathcal{L}/\partial z^{(1)}∂L/∂b1=∂L/∂z(1)。
正则化与优化技巧
过拟合防治:
- L1/L2正则:添加λ∑∣w∣\lambda\sum|w|λ∑∣w∣或λ∑w2\lambda\sum w^2λ∑w2到损失。
- Dropout:训练时随机丢弃神经元(概率p)。
- 数据增强:增加训练数据。
- 早停:验证损失上升时停止。
初始化:He初始化forReLU:w∼N(0,2/ml−1)w\sim\mathcal{N}(0,\sqrt{2/m_{l-1}})w∼N(0,2/ml−1)。
批标准化(BatchNormalization):在每层后标准化z⃗(l)\vec{z}^{(l)}z(l),加速训练。
学习率调度:余弦退火或指数衰减。
超参数调优:层数、神经元数、学习率、批大小。用GridSearch或BayesianOptimization。
优点与缺点
优点:
- 处理非线性关系:通用函数逼近器。
- 自动特征提取:隐藏层学习高级表示。
- 可扩展:深层网络捕捉复杂模式。
缺点:
- 计算密集:训练需GPU。
- 黑箱:解释性差(用SHAP或LIME改善)。
- 需大量数据:小数据集易过拟合。
- 梯度消失/爆炸:深层网络问题(用ReLU、残差连接缓解)。
应用场景
- 房价预测:输入面积、位置等,输出价格。
- 时间序列预测:RNN/LSTM变体,但基本FNN可用于简单回归。
- 图像回归:CNN提取特征,后接全连接回归(如年龄估计)。
- 金融:股票价格预测。
实际例子
例子1:线性回归模拟
用单层无激活网络模拟线性回归y=2x+1y=2x+1y=2x+1。
- 输入xxx,输出y^=wx+b\hat{y}=wx+by^=wx+b。
- 损失MSE。
- 训练后w≈2w\approx2w≈2,b≈1b\approx1b≈1。
例子2:非线性回归
预测y=sin(x)+噪声y=\sin(x)+噪声y=sin(x)+噪声。
- 网络:输入1,隐藏[64,64]ReLU,输出1线性。
- 数据:1000点x∈[−π,π]x\in[-π,π]x∈[−π,π]。
- 训练:Adam,MSE,epochs=1000。
网络学习正弦曲线。
代码实现(Python with PyTorch)
import torch
import torch.nn as nn
import torch.optim as optim
class RegressionNet(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(1, 64)
self.fc2 = nn.Linear(64, 64)
self.fc3 = nn.Linear(64, 1)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
return self.fc3(x)
# 数据
x = torch.randn(1000, 1) * 3.14
y = torch.sin(x) + 0.1 * torch.randn(1000, 1)
# 训练
model = RegressionNet()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)
for epoch in range(1000):
optimizer.zero_grad()
output = model(x)
loss = criterion(output, y)
loss.backward()
optimizer.step()
总结
神经网络回归通过多层变换、反向传播和优化学习连续映射。