激活函数的作用与选择原则

激活函数引入非线性变换,使神经网络能够拟合复杂函数。回归任务中激活函数的选择需考虑输出范围、梯度特性和任务需求。常见激活函数包括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。实验不同组合并通过验证集评估效果是确定最佳选择的可靠方法。

更多推荐