/EssayKiller_V2

基于开源GPT2.0的初代创作型人工智能 | 可扩展、可进化

Primary LanguagePythonMIT LicenseMIT

EssayKiller

image image image image image image

通用型议论文创作人工智能框架,仅限交流与科普。

Bilibili视频地址:https://www.bilibili.com/video/BV1pr4y1w7uM/

项目简介

EssayKiller是基于OCR、NLP领域的最新模型所构建的生成式文本创作AI框架,目前第一版finetune模型针对高考作文(主要是议论文),可以有效生成符合人类认知的文章,多数文章经过测试可以达到正常高中生及格作文水平。

项目作者 主页1 主页2 主页3
图灵的猫 知乎 B站 Youtube

致谢

感谢开源作者@imcaspar 提供GPT-2中文预训练框架与数据支持。 感谢@白小鱼博士@YJango博士@画渣花小烙@万物拣史@柴知道@风羽酱-sdk@WhatOnEarth@这知识好冷@科技狐 的参与和支持

框架说明

  • 基于EAST、CRNN、Bert和GPT-2语言模型的高考作文生成AI
  • 支持bert tokenizer,当前版本基于clue chinese vocab
  • 17亿参数多模块异构深度神经网络,超2亿条预训练数据
  • 线上点击即用的文本生成效果demo:17亿参数作文杀手
  • 端到端生成,从试卷识别到答题卡输出一条龙服务

Colab线上作文生成功能

国内没有足够显存的免费GPU平台,所以配合Google Drive将训练好的AI核心功能Language Network写作模块迁移到Colab。

当前线上仅开放文本生成功能,输入对应句子,AI返回生成文章。同一个句子可以输入多次,每一次输出都不同。也可以选择同时生成多篇文章。具体见:17亿参数作文杀手

  • 第一步:安装环境

  • 第二部:加载模型

  • 第三步:文章生成

  • 写作效果

本地环境

  • Ubuntu 18.04.2
  • Pandas 0.24.2
  • Regex 2019.4.14
  • h5py 2.9.0
  • Numpy 1.16.2
  • Tensorboard 1.15.2
  • Tensorflow-gpu 1.15.2
  • Requests 2.22.0
  • OpenCV 3.4.2
  • CUDA >= 10.0
  • CuDNN >= 7.6.0

开发日志

  • 2020.06.23 本地Git项目建立
  • 2020.07.03 整体模型架构搭建,开始语料收集
  • 2020.07.13 基于OCR的视觉网络训练
  • 2020.08.01 GPT-2中文预训练模型微调
  • 2020.08.14 Bert文本摘要模型
  • 2020.08.23 通顺度判分网络测试
  • 2020.09.14 排版脚本与输出装置改装

模型结构

整个框架分为EAST、CRNN、Bert、GPT-2、DNN 5个模块,每个模块的网络单独训练,参数相互独立。infer过程使用pipeline串联,通过外接装置直接输出到答题卡。

1. 输入

高考语文试卷作文题

浙江卷

2. 识别网络

2.1 EAST文本检测

OpenCV 的EAST文本检测器是一个深度学习模型,它能够在 720p 的图像上以13帧/秒的速度实时检测任意方向的文本,并可以获得很好的文本检测精度。


模型亮点

  1. 简单的管道实现在当时较高精度的文本检测。
  2. 图像通过FCN处理产生像素级文本缩放地图和几何图形的多个频道。
  3. 可旋转的文本框,可以检测文本也可以检测单词。

EAST文本检测器需要 OpenCV3.4.2 或更高的版本,有需要的读者可以查看 OpenCV 安装教程。虽然EAST的模型在检测自然场景下的英文文本有着较好的性能,要实现中文场景下的中文文本检测,仍然需要重新训练模型。

数据集处理

中文文本识别的数据集要按照原作者的命名方式修改,即使使用ICDAR3013这类标准数据集,也需要修改对应的图片命名方式。原代码数据集的命名方式:图片1.jpg 图片1.txt。

此外,代码是通过获取文件类型然后重新命名以原来的文件类型保存的,所以文本数据和图片数据需要分开处理。

训练命令:

python multigpu_train.py --gpu_list=0 --input_size=512 --batch_size_per_gpu=14 --checkpoint_path=/tmp/east_icdar2015_resnet_v1_50_rbox/ \ --text_scale=512 --training_data_path=/data/ocr/icdar2015/ --geometry=RBOX --learning_rate=0.0001 --num_readers=24 \ --pretrained_model_path=/tmp/resnet_v1_50.ckpt 

更多细节可以参考:https://zhuanlan.zhihu.com/p/64737915


检测结果

除了EAST,也可以把识别网络替换为传统的CTPN等模型,github上有已经成熟的项目:https://github.com/Walleclipse/ChineseAddress_OCR

2.2 CRNN文本识别

参考 https://github.com/ooooverflow/chinese-ocr

数据准备

下载训练集:共约364万张图片,按照99: 1划分成训练集和验证集

数据利用中文语料库(新闻 + 文言文),通过字体、大小、灰度、模糊、透视、拉伸等变化随机生成。包含汉字、英文字母、数字和标点共5990个字符,每个样本固定10个字符,字符随机截取自语料库中的句子,图片分辨率统一为280x32。

修改/train/config.py中train_data_root,validation_data_root以及image_path

训练

cd train  
python train.py

训练结果

Epoch 3/100
25621/25621 [==============================] - 15856s 619ms/step - loss: 0.1035 - acc: 0.9816 - val_loss: 0.1060 - val_acc: 0.9823
Epoch 4/100
25621/25621 [==============================] - 15651s 611ms/step - loss: 0.0798 - acc: 0.9879 - val_loss: 0.0848 - val_acc: 0.9878
Epoch 5/100
25621/25621 [==============================] - 16510s 644ms/step - loss: 0.0732 - acc: 0.9889 - val_loss: 0.0815 - val_acc: 0.9881
Epoch 6/100
25621/25621 [==============================] - 15621s 610ms/step - loss: 0.0691 - acc: 0.9895 - val_loss: 0.0791 - val_acc: 0.9886
Epoch 7/100
25621/25621 [==============================] - 15782s 616ms/step - loss: 0.0666 - acc: 0.9899 - val_loss: 0.0787 - val_acc: 0.9887
Epoch 8/100
25621/25621 [==============================] - 15560s 607ms/step - loss: 0.0645 - acc: 0.9903 - val_loss: 0.0771 - val_acc: 0.9888


2. 语言网络

2.1 BERT文本摘要

BERT的全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder。模型的主要创新点在pre-train方法上,用了Masked LM和Next Sentence Prediction两种方法分别捕捉词语和句子级别的representation。

模型的构成元素Transformer可以参考Google的 Attention is all you need ,BERT模型的结构如下图最左:

对比OpenAI GPT(Generative pre-trained transformer),BERT是双向的Transformer block连接;就像单向RNN和双向RNN的区别,直觉上来讲效果会好一些。

在原论文中,作者展示了新的语言训练模型,称为编码语言模型与下一句预测

Original Paper : 3.3.1 Task #1: Masked LM

Input Sequence : The man went to [MASK] store with [MASK] dog Target Sequence : the his

规则: 会有15%的随机输入被改变,这些改变基于以下规则

  • 80%的tokens会成为‘掩码’token
  • 10%的tokens会称为‘随机’token
  • 10%的tokens会保持不变但需要被预测

下一句预测

Input : [CLS] the man went to the store [SEP] he bought a gallon of milk [SEP] Label : Is Next Input = [CLS] the man heading to the store [SEP] penguin [MASK] are flight ##less birds [SEP] Label = NotNext

规则:

  • 50%的下一句会(随机)成为连续句子
  • 50%的下一句会(随机)成为不关联句子

训练

python run.py --model bert

测试时,需要用正则表达式过滤考试专用词,包括“阅读下面的材料,根据要求写作”,“要求:xxx”,“请完成/请结合/请综合xx”。

比如

人们用眼睛看他人、看世界,却无法直接看到完整的自己。所以,在人生的旅程中,我们需要寻找各种“镜子”、不断绘制“自画像”来审视自我,尝试回答“我是怎样的人”“我想过怎样的生活”“我能做些什么”“如何生活得更有意义”等重要的问题。

2.2 GPT-2文本生成

参考:https://github.com/imcaspar/gpt2-ml/

预训练语料来自 THUCNews 以及 nlp_chinese_corpus,清洗后总文本量约 15G。 Finetune语料来自历年满分高考作文、优质散文集以及近现代散文作品,约1000篇。

预训练
参考 GPT2-ML 预训练模型,使用 Quadro RTX 8000 训练 28w 步


Finetune

1、进入dataset目录
python pre_data.py --filepath /data/home/share1/gpt2-ml-Finetune/data-mayun_xiugai --outfile /data/home/share1/gpt2-ml-Finetune/data/22.json
filepath为finetune数据目录

2、生成tfrecord训练数据
python prepare_data.py -input_fn /data/home/share1/gpt2-ml-Finetune/data

3、finetune
CUDA_VISIBLE_DEVICES=0  python train/train_wc.py --input_file=/data/EssayKiller/gpt2-ml-Finetune/data/train.tfrecord --output_dir=/data/EssayKiller/gpt2-ml-Finetune/finetune_model --init_checkpoint=/data/EssayKiller/gpt2-ml/models/mega/model.ckpt-220000

3.判分网络

3.1 DNN判分模型

这部分直接调用百度API。有现成的模型就不重复造轮子了,具体实现方式百度没有开源,这里简单描述一下语言模型的概念: 语言模型是通过计算给定词组成的句子的概率,从而判断所组成的句子是否符合客观语言表达习惯。通常用于机器翻译、拼写纠错、语音识别、问答系统、词性标注、句法分析和信息检索等。

这里使用通顺度打分作为判断依据。

3.2 高考排版器

标题
复用BERT_SUM生成Top3的NER粒度token作为标题

主体
高考议论文的写作格式要求如下:

  1. 标题居中,一般少于20字
  2. 每段段首缩进两格
  3. 每个字符尽量保持在字体框内
  4. 字数不能过长或过短

由于模型输出的文章不保证换行和分段,通过统计高考作文的常见段数、每段句数,编写脚本对输出进行划分。大多数情况下分段排版的结果都比较合理。


输出

答题卡

外接装置

基于aedraw,一款开源的CNC(Computer Numerical Control数控机床)画图机器人,具有绘制图案、写字等功能,它也可以升级为激光雕刻等用途。 详细教程见 http://aelab.net/ ,不仅能自己制作一台写字绘画机器人,而且能够掌握其工作原理拓展更多的应用。

原版的输出临摹装置存在速度慢和格式不准的问题,通过改装和修改源代码得以优化

  • 因为时间原因目前的手写装置还有些问题,偶尔会有漏写、越格的问题
  • 视频中的作文经过后期的人工处理,补上了漏字

预训练模型

模型 参数量 下载链接 备注
EAST < 0.1 Billion GoogleDrive 检测模型
CRNN < 0.1 Billion 网盘链接 提取码:vKeD 识别模型
BERT 0.1 Billion GoogleDrive 摘要模型
GPT-2 1.5 Billion GoogleDrive 生成模型

整个AI的参数量分布不均匀,主要原因在于,这是一个语言类AI,99%的参数量集中在语言网络中,其中GPT-2(15亿)占88%,BERT(1.1亿)占7%,其他的识别网络和判分网络共占5%。

当前问题

  • 输出的格式和高考作文还不能完美契合,之后的参数需要微调一下。为了国庆前完成,我还没来得及优化
  • 生成的100篇作文里有很大一部分其实算不上合格的作文,有些只能勉强及格,有些甚至能拿零分(占比不多),显然GPT-2的能力有限。为了视频效果我只选了相对好的几篇做展示
  • 英文版的说明还没来得及写,有空的同学可以翻译一下提个pr

Q&A

  • 我能否用EssayKiller来帮自己写作业?
    不能。所以有下一个问题:

  • 为什么缺少一些关键文件?
    项目在一开始是完全开源的,经过慎重考虑我认为完全开源会被部分别有用心的人用以牟利,甚至用作不法用途。参考咸鱼和淘宝上一些魔改的开源框架应用。部分懂技术又不想动笔的小同志可能会让Essaykiller帮自己写作业,比如读后感、课后作文、思修小论文。我想说,这样不好。

  • 为什么不直接加密?
    本来打算用混淆加密,但一些模块本就是开源的,所以我开源了整体的模型文件,只隐藏了关键的,包括pipeline、输入输出在内的文件,另外有些文件里也加了盐。

  • 有哪些模组可用?
    目前完全开源,可以独立复用的部分包括:

    • 检测网络
    • 文本摘要网络
    • 文本生成网络
    • 判分网络与排版脚本
  • 为什么不用GPT-3
    训练一个中文GPT-3的价格至少为1200万美元,折合人民币将近1亿。要是真有人训练出来一个中文GPT-3还开源模型文件了,我愿称之为最强。

  • 训练EssayKiller需要多少钱?
    从头到尾训练完pipeline的话在1K~100K人民币不等,取决于你有无分布式集群可用


Citation

@misc{EssayKillerBrain,
  author = {Turing's Cat},
  title = {Autowritting Ai Framework},
  year = {2020},
  publisher = {GitHub},
  journal = {GitHub repository},
  howpublished = {\url{https://github.com/EssayKillerBrain/EssayKiller}},
}

参考资料

[1] BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
[2] ERNIE: Enhanced Representation through Knowledge Integration
[3] Fine-tune BERT for Extractive Summarization
[4] EAST: An Efficient and Accurate Scene Text Detector
[5] An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition
[6] Language Models are Unsupervised Multitask Learners
[7] https://github.com/Morizeyao/GPT2-Chinese
[8] https://github.com/argman/EAST
[9] https://github.com/bgshih/crnn
[10] https://github.com/zhiyou720/chinese_summarizer
[11] https://zhuanlan.zhihu.com/p/64737915
[12] https://github.com/ouyanghuiyu/chineseocr_lite
[13] https://github.com/google-research/bert
[14] https://github.com/rowanz/grover
[15] https://github.com/wind91725/gpt2-ml-finetune-
[16] https://github.com/guodongxiaren/README
[17] https://www.jianshu.com/p/55560d3e0e8a
[18] https://github.com/YCG09/chinese_ocr
[19] https://github.com/xiaomaxiao/keras_ocr
[20] https://github.com/nghuyong/ERNIE-Pytorch
[21] https://zhuanlan.zhihu.com/p/43534801
[22] https://blog.csdn.net/xuxunjie147/article/details/87178774/
[23] https://github.com/JiangYanting/Pre-modern_Chinese_corpus_dataset
[24] https://github.com/brightmart/nlp_chinese_corpus
[25] https://github.com/SophonPlus/ChineseNlpCorpus
[26] https://github.com/THUNLP-AIPoet/Resources
[27] https://github.com/OYE93/Chinese-NLP-Corpus
[28] https://github.com/CLUEbenchmark/CLUECorpus2020
[29] https://github.com/zhiyou720/chinese_summarizer

免责声明

该项目中的内容仅供技术研究与科普,不作为任何结论性依据,不提供任何商业化应用授权