这是一个结构很简单的网络(见图1),速度非常快,在某些任务上准确率会比rnn\transformer等还要好。有没有谁能告诉我为什么简单但却有效呢?

关键代码也是超级简单
sentence_embeddings = tf.nn.embedding_lookup(self.Embedding,self.sentence) #参考的代码中self.Embedding是随机初始化的,应该也可以用预训练的词向量进行初始化吧
self.sentence_embeddings = tf.reduce_mean(sentence_embeddings, axis=1)
self.W = tf.get_variable("W", [self.embed_size, self.label_size])
self.b = tf.get_variable("b", [self.label_size])
logits = tf.matmul(self.sentence_embeddings, self.W) + self.b
训练时的损失函数比较特别,用的是语言模型常用的损失函数nce损失:
loss = tf.reduce_mean(
tf.nn.nce_loss(weights=tf.transpose(self.W),
biases=self.b,
labels=labels,
inputs=self.sentence_embeddings,
num_sampled=self.num_sampled,
num_classes=self.label_size,partition_strategy="div"))
论文里面还提到两个trick一个是分层softmax 一个是ngram。