我最近抽空完成了一个新的github项目–InferSent 。 关于InferSent前面的文章有过介绍。我实现它的原因有二:一是因为算法本身简单,二是因为它在各种NLP任务上表现可以和其他state-of-art的模型对标。
InferSent的模型结构如下:
InferSent选择了NLI任务用来训练句子embedding,对应的数据集是SNLI,前文有介绍,这里不再赘述。 作为premise和hypothesis的句子共享同一个sentence encoder。 论文实验了LSTM and GRU, BiLSTM with mean/max pooling, Self-attentive network, Hierarchical ConvNet。 结论是BiLSTM with max pooling在迁移学习中综合表现最好。
我在代码里实现了两种encoder,DAN(deep averaging network) 和 BiLSTM with max pooling。 实现后者是因为其作为encoder表现最优,实现DAN仅仅是因为它简单,可以做一个基线算法。
def bilstm_as_encoder(sent_padded_as_tensor, word_embeddings,
layer_size, hidden_size=100, sent_length=50, embedding_size=300):
embed_input = tf.nn.embedding_lookup(word_embeddings,
sent_padded_as_tensor)
print("sent_padded_as_tensor: "+str(sent_padded_as_tensor))
print("embed_input: "+str(embed_input))
cell_fw = tf.nn.rnn