这是模糊平铺激活:在线学习稀疏表示的简单方法的 PyTorch 实现/教程。
模糊平铺激活是一种基于分箱的稀疏激活形式。
分@@箱是基于间隔将标量值分类到条柱中。分箱的一个问题是,它为大多数值(bin的边界除外)提供零梯度。另一个原因是,如果分箱间隔很大,则分箱会失去精度。
自由贸易协定克服了这些缺点。自由贸易协定不像平铺激活那样使用硬边界,而是使用条柱之间的软边界。这为所有值或大范围的值提供非零梯度。而且也不会失去精度,因为它是以部分值捕获的。
是平铺矢量,
其中是输入范围,是 bin 大小,可被整除。
平铺激活是,
wh ere 是指标函数,它给出输入是否为正数,否则。
请注意,平铺激活会给出零梯度,因为它具有硬边界。
模糊指标函数,
它从到何时线性增加,等于 f or。是一个超参数。
FTA 使用它来创建条柱之间的软边界。
62import torch
63from torch import nn66class FTA(nn.Module):lower_limit
是下限upper_limit
是上限delta
是垃圾桶的大小eta
是确定边界柔和度的参数。71 def __init__(self, lower_limit: float, upper_limit: float, delta: float, eta: float):78 super().__init__()初始化平铺矢量
81 self.c = nn.Parameter(torch.arange(lower_limit, upper_limit, delta), requires_grad=False)输入向量展开的系数等于条柱的数量
83 self.expansion_factor = len(self.c)85 self.delta = delta87 self.eta = eta89 def fuzzy_i_plus(self, x: torch.Tensor):95 return (x <= self.eta) * x + (x > self.eta)97 def forward(self, z: torch.Tensor):再添加一个尺寸尺寸。我们会将其扩展为垃圾箱。
100 z = z.view(*z.shape, 1)103 z = 1. - self.fuzzy_i_plus(torch.clip(self.c - z, min=0.) + torch.clip(z - self.delta - self.c, min=0.))重塑为原始尺寸数。最后一个维度大小将按条柱的数量进行扩展。
107 return z.view(*z.shape[:-2], -1)110def _test():114 from labml.logger import inspect初始化
117 a = FTA(-10, 10, 2., 0.5)打印
119 inspect(a.c)打印纸箱数量
121 inspect(a.expansion_factor)输入
124 z = torch.tensor([1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9., 10., 11.])打印
126 inspect(z)打印
128 inspect(a(z))
129
130
131if __name__ == '__main__':
132 _test()