这是 PyTorch 的 Fuzzy Tiling Activations 实现/教程:一种在线学习稀疏表示的简单方法。
模糊平铺激活是一种基于分箱的稀疏激活形式。
分@@箱是根据间隔将标量值分类到数据桶中。分箱的一个问题是,它为大多数值提供零梯度(区间边界除外)。另一个原因是,如果分箱间隔很大,则分箱会失去精度。
自由贸易协定克服了这些缺点。FTA 没有像 Tiling Activations 那样使用硬边界,而是使用箱子之间的软边界。这为所有或很宽范围的值提供了非零梯度。而且也不会损失精度,因为它是在部分值中捕获的。
是平铺向量,
其中,是输入范围,是图格大小,可被整除。
平铺激活是,
其中,是指示函数,该函数给出输入是否为正,否则。
请注意,平铺激活的梯度为零,因为它有硬边界。
模糊指标函数,
它从到何时线性增加,等于 for。是一个超参数。
FTA 使用它在箱子之间创建软边界。
61import torch
62from torch import nn
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)
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()