fseasy / sequence-labeling-by-nn

sequence labeling by neural network
17 stars 5 forks source link

分词实验重做,且实验设置、记录简化 #10

Open fseasy opened 7 years ago

fseasy commented 7 years ago

或许是因为找工作的原因,或者是在数据、模型、任务的繁多设置之间迷了方向,现在回过头看自己之前做的分词实验,觉得非常失败。 首先是很多信息没有记录全,导致现在回头看根本不知道到底是怎么做的了。 其次,数据结果太冗余。表现在两点,一是把prf、acc全给记录下来了。详细信息当然得保存下来,但是不应该展示在这里。二是为了做实验而做实验。我觉得在模型比较阶段,测试在开发集的效果就可以了——因为之前的实验也已经说明,开发集和测试集分布很一致;此外,没不要再做单独的PKU, WEIBO效果测试,那对当前模型选择意义不大(或许在之后是有意义的)。 最后,缺乏总结。一是没有对预测结果做查看(没有看错例!),二是没有对当前模型做深入评价,三是没有对未来工作做预期。导致的后果就是,做完该做的实验后,不知道模型哪里不好,说不出错误case,也不知道下步该做什么。

因此要对分词实验重做。 对实验设置做一些改变:

  1. 放弃双输入,在分词任务下,因为语料比较大,外部Embedding意义不大,混淆视听。
  2. 暂时放弃pretag、crf。这个后面肯定得做,因为有分析case看到分类模型存在的不足,但之后再做。目前关注于输入的编码。
  3. 放弃simpleRNN,GRU.
  4. 设置实验条件: unigtam, bigram, lexicon-feature, [type-feature], 应该可以写代码完成命令行开关相应特征的功能。基于窗口、基于bi-lstm。
  5. CRFSuite、LTP删改特征,同样完成 unigram, bigram, lexicon-feature 的实验结果。LTP改起来应该更快,不过用CRFSuite也能熟悉下工具。
fseasy commented 7 years ago

基于窗口的实验

解释

rnn-lstm是基于整个句子的,但是不方便提高速度(利用batch,其实也是可以的,但是还没有做测试);我们想要尝试基于窗口的方法。输入是一个窗口(如窗口大小为5)的词,通过对这个窗口内的词做表示学习,来完成对整个句子的序列标注。

传统的CRF方法做序列标注,就可以认为是基于窗口的方法(在X的特征表示上),其提取的X特征往往是基于一个窗口的,常见的特征如 [ (W, -2) ,..., (W, 2), ( (W, -2), (W-1) ), ... ] 等其实就是窗口内的窗口为5的unigram与bigram特征。不过需要注意的是,CRF方法在解码时是全局的,即整个句子上的解码。我们目前使用的模型,如前面的设置所言,只考虑分类方法。因此其效果可能不如CRF。

传统的NN处理一个窗口的词,往往就是把这些词的Embedding拼接起来。这是一种方法,此外,我们也想尝试更多的方法。这些可能的方法就是我们所希望探究的。

窗口处理方法

输入,一个窗口的词向量。注意,这个含义很模糊,可能是unigram,或者bigram,或者二者的混合,甚至是加上了额外特征的信息,总的来说,就是表示当前位置的特征向量(集合)。输入的是一个窗口内各位置的特征向量集合。下面简述为窗口内的各向量。

  1. concatenate

    传统方法,直接拼接;一个问题是拼接后向量很长,计算复杂度高。

  2. average

    也算是传统方法,把窗口内各向量 +,然后求平均,作为窗口的表示。这样维度很低。

  3. CNN-bigram模型 (Deep Mind)

    来自Deep Learning for Answer Sentence Selection. 就是用一层卷积宽度为2(bigram的由来)、基于整个句子的平均pooling 的 CNN模型来建模一个句子的向量表示。这里借鉴用来建模一个窗口的表示。

  4. CNN-bigram-concat (将sum改为concat)

    上述最后使用的是average pooling, 即和2一样,就是求一个平均。这里把它修改一下,变成拼接。

  5. Attention1

    根据最基础的Attention模型提出的方案。用中心词去Attend窗口内的周围词。一个合理的动机就是,窗口内的词当当前中心词的影响,不仅仅与其位置相关,可能还与这个词与中心词之间的互动关系有关。如我的*苹*果很我的*确*很喜,字都位于中心词左1的位置,如果不考虑其与中心词的作用,其对分类的贡献是一致的(?),如果加入其与中心词的互动关系,可能更能建模窗口内词的信息。

    原始的Attention是把个向量相加求平均的,这里我们用拼接的方法。

  6. Attention1-avg

    将concatenate变为求平均。

  7. bilstm

    在一个窗口中使用双向LSTM .

    设计的动机:基于整个句子的双向LSTM效果优异;那么基于一个窗口的双向LSTM效果如何呢?如果比基于句子的差,那是否就是说基于窗口的方法就是比基于句子的表达能力差呢?如果是这样,那为什么CRF同样基于窗口,为什么效果就这么好呢?

@Oneplus 师兄有相关的建议吗~

update

师兄在组会上给出了如下建议:

  1. 修改对序列分类的策略

    之前的分类策略是:为了保证最终得到的Tag序列满足分词Tag约束, 将当前位置的分类候选集设置为与前一个已得到的Tag相兼容的Tag集合。有点绕,举例来说,就是假设之前的Tag被分类为B,那么当前Tag的可选的Tag就只能是{M, E}, 其余的{B, S}不在考虑范围之内——即使它们的分数比可选的高。

    现在想来这个策略有些愚蠢,不过在当时看来却觉得挺有道理的 :joy: 。或许真是当局者迷。

    将这个策略改为:解码时完全不做限制(就取argmax), 标签限制由后处理完成。。后处理的详细策略我会在后续相关WIKI中贴出。

  2. 适当调优模型。

    调参,包括学习率的decay,其他更新方式(momentum?)等;

此外,郭江师兄提出,Attention的方法可以有所改进,其一是算权值可以试试用v_a M v_b的方式,而不是U^t tanh(W_1 v_center + W_2 v_context)的方式;其二,用整个窗口的表示去Attend每个词,而不是用中心词去Attend窗口词,而整个窗口的表示可以是整个窗口的Embedding求平均。

fseasy commented 7 years ago

基于窗口的实验结果简记

窗口方法 unigram-best bigram-best
concatenate 92.99% 93.61%
average 50.88% 67.51%
CNN-bigram 77.04% 87.41%
CNN-bigram-concat 91.36% 93.47%
Attention1 90.73% 93.65%
Attention1-avg 75.64% 89.74%
bilstm 92.72% 93.99%