Open fseasy opened 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,或者二者的混合,甚至是加上了额外特征的信息,总的来说,就是表示当前位置的特征向量(集合)。输入的是一个窗口内各位置的特征向量集合。下面简述为窗口内的各向量。
concatenate
传统方法,直接拼接;一个问题是拼接后向量很长,计算复杂度高。
average
也算是传统方法,把窗口内各向量 +
,然后求平均,作为窗口的表示。这样维度很低。
CNN-bigram模型 (Deep Mind)
来自Deep Learning for Answer Sentence Selection. 就是用一层卷积宽度为2(bigram的由来)、基于整个句子的平均pooling 的 CNN模型来建模一个句子的向量表示。这里借鉴用来建模一个窗口的表示。
CNN-bigram-concat (将sum改为concat)
上述最后使用的是average pooling, 即和2一样,就是求一个平均。这里把它修改一下,变成拼接。
Attention1
根据最基础的Attention模型提出的方案。用中心词去Attend窗口内的周围词。一个合理的动机就是,窗口内的词当当前中心词的影响,不仅仅与其位置相关,可能还与这个词与中心词之间的互动关系有关。如我的*苹*果很
和我的*确*很喜
,字的
都位于中心词左1的位置,如果不考虑其与中心词的作用,其对分类的贡献是一致的(?),如果加入其与中心词的互动关系,可能更能建模窗口内词的信息。
原始的Attention是把个向量相加求平均的,这里我们用拼接的方法。
Attention1-avg
将concatenate变为求平均。
bilstm
在一个窗口中使用双向LSTM .
设计的动机:基于整个句子的双向LSTM效果优异;那么基于一个窗口的双向LSTM效果如何呢?如果比基于句子的差,那是否就是说基于窗口的方法就是比基于句子的表达能力差呢?如果是这样,那为什么CRF同样基于窗口,为什么效果就这么好呢?
@Oneplus 师兄有相关的建议吗~
师兄在组会上给出了如下建议:
修改对序列分类的策略
之前的分类策略是:为了保证最终得到的Tag序列满足分词Tag约束, 将当前位置的分类候选集设置为与前一个已得到的Tag相兼容的Tag集合。有点绕,举例来说,就是假设之前的Tag被分类为B,那么当前Tag的可选的Tag就只能是{M, E}, 其余的{B, S}不在考虑范围之内——即使它们的分数比可选的高。
现在想来这个策略有些愚蠢,不过在当时看来却觉得挺有道理的 :joy: 。或许真是当局者迷。
将这个策略改为:解码时完全不做限制(就取argmax), 标签限制由后处理完成。。后处理的详细策略我会在后续相关WIKI中贴出。
适当调优模型。
调参,包括学习率的decay,其他更新方式(momentum?)等;
此外,郭江师兄提出,Attention的方法可以有所改进,其一是算权值可以试试用v_a M v_b
的方式,而不是U^t tanh(W_1 v_center + W_2 v_context)
的方式;其二,用整个窗口的表示去Attend每个词,而不是用中心词去Attend窗口词,而整个窗口的表示可以是整个窗口的Embedding求平均。
窗口方法 | 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% |
或许是因为找工作的原因,或者是在数据、模型、任务的繁多设置之间迷了方向,现在回过头看自己之前做的分词实验,觉得非常失败。 首先是很多信息没有记录全,导致现在回头看根本不知道到底是怎么做的了。 其次,数据结果太冗余。表现在两点,一是把prf、acc全给记录下来了。详细信息当然得保存下来,但是不应该展示在这里。二是为了做实验而做实验。我觉得在模型比较阶段,测试在开发集的效果就可以了——因为之前的实验也已经说明,开发集和测试集分布很一致;此外,没不要再做单独的PKU, WEIBO效果测试,那对当前模型选择意义不大(或许在之后是有意义的)。 最后,缺乏总结。一是没有对预测结果做查看(没有看错例!),二是没有对当前模型做深入评价,三是没有对未来工作做预期。导致的后果就是,做完该做的实验后,不知道模型哪里不好,说不出错误case,也不知道下步该做什么。
因此要对分词实验重做。 对实验设置做一些改变: