注意力seq2seq模型
大部分的seq2seq模型,對所有的輸入,一視同仁,同等處理。
但實際上,輸出是由輸入的各個重點部分產生的。
比如:
(舉例使用,實際比重不是這樣)
對於輸出“晚上”,
各個輸入所占比重: 今天-50%,晚上-50%,吃-100%,什么-0%
對於輸出“吃”,
各個輸入所占比重: 今天-0%,晚上-0%,吃-100%,什么-0%
特別是在seq2seq的看圖說話應用情景中
睡覺還握着筆的baby
這里的重點就是baby,筆!通過這些重點,生成描述。
下面這個圖,就是attention的關鍵原理
tensorlfow 代碼
encoder 和常規的seq2seq中的encoder一樣,只是在attention模型中,不再需要encoder累計的state狀態,需要的是各個各個分詞的outputs輸出。
在訓練的時候,將這個outputs與一個權重值一起擬合逼進目標值。
這個權重值,就是各個輸入對目標值的貢獻占比,也就是注意力機制!
dec_cell = self.cell(self.hidden_size)
attn_mech = tf.contrib.seq2seq.LuongAttention(
num_units=self.attn_size, # 注意機制權重的size
memory=self.enc_outputs, # 主體的記憶,就是decoder輸出outputs
memory_sequence_length=self.enc_sequence_length,
# normalize=False,
name='LuongAttention')
dec_cell = tf.contrib.seq2seq.AttentionWrapper(
cell=dec_cell,
attention_mechanism=attn_mech,
attention_layer_size=self.attn_size,
# attention_history=False, # (in ver 1.2)
name='Attention_Wrapper')
initial_state = dec_cell.zero_state(dtype=tf.float32, batch_size=batch_size)
# output projection (replacing `OutputProjectionWrapper`)
output_layer = Dense(dec_vocab_size + 2, name='output_projection')
# lstm的隱藏層size和attention 注意機制權重的size要相同