【文本匹配】MatchZoo的基本使用

在前序文章中分别介绍了文本匹配的基本应用场景以及两大主流匹配范式:表示型匹配模型交互型匹配模型。本文介绍一款文本匹配的基本工具:MatchZoo,其囊括了常见的文本匹配模型,免去重复造轮子的麻烦,且提供了基于TensorflowPytorch的两个版本。

本文按照【数据集准备】——>【模型训练】——>【模型使用】的常规顺序,介绍pytorch版本的基本使用。

一、数据准备

MatchZoo按照DataPack——>Preprocessed——>DataSet——>DataLoader的顺序来组织文本顺序。

1.1 DataPack
(1)数据定义

显然,在文本问题中,包括text1text2relation三个元素,而DataPack正是有对应的leftrightrelation三部分的数据结构,每部分都是一个单独的DataFrame,其中relation的每条记录中包括leftright相应的id

class DataPack(object):
    def __init__(
        self,
        relation: pd.DataFrame,
        left: pd.DataFrame,
        right: pd.DataFrame
    ):
        """:class:`DataPack` initializer."""
        self._relation = relation
        self._left = left
        self._right = right

其中leftright的格式类似于:
在这里插入图片描述
relation的格式类似于:
在这里插入图片描述

(2)DataPack——>DataFrame

对于DataPack对象,通过frame()方法可将返回对应的DataFrame对象。其包含id_lefttext_leftid_righttext_rightlabel五个字段。
在这里插入图片描述

(3)DataFrame——>DataPack

反之,也可以通过顶级函数packDataFrame数据直接转换为DataPack。其中,原始DataFrame数据必须至少包含text_lefttext_right列,而id_leftid_right在转换中可自动生成,label列任意(分为训练和测试阶段)。

此外在pack函数中有个重要的参数:task,其取决于我们对解决文本分类问题的思路:是定义为分类问题,还是定义为pair-wise的排序问题(具体解释见后文的tasks部分)。该函数默认值为ranking,即排序问题;此外,还设置为clsssification,即分类问题,或设定为两者对应的类。在DataFrame——>DataPack过程中,该参数的不同会影响到label字段值的类型,即ranking变为float类型,而clsssification变为int类型,这是由两类问题不同的损失函数所决定。

(4)DataPack中的unpack方法

在训练/预测阶段,DataPack类型的数据会通过unpack函数进行拆包,转变为(X, y)元组(测试阶段无lable时,y=None),其中X{str: np.array}的键值对,拆包后的数据可直接用于模型的fitfit_generator函数进行。

1.2 Preprocessed

matchzoo的preprocessors中提供了一系列用于文本处理的基本类(如包含词频过滤、停用词过滤、长度截断的BasicPreprocessor,可用于Bert
类模型数据预处理的BertPreprocessor),而在各模型中可直接使用get_default_preprocessor等方法调用进行适用于该模型的文本处理器,然后通过traintrainsform方法将文本转变为可用于训练的数字数据。

经过preprocessors处理后的数据仍为DataPack类型。

1.3 DataSet

继承自torch.utils.data. Dataset,对Preprocessed的数据进行采样、批量化、随机、排序、编号等操作,通过unpack方法返回(X, y)元组

其中有几点需要注意:
(1)训练模式:matchzoo支持point-wise ranking,即classfication的训练模式,也支持pair-wise ranking的训练模式(暂未实现list-wise ranking)。对应参数分别为mode=pointmode=pair

mode=pair时,如下参数需要设置:

  • num_dup: 重采样的次数,默认1,即不重新采样
  • num_neg:负采样的次数,1个正例+num_neg个负例在mode=pair时为真正的一个sample
  • resample:是否在每个batch中重新采样

(2)不同于pytorch中默认的将批量化、随机等操作放在DataLoader阶段,MatchZoo将其前置到DataSet中,并通过其中的reset_index__getitem__的方法进行实现

(3)样本的索引列表通过index_pool进行保存,当mode=point时,索引列表即为原始的索引列表,而mode=pair会,每一个元素中的文本pair为1+num_neg。

1.4 DataLoader

将DataSet返回的DataPack类型数据进行进一步处理,返回可迭代的batch。其中重要的参数包括:
(1)stage: 用于控制模型的阶段,分为"train", “dev”,和"test";
(2)callback: 一些处理函数,比如padding操作。

二、模型训练
2.1 指定tasks

tasks是MatchZoo中定义的概念,用于指定文本匹配任务的类型,即是分类问题(classification)还是排序问题(pair-wise ranking)。

无论将其定义为哪一种问题,均需要设置如下的参数:
(1)losses : 即损失函数

对于分类任务,可直接采用pytorch中内置的交叉熵等损失函数;
对于排序任务,MatchZoo自定义两种损失函数,分别为适用于排序的交叉熵损失RankCrossEntropyLoss和用于区分正负样本margin的铰链损失RankHingeLoss

具体而言,RankCrossEntropyLoss指对于每一组正、负样本计算其softmax后的交叉熵损失的均值;

-torch.mean(
            torch.sum(
                labels * torch.log(F.softmax(logits, dim=-1) + torch.finfo(float).eps),
                dim=-1
            )

RankHingeLoss则是对于每一组正、负样本中的负样本先计算其平均值,在与正例的预测值进行HingeLoss的计算。

(2)metrics:即评价指标

分类任务常用的metrics有: accuracy、crossentropy
排序任务常用的metrics有:map、mrr、dcg和ndcg等

2.2 定义模型

MatchZoo的models模块中定义了许多经典的文本匹配模型以直接调用,在指定各params后调用build函数即可得到对应的模型架构和初始化参数。

2.3 定义优化器等

与pytroch的惯用套路一样,这里不加详细说明。

2.4 定义Trainer

MatchZoo对训练阶段的封装,可指定如下参数:

  • model:表示上面定义的model
  • optimizer:表示pytorch中的优化器
  • trainloader:DataLoader类型,表示训练数据加载实例
  • validloader:DataLoader类型,表示验证数据加载实例
  • device:可以是list型,表示数据并行训练
  • start_epoch:默认起始epoch的值
  • epochs:表示需要运行的epochs,默认为10
  • validate_interval:int型,表示每各多少个steps显示一次结果
  • clip_norm:int型或者float型,表示梯度裁剪的norm值
  • patience:int型,这里并不表示多少个steps,而是表示经过多少次+ + evaluate,使用patience * validate_interval则表示经过多少个steps
  • key:用于比较的metric,也就是如何用于决定是否early-stopping的标准
  • checkpoint:Path类型,表示保存的模型的checkpoint
  • save_dir:Path类型,表示模型保存的文件夹
  • save_all:bool型,如果是True,则保存Trainer的实例,否则只保存模型
    verbose
2.5 开始训练

通过trainer.run()进行训练。

三、模型预测

通过trainer.predict()进行预测,其输入数据为DataLoader。

四、示例

这里给出官方的简单示例:

import torch
import matchzoo as mz

# 1. 指定任务类型(一般情况可放在model之前,无论如何注意前后问题定义的一致性)
ranking_task = mz.tasks.Ranking(losses=mz.losses.RankCrossEntropyLoss(num_neg=4))
# 1.1 定义任务的loss和metric
ranking_task.metrics = [
    mz.metrics.NormalizedDiscountedCumulativeGain(k=3),
    mz.metrics.MeanAveragePrecision()
]

# 2. 准备数据
# 2.1 封装成DataPack
train_pack = mz.datasets.wiki_qa.load_data('train', task=ranking_task)
valid_pack = mz.datasets.wiki_qa.load_data('dev', task=ranking_task)

# 2.2 经过preprocess处理
preprocessor = mz.models.ArcI.get_default_preprocessor()
train_processed = preprocessor.fit_transform(train_pack)
valid_processed = preprocessor.transform(valid_pack)

# 2.3 Dataset
trainset = mz.dataloader.Dataset(
    data_pack=train_processed,
    mode='pair',
    num_dup=1,
    num_neg=4,
    batch_size=32
)
validset = mz.dataloader.Dataset(
    data_pack=valid_processed,
    mode='point',
    batch_size=32
)

# 2.4 DataLoader 
padding_callback = mz.models.ArcI.get_default_padding_callback()    # padding策略

trainloader = mz.dataloader.DataLoader(
    dataset=trainset,
    stage='train',
    callback=padding_callback
)

validloader = mz.dataloader.DataLoader(
    dataset=validset,
    stage='dev',
    callback=padding_callback
)

# 3. 搭建模型
# 3.1 调用内置模型并初始化参数
model = mz.models.ArcI()
model.params['task'] = ranking_task
model.params['embedding_output_dim'] = 100
model.params['embedding_input_dim'] = preprocessor.context['embedding_input_dim']
model.guess_and_fill_missing_params()
model.build()

# 3.2 定义优化器等
optimizer = torch.optim.Adam(model.parameters())

# 3.3 封装训练器
trainer = mz.trainers.Trainer(
    model=model,
    optimizer=optimizer,
    trainloader=trainloader,
    validloader=validloader,
    epochs=10
)

# 3.4 进行训练
trainer.run()


# 4. 进行预测
# trainer.predict()

【参考资料】:
(1)官方API文档
(2)关于文本匹配工具MatchZoo

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
对面向开发者的干货内容进行了梳理和总结: 一是理论。 过去一年间, AI 科技评论不断报道与人工智能技术相关的公开课程, 请来多个相关领域的资深学者, 持续解读基础概念, 为大家答疑解惑。 该栏目涵盖深度学习以及相关应用和延伸, 涉及自动驾驶、 语音、医疗、 人脸识别等方方面面。 二是工具。 AI 科技评论也在时刻关注着相关深度学习工具的动态和更新,如 TensorFlow、PyTorch、 Theano 等。 不仅如此, 我们还推出相关实战课程, 例如如何搭建系统进行图像识别。 除了底层工具,我们还关注大大小小的开源项目, 如 OpenBLAS、 阿里 Pouch、中科院 MatchZoo 等。 此外, 这一栏目也集结了腾讯、 阿里、英特尔等公司的深度学习解决方案。 三是赛事。 在与人工智能相关的一系列比赛中, 也能见到 AI 科技评论报道的身影。2017 年,我们对多个数据科学类的比赛进行跟踪报导, 涵盖 KDD Cup、 ICCV 2017 COCO&Places; 挑战赛、 DARPA 挑战赛、 京东金融全球数据探索者大赛等, 内容覆盖冠军解决方案、 赛事难点等多个层次, 冠军团队包括微软、 旷视等多家企业,清华大学、北京大学等多所高校。 希望大家能通过「理论」、「工具」、「赛事」 这 3 个栏目、 50 篇文章, 不断进阶,不断思考, 从理论走向实践, 成为一名优秀的开发者, 为人工智能社群贡献自己的一份力量。 也希望, AI 科技评论的这份总结和梳理能帮助到读者朋友们, 大家都能真正学有所获。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值