1. 激活函数 激活函数是神经网络中用于引入非线性变换的重要组成部分。通过激活函数,神经网络能够学习到复杂的函数映射。
1.1 常见的激活函数 1.1.1 Sigmoid 函数 Sigmoid
函数是最早使用的激活函数之一,其公式为:
$$ \sigma(x) = \frac{1}{1 + e^{-x}} $$
特性 :
输出范围为 (0, 1)。
适合于二分类任务的输出层。
缺点 :
1 2 3 4 5 6 7 import torchimport torch.nn as nnsigmoid = nn.Sigmoid() input_tensor = torch.tensor([-1.0 , 0.0 , 1.0 ]) output = sigmoid(input_tensor) print (output)
1.1.2 ReLU 函数 ReLU
(Rectified Linear Unit)是目前使用最广泛的激活函数,其公式为:
$$ f(x) = \max(0, x) $$
特性 :
缺点 :
死亡的 ReLU 的问题:当输入为负时,输出恒为 0。
1 2 3 4 relu = nn.ReLU() input_tensor = torch.tensor([-1.0 , 0.0 , 1.0 ]) output = relu(input_tensor) print (output)
1.1.3 Tanh 函数 Tanh
(双曲正切)是另一种常用的激活函数,其公式为:
$$ \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} $$
特性 :
输出范围为 (-1, 1)。
较 Sigmoid
函数更优,输出均值为 0。
缺点 :
1 2 3 4 tanh = nn.Tanh() input_tensor = torch.tensor([-1.0 , 0.0 , 1.0 ]) output = tanh(input_tensor) print (output)
1.2 自定义激活函数 在某些情况下,我们可能希望使用自定义的激活函数。可以通过继承 nn.Module
来实现。
1 2 3 4 5 6 7 8 class CustomActivation (nn.Module): def forward (self, input ): return input * torch.sigmoid(input ) custom_activation = CustomActivation() input_tensor = torch.tensor([-1.0 , 0.0 , 1.0 ]) output = custom_activation(input_tensor) print (output)
2. 损失函数 损失函数用于衡量模型的输出与真实标签之间的差距。通过最小化损失函数,我们可以优化模型的权重。
2.1 常见的损失函数 2.1.1 交叉熵损失 对于分类问题,CrossEntropyLoss
函数通常用于衡量分类的准确性。其公式为:
$$ L = -\sum_{i=1}^{C} y_i \log(p_i) $$
1 2 3 4 5 6 criterion = nn.CrossEntropyLoss() output = torch.tensor([[1.0 , 2.0 , 0.0 ]]) target = torch.tensor([1 ]) loss = criterion(output, target) print (loss.item())
2.1.2 均方误差损失 对于回归问题,常用 MSELoss
(均方误差损失)来衡量模型输出与真实值之间的差距,其公式为:
$$ L = \frac{1}{N} \sum_{i=1}^{N} (y_i - \hat{y_i})^2 $$
1 2 3 4 5 6 criterion = nn.MSELoss() target = torch.tensor([1.0 , 2.0 , 3.0 ]) output = torch.tensor([1.5 , 2.5 , 3.5 ]) loss = criterion(output, target) print (loss.item())
2.2 自定义损失函数 可以通过继承 nn.Module
来创建自定义损失函数。
1 2 3 4 5 6 7 8 9 class CustomLoss (nn.Module): def forward (self, output, target ): return torch.mean((output - target) ** 2 ) + 0.1 * torch.mean(output) custom_loss = CustomLoss() target = torch.tensor([1.0 , 2.0 , 3.0 ]) output = torch.tensor([1.5 , 2.5 , 3.5 ]) loss = custom_loss(output, target) print (loss.item())
结论 在这部分内容中,我们详细介绍了 激活函数
和 损失函数
的重要性及常见类型,并展示了如何在 PyTorch 中使用和自定义这些函数。通过对这些概念的掌握,我们可以更好地设计和训练神经网络模型。