(二十二)RASA的超参数优化
共 2900字,需浏览 6分钟
·
2021-10-11 02:06
作者简介
作者:孟繁中
原文:https://zhuanlan.zhihu.com/p/349000987
转载者:杨夕
面筋地址:https://github.com/km1994/NLP-Interview-Notes
个人笔记:https://github.com/km1994/nlp_paper_study
这篇文章包含以下内容:
如何用Rasa NLU进行大规模参数优化
哪个超参数在微调时对结果优化最明显
超参数优化
选择合适的组件是你的AI助手应用成功的关键。但是,如果你想要进一步充分利用组件,你必须要对单个组件的配置参数(叫做超参数)进行调优。寻找最佳配置的方法是,用不同的配置参数进行训练,然后分别在验证集上面进行评估。通过超参数查找,可以找到评估分数最高的超参数配置。由于组件有很多的超参数,以及模型训练是时间密集型的,我们将展示如何使用Docker容器,帮助你将超参数查找更好的扩展到多个机器上。
定义查找空间
在开始之前,前克隆rasaHQ/nlu-hyperopt repository。为你的NLU管道定义模板,可以对data/template_config.yml
进行更改。并将参数替换成你想要优化的参数,使用大括号括起来,如:
language: en
pipeline:
- name: "intent_featurizer_count_vectors"
- name: "intent_classifier_tensorflow_embedding"
epochs: {epochs}
在上面的例子中,我们定义了NLU管道用于intent_classifier_tensorflow_embedding
意图识别。在超参数查找的时候,我们将试图查找最佳的训练迭代次数。
下一个步骤是定义你的NLU模型中想要评估的参数的范围。根据你想要评估的超参数,调整nlu_hyperopt/space.py
文件中的内容,如:
from hyperopt import hp
search_space = {
'epochs': hp.uniform(“epochs”, 1, 10)
}
针对查找空间,模型将被以不同的epochs数值进行训练,epochs的取值范围为从1到10。你可以从其他的分布中进行选择。参见hyperopt docs。
组件有很多的超参数,那么我们该从什么地方开始呢?由于预训练词嵌入intent_classifier_sklearn已经在训练中执行了网格搜索,当你使用intent_classifier_tensorflow_embedding训练你自己的词嵌入的时候,超参数优化会更你更多的额外的好处。该组件的重要的超参数是来自 intent_featurizer_count_vectors组件和分类器本身的。对于组件 intent_featurizer_count_vectors,我们建议考虑min_df
,max_df
,和max_features
。更详细介绍参见:Sklearn documentation。
tensorflow classifier含有很多的参数。我们建议从调整embeddings的维度(embed_dim
)和隐藏层的大小(hidden_layers_sizes_a,hidden_layers_sizes_b
)开始。针对上面三个参数,更大的值能够获得更高的精度,但是也可能会导致过拟合。
配置超参数搜索
最后,配置你的尝试。这是通过环境变量的设置实现的。如果你想要顺序的运行超参数查找,或不适用Docker,那么你可以忽略mongo数据库的设置。这个选项的详细介绍见readme,因此为了简单起见,我们将关注最重要的几个参数。
MAX_EVALS
这个参数描述了你想要运行多少次评估。如果参数的组合(查找空间)比较小,你也许需要选择一个较小的值。如果查找空间很大,为了更好的覆盖查找空间,必须要执行更多的评估。
TARGET_METRIC
这个值定义了用于比较不同训练模型的评价指标。可供的选择有:
f1_score
:在评估数据集中查找f1
分数最高的模型accuracy:在评估数据集中查找准确度最高的模型
precision:在评估数据集中查找精度最高的模型
threshold_loss
:其他的度量方式会选择出置信度最高的意图作为正确的结果,该损失函数仅会选择出预测结果是正确的,并且置信度值高于阈值的结果。这说明了使用fallback策略来消除低置信度预测的歧义。你可以使用参数ABOVE_BELOW_WEIGHT
来指定使用阈值之上还是阈值之下的预测作为不正确的预测。
然后添加训练集用于模型训练,评价集用于模型评估。通过将训练数据放到data/train.md
,将评估数据放到data/validation.md
进行指定。
运行
终于到了运行参数搜索的时间了。你可以选择不使用Docker或使用Docker容器来运行超参数搜索。
如果你想要在本地运行,通过命令pip install -r requirements.txt
安装依赖,然后执行python -m nlu_hyperopt.app
。
如果想要通过Docker运行,可以执行命令:docker-compose up -d --scale hyperopt-work=
。这个会构建包含你的数据集,搜索空间,和模板配置的docker镜像,接着使用mongo数据库并行的运行。当然,你可以在集群运行,将工作分发到不同的机器上。常见的集群编排工具,如Kubernetes,能够处理生成的docker-compose文件。
当评估结束之后,会在日志中输出最佳的pipeline配置,如:
INFO:__main__:The best configuration is:
language: en
pipeline:
- name: "intent_featurizer_count_vectors"
- name: "intent_classifier_tensorflow_embedding"
epochs: 8.0
如果你通过Docker和mongo数据库进行超参数搜索,所有的评估结果会存储到mongo数据库中。通过执行docker-compose exec mongodb mongo
进入mongo容器查看评估结果。下面的命令会输出对应的结果:
db.jobs.find({"exp_key" : "default-experiment", "result.loss":{$exists: 1}}).sort({"result.loss": 1})