SENet这篇文章是CNN based,目前在推荐领域应用也很广泛,正好前几天看了MaskNet的论文,回头看这篇论文时候,发现SE block的作用和Mask block作用相似,顺便记录一下~
SENet论文中给出的结构如下,由于论文是在CNN模型中提出的SE block
基本的流程如下:
z c = F s q ( u c ) = 1 H × W ∑ i = 1 H ∑ j = 1 W u c ( i , j ) z_c=F_{sq}(u_c)=\frac{1}{H \times W}\sum_{i=1}^{H}{\sum_{j=1}^{W}{u_c(i,j)}} zc?=Fsq?(uc?)=H×W1?i=1∑H?j=1∑W?uc?(i,j) s = F e x ( z , W ) = σ ( g ( z , W ) ) = σ ( W 2 δ ( W 1 z ) ) s=F_{ex}(z,W)=\sigma(g(z,W))=\sigma(W_2\delta(W_1z)) s=Fex?(z,W)=σ(g(z,W))=σ(W2?δ(W1?z))
下面主要介绍应用在推荐系统中的调整版本:
Squeeze
主要作用:Global Information Embedding
在Squeeze阶段,我们对每个特征的Embedding向量进行数据压缩与信息汇总,如下: z i = F s q ( v i ) = 1 k ∑ t = 1 k v i t z_i=F_{sq}(v_i)=\frac{1}{k}\sum_{t=1}^{k}{v_i^t} zi?=Fsq?(vi?)=k1?t=1∑k?vit?
假设某个特征 是k维大小的Embedding,那么我们对Embedding里包含的k维数字求均值,得到能够代表这个特征汇总信息的数值 ,也就是说,把第i个特征的Embedding里的信息压缩到一个数值。
通过Squeeze阶段,对于每个特征 v i v_i vi?,都压缩成了单个数值 z i z_i zi? ,假设特征Embedding层有 f f f个特征,就形成了Squeeze向量 Z Z Z,向量大小为 f f f 。
Excitation
capture feature-wise dependencies
S = F e x ( Z , W ) = δ ( W 2 δ ( W 1 Z ) ) S=F_{ex}(Z,W)=\delta(W_2\delta(W_1Z)) S=Fex?(Z,W)=δ(W2?δ(W1?Z)) 每个特征以一个Bit来表征,通过MLP来进行交互,通过交互,得出结果:对于当前所有输入的特征,通过相互发生关联,来动态地判断哪些特征重要,哪些特征不重要。这个就和Mask block的目的想通了,都是通过构建一种运算方式,来动态的强化重要特征,弱化噪声或不重要的特征。
因为假设Embedding层有f个特征,那么我们需要保证输出f个权重值,而第二个MLP就是起到将大小映射到f个数值大小的作用。这样,经过两层MLP映射,就会产生f个权重数值,第i个数值对应第i个特征Embedding的权重 a i a_i ai? 。我们把每个特征对应的权重 a i a_i ai? ,再乘回到特征对应的Embedding里,就完成了对特征重要性的加权操作。 a i a_i ai? 数值大,说明SENet判断这个特征在当前输入组合里比较重要, a i a_i ai? 数值小,说明SENet判断这个特征在当前输入组合里没啥用。
所谓动态,指的是比如对于某个特征,在某个输入组合里可能是没用的,但是换一个输入组合,很可能是重要特征。它重要不重要,不是静态的,而是要根据当前输入,动态变化的。