rasa算法_多轮对话框架Rasa代码解读--训练过程1

rasa算法_多轮对话框架Rasa代码解读--训练过程1_第1张图片

训练之前,要搭建环境,参考:

水中的鱼:多轮对话框架Rasa代码解读--环境搭建​zhuanlan.zhihu.com
91113aff70ae15a0cee371983e04455e.png

一.训练入口解读

训练过程的命令为:

python __main__.py  train --domain domain.yml --data data --config config.yml --out models

真心为rasa的代码点赞,因为它使用Python3新特性类型注解, 提高代码可读性.

我们知道 Python 是一种动态语言,变量以及函数的参数是不区分类型。.
Python解释器会在运行的时候动态判断变量和参数的类型,这样的好处是编写代码速度很快,很灵活,但是坏处也很明显,不好维护,可能代码写过一段时间重新看就很难理解了,因为那些变量、参数、函数返回值的类型,全都给忘记了。
而且当你在读别人的代码的时候,也无法一眼看出变量或者参数的类型,经常要自己推敲,这样给学习带来了很大的障碍。

rasa算法_多轮对话框架Rasa代码解读--训练过程1_第2张图片

在59-66行,主要是argparse模块构造命令行的参数。argparse模块的用法,这里不详述。重点在68-70行。

cmdline_arguments.func(cmdline_arguments),这行代码到底执行的是那个函数呢?

这里直接给出设置的地方:create_argument_parser()--train.add_subparser--train_parser.set_defaults(func=train),这样调用的就是train。

也就是rasa_chatbot_cn/venv/lib/python3.5/site-packages/rasa/train.py文件中的train函数。

train_async函数是训练的真正入口,先看看参数:

domain='domain.yml'

config='config.yml'

training_files= [data]

output_path='models'

force_training=False

fixed_model_name=None

kwargs=: {'augmentation_factor': 50, 'dump_stories': False, 'debug_plots': False}

在调用_do_training,入参和上述不同的地方在于domain不再是一个字符串,而是一个Domain对象,主要是把domain.yml文件中的内容变成字典from_dict。

然后分别用_train_core_with_validated_data训练core,用_train_nlu_with_validated_data训练nlu.

之前讲过,Core 包含对话管理,也就是对话上下文的管理,语句生成。nlu包括包含意图识别和实体提取。按照对话的流程

rasa算法_多轮对话框架Rasa代码解读--训练过程1_第3张图片

我们先看训练NLU的部分。

二. 训练NLU的部分

入口是rasa.nlu.train。处理逻辑:

加载配置文件---构造训练组件的对象---加载训练数据---每个组件依次对训练数据进行处理和训练---模型的持久化

1. 加载配置文件

调用config.load,将配置文件config.yml的文件内容读出来,并保存到RasaNLUModelConfig对象中,看下这个对象的详细信息:

rasa算法_多轮对话框架Rasa代码解读--训练过程1_第4张图片

rasa算法_多轮对话框架Rasa代码解读--训练过程1_第5张图片

rasa算法_多轮对话框架Rasa代码解读--训练过程1_第6张图片

可以看到,和配置文件的内容是基本一致的。

2. 构造训练组件的对象

在Trainer类的构造函数中,主要是构造pipeline,也就是说根据配置文件config.yml中的pipeline中的每个类,依次调用类的构造函数。那么配置文件中的名称和类的名称的对应关系在registry.py中的component_classes变量中。

3. 加载训练数据

load_data会读取训练数据,都保存在TrainingData对象中,

training_examples,对应数据中common_examples

entity_synonyms,对应数据中entity_synonyms,目前样例为空。

regex_features,对应数据中regex_features,目前样例为空

lookup_tables,目前样例为空

在看看数据结构的定义,training_examples是一个列表,每个元素是一个Message对象。

原始训练数据中的每条:

rasa算法_多轮对话框架Rasa代码解读--训练过程1_第7张图片

分别对应Message对象中的text ,data["intent"],data["entities"] ,data是一个字典。

4. 每个组件依次对训练数据进行处理和训练

trainer.train,依次调用pipeline每个组件的预处理函数和训练函数,这里需要理解过程中训练的结果保存到哪里?

这里采用一个字典context,在训练开始前,每个组件都通过provide_context将需要提供的上下文信息更新到context中,大部分组件不需要提供预置信息。比如MITIE , spacy需要提供框架的环境变量,比如词向量。

组件JiebaTokenizer的训练:将training_examples中的每个Message对象中的text 进行分词,并将分词结果保存到data["tokens"]中。

组件CRFEntityExtractor的训练,训练过程涉及需要详细讲解的算法,准备用一个单独的一篇来讲解。这里只说下输出:保存到data["entities"]中。

组件JiebaPsegExtractor,没有定义训练过程,无需训练。

组件BertVectorsFeaturizer,准备用一个单独的一篇来讲解

组件EmbeddingBertIntentClassifier,准备用一个单独的一篇来讲解

5. 模型的持久化

将模型的输出打包成一个zip文件,fingerprint的作用是,保存模型和训练数据的对应关系。当训练数据没有变化时,fingerprint也是一致的,就不用重新训练。

你可能感兴趣的:(rasa算法)