Words Can Shift 代码阅读

git代码链接

在这里插入图片描述
整体结构很好看,对与单词的表达进行改变,改变的动机是想要利用其他模态的信息,非常合理。
在中间的模块,首先做了对声音特征和视觉特征的权重计算,也就是计算了一个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的计算过程和论文中给的不一样,就这样吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

binqiang2wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值
>