大数据文摘授权转载自安迪的写作间
作者:Andy
今早一起床就看到François Chollet大神(Keras作者)发推,根据 GPT-2中量模型的超长距离记忆想到了一种简单的不基于机器学习的文本生成方式,居然神奇地复现了GPT-2的结果,方法很简单(只用了20分钟写代码),每次用要基于文本中的关键词,还有句末几个词,在谷歌直接搜索,然后将获取检索片段基于最后几个词连接起来,只要这样不停做甚至能生成GPT-2论文中那个发现神奇独角兽的例子。
至于代码,François很幽默地说:“I will not be releasing the code, because you guys couldn't handle the power of a Python script cobbled together in 20 minutes with Requests, BeautifulSoup, and regular expressions. It would change algorithmic cyberwar forever.”又是一个 “Too dangerous to release。”不过更多调侃意义在里头,狠狠嘲讽了OpenAI一波。趁此机会,也把自己慢慢码了几天的稿发出来。
如果说BERT模型还很巧妙地提出Maske Language Model Loss加上 Next Sentence Prediction Loss来让预训练模型学到更全面信息,那GPT系列则就只是把貌似平淡无奇的Transformer Decoder(单向解码)给加大再加大,当然好的数据也不可少,然后向大家展示大到一定程度后(GPT-2)非常厉害的,特别在语言生成上,刚好填补了BERT 的缺陷。
GPT-2现在如此有名估计也是吸取了前一次教训,直到BERT出现大部分人才知道有个GPT,于是GPT-1完美的成了BERT的垫脚石。所以待 GPT-2出场,虽然论文正文短短几页,却是出尽风头,不知其中 OpenAI公关有出几分力,待人们问开不开源啊,答曰:”Too Dangerous to Release!(就是不给你们用!)”
此语一出,一下惊起一片反响,立刻出现了挺OpenAI派和反OpenAI 派,双方论证十足,纷纷发文,光那几天我每天都起码得看上一篇关于 GPT-2争论的博文。而GPT-2最小的117MB(指参数量)预训练模型,也在这吵吵闹闹中被悄悄放了出来。
之后,偶有在Reddit看到几篇基于117M模型finetune的帖,很有趣,一直想找时间也弄个玩玩,可惜太忙,前段时间专注BERT加上度假,也就搁下了。
因此,直到前几天,莫名发现关于GPT-2 finetune的帖突然又变多了,才发现OpenAI又放出了更大的模型,也就是这篇主要会用到的 345M模型(如需用小模型,只需将文中345M改为117M即可)。除此二者,根据论文,应该还有两个更大模型,如果OpenAI准备放出的话,估计GPT-2这个概念能炒整个2019年。
趁着现在这波热潮,总算是把GPT-2使用相关的库都浏览了一遍,顺便自己也finetune了几个模型,发现效果还挺好的。此外发现网上也没太多关于GPT-2使用的中文资料,因此就分享一下自己经验。
本文结构如下,大家自取所需:
首先,我会告诉大家如何用更底层的nshepperd的gpt-2库来 finetune模型;
之后,会介绍如何用更上层的minimaxir的gpt-2-simple库来更简单地finetune模型,主要用Colab的Notebook来教大家免费蹭 GPU来finetune模型;
最后,我会介绍如何把训练好的模型用t04glovern的gpt-2-flask-api模型部署到服务器上,通过浏览器访问,输入句子让模型续写。这里还会用到Hugginface的pytorch-pretrained-BERT来转换模型格式。
所需库Github链接:
gpt-2:https://github.com/nshepperd/gpt-2
gpt-2-simple:https://github.com/minimaxir/gpt-2-simple
gpt-2-flask-api:https://github.com/t04glovern/gpt-2-flask-api
pytorch-pretrained-BERT:https://github.com/huggingface/pytorch-pretrained-BERT
用到的训练数据是我从网上爬下来的老友记十季的剧本:
friends.txt:https://pan.baidu.com/s/1blbeVCro1nErh34KUGrPIA提取码:40bn
接下来就让我们开始吧,默认大家会用Linux系统来操作。
老板先来一盘GPT-2