scaled_dot_product_attention

注意:该API仅支持【静态图】模式

  • paddle.fluid.nets.scaled_dot_product_attention(queries, keys, values, num_heads=1, dropout_rate=0.0)[源代码]

该接口实现了的基于点积(并进行了缩放)的多头注意力(Multi-Head Attention)机制。attention可以表述为将一个查询(query)和一组键值对(key-value pair)映射为一个输出;Multi-Head Attention则是使用多路进行attention,而且对attention的输入进行了线性变换。公式如下:

scaled_dot_product_attention - 图1

其中,

scaled_dot_product_attention - 图2 分别对应 querieskeysvalues ,详细内容请参阅 Attention Is All You Need

要注意该接口实现支持的是batch形式,

scaled_dot_product_attention - 图3 中使用的矩阵乘是batch形式的矩阵乘法,参考 fluid.layers. matmul

  • 参数:
    • queries (Variable) - 形状为 scaled_dot_product_attention - 图4 的三维Tensor,其中 scaled_dot_product_attention - 图5 为batch_size, scaled_dot_product_attention - 图6 为查询序列长度, scaled_dot_product_attention - 图7 为查询的特征维度大小, scaled_dot_product_attention - 图8 为head数。数据类型为float32或float64。
    • keys (Variable) - 形状为 scaled_dot_product_attention - 图9 的三维Tensor,其中 scaled_dot_product_attention - 图10 为batch_size, scaled_dot_product_attention - 图11 为键值序列长度, scaled_dot_product_attention - 图12 为键的特征维度大小, scaled_dot_product_attention - 图13 为head数。数据类型与 queries 相同。
    • values (Variable) - 形状为 scaled_dot_product_attention - 图14 的三维Tensor,其中 scaled_dot_product_attention - 图15 为batch_size, scaled_dot_product_attention - 图16 为键值序列长度, scaled_dot_product_attention - 图17 为值的特征维度大小, scaled_dot_product_attention - 图18 为head数。数据类型与 queries 相同。
    • num_heads (int) - 指明所使用的head数。head数为1时不对输入进行线性变换。默认值为1。
    • dropout_rate (float) - 以指定的概率对要attention到的内容进行dropout。默认值为0,即不使用dropout。

返回: 形状为

scaled_dot_product_attention - 图19 的三维Tensor,其中 scaled_dot_product_attention - 图20 为batch_size, scaled_dot_product_attention - 图21 为查询序列长度, scaled_dot_product_attention - 图22 为值的特征维度大小。与输入具有相同的数据类型。表示Multi-Head Attention的输出。

返回类型: Variable

  • 抛出异常:
    • ValueErrorquerieskeysvalues 必须都是三维。
    • ValueErrorquerieskeys 的最后一维(特征维度)大小必须相同。
    • ValueErrorkeysvalues 的第二维(长度维度)大小必须相同。
    • ValueErrorkeys 的最后一维(特征维度)大小必须是 num_heads 的整数倍。
    • ValueErrorvalues 的最后一维(特征维度)大小必须是 num_heads 的整数倍。

代码示例

  1. import paddle.fluid as fluid
  2.  
  3. queries = fluid.layers.data(name="queries",
  4. shape=[3, 5, 9],
  5. dtype="float32",
  6. append_batch_size=False)
  7. queries.stop_gradient = False
  8. keys = fluid.layers.data(name="keys",
  9. shape=[3, 6, 9],
  10. dtype="float32",
  11. append_batch_size=False)
  12. keys.stop_gradient = False
  13. values = fluid.layers.data(name="values",
  14. shape=[3, 6, 10],
  15. dtype="float32",
  16. append_batch_size=False)
  17. values.stop_gradient = False
  18. contexts = fluid.nets.scaled_dot_product_attention(queries, keys, values)
  19. contexts.shape # [3, 5, 10]