(二十二)RASA的超参数优化

DayNightStudy

共 2900字,需浏览 6分钟

 · 2021-10-11


作者简介





作者:孟繁中

原文: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_dfmax_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})

原文地址:https://blog.rasa.com/rasa-nlu-in-depth-part-3-hyperparameters/



浏览 63
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报