PyTorch 深度学习笔记(十一):回归任务中非线性激活函数的场景选择
·
激活函数的作用与选择原则
激活函数引入非线性变换,使神经网络能够拟合复杂函数。回归任务中激活函数的选择需考虑输出范围、梯度特性和任务需求。常见激活函数包括ReLU、Sigmoid、Tanh等,各有适用场景。
输出无界场景(如房价预测)
ReLU及其变种适合输出范围无限制的回归任务。ReLU计算简单且缓解梯度消失问题,但需注意Dead ReLU现象。LeakyReLU和Parametric ReLU(PReLU)可改善神经元死亡问题。
代码示例:
model = nn.Sequential(
nn.Linear(input_dim, hidden_dim),
nn.ReLU(), # 或 nn.LeakyReLU(negative_slope=0.01)
nn.Linear(hidden_dim, output_dim) # 最后一层通常不激活
)
输出有界场景(如概率预测)
Sigmoid将输出压缩到(0,1),适合概率相关回归任务。Tanh输出范围(-1,1),适用于需要正负输出的场景。需注意梯度消失问题,可通过适当初始化缓解。
代码示例:
model = nn.Sequential(
nn.Linear(input_dim, hidden_dim),
nn.Tanh(),
nn.Linear(hidden_dim, output_dim),
nn.Sigmoid() # 最后一层用Sigmoid约束输出
)
平滑输出需求场景
Softplus作为ReLU的平滑版本,适合需要连续可导特性的任务。其输出始终为正,适合预测正值的回归问题。
数学表达式: $ \text{Softplus}(x) = \frac{1}{\beta} \log(1 + \exp(\beta x)) $
代码示例:
model = nn.Sequential(
nn.Linear(input_dim, hidden_dim),
nn.Softplus(),
nn.Linear(hidden_dim, output_dim)
)
深层网络中的激活选择
Swish和Mish结合了ReLU的优点和Sigmoid的平滑性,在深层网络中表现优异。这些自门控激活函数需更多计算资源但能提升模型性能。
代码示例:
def mish(x):
return x * torch.tanh(F.softplus(x))
class Mish(nn.Module):
def forward(self, x):
return mish(x)
model = nn.Sequential(
nn.Linear(input_dim, hidden_dim),
Mish(),
nn.Linear(hidden_dim, output_dim)
)
实践建议
隐藏层通常优先选择ReLU或其改进版本,因其训练效率高。输出层激活函数需匹配任务需求:无约束输出可不使用激活函数,概率输出用Sigmoid,比率输出用Tanh。实验不同组合并通过验证集评估效果是确定最佳选择的可靠方法。
更多推荐
所有评论(0)