attention的一种实现方式记录

1. ATTENTION的一种结构及计算公式

  • 如下图,原图记得是来自论文Effective Approaches to Attention-based Neural Machine Translation(下图及后续图片直接copy自blog,侵删)在这里插入图片描述
  • 思想是当前信息ht与前文多个信息hs进行比对计算,得到对各个前文信息hs应该有多少关注度,即at;利用at加权相应的hs,并累加所有加权后的前文信息,得到综合前文信息ct,将其与当前信息ht进行拼接组合进行预测;
  • 上述流程计算方式如下:
    在这里插入图片描述
  • 这里的注意力其实可以认为指的是at,因此需要关注at如何计算(上述公式1),at计算主要部分是score(ht, hs),score计算常见有三种方式,如下:在这里插入图片描述

2. score的一种实现代码

  • 这里贴出Intel distiller开源实现的score第三种方式的计算代码,输入为两个三维tensor,分别是query和keys,shape分别为[batch_size, query_len, hid_dim] 和 [batch_size, key_len, hid_dim]:
    def calc_score(self, att_query, att_keys):
        """
        Calculate Bahdanau score

        :param att_query: b x t_q x n
        :param att_keys: b x t_k x n

        return b x t_q x t_k scores
        """

        b, t_k, n = att_keys.size()
        t_q = att_query.size(1)
		# 以下进行dimension的扩充;因为这里的query_len 不再是1,而是多个,通过扩充dimension来和keys做笛卡尔积,可以减少代码量和快速计算;
        att_query = att_query.unsqueeze(2).expand(b, t_q, t_k, n)
        att_keys = att_keys.unsqueeze(1).expand(b, t_q, t_k, n)
        # eltwiseadd_qk是一个tensor相加的简单操作(因其他目的做了封装);之所以相加,是简化了第三种score计算方式,即将上述Wa省略了(注意第三种方式等价于拼接前各自乘以一个W后再相加,如果把各自的w去掉,就是直接相加了);
        sum_qk = self.eltwiseadd_qk(att_query, att_keys)
		# 做一些归一化
        if self.normalize:
            sum_qk = self.eltwiseadd_norm_bias(sum_qk, self.normalize_bias)
			# self.linear_att 是一个shape为[hid_dim]的tensor
            tmp = self.linear_att.to(torch.float32) 
            linear_att = tmp / tmp.norm()
            linear_att = linear_att.to(self.normalize_scalar)
			# eltwisemul_norm_scaler 乘法封装
            linear_att = self.eltwisemul_norm_scaler(linear_att, self.normalize_scalar)
        else:
            linear_att = self.linear_att
		# self.matmul_score 乘法封装,得到score结果
        out = self.matmul_score(self.tanh(sum_qk), linear_att)  # a.matmul(b)
        return out

  • 还是要自己写一遍加深印象和代码能力

3. 关于注意力可能的改进或者变种

  • 目前的注意力机制似乎要和前文信息的每个字或者每个词进行逐一计算注意力,个人觉得略繁琐,是否可以有块注意力,是否可以利用前面的注意力结果,尤其是在decoding的时候

P.S 仅供参考,敬请指正,侵删

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值