也来玩玩目前最大的中文GPT2模型(bert4keras)
©PaperWeekly 原创 · 作者|苏剑林
单位|追一科技
研究方向|NLP、神经网络
模型介绍
该计划发布的第一个模型称为 CPM-LM,参数大约为 26 亿,预训练中文数据规模 100GB,是一个单向的语言模型,其他细节大家自行到下面的链接阅读就好。这么大的参数量,一般我们都是直接使用而不考虑去 finetune 它的了,它所具备的能力就是无条件地随机生成文本,当然我们也可以实现给它一些引导,然后用它来实现文本续写,至于 Few Shot 之类的应用,本质上也都是文本续写的变式。
主页:
https://cpm.baai.ac.cn/
GitHub:
https://github.com/TsinghuaAI/CPM-Generate
公众号:
中文版GPT-3来了?智源研究院发布清源 CPM —— 以中文为核心的大规模预训练模型
这里说一下模型结构的问题,也是笔者在适配过程中踩的第一个坑。CPM-LM 的模型架构跟 OpenAI 的 GPT2 是一样的,所以说白了这就是一个 26 亿参数的中文 GPT2 模型。
开始笔者没认真看,然后又被 CPM-LM-TF2 项目 [1] 稍微误导了一下,导致在前期以为它的结构跟 GPT2_ML [2] 一样(GPT2_ML 既不是 GPT,也不是 GPT2,它介乎两者之间),很久都没调出合理的结果。
Tokenizer
在适配过程中踩到的第二个,是关于 tokenizer 的。不得不说,CPM-LM 所写的 tokenizer,在笔者看来实在是难登大雅之堂,至今仍然我耿耿于怀。
该 tokenizer 实际上就是在 Google 的 sentencepiece 的基础上包装了一下,但是又包得特别不优雅,简直是强迫症患者的噩梦。
具体来说,像 BERT 的 tokenizer 或者 sentencepiece 这类分词工具,都会默认去掉空格、换行符等分隔符,但是 CPM-LM 想要将空格和换行符保留,所以在送入 tokenizer 之前将它们替换为了别的符号(目前是空格替换为“▂”、换行符替换为“▃”),最后输出之前再替换回来。
这是一种常见的做法,是可以理解的,但我最不能理解的是换行符的替代符号“▃”居然不在它的 sentencepiece 模型的词表中!为了避免“▃”变成,CPM-LM 又将它替换为,也就是做了二次替换,才得到换行符的 id...
使用测试
GitHub:https://github.com/bojone/CPM_LM_bert4keras
一些 Few Shot 效果(输出结果会有一定的随机性,如果只关心 Few Shot 效果,可以考虑将解码方式换为 beam search):
# 常识推理
# 本例输出:北京
query = u"""
美国的首都是华盛顿
法国的首都是巴黎
日本的首都是东京
中国的首都是
"""
print(text_expansion.generate(query[1:-1], 1)[0])
# 单词翻译
# 本例输出:bird
query = u"""
狗 dog
猫 cat
猪 pig
鸟
"""
print(text_expansion.generate(query[1:-1], 1)[0])
# 主语抽取
# 本例输出:杨振宁
query = u"""
从1931年起,华罗庚在清华大学边学习边工作 华罗庚
在一间简陋的房间里,陈景润攻克了“哥德巴赫猜想” 陈景润
在这里,丘成桐得到IBM奖学金 丘成桐
杨振宁在粒子物理学、统计力学和凝聚态物理等领域作出里程碑性贡献
"""
print(text_expansion.generate(query[1:-1], 1)[0])
# 三元组抽取
# 本例输出:张红,体重,140斤
query = u"""
姚明的身高是211cm,是很多人心目中的偶像。 ->姚明,身高,211cm
虽然周杰伦在欧洲办的婚礼,但是他是土生土长的中国人->周杰伦,国籍,中国
小明出生于武汉,但是却不喜欢在武汉生成,长大后去了北京。->小明,出生地,武汉
吴亦凡是很多人的偶像,但是他却是加拿大人,另很多人失望->吴亦凡,国籍,加拿大
武耀的生日在5月8号,这一天,大家都为他庆祝了生日->武耀,生日,5月8号
《青花瓷》是周杰伦最得意的一首歌。->周杰伦,作品,《青花瓷》
北京是中国的首都。->中国,首都,北京
蒋碧的家乡在盘龙城,毕业后去了深圳工作。->蒋碧,籍贯,盘龙城
上周我们和王立一起去了他的家乡云南玩昨天才回到了武汉。->王立,籍贯,云南
昨天11月17号,我和朋友一起去了海底捞,期间服务员为我的朋友刘章庆祝了生日。->刘章,生日,11月17号
张红的体重达到了140斤,她很苦恼。->
"""
print(text_expansion.generate(query[1:-1], 1)[0])
文章小结
参考文献
更多阅读
#投 稿 通 道#
让你的论文被更多人看到
如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。
总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。
PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得或技术干货。我们的目的只有一个,让知识真正流动起来。
📝 来稿标准:
• 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向)
• 如果文章并非首发,请在投稿时提醒并附上所有已发布链接
• PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志
📬 投稿邮箱:
• 投稿邮箱:hr@paperweekly.site
• 所有文章配图,请单独在附件中发送
• 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通
🔍
现在,在「知乎」也能找到我们了
进入知乎首页搜索「PaperWeekly」
点击「关注」订阅我们的专栏吧
关于PaperWeekly
PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。