從rnn到lstm,再到seq2seq(二)

2022-05-08 21:06:11 字數 2659 閱讀 4414

從圖上可以看出來,decode的過程其實都是從encode的最後乙個隱層開始的,如果encode輸入過長的話,會丟失很多資訊,所以設計了attation機制。

attation機制的decode的過程和原來的最大的區別就是,它輸出的不只是基於本時刻的h,而是基於本時刻的h和c的concat矩陣。

那麼c是什麼,c就是encode的h的聯合(見最後一張圖的公式),含義非常明顯了,就是我在decode的時候,不但考慮我現在decode的隱層的情況,同時也考慮到encode的隱層的情況,那麼關鍵是encode的隱層那麼多,你該怎麼考慮了,這就是attation矩陣的計算方式。。目前的計算方式是,這個時刻decode的隱層和encode的所有隱層做個對應,最後一張圖非常明白

如果你還沒有理解,看這個公式,輸入的d『t就是我上面說的c,把這個和dt concat就是本時刻輸出的隱層

其實實現起來不複雜,就是在decode的時候,隱層和encode的隱層對應一下,然後concat一下:

下面這個**是在github上找的,兩個隱層對應的方式可能跟上面說的不一樣,但是原理都差不多,看這個**感受一下這個流程。

s =self.encoder.zero_state(self.batch_size, tf.float32)

encoder_hs =

with tf.variable_scope(

"encoder"):

for t in

xrange(self.max_size):

if t >0: tf.get_variable_scope().reuse_variables()

x = tf.squeeze(source_xs[t], [1])

x = tf.matmul(x, self.s_proj_w) +self.s_proj_b

h, s =self.encoder(x, s)

encoder_hs =tf.pack(encoder_hs)

s =self.decoder.zero_state(self.batch_size, tf.float32)

logits =

probs =

with tf.variable_scope(

"decoder"):

for t in

xrange(self.max_size):

if t >0: tf.get_variable_scope().reuse_variables()

ifnot self.is_test or t ==0:

x = tf.squeeze(target_xs[t], [1])

x = tf.matmul(x, self.t_proj_w) +self.t_proj_b

h_t, s =self.decoder(x, s)

h_tld =self.attention(h_t, encoder_hs)

oemb = tf.matmul(h_tld, self.proj_w) +self.proj_b

logit = tf.matmul(oemb, self.proj_wo) +self.proj_bo

prob =tf.nn.softmax(logit)

defattention(self, h_t, encoder_hs):

#scores = [tf.matmul(tf.tanh(tf.matmul(tf.concat(1, [h_t, tf.squeeze(h_s, [0])]),

#self.w_a) + self.b_a), self.v_a)

#for h_s in tf.split(0, self.max_size, encoder_hs)]

#scores = tf.squeeze(tf.pack(scores), [2])

scores = tf.reduce_sum(tf.mul(encoder_hs, h_t), 2)

a_t =tf.nn.softmax(tf.transpose(scores))

a_t = tf.expand_dims(a_t, 2)

c_t = tf.batch_matmul(tf.transpose(encoder_hs, perm=[1,2,0]), a_t)

c_t = tf.squeeze(c_t, [2])

h_tld = tf.tanh(tf.matmul(tf.concat(1, [h_t, c_t]), self.w_c) +self.b_c)

return h_tld

NLP從Seq2Seq到ALBERT模型理解與實踐

今天來推薦一下自己開源的乙個小專案,主要包括nlp中一些經典模型的理解與相關實踐,從最初的seq2seq到目前比較流行的bert模型,以及bert模型改進 albert模型等。下面是模型實踐的基本學習路線 內年分為對應模型的 發表年份。1 seq2seq模型 2 attention機制 3 tran...

seq2seq模型詳解

在李紀為博士的畢業 中提到,基於生成的閒聊機械人中,seq2seq是一種很常見的技術。例如,在法語 英語翻譯中,的當前英語單詞不僅取決於所有前面的已翻譯的英語單詞,還取決於原始的法語輸入 另乙個例子,對話中當前的response不僅取決於以往的response,還取決於訊息的輸入。其實,seq2se...

Seq2Seq模型結構

seq2seq sequence to sequence 是乙個處理序列問題的模型,傳統的 rnn 或 lstm 只能處理 輸入及輸出是定長即 一對一或多對多的問題,而 seq2seq 則能處理一對多的問題,它也是 rnn 最重要的乙個變種 n vs m 輸入與輸出序列長度不同 編碼 解碼模型,主要...