seq2seq 具有极强的时序能力,在自然语言处理(NLP)中是一个很强的模型,最近一段时间,在工程方面将该模型引入做命名实体识别(NER)也取得不错的效果。推荐G.Hinton的论文“Grammar as a Foreign Language”,讲述了如何用seq2seq做序列标注。
对于中文的命名实体识别的处理方式,参考中文分词和词性标注的思路,设定标签集:{B, M, E, S, B-name, M-name, E-name, S-name, …},里面的” *-name “,是实体类别的标签,标注的时候,我采用字符级的标注方案。
数据处理
我们将数据分为编码数据(encode data)和解码数据(decode data),并对数据添加GO, EOS, PAD符号,分别代表:
GO: 解码数据开头添加该符号。解码开始的时候作为输入使用。
EOS: 解码数据结尾符号。表示解码数据的结尾
PAD: 编码和解码数据补零符号。在mini-batch的时候,batch中最长文本的长度将剩余的文本用PAD补全。
编码数据在输入的时候,把顺序反置,在神经翻译系统里面,效果更好,即
[GO, 明,天,张,三,……,EOS,PAD,PAD,PAD]
转为
[PAD,PAD,PAD,EOS,……,三,张,天,明,GO]
模型:
字符的向量大小:128
LSTM层数:2
softmax输出,交叉熵求损失
学习率:
– 用SGD,学习率0.1,学习率衰减值0.99(慢慢的减少)
– 用Adadelta,初始学习率随便设置0.9,会自适应修改。
模型参考了tensorflow里面的英法翻译的模型,被Google用在了自动翻译中,称为“神经机器翻译(Google Neural Machine Translation,GNMT)”。
发表回复