最开始出现“Error running graph component for node train_DIETClassifier4”的错误的时候,我的解决方式就是减少DIETClassifier的epochs,有时候确实能解决有时候不能,等到后面NLU的模板增多的时候,报错的次数增多了不少。
DIETClassifier是NLU部分意图分类的重要组件,这个错误很明显是train_DIETClassifier这个环节出的错误。
关于DIETClassifier这个组件,我们可以找到官方给出的组成图:
不难发现,token都有一个FF环节跟与训练词嵌入的过程,翻看报错日志,这里说了真实的原因在上面这个节点上:
Node: 'cond/add_1'
Incompatible shapes: [20,24] vs. [20,23]
[[{{node cond/add_1}}]] [Op:__inference_train_function_74808]
这个错误的根本原因是在训练过程中,某些张量的形状存在不兼容的情况。也就是LanguageModelFeaturizer配置的预训练的向量化组件Bert的问题。尝试把Bert去掉只保留Jieba,解决了,增大epochs也可以训练,看来就是这个问题。
怎么解决这个问题呢,单单是把他去掉的话对意图分类影响不大,但是实体提取变得很不准确。
网上找到一篇相关的issue:bert-base-chinese Incompatible shapes error · Issue #8381 · RasaHQ/rasa (github.com)https://github.com/RasaHQ/rasa/issues/8381里面是把bert换成bert-chinese,但是这貌似是rasa2的做法,明显解决不了,实践之后也确实如此。
重新审视错误,通常这种错误可能是由于数据处理上的错误、模型定义上的错误或者是训练参数设置上的错误导致的。我尝试检查一下以下几个方面:
-
数据处理:检查训练数据是否存在格式上的问题,比如说标签和特征向量的形状是否匹配,特征向量是否存在缺失值等。
-
模型定义:检查一下模型定义是否正确,比如说你的模型是否正确处理了输入数据的形状,是否正确地连接各个层,各层的参数是否正确等。
-
训练参数:检查一下训练参数是否正确设置,比如说学习率是否过高或过低,是否存在梯度消失或梯度爆炸等问题。
训练参数、模型定义这两部分我没有动过rasa的代码,组件也是自带的不是自定义,那么就可能是数据处理上NLU的配置参数的问题了。逐段删除排除引号、句号的问题,最后发现就是空格的问题,至此问题解决,增大epochs到200也不再出错。