深度学习中为什么不同的特征信息可以直接相加
class ImageFeatureDecoder(nn.Module):
def __init__(self, vocab_size, d_model, N, heads, dropout, max_length=1024):
super().__init__()
self.N = N
self.embedX = Embedder(vocab_size, d_model)
self.embedP = Embedder(max_length, d_model)
self.layers = get_clones(DecoderLayer(d_model, heads, dropout), N)
self.norm = Norm(d_model)
def forward(self,image_tensor,operation,trg_mask):
position = torch.arange(0, image_tensor.size(1), dtype=torch.long,
device=image_tensor.device)
x = image_tensor+self.embedP(position)+self.embedX(operation)
for i in range(self.N):
x = self.layers[i](x, trg_mask)
return self.norm(x)
这串代码讲的是,把有限的历史画面特征、对应画面序号信息和操作信息进行融合后再编码,得到混合后的融合特征。但是这串代码中直接将三种信息相加的语句让我很不理解。这样直接相加不同类型的特征,特征岂不会混乱了,为什么不用concat。
其实当concat的信息共用一个权重矩阵的时候,与直接相加的效果一样。(img+pos)W=img*W+pos*W。多一个权重矩阵也就多一笔计算量,所以,在有的场合(concat作用不大的情况)直接用add。此外,参数少还能有效减少过拟合的风险。
人眼有一项能力,在一张图片中,除了可以看见物体、人物,还可以通过低频信息读出白天还是夜晚的信息。拍同一场景,黑夜与晚上各一张。虽然时间与场景叠加,但是你依然能找到图片中的高频信息(人与物),这就是人天生傅里叶变换逆向转换的能力。但是当时间信息非常夸张的话,过分的黑与白,会让你看不清高频信息。但是高频信息依然存在,不过它会因为各种因素(拍照设备,观测设备)趋向于没有。事实上,一种信息淹没另外一种信息,需要非常强的信息能量。不过,既然这个信息非常强,那说明这个信息很重要,如果不重要,那必然会被反向传播给优化处理。
我将768长度的位置信息与图像特征信息以点的形式画在图上,其中红色点是位置信息,蓝色点是图像信息,绿色点是相加信息。从图中可以看出,也许二维空间中无法区分出来这些信息,但是,这要是放到768维空间中的话,这区分也就没有那么困难。
推荐阅读
公众号粉丝礼包: 后台关键词:python大礼包 礼包内容:Matlab,数据分析与机器学习实战,数据科学概率基础,数学基础,算法讲解视频 整理不易,还请点击在看与分享,谢谢。
希望您能喜欢“在看”
评论