这是最近在做王者荣耀AI所做的笔记。
# 首发同名公号
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。
我印象中这种添加位置信息的 *** 作来源于自然语言处理那边,所以我就翻看了相关网页,得到了很Nice的答案。
其实当concat的信息共用一个权重矩阵的时候,与直接相加的效果一样。
(img+pos)W=img*W+pos*W。
多一个权重矩阵也就多一笔计算量,所以,在有的场合(concat作用不大的情况)直接用add。
此外,参数少还能有效减少过拟合的风险。
人眼有一项能力,在一张图片中,除了可以看见物体、人物,还可以通过低频信息读出白天还是夜晚的信息。
拍同一场景,黑夜与晚上各一张。
虽然时间与场景叠加,但是你依然能找到图片中的高频信息(人与物),这就是人天生傅里叶变换逆向转换的能力。
但是当时间信息非常夸张的话,过分的黑与白,会让你看不清高频信息。
但是高频信息依然存在,不过它会因为各种因素(拍照设备,观测设备)趋向于没有。
事实上,一种信息淹没另外一种信息,需要非常强的信息能量。
不过,既然这个信息非常强,那说明这个信息很重要,如果不重要,那必然会被反向传播给优化处理。
我将768长度的位置信息与图像特征信息已点的形式画在图上,其中红色点是位置信息,蓝色点是图像信息,绿色点是相加信息。
从图中可以看出,也许二维空间中无法区分出来这些信息,但是,这要是放到768维空间中的话,这区分也就没有那么困难。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)