Keras 2 API 文件 / 層 API / 注意力層 / 注意力層

注意力層

[原始碼]

Attention 類別

tf_keras.layers.Attention(use_scale=False, score_mode="dot", **kwargs)

點積注意力層,又稱 Luong 式注意力。

輸入為形狀 [batch_size, Tq, dim]query 張量、形狀 [batch_size, Tv, dim]value 張量,以及形狀 [batch_size, Tv, dim]key 張量。計算步驟如下:

  1. 使用 query-key 點積計算形狀為 [batch_size, Tq, Tv] 的分數:scores = tf.matmul(query, key, transpose_b=True)
  2. 使用分數計算形狀為 [batch_size, Tq, Tv] 的分布:distribution = tf.nn.softmax(scores)
  3. 使用 distribution 建立 value 的線性組合,其形狀為 [batch_size, Tq, dim]return tf.matmul(distribution, value)

引數

  • use_scale:若為 True,將建立一個純量變數來縮放注意力分數。
  • dropout:介於 0 和 1 之間的浮點數。注意力分數要捨棄的單元比例。預設為 0.0。
  • score_mode:用於計算注意力分數的函數,可以是 {"dot", "concat"} 之一。 "dot" 指的是查詢向量和鍵向量之間的點積。 "concat" 指的是查詢向量和鍵向量串聯的雙曲正切。

呼叫引數

  • inputs:下列張量的列表
    • query:形狀為 [batch_size, Tq, dim] 的查詢 Tensor
    • value:形狀為 [batch_size, Tv, dim] 的值 Tensor
    • key:形狀為 [batch_size, Tv, dim] 的可選鍵 Tensor。若未提供,則將使用 value 作為 keyvalue,這是最常見的情況。
  • mask:下列張量的列表
    • query_mask:形狀為 [batch_size, Tq] 的布林遮罩 Tensor。若提供,則在 mask==False 的位置,輸出將為零。
    • value_mask:形狀為 [batch_size, Tv] 的布林遮罩 Tensor。若提供,將套用遮罩,使得在 mask==False 位置的值不會對結果產生影響。
  • return_attention_scores:布林值,若為 True,則將注意力分數(遮罩和 softmax 後)作為額外輸出引數傳回。
  • training:Python 布林值,指示層應在訓練模式(新增 dropout)還是在推論模式(無 dropout)下運作。
  • use_causal_mask:布林值。針對解碼器自我注意力設定為 True。新增遮罩,使得位置 i 無法關注位置 j > i。這可以防止資訊從未來流向過去。預設為 False

輸出

Attention outputs of shape `[batch_size, Tq, dim]`.
[Optional] Attention scores after masking and softmax with shape
    `[batch_size, Tq, Tv]`.

queryvaluekey 的意義取決於應用。例如,在文字相似度的情況下,query 是第一段文字的序列嵌入,而 value 是第二段文字的序列嵌入。key 通常與 value 張量相同。

以下是在 CNN+注意力網路中使用 Attention 的程式碼範例

# Variable-length int sequences.
query_input = tf.keras.Input(shape=(None,), dtype='int32')
value_input = tf.keras.Input(shape=(None,), dtype='int32')

# Embedding lookup.
token_embedding = tf.keras.layers.Embedding(input_dim=1000, output_dim=64)
# Query embeddings of shape [batch_size, Tq, dimension].
query_embeddings = token_embedding(query_input)
# Value embeddings of shape [batch_size, Tv, dimension].
value_embeddings = token_embedding(value_input)

# CNN layer.
cnn_layer = tf.keras.layers.Conv1D(
    filters=100,
    kernel_size=4,
    # Use 'same' padding so outputs have the same shape as inputs.
    padding='same')
# Query encoding of shape [batch_size, Tq, filters].
query_seq_encoding = cnn_layer(query_embeddings)
# Value encoding of shape [batch_size, Tv, filters].
value_seq_encoding = cnn_layer(value_embeddings)

# Query-value attention of shape [batch_size, Tq, filters].
query_value_attention_seq = tf.keras.layers.Attention()(
    [query_seq_encoding, value_seq_encoding])

# Reduce over the sequence axis to produce encodings of shape
# [batch_size, filters].
query_encoding = tf.keras.layers.GlobalAveragePooling1D()(
    query_seq_encoding)
query_value_attention = tf.keras.layers.GlobalAveragePooling1D()(
    query_value_attention_seq)

# Concatenate query and document encodings to produce a DNN input layer.
input_layer = tf.keras.layers.Concatenate()(
    [query_encoding, query_value_attention])

# Add DNN layers, and create Model.
# ...