这是一个能够在文本对话中表达情感的对话系统。在线尝试!
它用Theano 和 Lasagne编写,使用5种不同情绪的端到端训练嵌入来产生由给定情绪限制的反应。
代码是灵活的,并允许通过为训练数据中的一些样本定义的任意分类变量来调节响应。例如,您可以训练基于角色的个人神经对话模型或创建一个没有外部记忆的情感聊天机器人。
- 模型: 用于处理深层对话上下文的分层递归编码器 - 解码器(HRED)架构7 具有GRU细胞的多层RNN。话语级编码器的第一层始终是双向的。 **向量在每个解码步骤被馈入解码器。 解码器可以在任何字符串标签上进行调节。例如:情感标签或一个人说话的身份。 Word嵌入层: 可以使用在您自己的语料库中训练的w2v模型进行初始化。 嵌入层可以保持固定,与网络的所有其他权重一起进行微调。 解码 4种不同的响应生成算法:“采样”,“波束搜索”,“采样重新排序”和“波束搜索重新排序”。根据对数似然或MMI标准3执行对生成的候选者的重新排名。有关详情,请参阅配置设置说明 指标: 困惑 n-gram不同的指标调整到样本大小3。 模型样本与某些固定数据集之间的词汇相似性。词汇相似性是模型生成的响应的TF-IDF向量与数据集中的令牌之间的余弦距离。 排名指标:平均精确度和平均召回量@ k。8 快速开始 运行仅CPU的预构建docker镜像并启动在8080端口上为模型提供服务的CakeChat:
docker run --name cakechat-dev -p 127.0.0.1:8080:8080 -it lukalabs/cakechat:latest \
bash -c "python bin/cakechat_server.py"
(Or) using the GPU-enabled image:
nvidia-docker run --name cakechat-gpu-dev -p 127.0.0.1:8080:8080 -it lukalabs/cakechat-gpu:latest \
bash -c "USE_GPU=0 python bin/cakechat_server.py"
你可以尝试运行 python tools/test_api.py -f localhost -p 8080 -c "Hi! How are you?"
于命令行.
这是设置环境和安装所有依赖项的最简单方法。
-
安装 Docker
-
安装docker镜像
构建cpu镜像:
docker build -t cakechat:latest -f dockerfiles/Dockerfile.cpu dockerfiles/
- 打开容器
在仅CPU环境中运行docker容器
docker run --name <CONTAINER_NAME> -it cakechat:latest
-
安装nvidia-docker .
-
构建支持GPU的docker镜像:
nvidia-docker build -t cakechat-gpu:latest -f dockerfiles/Dockerfile.gpu dockerfiles/
- 打开容器
在启用GPU的环境中运行docker容器:
nvidia-docker run --name <CONTAINER_NAME> -it cakechat-gpu:latest
你可以训练你自己的模型并开始聊天.
如果您不想处理docker图像和容器,您可以随时运行(用 sudo
, --user
或者你内部 virtualenv):
pip install -r requirements.txt
很可能这将完成这项工作. NB: 此方法仅提供仅CPU环境。 要获得GPU支持,您需要构建和安装 libgpuarray 通过你自己 (看 Dockerfile.gpu for example).
运行 python tools/download_model.py
来下载我们的预训练模型.
这个模型是使用 context size 3 编码序列包含 30 tokens or less 和解码序列 32 tokens or less. 编码和解码序列都包含 2 GRU layers 和 512 hidden units . 该模型在Twitter预处理的会话数据上进行了训练。 为了清理数据,我们删除了网址,转发和引文。 我们还删除了没有正常单词或标点符号的提及和主题标签 并筛选出包含30个以上令牌的所有邮件。 然后我们用我们的情绪分类器标出每个话语,预测其中一个 5种情绪:“中性”,“快乐”,“愤怒”,“悲伤”和“恐惧”。 用你可以使用的情感来标记自己的语料库,例如[DeepMoji工具](https://github.com/bfelbo/DeepMoji) 或者你拥有的任何其他情绪分类器。
对于一些工具 (例如 tools/train.py
) 您可以通过参数指定模型初始化权重的路径 --init_weights
.
权重可以来自经过训练的模型或来自具有不同体系结构的模型。
在后一种情况下,可以保留模型的一些参数而不进行初始化:
如果参数的名称和形状是,则将使用保存的值初始化参数
与保存的参数相同,否则参数将保持其默认初始化权重。
从 load_weights
中获得功能的细节.
- 将您的培训文本语料库添加到
data/corpora_processed/
. 语料库文件的每一行都应该是一个JSON对象,其中包含按时间顺序排序的对话消息列表。 代码完全与语言无关 - 您可以在数据集中使用任何unicode文本。 请参阅我们的虚拟语料库以查看输入格式data/corpora_processed/train_processed_dialogs.txt
.
2.以下数据集用于验证和提前停止:
data/corpora_processed/val_processed_dialogs.txt
(假的例子) - 对于上下文敏感数据集data/quality/context_free_validation_set.txt
- 用于无上下文的验证数据集data/quality/context_free_questions.txt
- 用于生成记录和计算不同度量标准的响应data/quality/context_free_test_set.txt
- 用于计算训练模型的度量,例如, 排名指标
- 设置训练参数
cakechat/config.py
. 看 configuration settings description 更多细节. - 运行
python tools/prepare_index_files.py
使用训练语料库中的标记和条件构建索引文件. - 运行
python tools/train.py
. 别忘记设置USE_GPU=<GPU_ID>
环境变量 (用 GPU_ID 到 nvidia-smi) 如果你使用GPU. 使用SLICE_TRAINSET=N
在训练数据的前N个样本的子集上训练模型,以加快预处理以进行调试. - 您还可以设置
IS_DEV = 1
以启用“开发模式”。 它使用减少数量的模型参数(减少隐藏层维度,令牌序列的输入和输出大小等),执行详细日志记录并禁用Theano图优化。 使用此模式进行调试。 7.模型的权重将保存在data / nn_models /
中.
您可以在任何可用的文本会话数据集上训练对话模型。 可以在此处找到现有会话数据集的精彩概述: https://breakend.github.io/DialogDatasets/
运行使用给定输入消息(上下文)处理HTTP请求的服务器,并返回模型的响应消息:
python bin/cakechat_server.py
如果要使用某个GPU,请指定USE_GPU=<GPU_ID>
环境变量。
等到模型编译完毕.
别忘记运行 tools/download_model.py
在运行之前 bin/cakechat_server.py
如果你想用我们预先训练过的模型启动API。
为确保一切正常,请在以下对话中测试模型:
– Hi, Eddie, what's up?
– Not much, what about you?
– Fine, thanks. Are you going to the movies tomorrow?
python tools/test_api.py -f 127.0.0.1 -p 8080 \
-c "Hi, Eddie, what's up?" \
-c "Not much, what about you?" \
-c "Fine, thanks. Are you going to the movies tomorrow?"
JSON parameters are:
Parameter | Type | Description |
---|---|---|
context | list of strings | List of previous messages from the dialogue history (max. 3 is used) |
emotion | string, one of enum | One of {'neutral', 'anger', 'joy', 'fear', 'sadness'}. An emotion to condition the response on. Optional param, if not specified, 'neutral' is used |
POST /cakechat_api/v1/actions/get_response
data: {
'context': ['Hello', 'Hi!', 'How are you?'],
'emotion': 'joy'
}
200 OK
{
'response': 'I\'m fine!'
}
We recommend to use Gunicorn for serving the API of your model at a production scale.
Run a server that processes HTTP-queries with input messages and returns response messages of the model:
cd bin && gunicorn cakechat_server:app -w 1 -b 127.0.0.1:8080 --timeout 2000
You may need to install gunicorn from pip: pip install gunicorn
.
You can also test your model in a Telegram bot: create a telegram bot and run
python tools/telegram_bot.py --token <YOUR_BOT_TOKEN>
cakechat/dialog_model/
- 包含计算图,训练程序和其他模型实用程序cakechat/dialog_model/inference/
- 响应生成算法cakechat/dialog_model/quality/
- 度量计算和日志记录的代码cakechat/utils/
- 用于文本处理,w2v培训等的实用程序cakechat/api/
- 运行http服务器的函数:API配置,错误处理tools/
- 用于培训,测试和评估模型的脚本
bin/cakechat_server.py
- 运行HTTP服务器,该服务器返回给定对话框上下文和情绪的模型的响应消息。 看到 run section 更多资料.tools/train.py
- 在您的数据上训练模型。 您可以通过指定模型参数初始化权重的路径--init_weights
. 也可以使用标记用于训练"*-reranking" 响应生成算法中使用的模型,以获得更准确的预测。tools/prepare_index_files.py
- 准备最常用的令牌和条件的索引。 在训练模型之前使用此脚本。tools/quality/ranking_quality.py
- 计算对话模型的排名度量。tools/quality/prediction_distinctness.py
- 计算不同-对话模型的指标。 看 features section 更多关于指标资料.tools/quality/condition_quality.py
- 根据条件值计算数据的不同子集的度量.tools/generate_predictions.py
- 评估模型。 在给定的对话框上下文集上生成对话模型的预测,然后计算度量。 请注意,您应该具有反向模型data/nn_models
目录,如果你想使用 "*-reranking" 预测模式。tools/generate_predictions_for_condition.py
- 生成给定条件值的预测。tools/test_api.py
- 用于将请求发送到正在运行的HTTP服务器的示例代码。tools/download_model.py
- 下载预先训练的模型和与之关联的索引文件。 还要编译整个模型一次以创建Theano缓存。tools/telegram_bot.py
- 运行使用训练模型的电报机器人。
网络体系结构,培训,预测和记录步骤的所有配置参数都在中定义cakechat/config.py
.
HTTP服务器中使用的一些推理参数在中定义 cakechat/api/config.py
.
-
网络架构和规模
HIDDEN_LAYER_DIMENSION
是定义循环图层中隐藏单元数的主要参数.WORD_EMBEDDING_DIMENSION
和CONDITION_EMBEDDING_DIMENSION
定义每个隐藏单元的数量 令牌/条件映射到。 它们一起汇总到传递给编码器RNN的输入矢量的维度。- 解码器输出层的单元数由字典中的令牌数定义 tokens_index目录。
-
解码算法:
PREDICTION_MODE_FOR_TESTS
定义如何生成模型的响应。 选项如下:- sampling – response is sampled from output distribution token-by-token.
对于每个标记,在采样之前执行温度变换。
您可以通过调整来控制温度值
DEFAULT_TEMPERATURE
参数. - sampling-reranking – multiple candidate-responses are generated using sampling procedure described above.
之后候选人根据他们的MMI得分排名[3]
您可以通过选择来调整参数此模式
SAMPLES_NUM_FOR_RERANKING
和MMI_REVERSE_MODEL_SCORE_WEIGHT
. - beamsearch – candidates are sampled using beam search algorithm. 根据由波束搜索过程计算的对数似然分数对候选者进行排序。
- beamsearch-reranking – same as above, but the candidates are re-ordered after the generation in the same way as 在采样 - 重新排名模式下。
- sampling – response is sampled from output distribution token-by-token.
对于每个标记,在采样之前执行温度变换。
您可以通过调整来控制温度值
请注意,还有其他参数会影响响应生成过程。 See
REPETITION_PENALIZE_COEFFICIENT
,NON_PENALIZABLE_TOKENS
,MAX_PREDICTIONS_LENGTH
.
通过在数据集条目中提供其他条件标签,您可以构建以下模型:
- A Persona-Based Neural Conversation Model — 允许对角色ID进行条件响应以使其在词汇上与给定角色的语言风格相似的模型。
- Emotional Chatting Machine-like model — 允许调节情绪反应以提供情绪风格(愤怒,悲伤,快乐等)的模型。
- Topic Aware Neural Response Generation-like model - 一种模型,允许对特定主题的响应进行条件化以保持主题感知对话。 要使用这些额外条件,请参阅本节 Training your own model. 只需设置“条件”字段即可training set 以下之一: persona ID, emotion or topic标签,更新索引文件并开始培训。
- [1] 神经对话模型
- [2] 如何不评估你的对话系统
- [3] 神经对话模型的多样性促进目标函数
- [4] 情绪聊天机:内部和外部记忆的情感对话
- [5] 基于角色的神经对话模型
- [6] 主题意识神经响应生成
- [7] 用于生成上下文感知查询建议的分层递归编码器 - 解码器
- [8] 口语对话系统用户仿真技术的定量评估
它由 Replika开发和维护: Michael Khalman, Nikita Smetanin, Artem Sobolev, Nicolas Ivanov, Artem Rodichev and Denis Fedorenko. Demo by Oleg Akbarov, Alexander Kuznetsov and Vladimir Chernosvitov.
可以在此处跟踪所有问题和功能请求 - GitHub Issues.