对这个论文效果的验证
dongrixinyu opened this issue · 4 comments
我认为这个论文无效:
在中文数据集上的试验,使用 jieba 分词,代码tf 如下:
with tf.variable_scope('word_char_embedding_combine'):
with tf.variable_scope('word_freq_conversion'):
word_freq_compress = self.word_freq_placeholder * 0.005
word_freq_conversion = tf.tanh(word_freq_compress, name='tanh_word_freq')
self.word_freq_conversion = word_freq_conversion
#with tf.variable_scope("word_embedding_gate"):
# word 级别的各项参数
#word_w = tf.layers.dense(inputs=self.x_word_embedding, units=1, activation=None)
#char_w = tf.layers.dense(inputs=x_char_cnn_embedding, units=1, activation=None)
# freq_w = tf.layers.dense(inputs=word_freq_conversion, units=1, activation=None)
# b_w = tf.get_variable(shape=[1], name="b_w")
# word_gate = tf.sigmoid(freq_w + b_w + word_w + char_w, name='word_embedding_gate')
self.word_gate = word_freq_conversion
可以看一下上面的代码是否有误
隐藏层的那一部分同理
试验效果
['同时', ',']
['同时<pad_char><pad_char>', ',<pad_char><pad_char><pad_char>']
word_freq: [1. 1. ]
word_gate: [0.98816895 0.9967069 ]
char_gate: [0.89430475 0.8514535 ]
['至此', ',']
['至此<pad_char><pad_char>', ',<pad_char><pad_char><pad_char>']
word_freq: [0.9715941 1. ]
word_gate: [0.99966156 0.9967069 ]
char_gate: [0.7587908 0.8514535 ]
['<unk_word>', '…']
['多大仇<pad_char>', '…<pad_char><pad_char><pad_char>']
word_freq: [0.00499996 1. ]
word_gate: [0.9449244 0.9953596 ]
char_gate: [0.7027143 0.87556285 ]
['<unk_word>', ',']
['鳞次栉比', ',<pad_char><pad_char><pad_char>']
word_freq: [0.00499996 1. ]
word_gate: [0.96310204 0.9967069 ]
char_gate: [0.68618333 0.8514535 ]
['<unk_word>', ',']
['正巧<pad_char><pad_char>', ',<pad_char><pad_char><pad_char>']
word_freq: [0.00499996 1. ]
word_gate: [0.7656248 0.9967069 ]
char_gate: [0.7440602 0.8514535 ]
可以看一下,这里的门概率取值和本身词汇 的词频没任何线性关系,完全是随机的。
想问一下,既然假设前提是,词频低的词向量不够可靠,那决定因素是词频,和不准确的词向量本身有什么关系呢?
然后我将词向量全部剔除,只保留词频做参数,添加一个线性变换,得到的结论是:
- word-gate 的值范围在 0.77~0.93 之间,
- 若 tanh 为 1,即词向量非常可靠,则门取值 0.93,
- 若tanh 为 0.004 ,即词向量非常不可靠,则门去 0.77
即 门控的影响很小,在训练过程中被压缩了。
隐藏层的影响范围更加小,在 0.72~0.77 之间。
最终的在人民日报、MSRA、boson等数据集上的测试效果均不理想,不如直接将 char 和 word 的向量直接 concat。
所以,论文方法无效。
我们在OntoNotes和一些LORELEI数据集上测试了我们的模型,但没有在中文数据集上测试过。中文本身具有特殊性(例如字符数量远大于中文,字符本身语义丰富,多数单词为单字词或者双字词),英文或类似语言上的结论在中文上不一定成立。
关于Gating mechanism的设计:通常情况下,OOV和稀有词在文本中的比例并不高。对于其他词频较高的单词,我们也希望模型能够对不同的单词动态地决定如何混合character-level representation和word-level representation,类似的结构可以参考[1]和[2]。同时因为每个gate有character/word-level representation和reliability signal三种输入,其输出的平均值和词频并不一定有线性关系。
[1] Miyamoto, Yasumasa, and Kyunghyun Cho. "Gated word-character recurrent language model." In 2016 Conference on Empirical Methods in Natural Language Processing, EMNLP 2016, pp. 1992-1997. Association for Computational Linguistics (ACL), 2016.
[2] Rei, Marek, Gamal Crichton, and Sampo Pyysalo. "Attending to Characters in Neural Sequence Labeling Models." In Proceedings of COLING 2016, the 26th International Conference on Computational Linguistics: Technical Papers, pp. 309-318. 2016.
@limteng-rpi
1、如果词频对于门的设计不太重要,那么词频信息添加进去也是徒劳,作用太小。
2、如果这样的设计对高频词也有效。高频词数量比例是非常大的,按理说结果应该有提升。但实际上这样的操作最终结果指标在多个数据集上还不如直接 concat 字和词,甚至不如直接使用词。
3、关于中英文的区别说法,只会显得论文的结果更加不可靠吧。
4、最后,最重要的是,我做了两次试验,使用同样的数据集,同样参数配方,拟合过后,取同样的词看gating 配比,发现差别还是挺大的。也就是说,同样的词,模型都不知道学到了什么,更可见模型很难说从词频和字词向量中学到了什么配比。
另外,可能会怀疑我的模型过拟合导致了权重配比每次训练不一样。我训练的语料抛除 人日和 微软,共计 3800万字,样本量百万条,模型大小也有控制。词向量和字向量训练在 10亿字上。所以不是过拟合导致了配比不准确。
就我们在OntoNotes上的结果而言(Table 2),reliability signals的加入确实在wb以外的子集上有所提升,所以我个人不认为“词频对于门的设计不太重要”。这样的设计也许并不适用于中文,但这不等同于论文的结果不可靠。我们的结论是根据OntoNotes上的结果得出的,结论是否能推广到其他语言或者差别较大的domain需要另外的实验来验证。我认为中英文的差别可能是导致concat的方法效果更好的原因之一。基于你的实验,你可以认为这种gating mechanism在相关数据集上无效。