模糊平铺激活 (FTA)

Open In ColabOpen In Comet

这是模糊平铺激活:在线学习稀疏表示的简单方法的 PyTorch 实现/教程。

模糊平铺激活是一种基于分箱的稀疏激活形式。

分@@

箱是基于间隔将标量值分类到条柱中。分箱的一个问题是,它为大多数值(bin的边界除外)提供零梯度。另一个原因是,如果分箱间隔很大,则分箱会失去精度。

自由贸易协定克服了这些缺点。自由贸易协定不像平铺激活那样使用硬边界,而是使用条柱之间的软边界。这为所有值或大范围的值提供非零梯度。而且也不会失去精度,因为它是以部分值捕获的。

平铺激活

是平铺矢量,

其中是输入范围,是 bin 大小,可被整除

平铺激活是,

wh ere 是指标函数,它给出输入是否为正数,否则。

请注意,平铺激活会给出零梯度,因为它具有硬边界。

模糊平铺激活

模糊指标函数,

它从何时线性增加,等于 f or是一个超参数。

FTA 使用它来创建条柱之间的软边界。

这是一个在变压器中使用自由贸易协定的简单实验

62import torch
63from torch import nn

模糊平铺激活 (FTA)

66class 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 = delta

87        self.eta = eta

模糊指标函数

89    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)

用于测试 FTA 模块的代码

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()