特征交叉04 SENet 和 Bilinear 交叉

  SENet 和 Bilinear 交叉这两种模型用在排序上都有收益。

  SENet:

根据所有的特征,自动判断每一个field的特征重要性。对离散特征做field-wise 加权。

embedding向量维度相同

离散特征的处理:表示成K维的向量,m个特征

对矩阵的行做avgpooling得到一个向量,向量每个元素对应一个离散特征。

再用一个全连接层和relu激活函数把m维向量压缩成m/r维向量。r是压缩比例,一个大于1的数。

再用一个全连接层和sigmoid函数恢复成m维向量,元素介于0-1之间欸。

把向量成行乘到最初的mxk矩阵上,得到新的矩阵。新矩阵第二行是原矩阵第二行乘以m维向量第二个元素。

中间m维向量的作用就是对特征对加权。

embedding向量维度不同

field间特征交叉

这两种都要求训练形状相同。

Bilinear 交叉(内积)

想要减少参数数量,需要人工指定某些相关而且重要的特征做交叉,而不能让全部都交叉。

Bilinear 交叉(哈达玛乘积)

FiBiNet:

结合SENet 和 Bilinear 交叉

### SENet SE 的概念及其在深度学习架构中的关系 #### 什么是 Squeeze-and-Excitation (SE)? Squeeze-and-Excitation 是一种用于增强卷积神经网络(CNN)性能的模块化设计。它通过显式建模通道之间的相互依赖性,使网络能够自适应地重新校准通道特性的重要性[^1]。具体来说: - **Squeeze 操作**:该操作会全局平均池化每个通道上的特征图,从而生成一个描述整个输入空间的单一向量。这一步骤有效地压缩了空间维度的信息。 - **Excitation 操作**:基于挤压后的特征向量,这一阶段利用两个全连接层计算权重,这些权重表示不同通道的重要程度。最终得到的是一个归一化的激活函数输出。 - 将 Excitation 阶段产生的权值乘回到原始输入特征图上完成最后的重缩放过程。 这种机制允许模型关注更有意义的部分而抑制无关紧要的内容,进而提升整体表现效果。 #### 关于 SENet 架构 SENet(Squeeze-and-Excitation Network)是在传统 CNN 基础之上引入了多个 SE 模块构成的新一代高效网络结构之一。它的核心思想就是在标准 Residual Blocks 或者其他类型的 Building Blocks 中嵌入上述提到过的 SE 组件来加强信息传递效率以及提高泛化能力[^1]。 例如,在构建 SE-Inception 网络时,可以将转换 \(F_{tr}\) 视作一个完整的 Inception 模块;而在创建 SE-ResNet 则把同样的变换应用到了残差单元里——即让 squeeze-excitation 过程发生在恒等映射之前[^1]。这样做的好处在于不仅保留了原有框架的优点还额外增加了对跨通道交互的学习功能。 另外值得注意的是,除了与 ResNet 结合外,还可以很容易地将其扩展至更多现有先进模型比如 ResNeXt、Inception-ResNet、MobileNet 及 ShuffleNet 上面去形成各自对应的改进版本如 SE-ResNeXt 等。 ```python import torch.nn as nn class SELayer(nn.Module): def __init__(self, channel, reduction=16): super(SELayer, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.fc = nn.Sequential( nn.Linear(channel, channel // reduction, bias=False), nn.ReLU(inplace=True), nn.Linear(channel // reduction, channel, bias=False), nn.Sigmoid() ) def forward(self, x): b, c, _, _ = x.size() y = self.avg_pool(x).view(b, c) y = self.fc(y).view(b, c, 1, 1) return x * y.expand_as(x) # Example usage within a residual block class SEResBlock(nn.Module): expansion = 1 def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1, base_width=64, dilation=1, norm_layer=None, *, reduction=16): ... self.se = SELayer(planes * block.expansion, reduction=reduction) def forward(self, x): identity = x out = ... # Convolution operations here out = self.se(out) if self.downsample is not None: identity = self.downsample(x) out += identity out = self.relu(out) return out ``` 以上代码片段展示了如何定义一个基本形式下的 SE 层类 `SELayer` 并将其融入到典型的残差块之中成为新的组件 `SEResBlock`. #### 总结对比分析 | 特征 | SE | SENet | |------|----------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------| | 定义 | 单独存在的轻量化模块,负责调整各通道间的关系 | 整套包含若干个 SE 模块在内的新型深层神经网路 | | 功能 | 提升单一层面对复杂场景的理解力 | 显著改善整条流水线上各级别的表达质量 | | 应用范围 | 能够灵活嫁接到几乎所有的经典 CNN 设计上去 | 主要是针对特定领域问题定制开发出来的综合性解决方案 | 尽管两者紧密相连但从严格意义上讲它们还是有所区别的:“SE”仅仅代表了一种技术手段或者说是工具,“SENet”才是指代运用这项技术创新之后所形成的完整体系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值