attention mechanism( 구현 관점에서 ) 작성중 - beyondnlp/nlp GitHub Wiki

  • TF가 능숙하지 않은 개발자 입장에서 attenton구현시 고민하게 하는 부분
    • seq2seq를 구현할때 tf로 구현을 하게 되면 전처리 부분을 제외하고 encoder 2줄 decoder 2줄이면 해결이 된다.( 과장해서 )
    • cell을 선언하고 선언된 셀을 입력으로 dynamic_rnn에서 필요한 만큼 루프를 돌아 outputs과 state를 리턴해준다.
    • ( 주의 : 리턴값 outputs은 복수이고 state는 단수이다.)
   self.enc_cell = tf.nn.rnn_cell.BasicLSTMCell(self.n_hidden_size)
   self.dec_cell = tf.nn.rnn_cell.BasicLSTMCell(self.n_hidden_size )
   self.enc_outputs, self.enc_state = tf.nn.dynamic_rnn( self.enc_cell, self.enc_embed, sequence_length=self.seq_length, dtype=tf.float32 )
   self.dec_outputs, self.dec_state = tf.nn.dynamic_rnn( self.dec_cell, self.dec_embed, initial_state=self.enc_state, dtype=tf.float32 )
  • tensorflow debug tip
    • _, loss = sess.run( [optimizer, loss ], feed_dict=feed_dict )
    • 보통 위와 같이 사용한다.
    • sess run에 feed_dict처럼 앞의 그래프 노드도 dict 형태로 입력이 가능하다. dict로 입력을 하면 return value도 dict형식으로 리턴이 되고 변수의 shape와 값을 동시에 찍어 볼수 있다.
    • 예를 들면 다음과 같다.
feed_opt={
    'model'        : model,
    'losses'       : losses,
feed_dict={
    enc_input : inputs_batch,
    dec_input : output_batch,
    targets   : target_batch,
    seq_length: train_sequence_length,
    n_batch_size: batch_size,
}
rets = sess.run( feed_opt, feed_dict=feed_dict )
for key in rets:
   val = rets[key];
   print('---------------------------------------------------------------------------------')
   print( 'SHAPE:' , np.shape(val), key )
   #print( key + ' : ', val )
print('--------------------------------------end-------------------------------------------')