「埃尔法哥哥」语义不畅低质文本识别与应用如何撑起58同城海量数据?( 二 )

困惑度(Perplexity):是自然语言处理领域衡量一条语句是否符合已知某种语言概率分布的度量 , 计算公式如(1)所示:
「埃尔法哥哥」语义不畅低质文本识别与应用如何撑起58同城海量数据?
本文插图
2. 模型结构设计v1
模型结构基于Transformer Block , 结构设计如图2所示:
「埃尔法哥哥」语义不畅低质文本识别与应用如何撑起58同城海量数据?
本文插图
图2:语言模型结构图
对比与传统的RNN , Transformer有4个优势:
a) 解决长程依赖性的问题;虽然RNN可以通过LSTM引入长期记忆的方式缓解梯度消失、梯度爆炸等问题 , 但依然无法从根本上解决长程依赖性的问题 。 Transformer通过引入Self-Attention机制 , 把任意两个字符之间的距离缩减为1 , 有效解决了长程依赖性的问题 。
b) 可以并行计算 , 解决RNN计算速度慢的问题;RNN的序列结构决定了其计算过程只能串行 , 计算速度慢 。 Transformer取消了不同时间步的依赖关系 , 计算量主要体现在矩阵乘法计算上 , 更适合用GPU等并行计算单元来提速 。
c) 提取特征能力更强;大量研究论文已经表明 , Transformer提取特征的能力更强 。
d) 可以通过堆叠的方式叠加N层 , 更适合捕获深层的语义特征 。
本文把语言模型建模看成一个Seq2Seq的模型 , 针对每条训练本 , 输入输出的关系如图3所示:
「埃尔法哥哥」语义不畅低质文本识别与应用如何撑起58同城海量数据?
本文插图
图3:语言模型输入输出关系
在Transformer Block的计算过程中 , 考虑到语言模型要计算单词基于上文环境下出现的概率 , 在Self-Attention的计算出匹配得分矩阵M后 , 需要对矩阵M取下三角 , 抹掉该词及其下文环境的信息 。
3. 模型v1遇到的问题
3.1 被平均问题
由公式(1)可知 , 困惑度PPL的计算涉及到若干词概率的对数的平均值 , 如果文本长度n特别大 , 文本中只有个别几个位置出现了生僻字 , 概率值较小 , 通过平均值的计算 , 对局部概率值变化大的地方起到了平滑的作用 , 可能会导致无法识别出低质文本 。
对于这个问题 , 我们可以通过移动平均(Moving Average)的方式解决 。 设置合适窗口宽度w,分别计算滑动窗口内语句的困惑度 , 然后取困惑度的最大值作为整个语句的得分 。
3.2 定长截断问题
在训练模型时 , 模型都对样本有最大序列长度MaxLength的限制 , 如果直接对于小于MaxLength的样本进行填充处理 , 样本中充斥的大量无意义的PAD字符 , 会导致训练模型过程中无法收敛的问题 。 我们应用了大量论文中提到的定长截断的Trick , 即把所有样本拼接成一个长字符串 , 然后按照最大序列长度进行截取 , 然而这也会引入一定的噪声 。 截取操作如图4所示:
「埃尔法哥哥」语义不畅低质文本识别与应用如何撑起58同城海量数据?
本文插图
图4:定长截断Trick操作示意
通过定长截取 , 第二条样本会以“ , ”开始 , 这也不符合我们的语言习惯 , 也就是说 , 在训练过程中引入了噪声 。
3.3 语料规模问题
我们收集了大概500M的语料数据后 , 对模型进行训练 , 模型上线后 , 遇到了一些误召回的问题 , 误召回的原因主要是:
a) 地名问题 , 主要是出现次数少或没有出现过的地名;
b) 命名实体 , 比如快餐店招工广告中出现“油条”“豆沙包”等命名实体 , 训练数据中没有出现过类似数据
c) 专业词汇、简称等
归根结底 , 主要原因是收集的语料规模不够大 , 导致模型的泛化性能不足所致 。
4. 模型结构设计v2
2018年10月 , Google推出了NLP的里程碑式的模型BERT , 受到了广泛的关注 。 主要思想是:通过Masked Language Model和Next Sentence Prediction的方式进行预训练 , 获取句子的表征 , 然后再通过Fine-Tuning的方式训练上游模型参数 。


推荐阅读