
最近工作中使用到rasa,其nlu部分有一个rasa自己提出的DIETClassifier框架组建,可用于意图分类与实体识别。今天有空,就来研究下它~
论文地址:https://github.com/RasaHQ/DIET-paper
先总结下DIET出彩的地方:
整体框架:

下面,我们结合上图进行逐个模块的讲解
使用一个2层的transformer和相对位置attention,对整个句子进行encode,由于transformer架构要求它的输入与transformer层的维度相同,因此,concatenate后的特征通过另一个全连接层,在所有序列步骤中共享权值,以匹配transformer层的维度,在实验中是256维。
通过CRF)在tranformer输出序列之上标记一个与token输入序列对应的层来预测实体。
将transformer输出的__CLS__token表示 和 意图标签表示的语义向量空间,进行相似度比较,使用类似于triplet loss的思想:



受masked language modelling task的启发,作者额外增加一个MASK损失函数来预测randomly masked input tokens。在序列中随机选择输入词符的 15%, 对于选定的词符,在70%的情况下,将输入替换为特殊屏蔽词符 MASK 对应的向量,在 10% 情况下,用随机词符的向量替换输入,并在其余的 20% 情况下保留原始输入.。同样,使用类似于triplet loss的思想::



模型假设,为重建masked输入而增加一个训练目标应该起到正则化的作用,并且帮助模型从文本中学习更多的一般特征,而不仅仅是用于分类的识别特征。

这个结构可以配置,可以随时关闭上述总和中的任何一种损失。该体系结构的设计方式可以打开或关闭多个组件,旨在处理意图和实体分类,但是如果只希望模型进行intent classification,则可以关闭Entity loss和Mask loss,而只专注于优化训练期间的Intent loss。
使用balanced batching策略来减轻类别不平衡,因为某些意图可能比其它意图更为频繁。 另外,还在整个训练期间增加批次大小,作为正则化的另一个来源。

对比单任务学习性能:

可以看到相比之下,单任务的意图分类效果会有一点的提升(90.18->90.90),但是实体识别效果却降低了非常多(86.04->82.57)。这可能是由于特定意图与特定实体的存在之间的强相关性。 例如,几乎所有属于 play_game 意图的语句都有一个名为 game_name 的实体。 同样,实体 game_name 仅与意图 play_game 一起出现。 我们认为,这一结果进一步表明拥有像 DIET 这样的模块化和可配置架构的重要性,以便处理这两项任务之间的性能折中。

将 可进行finetuning Bert的DIET 与 sparse特征+冻结预训练ConveRT Emb的 DIET进行比较:

可以看到,sparse特征+冻结预训练ConveRT Emb的 DIET在实体识别上表现优于fine-tuned BERT的DIET,而在意图分类方面表现持平。 但要知道,在所有 10 个 NLU-Benchmark 数据集上**,finetuning的 DIET 中的 BERT 需要 60 个小时,而使用 ConveRT 嵌入和稀疏特征的 DIET 只需要 10 个小时。**
作者采用在 NLU-Benchmark 数据集上性能最佳的 DIET 模型配置,并在 ATIS 和 SNIPS 上对其进行评估。 下表中列出 ATIS 和 SNIPS 数据集上的意图分类准确性和命名实体识别 F1 得分。* 表示使用 BILOU 标记模式对数据进行标注。†表示未使用Mask Loss。

值得注意的是,DIET 仅使用稀疏特征而没有任何预训练的嵌入,即使这样其性能仅比 Joint BERT 模型低 1-2%之内。 利用 NLU-Benchmark 数据集上性能最佳模型的超参数,DIET 在 ATIS 和 SNIPS 上均获得与 Joint BERT 有竞争力的结果。