
整体结构很好看,对与单词的表达进行改变,改变的动机是想要利用其他模态的信息,非常合理。
在中间的模块,首先做了对声音特征和视觉特征的权重计算,也就是计算了一个gate的门值:

门值计算之后就开始加权,直接得到将要去shift的向量h_m:

以上论文描述对应的代码都很清晰:
wordFlat = words.data.contiguous().view(-1, gc.wordDim)
covarepWeight = self.covarepW(torch.cat([covarepState, wordFlat], 1))
facetWeight = self.facetW(torch.cat([facetState, wordFlat], 1))
covarepState = covarepState * covarepWeight
facetState = facetState * facetWeight #这里两个就都分别计算完了
addon = self.calcAddon(torch.cat([covarepState, facetState], 1)) # 这里根据后面的定义应该只是做了映射
定义:
self.calcAddon = nn.Linear(2 * gc.cellDim, gc.wordDim) #和单词维度一样了而已。
以上这个在论文里找不到对应公式了,不过操作好理解,最多加了一层映射,不影响网络的核心结构。
接下来是sift的计算:

这里公式直观看,很好理解,就是在原来的单词表达上加了一个向量,同时又给这个向量一个缩放系数,这就是公式7
接下来,为了决定这个系数,用了一个min函数,之所以这样搞,论文中是这样说的:

非常合理!
但是代码中的实现却比较疑惑,注释部分是笔记
addonL2 = torch.norm(addon, 2, 1) # h_m_2
addonL2 = torch.max(addonL2, torch.tensor([1.0]).to(gc.device)) / torch.tensor([gc.shift_weight]).to(gc.device)
addon = addon / addonL2.unsqueeze(1)
addon = addon.data.contiguous().view(batch, gc.padding_len, gc.wordDim)
wordsL2 = torch.norm(words, 2, 2).unsqueeze(2)
wordInput = self.dropWord(words + addon * wordsL2) #公式7中的加法
最后一行应该是公式7,那加号两边应该是原始的words和对于h_m的加权
左边肯定没有问题,问题在于右边的addon*wordsL2
wordsL2是对原始的words取了范数
网页编辑保存失败了???
重新简单总结一下吧:就是的确用了shift的思想,但是具体shift的计算过程和论文中给的不一样,就这样吧。
2721

被折叠的 条评论
为什么被折叠?



