广告行业中那些趣事系列29:基于BERT构建文案生成模型

2022-05-05 13:32:32 浏览数 (1)

导读:本文是“数据拾光者”专栏的第二十九篇文章,这个系列将介绍在广告行业中自然语言处理和推荐系统实践。本篇从理论到实践介绍了基于BERT构建文案生成模型,对于希望用BERT构建文案生成模型感兴趣的小伙伴能有所帮助。

摘要:本篇从理论到实践介绍了基于BERT构建文案生成模型。首先介绍了业务背景以及行业参考,通过构建基于标签的文案生成模型不仅可以提升广告主创建广告的效率,而且引人注目的广告文案可以有效提升广告的转化效果,同时介绍了行业竞品主要有阿里妈妈的一键生成电商营销方案系统和宇宙条的巨量创意平台;然后重点详解了BERT构建文案生成模型,包括本质属于Seq2Seq任务、BERT和Seq2Seq的结合UNILM、beam search优化、基于检索和基于生成的两种可行性方案以及基于Conditional Layer Normalization的条件文本生成原理;最后通过源码实践了BERT基于标签的文案生成模型,包括线下构建离线模型和基于Flask构建线上模型。希望对应用BERT构建文案生成模型感兴趣的小伙伴能有所帮助。

下面主要按照如下思维导图进行学习分享:

01 背景介绍

1.1 为啥要学习文案生成模型

还是按照惯例讲下为啥要做基于标签的文案生成模型,其实之前一篇文章《广告行业中那些趣事系列27:围观机器学习是怎么解决“看图说话”任务》也或多或少讲过,这里再简单说下。因为我们今年有个业务是根据一定的条件(这个条件可以是标签、关键词等)来自动生成广告文案,有两个业务目标:第一个目标是提升广告主创建广告的效率,第二个目标是通过引人注目的广告文案提升广告转化效果

先看看广告文案生成模型是如何提升广告主创建广告的效率。一般广告主在创建广告的时候需要准备广告素材图片和广告文案。对于广告主来说创建广告的流程越简单越好,通常情况下广告素材图片因为涉及到代言人等等原因所以需要定制化,而广告文案如果能根据广告的自身特点比如广告自身信息、广告类别、受众人群和广告素材图片等自动生成的话就可以大大节约广告主撰写广告文案的成本。通俗点说,假如我要创建一个广告,希望准备一张广告素材图片,平台就可以根据广告自身的信息和提供的广告素材图片来自动生成广告文案。根据广告主的需求自动生成可参考的广告文案就可以有效提升创建广告的效率;

至于广告文案可以提升广告转化效果大家应该更容易理解。比如戴比尔斯钻石的《钻石恒久远,一颗永流传》、农夫山泉的《我们只做大自然搬运工》、王老吉的《怕上火,喝王老吉》或者虽然被无数人吐槽但是非常洗脑的脑白金的《今年过节不收礼,收礼只收脑白金》等广告文案对最终广告转化效果的贡献都功不可没。这就是文案生成模型可以提升广告转化效果的原因。

图1 脑白金的广告文案

1.2 行业参考或竞品

上面说了广告文案生成模型的业务背景,下面看下行业内做的比较好的广告文案自动生成系统。经过调研,主要有阿里妈妈的一键生成电商营销方案系统和宇宙条的巨量创意平台。阿里妈妈的一键生成电商营销文案系统只需要用户输入TB商品链接阿里妈妈平台就会自动生成商品广告营销文案。这里TB商品链接其实会作为生成条件,链接里包括商品相关的信息,广告主还可以进一步确定关键词提升文案生成的效果。可以看出生成的广告营销文案效果还是不错的,下面是阿里妈妈的一键生成电商营销文案的示例图

图2 阿里妈妈的一键生成电商营销文案

其实和我们业务更加相近的是宇宙条的巨量创意平台中的妙笔。用户只需要选择行业并且输入关键词就可以生成对应的广告文案,下面是巨量创意平台的文案生成效果:

图3 巨量创意平台的文案生成效果

小结下,本章先讲了构建文案生成模型的业务背景,不仅可以提升广告主创建广告的效率,而且可以提升广告的转化效果;然后讲了下行业参考或竞品,主要有阿里妈妈的一键生成电商营销方案系统和宇宙条的巨量创意平台中的妙笔,整体来看我们的业务和巨量创意平台的妙笔非常类似。通过本章希望小伙伴们可以了解我们构建文案生成模型的作用和意义。

02 详解基于BERT构建文案生成模型

2.1 本质是Seq2Seq任务

上一章讲了构建基于标签的文案生成模型业务背景,本章主要从理论的角度介绍模型方案及原理。先看下模型的输入和输出:模型的输入是一句话,这句话是标签或者主题,这里的标签或主题其实就是广告所属的分类。我们会构建标签体系,通过标签来将人群进行划分,同时广告主也是通过标签来圈选人群进行投放广告。举例说明吧,比如我们现在有三大类标签游戏、汽车和金融,我们会将大盘人群根据用户行为数据来打标,从而将人群划分到这三大类标签,有的人可能会被打上三个标签,而有的人可能一个标签都没有。最后广告主创建广告并选择人群进行投放广告的时候也会根据自身广告的属性来圈选人群,比如一个卖车的广告主会选择汽车这个标签来投放广告。关于用户是怎么被打上标签的小伙伴们可以看下我之前写过的一篇文章《广告中那些趣事系列1:广告统一兴趣建模流程》,这里不再赘述;再回过头来看下模型的输出也是一句话,也就是生成的广告文案。因为模型的输入和输出都是文本序列,并且输入和输出的长度可能不同,所以是Seq2seq任务。Seq2seq模型架构如下图所示:

图4 Seq2seq模型架构

从上图中可以看出,Seq2seq模型架构中输入是w1、w2、…wn,输出是y1、y2、…yn,主要分成编码器和解码器两部分。编码器把输入序列转化成一个固定大小的向量hn,然后解码器根据向量hn单向递归的生成输出序列。重点注意下输出序列的流程,解码器第一轮解码会根据hn向量和开始符号S先输出y1,然后第二轮再根据hn向量和已经生成的词y1来输出y2,不断循环,每轮解码只能利用已经生成的序列,而后面的序列是不可见的,直到遇见结束符号E完成模型整个输出。

在NLP领域中编码器和解码器结构可以选择的很多,主要有LSTM、CNN或者当前超火的Transformer模型。实际项目中主要使用BERT来构建Seq2Seq任务。

2.2 BERT和Seq2Seq的结合UNILM

上面说Seq2Seq模型结构的解码器是利用编码器得到的固定向量hn去单向递归的生成输出序列,而BERT是基于Transformer的双向循环结构,模型训练过程中对于每个词来说其他所有词都是可见的,所以需要对BERT进行改造才能适配Seq2Seq模型。将BERT用于完成Seq2Seq任务主要是使用微软的UNILM模型,具体做法是对Attention矩阵进行改造从而可以仅需使用一个BERT模型来同时完成编码器和解码器的工作,下面分别是双向可见、单向可见和前缀双向可见的注意力机制掩码操作:

图5 三种不同的注意力机制掩码操作

从上图中可以看出,第一种双向可见的Attention机制是BERT原始的编码机制,对于每个词来说所有词都是可见的;第二种单向可见的Attention机制是Seq2Seq模型中解码器的结构,对于每个词来说只能看到它之前的词,而之后的词都是不可见的。比如对于第三个字“吃”来说,之前的“我”和“想”是可见的,而之后的“苹“和”果”是不可见的。如果用单向可见的Attention机制,那么需要使用两个BERT模型,第一个BERT用于作为编码器,第二个BERT改造成单向可见的Attention即可完成,这也是BERT和Seq2Seq模型相结合的一个工作,是微软的MASS。但是整体来看不够优雅;第三种是前缀双向可见的Attention机制,也就是微软的UNILM。这个模型巧妙之处在于仅使用单个BERT模型就可以完成Seq2Seq任务,不需要区分编码器和解码器。具体通过举例说明,假如我们现在输入序列是“我”、“想”、“吃”,输出序列是“苹“、”果”。通过UNILM模型,对于输入序列中的每个字都是互相可见的,而对于输出序列则之前的序列是可见,之后的序列是不可见的,很好的满足了Seq2Seq的模型结构,可以说是非常巧妙的设计。通过这种方式,可以将BERT很好的应用到NLG自然语言生成任务中去。经过实践,模型的生成效果也是很不错的。

2.3 beam search优化

Seq2Seq模型主要是基于已知序列不断来生成新的序列,相当于是建模:

P(Y|W)=P(Y1|W)P(Y2|W,Y1) P(Y3|W,Y1,Y2)……P(Yn|W,Y1,Y2..Yn-1)

Seq2Seq模型解码需要找到最大概率Y。第一种最简单的贪心搜索,对于解码器来说如果有N个词其实就是一个N分类的任务。第一轮模型会基于W选择概率值最大的作为Y1,然后第二轮模型会基于W和已得到的Y1继续进行N分类任务选择概率值最大的作为Y2,直到模型遇到结束符号。但是这种贪心策略得到的结果未必是最优的,很容易陷入局部最优最终导致模型生成的结果较差。假如通过输入“我想吃”模型得到的概率值最大的词是“果”,那么后续会基于“我想吃果”得到的生成结果都不一定效果好。

但是如果要穷举所有可能那么模型的计算量会异常庞大,针对这种情况可以采用beam search这种折中的方式进行优化,beam search具体流程如下图所示:

图6 使用top(2)的beam search搜索流程

从上图可以看出,模型输入是“我想吃”,目标输出是“我想吃猕猴桃”,词表中有“苹、果、猕、猴、桃”五个字。解码器第一轮的时候输出“苹”的概率值最高是0.4,如果是贪心搜索的话模型则会确认第一轮的输出为“苹”。而beam serch会选择输出top(k)的结果,如果设置k为2(这里参数k是可以调的),那么模型会同时输出两种结果。也就是说beam search第一轮之后会输出两个结果“我想吃苹”和“我想吃猕”,也就是P(Y1|W)的top(2);第二轮的时候贪心搜索则会继续基于“我喜欢吃苹”来输出概率值最高的字,而beamsearch则会分别基于“我想吃猕”和“我想吃苹”总共可以得到2X2=4种组合,这时会计算每一种组合的总概率继续取前两个,也就是P(Y2|X,Y1)的top(2),比如得到了“我想吃猕猴”和“我想吃苹K1”。接下来继续进行下一轮,通过这种方式可以使后续的每一轮输出结果都只取top(k)虽然本质还是局部搜索,但是结合了更多的可能性,使得模型最终的生成结果效果更好。

2.4 基于检索和基于生成的两种方案

通过上面的内容我们已经了解可以用BERT和Seq2Seq相结合的方式UNILM来构建基于标签的文案生成模型。目前思考了两种可行性方案,第一种是以标签为条件的广告文案生成模型,线上通过检索的方式来部署服务。我们可以拿到标签以及对应的广告文案语料,模型就是对标签名进行编码,然后来生成对应的广告文案。线下可以生成海量的广告文案库,部署到线上时广告主必须选择标签,然后可以选择性输入关键词。生成广告文案的流程就变成了如果不输入关键词那么就直接从文案库从得到一批标签对应的广告文案,如果输入关键词(因为广告主输入的关键词可能比较杂乱)那么从当前标签对应的广告文案中通过simbert来检索语义相似的广告文案;第二种方式是以标签 关键词为条件的广告文案生成模型,线上通过实时生成的方式来部署服务。首先会通过关键词提取模型对广告文案提取对应的关键词,然后模型训练的时候会将标签 对应的关键词(可为空)一起作为生成条件来生成对应的广告文案。部署到线上的时候会直接将广告主必选的标签 输入的关键词(可为空)作为生成条件来实时生成广告文案。

上面两种方案都可以基于UNILM来构建基于标签的广告文案生成模型,只不过输入的粒度大小不同。第一种的粒度是标签,相对比较大;第二种的粒度是标签 关键词,相对比较小,当关键词为空的时候相当于是包含了第一种的。

2.5 基于Conditional Layer Normalization的条件文本生成

经过调研还发现了一种基于Conditional Layer Normalization的条件文本生成模型可以构建文案生成模型,这个方案是苏建林根据图像中流行的基于条件BN(Conditional Batch Normalization)的条件GAN思路提出的。因为BERT底层是基于Transformer模型,而Transformer使用Layer Normalization进行归一化操作。作者将Layer Normalization中对应的β和γ参数作为输入条件来控制UNILM模型的生成行为,从而完成了基于Conditional Layer Normalization的条件文本生成。下面是条件Normalization示意图:

图7 条件Normalization示意图

通过上图可以看出,模型输入是x,将c分别加入到β和γ参数作为条件来生成最终的~x。我们目前线上完成的初步版本就是基于Conditional LayerNormalization的条件文本生成完成的,将标签id化作为条件来生成对应的广告文案,下面是我们通过模型生成的广告文案:

图8 模型生成的广告文案

线下让模型生成海量的广告文案构成文案库。上线再通过simbert检索的方式从文案库中获取选定标签下语义相似度高的广告文案,根据用户定制化的需求,比如有的用户需要包含“传奇”,有的则需要包含“手游”,还有的需要包含“爆率”等。

小结下,本章首先讲了构建基于标签的文案生成模型本质是Seq2Seq任务;然后介绍了使用NLP领域中BERT和Seq2Seq相结合的UNILM来构建文案生成模型以及beam search优化策略;最后介绍了基于检索和基于生成的两种可行性方案,并基于Conditional Layer Normalization的条件文本生成初步完成了模型开发,并取得不错的线上效果。

03 源码实践基于BERT构建文案生成模型

上一章从理论的角度讲了基于BERT构建文案生成模型的方案及原理,本章我们分别从线下和线上来源码实践模型。

3.1 线下构建离线模型

上一章也讲过离线构建基于BERT的文案生成模型主要是利用UNILM,主要参考苏建林的开源项目bert4keras,非常幸运的是里面直接有现成的例子可以使用,小伙伴们可以直接通过下面两个例子来构建自己的文案生成模型,下面是github地址:

基于UNILM构建Seq2Seq模型的例子: https://github.com/bojone/bert4keras/blob/master/examples/task_seq2seq_autotitle.py 基于Conditional Layer Normalization的条件文本生成模型的例子: https://github.com/bojone/bert4keras/blob/master/examples/task_conditional_language_model.py

3.2 基于Flask构建线上模型

上一章讲了基于检索和基于生成的两种方案,如果是基于检索的比较容易,直接线下生成海量文案,部署到线上的时候仅仅是个简单的搜索查询任务。但是如果是基于生成的任务则比较麻烦,因为需要把模型部署到线上进行实时生成,那就需要通过Flask把模型部署到线上下面讲下Flask线上部署模型流程:

  • Step1:构建模型相关的类用于下游Blueprint调用(title_generate.py)

图9 构建模型相关的类

  • Step2:搭建flask服务,调用上述模型类(blueprint.py)

图10 搭建flask服务

  • Step3:构建程序启动服务脚本(app.py)

图11 构建程序启动服务脚本

总结及反思

本篇从理论到实践介绍了基于BERT构建文案生成模型。首先介绍了业务背景以及行业参考,通过构建基于标签的文案生成模型不仅可以提升广告主创建广告的效率,而且引人注目的广告文案可以有效提升广告的转化效果,同时介绍了行业竞品主要有阿里妈妈的一键生成电商营销方案系统和宇宙条的巨量创意平台;然后重点详解了BERT构建基于标签的文案生成模型,包括本质属于Seq2Seq任务、BERT和Seq2Seq的结合UNILM、beam search优化、基于检索和基于生成的两种可行性方案以及基于ConditionalLayer Normalization的条件文本生成原理;最后通过源码实践了BERT基于标签的文案生成模型,包括线下构建离线模型和基于Flask构建线上模型。希望对应用BERT构建标签的文案生成模型感兴趣的小伙伴能有所帮助。

0 人点赞