Fork me on GitHub

贝壳找房【语言模型系列】实践篇:ALBERT 在房产领域的实践

贝壳找房【语言模型系列】原理篇一:从 one-hot 到 Word2vec

贝壳找房【语言模型系列】原理篇二:从 ELMo 到 ALBERT

随着预训练模型在各大榜单的不断屠榜,学术界和工业界对于预训练模型的研究也愈加狂热。预训练语言模型一般基于海量语料,消耗大量的硬件资源以及时间成本,利用无监督的方法学习一个语言模型,随之应用到各种任务中,带来效果上的提升。

贝壳找房作为中国互联网房产领域领先的服务平台,业务场景中包含了大量的自然语言处理任务,积累了大量的房产领域文本语料,如何更好的利用这些海量的语料,完成各种业务场景的提效,是贝壳找房语言智能与搜索团队面临的挑战之一。

一、模型选择

一般来讲,使用预训练模型分为三个阶段:选择模型、领域预训练、微调(fine-tuning),如下图所示。

预训练过程:

模型的选择是最基础,也是很大程度上决定最终应用效果和性能的关键一步。

谷歌提出的预训练语言模型 BERT 算是 NLP 领域近年来取得的重大进展及里程碑事件之一。虽然 BERT 效果显著,但是由于其庞大的参数量,使得其在现实场景的工程落地中步履维艰,难以真正的部署到线上使用。幸运的是,如今已经有很多算法对其进行了改进,使得模型更”接地气“,能够应用到具体的任务场景中,比如 2019 年提出的 ALBERT。

ALBERT 在参数量上做了很多文章,将 BERT 中 100 多 M 的参数量缩小到 12M(base),甚至是 4M(tiny),极大的提升了训练和推理速度,且效果基本保持一致。为了更好的进行线上工程化,选用 ALBERT 基于中文语料训练的 tiny 版本模型。tiny 版本只有 4 层 transformer,在推理速度上会大大提升。

二、领域预训练阶段

为了在特定领域的任务中取得更好的效果,通常会用特定领域的语料在公开的预训练模型基础上进一步训练,学习更多的关于该领域的语义信息。房产领域中的文本语料特点突出,具有很多房产领域特有的语言习惯和专业词汇,因此利用房产领域的文本进行进一步的领域预训练十分必要。

2.1 数据准备

综合贝壳找房多个业务场景下的语料(小贝助手、智能客服、看点、房评等),共准备了约 30G 左右的房产领域语料。

利用房产领域语料进行预训练,需要将大量的房产领域语料转成 tfrecord 格式,以便于进行快速的预训练。tfrecord 的生成主要消耗大量的 CPU 资源,对 GPU 资源没有依赖。一般来讲,我们会把预训练语料进行切分,以便在有限的内存资源中完成 tfrecord 的生成。这里我将原始语料切分为 317 份,每份 50 万行数据,依次生成 tfrecord。

2.2 算力和训练时间

由于 ALBERT_tiny 的参数量相较于 BERT 来讲减少了很多,所以在正常的 GPU 中也可以跑起来,且预训练速度也还可以接受,主要参数如下所示。

数据量 预训练参数 所用资源 所用时间
30G train_batch_size=512 max_seq_length=128 num_train_steps=30000 4 块 v100 42h

三、fine-tuning 阶段

经历过算法模型工业实践洗礼的同学,一定能够深刻的体会到工业中高质量数据的难得和重要,通常我们都没法拿到数量足够多的训练集。所以如何在只拥有少量数据集的情况下,取得较好的训练效果,就成了工业实践中比较常见的一个问题,而 fine-tuning 就很好的解决了这个问题。

所谓的 fine-tuning 阶段就是”站在巨人的肩膀上看世界“,这里的“巨人”就是我们前面提到的领域预训练。预训练模型在领域预训练阶段进行的是无监督训练,会学习到大量的领域知识,因此在 fine-tuning 阶段将预训练模型的参数作为具体任务的初始化参数,能够在具体的任务中使用更少的数据,得到更好的训练效果。

当前我们在房产领域中进行了两个任务的实践--意图识别和句式识别,并已经将意图识别的模型成功应用到线上,且取得了不错的效果。

3.1 意图识别

3.1.1 定义

意图识别,简单来说就是读懂一个 query 表达的意图,比如识别出“我想要一个带阳台的大房子”表达的意图是“找房”,其实直白的说,意图识别就是一个多分类任务。房产领域的意图识别主要分为用户意图识别和经纪人意图识别,其中用户意图体系复杂,任务难度较大,我们这次的实践也是挑了这块难啃的骨头。

3.1.2 整体架构

我们在建立用户意图体系的过程中,定义了 256 个意图类别,由于意图种类过多,难以使用一个模型进行分类表示,所以我们又将 256 类意图进行向上归类,定义了 13 个技能类别(包含一个 other 类别),每个技能下对应着一部分意图。在预测过程中,query 先经过技能模型,得到技能的标签,然后根据技能标签决定调取哪个意图模型。所以,我们一共有 1 个技能模型和 12 个意图模型,如下图所示。

模型架构:

3.1.3 albert 登场

在这个模型体系中,起初的技能模型和意图模型都是用的 fasttext。fasttext 虽然是一个很优秀的模型,但也有其缺陷。fasttext 模型对 query 的语义信息识别不充分,对“词”的依赖程度过高,比如技能标签是房屋信息的 query 大多为疑问句,导致 query 中经常出现”吗“这种疑问词,使得可能将“吗?”这种 query 识别成房屋信息。而 albert 这种预训练模型能够获取 query 的语义信息,内部采用注意力机制,对 query 中的每个词分配不同权重,可以在一定程度上避免这种问题的出现。所以我们将技能模型替换为了 albert,如下图所示。

模型架构替换:

3.1.4 效果

我们在对意图识别整体架构体系进行变更之前,完成了两版评测--线下模型评测及线上评测。

在线下评测过程中,我们在同等训练集、测试集的情况下,对 fasttext 和 albert 在技能层的效果进行了对比,结果如下

模型 评测任务 效果(acc)
fasttext 意图识别技能层 0.75
albert_origin+fine-tuning 意图识别技能层 0.804
albert_pretrain+fine-tuning 意图识别技能层 0.832

其中,albert_origin 是没有进行领域预训练的模型,直接使用了作者公开的预训练模型,albert_pretrain 是利用了房产领域数据进行预训练之后的模型。这里 albert 的效果是在预训练模型的基础上进行微调(fine-tuning)的结果。可以看出来,在线下评测中,技能层的模型由 fasttext 更替到 albert 后,其准确率由 0.51 上升到 0.632,提升了 12.2 个百分点,这个程度的提升还是很明显的。同时 albert_origin 和 albert_pretrain 也存在着 2.8 个点的差异,说明领域预训练是很有必要且效果显著的。

在上线之前,我们还进行了线上模拟评测,采用了 GSB 的评测方法,即对一批线上语料,分别使用两个意图识别架构进行预测,并人工标出预上线的架构相较于线上架构的影响。这里的影响包括正向(good)、相同(same)、负向(bad),其中 good 指的是新架构预测正确的 case 数量,bad 是指线上架构预测正确的 case 数量,same 指的是两个架构预测结果相同。由此来评测出新体系上线后对于线上的作用效果,以下是评测效果。

模型 评测任务 评测数据数量(条) good same bad
albert_pretrain+fine-tuning 技能层 8000 1058/0.1323 6466/0.8083 476/0.0595
意图层 8000 1115/0.1394 6455/0.8069 430/0.0537

由以上评测可以看出来,在技能层,新的意图识别架构在 8000 条 case 中产生了 1058 条正向影响,476 条负向影响;在意图层,新的意图识别架构在 8000 条 case 中产生了 1115 条正向影响,430 条负向影响。整体结果说明新的意图识别架构体系对于线上的技能层以及意图层均产生了正向的效果。

3.2 句式识别

3.2.1 定义

根据业务需求,我们将房产领域的句式分为 5 类,如下所示

句式类别 label 定义
疑问句 interrogative 以疑问语气进行询问的语句
肯定句 af‭‭‭‭‭firmative 表达肯定语气的陈述句
反问句 rhetorical 反问句就是用疑问的句式,表达肯定的观点。反问句表面看来是疑问的形式,但实际上表达的是肯定的意思,答案就在问句之中。
否定句 negative 表达否定意思的陈述句
其他 unlimited 只包含标点等符号或无实际意义的句子

3.2.2 效果

我们对句式识别进行了一个线下模型的评测,效果如下所示。

模型 数据集 效果(acc)
fasttext 句式 0.946
albert_origin+fine-tuning 句式 0.962
albert_pretrain+fine-tuning 句式 0.967

可以看出,模型更替后的效果与意图识别的模型更替结论一致。albert 模型在句式识别中的准确率比 fasttext 模型高 2.1 个点,且可以看出来 albert_pretrain 的效果优于 albert_origin。

四、意图识别部署上线

4.1 数据预处理

我们已经将预训练模型 albert 在意图识别中的应用成功的部署到了线上,该过程有一个重要的步骤--数据预处理工程化。

在模型训练过程中,albert 模型的作者在代码中对训练语料进行了很多的预处理工作,包括去除特殊字符、去除控制字符、去除多余空格、使用最大贪婪法完成 word-id 的转化等等步骤。为了使得模型的线上效果与线下保持一致,我们在工程中进行了一样的数据预处理。

4.2 线上响应

上线之前,为了保险起见,我们将 albert 的超时时间设置为了 80ms。上线之后,我们发现,albert 的响应时间大概在 20ms 到 30ms 之间,完全符合上线要求。

作者介绍

李东超,2019 年 6 月毕业于北京理工大学信息与电子学院,毕业后加入贝壳找房语言智能与搜索部,主要从事自然语言理解等相关工作。


本文地址:https://www.6aiq.com/article/1589066895141
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出