瑞克|用GPT-2做个“姥爷”!57行代码给《瑞克和莫蒂》写新剧集

_原题为 用GPT-2做个“姥爷”!57行代码给《瑞克和莫蒂》写新剧集
瑞克|用GPT-2做个“姥爷”!57行代码给《瑞克和莫蒂》写新剧集
文章图片

大数据文摘出品
来源:Medium
编译:xt、coolboy
最近 , 一提到语言模型 , 我们想到的可能就是GPT-3 , 毕竟是有史以来规模最大的语言模型 , 参数高达1750亿个 。 事实上 , 它的前身GPT-2也很强大 。
本文将向各位展示如何利用Hugging Face的Transformers库“精细调教”使用《瑞克和莫蒂》剧本预先训练过的GPT-2模型 。 以下我们会制作一个展示案例 , 并使用Streamlit Sharing来部署它 。
介绍 随着机器学习(Machine Learning, ML)和自然语言处理(Natural Language Processing, NLP)技术的快速进展 , 新算法具备生成文本的能力 , 这些文本也变得越来越接近人类写出的内容 。 GPT21就是其中一个算法 , 它被应用在很多开源项目2中 。 GPT2以WebText为训练集 , WebText包含4500万条来自Reddit(一个对新闻进行评论的网络社区)的外链 。 其中占据外链内容前10的主要数据3来自Google , Archive , Blogspot , Github , NYTimes , WordPress , Washington Post , Wikia , BBC以及The Guardian 。 受过训练的GPT2模型能根据具体数据集再被进一步调校 , 比如说最终能够抓取某个数据集的风格或者能够做文档分类 。
这一功能基于迁移学习的实现 , 即一种从源设定中提取知识并应用到另一个不同目标设置上的技术4 。 如果想要了解GTP2算法更详细的解释以及算法构架 , 请参考原始文献5 , OpenAI的博客6和Jay Alammar的指导说明7 。
数据集 用来训练GPT2的数据集来自《瑞克和莫蒂》前三季的台词 。 我提前过滤了其中不属于Rick , Morty , Summer , Beth和Jerry的对话 。 这些数据下载后以生文本格式进行存储 。 每一行数据代表一位主角的发言 , 同时包含了对他们语气/动作及对话场景的描述 。 数据集被分为训练集和测试集 , 分别有6905行和1454行 。 原文件在此可供查看(https://github.com/e-tony/Story_Generator/tree/main/data) 。 训练集是用来训练模型的 , 测试集则用来评估模型效果 。
训练模型 Hugging Face’s Transformers库提供了一个简单的GPT2模型训练脚本(https://github.com/huggingface/transformers/tree/master/examples/language-modeling#gpt-2gpt-and-causal-language-modeling) 。
接下来 , 你可以在Google Colab notebook(https://colab.research.google.com/drive/1opXtwhZ02DjdyoVlafiF3Niec4GqPJvC?usp=sharing)环境下开始训练自己的模型 。 一旦完成了模型训练 , 你需要将训练输出文件夹下载下来 , 文件夹里包含了所有相关模型的文件 , 这一步对之后加载模型至关重要 。 你还可以将自己的模型上传到Hugging Face的模型中心8 , 让其他人也能看到它 。 这个训练好的模型在使用测试数据评估时 , 会获得17分左右的复杂度得分 。
瑞克|用GPT-2做个“姥爷”!57行代码给《瑞克和莫蒂》写新剧集
文章图片

搭建应用 首先 , 我们新建一个叫做Story_Generator的项目文件夹, 并在Python 3.7的环境下开始试验:
mkdir Story_Generator
cd Story_Generator
python3.7 -m venv venv
source venv/bin/activate
下一步 , 安装所有需要的依赖:
pip install streamlit-nightly==0.69.3.dev20201025
pip install torch==1.6.0+cpu torchvision==0.7.0+cpu -f https://download.pytorch.org/whl/torch_stable.html
pip install git+git://github.com/huggingface/transformers@59b5953d89544a66d73
整个应用通过app.py实现 。 我们需要创建python文件并导入我们新安装的依赖:
import urllib
import streamlit as st
import torch
from transformers import pipeline
在更进一步之前 , 需要加载训练好的模型 。 利用@st_cache的装饰器 , 执行一次load_model()函数并将结果存到本地缓存 。 这个操作能够增幅程序性能 。 接着用pipeline()函数加载文本生成器模型即可(将代码中的模型路径换成你自己的模型或者也可以直接用模型中心里我预先训练过的mypre-trainedmodel , https://huggingface.co/e-tony/gpt2-rnm):
@st.cache(allow_output_mutation=True, suppress_st_warning=True)
def load_model():
return pipeline("text-generation", model="e-tony/gpt2-rnm")model = load_model()
使用Streamlit中的text_area()函数可以生成一个简单文本框 。 我们可以额外定义文本框的高度及其容纳的最大字符数(需要注意的是越大的文本生成时间越长):
textbox = st.text_area('Start your story:', '', max_chars=1000)
搞定了代码的开头部分 , 我们现在可以运行程序 , 看看目前的进度(也可以通过刷新页面获取及时进度)


推荐阅读