12月07, 2019

Attention机制

今天复习了Attention机制,自己再总结一下

Attendtion机制的几种做法

Name Alignment score function Notes
内容注意力/Content-base attention \ \text{score}(\boldsymbol{s}_t, \boldsymbol{h}_i) = \text{cosine}[\boldsymbol{s}_t, \boldsymbol{h}_i] 注意力机制的概念,最早在[神经图灵机](https://blog\.csdn\.net/rtygbwwwerr/article/details/50548311\)中提出。
NTM是一种使用Neural Network为基础来实现传统图灵机的理论计算模型。利用该模型,可以通过训练的方式让系统“学会”具有时序关联的任务流。
加性注意力/Additive(*) \ \text{score}(\boldsymbol{s}_t, \boldsymbol{h}_i) = \mathbf{v}_a^\top \tanh(\mathbf{W}_a[\boldsymbol{s}_t; \boldsymbol{h}_i]) 在NMT/神经机器翻译网络中使用
位置注意力/Location-Base \ \alpha_{t,i} = \text{softmax}(\mathbf{W}_a \boldsymbol{s}_t) 注意力权重仅依赖目标隐状态
通用注意力/General \ \text{score}(\boldsymbol{s}_t, \boldsymbol{h}_i) = \boldsymbol{s}_t^\top\mathbf{W}_a\boldsymbol{h}_i W是可以训练的参数
点积注意力/Dot-Product \ \text{score}(\boldsymbol{s}_t, \boldsymbol{h}_i) = \boldsymbol{s}_t^\top\boldsymbol{h}_i 在BIDAF问答模型中使用
缩放点积注意力/Scaled Dot-Product(^) \ \text{score}(\boldsymbol{s}_t, \boldsymbol{h}_i) = \frac{\boldsymbol{s}_t^\top\boldsymbol{h}_i}{\sqrt{n}} Transformer模型采用。在点积注意力基础上增加了缩放因子; n代表来源隐状态的维度数量. 避免输入值太大时,softmax函数的梯度太小,无法充分学习

Scaled dot-product attention的Pytorch实现

import torch
import torch.nn as nn


class ScaledDotProductAttention(nn.Module):
    """Scaled dot-product attention mechanism."""

    def __init__(self, attention_dropout=0.0):
        super(ScaledDotProductAttention, self).__init__()
        self.dropout = nn.Dropout(attention_dropout)
        self.softmax = nn.Softmax(dim=2)

    def forward(self, q, k, v, scale=None, attn_mask=None):
        """前向传播.

        Args:
            q: Queries张量,形状为[B, L_q, D_q]
            k: Keys张量,形状为[B, L_k, D_k]
            v: Values张量,形状为[B, L_v, D_v],一般来说就是k
            scale: 缩放因子,一个浮点标量
            attn_mask: Masking张量,形状为[B, L_q, L_k]

        Returns:
            上下文张量和attetention张量
        """
        # 矩阵乘法
        attention = torch.bmm(q, k.transpose(1, 2))
        if scale:
            attention = attention * scale
        if attn_mask:
            # 给需要mask的地方设置一个负无穷
            attention = attention.masked_fill_(attn_mask, -np.inf)
        # 计算softmax
        attention = self.softmax(attention)
        # 添加dropout
        attention = self.dropout(attention)
        # 和V做点积
        context = torch.bmm(attention, v)
        return context, attention

参考资料

本文链接:http://57km.cc/post/Attention IS ALL YOUR NEEDS.html

-- EOF --

Comments