1.什么是非线性激活
非线性激活是一种将以各种函数的表现形式加入到输入中的方法。以最常见的 ReLU 和 Sigmoid 举例,其图示如下:

图 1 ReLU 函数

图 2 Sigmoid 函数
ReLU 函数就是输入为负时取 0,输入为正时取其本身,是一个简单的截断操作;sigmoid 函数是σ函数,其公式为:
非线性激活最主要的作用就是给输入添加非线性特征,提升模型的泛化能力。
2.SiLU函数
在我看来,SiLU 函数就是一种特殊的 Sigmoid 函数,算是 Sigmoid 函数的一个变种,其公式如下:
非线性激活并没有太多参数,一般来说非线性激活只需要提供输入即可,另外非线性激活还有一个较为重要的参数为 inplace,inplace 也是意如其名,它指的是是否将输入替换为非线性激活后的结果,其默认值为 False 即不替代,一般推荐使用默认值以保证输入的完整性。
3.具象化表示
这步演示我依然使用 CIFAR10 数据集,构建一个最简化的模型来演示非线性激活的实际效果,图 1 是原始图像,图 2 是非线性激活 SiLU 后的结果,这里取一个 batch 做演示:

图 1 原始图像

图 2 非线性激活后的结果
下面是测试代码:
import torchvision
from tensorboardX import SummaryWriter
from torch import nn
from torch.utils.data import DataLoader
data_set = torchvision.datasets.CIFAR10(root="./dataset", train=False, download=True, transform=torchvision.transforms.ToTensor())
data_loader = DataLoader(dataset=data_set, batch_size=64)
class Example(nn.Module):
def __init__(self):
super(Example, self).__init__()
self.silu1 = nn.SiLU()
def forward(self, input):
output = self.silu1(input)
return output
example = Example()
writer = SummaryWriter("./logs_silu")
step = 0
for data in data_loader:
imgs, targets = data
writer.add_images("input", imgs, global_step=step)
output = example(imgs)
writer.add_images("output", output, global_step=step)
step += 1
writer.close()
默认评论
Halo系统提供的评论