在使用rnn进行中文词性标注时遇到了这样的问题:损失函数几乎不下降。
我最初的做法是,对汉字和词性转化成0,1,2,3……这样的序号。总计52种词性,训练了十多个epoch以后,MSELOSS依旧有三十多。
之后我反应过来:我没有对文字进行编码,应当在rnn网络之前加如embedding层。同时,分类结果以0-52的形式存在并不合理,应当将其映射到(0,1)或者(-1,1)这样的区间。
但此时训练效果依旧不理想。于是我想到:既然可以对汉字进行embedding,那是否可以对词性也进行embedding呢?
但要我最开始对词性加入embedding层后,又跟了两个全连接。这就好玩了,loss是很小。为啥呢?因为所有词性全被这两个全连接层给映射到同一个值附近了。因此,此时的网络就成了这样:训练一个网络,无论其输入是什么,得出同一个结果。这可太容易实现了。但这样的网络显然不是我们希望的。故,对词性进行embedding后不能加入全连接。
训练的数据集是老舍的《骆驼祥子》。经过一个epoch的训练,输入“骆驼祥子拿着一个全新的手机”让网络识别,给出的结果是:
骆驼'n'名词
祥子 'nr'人称
拿 'v'动词
着 'f'方位(识别错误)
一个 'm'数次
全新 'n'名词
的 'uj'“的”
手机 'n'名词
。 'x'符号
虽然数据集中没有“手机”(毕竟老舍的年代肯定没这个东西),但网络能够结合前文进行推断:结合“一个崭新的”,和“手”能够推断“手机”是名词。