我有一个机器学习模型(即自编码器),它通过在目标函数中添加一个简单的L1惩罚项,试图学习输入信号的稀疏表示。这确实有助于促进稀疏向量表示,因为在学习的向量表示中,大多数元素都是零。然而,我需要这种稀疏性具有结构,使得非零元素在向量中“分散”/分布/均匀。具体来说,对于给定的输入信号,我的模型生成的稀疏表示如下所示:
当前的稀疏编码:[...,0,0,0,0,0,0,0,0,0,0,0,
0.2,0.3,0.5,0.9,0.3,0.2,0.1
,0,0,0,0,0,0,0,0,0,0,0,0,...]
你可以看到,大多数元素是零,夹杂着小簇的非零元素。相反,我希望稀疏性使得非零元素彼此“排斥”,从而使每个非零元素周围至少有一个或多个零,并且向量中很少或没有相邻的非零元素;具体来说,它应该更像这样:
期望的稀疏编码:[...,0,0,0,0,0,
0.2,0,0,0,0,
0.9,0,0,0,0,
0.5,0,0,0,0,0,0,
0.7,0,0,0,
0.4,0,0,
0.6,...]
在后一种稀疏编码中,非零元素的数量可能与前者相似,但每个非零元素之间由一定数量的零隔开。
有没有一种直接的目标函数惩罚方法可以诱导这种形式的稀疏性?
回答:
库尔贝克-莱布勒散度测量目标分布与样本分布之间的距离,是潜在空间模型/变分自编码器的标准做法。它在多个库中有多种实现。它可以让你在输出上强制执行均匀分布,这在一定程度上会导致更均匀分布的值。此外,额外的硬编码约束也可以在这里帮助你;即,惩罚你输出向量切片之和之间的均方差会惩罚不均匀分布的值。