jiangxinyang227 / textClassifier

tensorflow implementation
1.14k stars 556 forks source link

Transformer 计算key mask似乎有问题 #1

Closed ipp123456 closed 5 years ago

ipp123456 commented 5 years ago

位置嵌入生成的是一个[batch_size, sequence_length,sequence_length]维的单位矩阵; 然后与词嵌入拼接:self.embeddedWords = tf.concat([self.embedded, self.embeddedPosition], -1) 这个矩阵的维度应该是[batch_size, sequence_length,embedding_size+sequence_length],再作为Q/K/V传入multiheadAttention; 计算key mask的时候:keyMasks = tf.sign(tf.abs(tf.reduce_sum(keys, axis=-1))),比如最后时间步做的是Pad Zero, keys[:,:,-1]=[0,0,0,…0,|0,…,0,1] (“|”之前的是词嵌入,“|”之后的是位置嵌入)用上面函数计算出来的也是1,好像key mask永远不会有0值。

请问下作者用transformer做文本分类的效果怎么样?我尝试了keras上的实现总比LSTM差2-4个点,有遇到过吗? 谢谢!

jiangxinyang227 commented 5 years ago

感谢您的指正,确实存在这个问题,我应该将为拼接前的矩阵作为一个新的参数传入到multiheadAttention函数中,用这个来获得padding的位置。

transformer我目前还没有在实际工作中应用过,就在IMDB数据集上来看,目前的效果比BiLSTM + Attention要差一些,但是不多,准确率差0.7,auc差0.3。 IMDB数据集比较小,训练数据只有20000,就我目前的尝试大概有几个发现,你可以参考下: 1,我在这里选择固定的one-hoe的position embedding比论文中提出的利用正弦余弦函数生成的position embedding的效果要好,主要是论文中提出的position embedding是作为可训练的值传入的,这样就增加了模型的复杂度,在小数据集上有所下降。 2,mask可能不需要,添加mask和去除mask对结果基本没啥影响,也许在其他的任务或者数据集上有作用,但论文也并没有提出一定要在encoder结构中加入mask,mask更多的是用在decoder。 3,transformer的层数,我这里只用了一层,今天试了多层,发现效果并没有什么变化,层数多了之后反而有所下降。 4,在subLayers上加dropout正则化,主要是在multi-head attention层加,因为feed forward是用卷积实现的,不加dropout应该没关系。 目前来看,transformer在小数据集上的效果并不一定有LSTM好,之前看有人提到小数据集还是不要用transformer,用LSTM就好了。

我目前也还在探索中,希望能对您有帮助。

ipp123456 commented 5 years ago

确实我是在小数据集(8000+)上尝试的transformer,效果不好。您的建议非常有帮助,感谢!

netrookiecn commented 5 years ago

想请问下,用transformer分类时为何速度反而变的更慢,使用bilsm 5ms/step 而transformer需要 700ms,用的是你仓库的代码。二分类