特征交叉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向量维度不同

### 动态特征增强模块的技术原理与实现方式 动态特征增强模块的核心目标在于通过自适应的方式融合多尺度特征,从而提升模型对复杂场景的理解能力预测精度。以下是关于其实现方式技术原理的具体分析: #### 1. 多尺度特征提取 动态特征增强模块通常依赖于多尺度特征的提取。这一过程可以通过卷积神经网络(CNNs)中的不同层输出来完成。每一层的输出代表特定尺度下的特征表示。例如,在深层网络中,浅层捕捉到的是局部细节信息,而较深的层次则更多关注全局结构信息。 为了更有效地获取多尺度特征,可以采用金字塔池化结构[^3]。这种结构通过对输入特征图进行多次下采样上采样操作,生成多个分辨率不同的特征图,随后将其拼接在一起形成最终的多尺度特征表示。 ```python import torch.nn as nn class PyramidPoolingModule(nn.Module): def __init__(self, in_channels, out_channels): super(PyramidPoolingModule, self).__init__() self.pooling_layers = [ nn.AdaptiveAvgPool2d(output_size=(s, s)) for s in [1, 2, 3, 6] ] self.conv_layers = nn.ModuleList([ nn.Conv2d(in_channels, out_channels, kernel_size=1) for _ in range(4) ]) def forward(self, x): pooled_features = [] for i, pooling_layer in enumerate(self.pooling_layers): pool_out = pooling_layer(x) conv_out = self.conv_layers[i](pool_out) upsampled = nn.functional.interpolate(conv_out, size=x.size()[2:], mode='bilinear', align_corners=True) pooled_features.append(upsampled) return torch.cat([x] + pooled_features, dim=1) ``` #### 2. 自适应权重分配 动态特征增强的一个关键技术点是对不同尺度的特征赋予合适的权重。这一步骤可以通过注意力机制实现。具体来说,注意力机制会根据当前任务需求计算每种尺度特征的重要性,并据此调整各部分特征的比例。 一种常见的做法是使用SENet(Squeeze-and-Excitation Network),它先压缩空间维度得到通道间的统计特性,再经过全连接层映射产生各个通道上的激励系数[^3]。 ```python class ChannelAttentionModule(nn.Module): def __init__(self, channels, reduction_ratio=16): super(ChannelAttentionModule, self).__init__() hidden_units = int(channels / reduction_ratio) self.global_avg_pool = nn.AdaptiveAvgPool2d((1, 1)) self.fc1 = nn.Linear(channels, hidden_units, bias=False) self.relu = nn.ReLU(inplace=True) self.fc2 = nn.Linear(hidden_units, channels, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): batch_size, num_channels, _, _ = x.size() y = self.global_avg_pool(x).view(batch_size, num_channels) y = self.fc1(y) y = self.relu(y) y = self.fc2(y) attention_weights = self.sigmoid(y).view(batch_size, num_channels, 1, 1) return x * attention_weights ``` #### 3. 特征交互与融合 除了单独考虑每个尺度外,还需要促进不同尺度间的信息交流。为此可设计专门的交叉连接或者残差路径让高低频信号互相补充。比如ResNet风格的跳跃链接允许远距离节点共享梯度更新;又或者是DenseNet那样密集堆叠前向传播链路使得任意两层之间均存在直接联系。 另外还可以引入Transformer架构作为辅助工具进一步加强远程依存关系的学习效果。借助其强大的编码能力捕获长程关联模式有助于改善整体表现水平。 ```python class FeatureFusionBlock(nn.Module): def __init__(self, low_level_inplanes, high_level_inplanes, output_planes): super(FeatureFusionBlock, self).__init__() self.low_conv = nn.Sequential( nn.Conv2d(low_level_inplanes, output_planes//2, kernel_size=1), nn.BatchNorm2d(output_planes//2), nn.ReLU(True) ) self.high_conv = nn.Sequential( nn.Conv2d(high_level_inplanes, output_planes//2, kernel_size=1), nn.BatchNorm2d(output_planes//2), nn.ReLU(True) ) self.fuse_conv = nn.Sequential( nn.Conv2d(output_planes, output_planes, kernel_size=3, padding=1), nn.BatchNorm2d(output_planes), nn.ReLU(True) ) def forward(self, low_feat, high_feat): low_resized = F.interpolate(low_feat, scale_factor=0.5, mode="nearest") high_upscaled = F.interpolate(high_feat, scale_factor=2, mode="nearest") fused_low = self.low_conv(low_resized) fused_high = self.high_conv(high_upscaled) combined = torch.cat([fused_low, fused_high], dim=1) result = self.fuse_conv(combined) return result ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值