本文提出字词混合的Embedding中,字词对齐的两种方案。

分词还是不分词?分词后字序列和词序列长度不一致,如何对齐?这里,提供一种简单直观的字词混合方案,对于NLU任务来看,有一定的提高。

以字为基准对齐

假设有句子“我爱北京天安门”,分词后为“[‘我’, ‘爱’, ‘北京’, ‘天安门’]”,分词后的结果与原来的句子长度不一致,为此,分词后的结果应该repeat该词所占有的字数,于是把“[‘我’, ‘爱’, ‘北京’, ‘天安门’]”转化为:

1
['我', '爱', '北京', '天安门'] ==> ['我', '爱', '北京', '北京', '天安门', '天安门', '天安门']

这样对齐后,字词混合就可以直接相加,

例如,

1
2
3
4
5
text:我爱北京天安门
分词:['我', '爱', '北京', '天安门']
字ID:[2 3 4 5 6 7 8]
词ID:[2 3 37 37 38 38 38]
段ID:[1 2 3 3 4 4 4]

更直观点,如下

不过在实验时发现,有些情况下段ID反而起反作用,因此可以去掉,在优化时再引入,看是否起到负优化作用。此外,字词混合后Embedding输出需要接入LayerNormaliaztion重新归一化。

Embedding矩阵中,词的初始化也可以引入字的先验信息,避免词向量从头开始训练。对于词$ijk$,其字的向量的均值,即

通常词的引入并不是从零开始训练,而是便于引入预训练好的词向量。

以词为基准对齐

以词为基准需要词对应的字序列进行Aggregation。例如,以“天安门”为例,包括的字有['天', '安', '门'],然后获得的词向量分别为,

为让这三个词向量对齐“天安门”这个词的词向量,Aggregration操作,通常是取平均,

或者直接通过LayerNormalization归一化。

实现

补充和更新:这里提供一些实现,见word-char-hybrid-embedding

实践中发现在NLU任务中字词混合有1%~2%的提高。

总结

本文提供字词混合的两种对齐方案,实践发现在NLU任务有略有提高。对于需要引入词汇信息的NLP任务来说,上述不失为一种尝试。

转载请包括本文地址:https://allenwind.github.io/blog/10560
更多文章请参考:https://allenwind.github.io/blog/archives/