SENET: Squeeze-and-Excitation Networks

基本信息

字段 内容
标题 Squeeze-and-Excitation Networks
作者 Jie Hu, Li Shen, Samuel Albanie, Gang Sun, Enhua Wu
机构 Momenta; University of Oxford
年份 2018 (CVPR’18 Best Paper)
方向 Channel Attention, Feature Recalibration (原始 CV);推荐侧 → Feature-level Reweighting
场景 CV 图像分类通道注意力(原始);推荐系统中作为 FiBiNET 等模型的 embedding 特征重要性门控
arXiv https://arxiv.org/abs/1709.01507

是CV领域提出的模型,这里只简单介绍其在推荐任务中的应用。

SENET被FiBiNET使用,是用于不同特征Embedding权重化的一个模块

主要步骤:

1.池化:每个特征对Embedding做平均池化,(batchsize, num_features, embedding_dim) -> (batchsize, num_features)

2.提取:对池化后的Embedding作为输入送入两层FC Layer,先降维后升维,然后对输出使用Sigmoid,得到形状为(batchsize, num_features)的权重向量

3.加权:使用权重向量对原始的每个Embedding进行加权,得到权重增强的Embedding向量(batchsize, num_features, embedding_dim)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import torch  
import torch.nn as nn
import torch.nn.functional as F

class SEBlock(nn.Module):
def __init__(self, num_channels, reduction_ratio=4):
super(SEBlock, self).__init__()
self.avg_pool = nn.AdaptiveAvgPool1d(1) # 对于1D特征(如嵌入向量)
self.fc = nn.Sequential(
nn.Linear(num_channels, num_channels // reduction_ratio, bias=False),
nn.ReLU(inplace=True),
nn.Linear(num_channels // reduction_ratio, num_channels, bias=False),
nn.Sigmoid()
)

def forward(self, x_input):
b, f, size = x_input.size()
y = self.avg_pool(x_input).view(b, f)
gate = self.fc(y).view(b, f, 1)
return x_input * gate