K-Competitive Autoencoder for Text

对论文https://arxiv.org/pdf/1705.02033.pdf中的模型部分进行记录。如有问题,希望大家指正,非常感谢!

尽管自编码器的目标是最小化reconstruction error,我们的目标是从数据中提取出有意义的特征。相比于图片数据,文本数据对自编码器更有挑战,因为文本数据高维,离散。当查看用自编码器提取的特征时,发现这些特征并不是不同的。是因为在隐藏层的很多神经元分享了输入神经元的相似组(往往是出现次数最多的词),隐藏层的神经元与这些出现次数多的词有很强的联系。我们可以假设自编码器为了重构输入而贪婪地学习不重要的特征。

为了克服这种缺陷,我们在训练阶段加入互相的竞争来引导自编码器关注在重要的模式(特征)上。在竞争学习中,神经元为了对部分输入数据响应的权利而竞争,因此增加了网络中神经元的多样性。神经元的多样性是自编码器想要的,尤其是对文本数据。通过在自编码器中加入竞争,我们希望隐藏层的每个神经元负责识别输入数据中的不同模式。【感觉有点像CNN,每种filter来识别不同的特征】


Algorithm 1是KATE的伪代码。KATE是一个有着竞争的隐藏层的浅自编码器。x是一个d维的输入,也就是需要的输出,h1,h2...hm是m个隐藏神经元。W是连接输入层和隐藏层的权重,形状是d*m,b是隐藏层的偏倚,形状是m;c是输出层的偏倚,形状是d。g是激活函数:两种典型的激活函数是tanh和sigmoid。在前向计算的过程中,隐藏层神经元的激活值是,输出层的激活值是。连接隐藏层和输出层的权重是W的转置。

在Kate中,输入文本被表示成log-normalized的d维词频向量,每一维按下式计算:(那d就是词典大小,高维)


其中,V是词典,ni是词i在文档中出现的次数。损失函数是交叉熵,定义如下:

的重构输出。


H表示隐藏层神经元的子集,定义H的能量是H中所有激活输出的和,。在KATE的前向计算过程中,计算了给定输入x的激活值z之后,选择最有竞争力的k个神经元作为获胜者,剩余的失败者被镇压(例如,使这些神经元变成不被激活的状态)。为了弥补从这些失败者中丢失的能量,也让神经元之间的竞争更清楚,放大这些能量并在胜利神经元之间重新分配这些能量。


KATE使用tanh作为隐藏层的激活函数,根据激活输出将神经元分为正神经元和负神经元。最具竞争力的神经元是激活值的绝对值最大的神经元。选择个最大的正神经元作为正的获胜者,将其他失败的正神经元的能量按a倍放大,并在这些正的获胜神经元之间重新分配这些能量,a是一个超参数。最后将所有失败的正神经元的激活值设为0。对负的激活值的神经元也类似处理,但负神经元是选择个获胜的负神经元。详细见Algorithm 2。a倍的放大连接过程是重要的过程。当a=0的时候,梯度后向传播时不会传播经过这些失败的神经元,模型就会变成常规的k-sparse自编码器。当a>2/k时(为什么是2/k,而不是直接是a>0,还没想清楚),后向梯度会经过这些失败神经元传播。从经验上来说,放大的过程帮助提升KATE模型。


以上图为例,展示了k=2的前向计算过程。h1和h6分别是正和负的获胜神经元。正的获胜神经元h1获得失败的正神经元h2,h3的能量,能量是激活值的和,也就是0.2+0.1=0.3。类似的,获胜的负神经元h6获得失败的负神经元h4,h5的能量,为-(|-0.1|+|-0.3|)=-0.4。超参数a控制了这些能量如何归入获胜神经元,h1的激活值变成0.8+0.3×a,h6的激活值变成-0.6-0.4×a,其他神经元的激活值设为0。

在输出层,连接隐藏层和输出层的权重是W的转置,但是偏倚不同于连接输入层和隐藏层的偏倚,是c。由于输入是非负的词频向量,输出层使用sigmoid作为激活函数,保持非负性。注意到在梯度后向传播的过程中,梯度首先从输出层流向获胜的神经元,然后通过a扩大连接的过程流向失败的神经元。梯度不会直接从输出层流向隐藏层失败的神经元,因为这些神经元在前向计算的过程中被设置成没有激活,激活值是0。

当KATE的神经网络被训练好之后,将测试输入按Algorithm 1来编码文本数据。测试输入x的激活值是,也就是文本向量。在编码的过程中不需要加入竞争,因为隐藏层的神经元被训练之后已经可以相互区分。这是KATE的优点之一。

猜你喜欢

转载自blog.csdn.net/xxzhix/article/details/80916441