模糊拼贴激活 (FTA)

Open In Colab

这是 PyTorchFuzzy Tiling Activations 实现/教程:一种在线学习稀疏表示的简单方法

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

分@@

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

自由贸易协定克服了这些缺点。FTA 没有像 Tiling Activations 那样使用硬边界,而是使用箱子之间的软边界。这为所有或很宽范围的值提供了非零梯度。而且也不会损失精度,因为它是在部分值中捕获的。

平铺激活

是平铺向量,

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

平铺激活是,

其中,是指示函数,该函数给出输入是否为正,否则。

请注意,平铺激活的梯度为零,因为它有硬边界。

模糊拼贴激活

模糊指标函数,

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

FTA 使用它在箱子之间创建软边界。

这是一个在变压器中使用 FTA 的简单实验

61import torch
62from torch import nn

模糊平铺激活 (FTA)

65class FTA(nn.Module):
  • lower_limit 是下限
  • upper_limit 是上限
  • delta 是垃圾桶的大小
  • eta 是确定边界柔和度的参数。
70    def __init__(self, lower_limit: float, upper_limit: float, delta: float, eta: float):
77        super().__init__()

初始化平铺矢量

80        self.c = nn.Parameter(torch.arange(lower_limit, upper_limit, delta), requires_grad=False)

输入向量展开的系数等于条柱的数量

82        self.expansion_factor = len(self.c)

84        self.delta = delta

86        self.eta = eta

模糊指标函数

88    def fuzzy_i_plus(self, x: torch.Tensor):
94        return (x <= self.eta) * x + (x > self.eta)
96    def forward(self, z: torch.Tensor):

再添加一个尺寸尺寸。我们会将其扩展为垃圾箱。

99        z = z.view(*z.shape, 1)

102        z = 1. - self.fuzzy_i_plus(torch.clip(self.c - z, min=0.) + torch.clip(z - self.delta - self.c, min=0.))

重塑为原始尺寸数。最后一个维度大小将按条柱的数量进行扩展

106        return z.view(*z.shape[:-2], -1)

用于测试 FTA 模块的代码

109def _test():
113    from labml.logger import inspect

初始化

116    a = FTA(-10, 10, 2., 0.5)

打印

118    inspect(a.c)

打印纸箱数量

120    inspect(a.expansion_factor)

输入

123    z = torch.tensor([1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9., 10., 11.])

打印

125    inspect(z)

打印

127    inspect(a(z))
128
129
130if __name__ == '__main__':
131    _test()