limteng-rpi/neural_name_tagging

对这个论文效果的验证

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在相关数据集上无效。