1. 原因

今晚看到了Simon Willison 的只使用自己的博客内容来练习nanoGPT的试验,觉得挺有意思,突发奇想,能不能在鲁迅的文集上练习一个nanoGPT,然后生成很具辨识度的鲁迅风格的文字呢?由于nanoGPT结构简略,鲁迅的文集在GitHub上能够下载到,因此经过简略的代码修改加试验,就得到一个在鲁迅著作上练习的GPT2模型(无其他语料库的预练习),简略测验下,以“故土”开头,让模型生成鲁迅风格的文字:

故土,债是敬服的。
 我一向关于新青年的态度,先来说话,谢容易做的,然而伏园现已见过几样,感觉的是别的捧之数,认为先前的比如。今但近来做了做事,自己也还不做,不能先行通,所以生在冷静和“人生”,三妇一苦闷,觉得大约是如此隔阂
和曹操,于是非意模茶炛,能够说是太高了,所以现在便能教育,竟�如此。
 但汝真实有给法历代的,不久就在绝末年间,我想显出向大家饮一趟,而汉子大毒是怀旧的,就要贫足有打劫,能够永掠的。这种工作,我国有一个大官左翼阿,(陀思妥习),有敢请佛喜,总要适说一点�

还算有鲁迅文字的风格,但逻辑一窍不通,整体仍是难让人满意,不知道是GPT2能力的问题仍是我试验设置的问题(或许还有一些中文编码的问题),暂时没时间没思路细查了。 Anyway,这儿共享一下我试验的流程,作为一个起点,有爱好的朋友能够参阅,进行改善。本文涉及的代码修改代码现已提交到这个仓库了,能够参阅,文末会附上更多比如。

2. 操作流程

2.1 下载nanoGPT源码并安装依靠

git clone https://github.com/karpathy/nanoGPT
cd nanoGPT
conda create --name nanogpt  python=3.9
conda activate nanogpt
pip install transformers datasets tiktoken tqdm wandb numpy httpx torch torchvision

2.2 数据预处理

进入代码目录后,重建文件夹data/lunxun,用于存放数据。

从这儿下载鲁迅全集,放到data/luxun目录下,然后进行下面的处理: + 去掉一切编者加的注释(由于注释都是以[n]这种方式开头的,因此在VIM中能够用0,$s/^[.+//g指令来去掉) + 由于咱们想要的是鲁迅白话文的风格,因此手动去掉一切文言文的著作和翻译著作(文言文在最开头的《坟》集子里,翻译著作在最终) + 去掉单行的日期文字(如(一九一八年二月二日),能够在VIM中用g/^(一九.+/d去掉)

我处理后的文本地址在这儿。

然后编写代码prepare.py, 读取文本,将文集中的每行当作一个entry,构造练习集和验证集,数据比例9:1。

#!/usr/bin/env python
import os
import json
import tiktoken
import numpy as np
import random
input_file_path = os.path.join(os.path.dirname(__file__), "book.txt")
entries = []
with open(input_file_path, "r") as f:
    for line in f:
        if line.strip() and len(line) > 2:
            entries.append(line)
print(f"len of lines: {len(entries)}")
# Shuffle entries
random.shuffle(entries)
n = len(entries)
train_entries = entries[: int(n * 0.9)]
val_entries = entries[int(n * 0.9):]
# Turn those into strings
train_data = " ".join("{}".format(entry) for entry in train_entries)
val_data = " ".join("{}".format(entry) for entry in val_entries)
# encode with tiktoken gpt2 bpe
enc = tiktoken.get_encoding("gpt2")
train_ids = enc.encode_ordinary(train_data)
val_ids = enc.encode_ordinary(val_data)
print(f"train has {len(train_ids):,} tokens")
print(f"val has {len(val_ids):,} tokens")
# export to bin files
train_ids = np.array(train_ids, dtype=np.uint16)
val_ids = np.array(val_ids, dtype=np.uint16)
train_ids.tofile(os.path.join(os.path.dirname(__file__), "train.bin"))
val_ids.tofile(os.path.join(os.path.dirname(__file__), "val.bin"))

处理好的练习验证集在这儿,能够直接使用。

2.3 练习网络

数据集构建完成后,就能够练习模型了。在代码库根目录,履行下面的指令:

python train.py \
  --dataset=luxun \
--compile=False \
--batch_size=8 \
--dtype=float16

详细练习参数能够检查train.py,包括练习的层数、batch size,练习后端等等。

练习的模型默认保存在out/ckpt.pt。

练习22000次迭代的时分我停止了试验,loss是0.15左右。

2.4 测验模型

测验代码在sample.py,默认提示词为空(start=’\n’)能够经过添加–start=”xxx”来修改提示词:

python sample.py --start="故土"

3. 更多比如

3.1 人工智能

人工智能力。两社丈一多,西辛,是发昏了的成果,但去的四五十岁,死的陈源教授却很不通,我也就不再有了。忍不知道阿Q的名字是怎样写的?这不过是一个问境。他总还拿着四个年的过头放在心里,说道,“哀,遇的。他可
是弯口,道是阿Q;近来现已做了杜师长了,半年的大武人,你还和他对面具汗说:‘十分救命!’‘是情愧 夫子’的学理论矛盾的工人,……并且跳不过是这三秒……。”
 罢了 偶阵线告了一个大问题,拿去做的胶葛,而他们就癖在《试玈书》的第一幅,来由于又是删节的,还和所放的做。不过假如加以细见,不想多写了东�

3.2 文艺复兴

文艺复兴运动,也是指惺把文艺当接受照时代,更易于政治家,我国并不见马上,万分折中心,更何况失了国家,只有拜读之处,这就是政治心软到新舖式的必读书。……”
 咱们──由此满可知道河南的内心眼和理解的点魂灵。我在从前想做以看空无洋,决不叫看情形。由于我想,便能够支持日子的原因,至少,更进一步而到我国来,他们也给了世界上的美�家所指见的最多也并非精微坏,难道看翻译
,可说是不算太多了。
 问题。
 “咱们没有见过这种东西,便怎样办呢?”
 递进句也不是有许多话。
 “能够能够,”四铭吃了点

3.3 新文化

新文化运动,也许由于他们现已有了“力”这句话的职责了。在那里和他们的风化是并不相禁多的。
 阿呼呜呼兮呜呼阿呼,
 八九年
 二、浙江艳七百
 一九二五年十二月三十日风雨之夜示,此地声声流鼓近山腌至责诼谢。
 阿Q的讲到文学说,他们会打断了阿Q的名目退向王的头发,向公司被挤出去了。
 最末的批评,是“没有话派的书,关于政府来往往解释,加以泄除,以政治的运命,至于失败,那却是往往会说,我十分风险。
 小娘枟不用小说的经济字的由校的文章,使是屠戮政府,是凡这些的,但我知道画家共同攻,共同的阅历

假如本文操作中有误的当地,还请专业人士多指出讨论。

本文正在参加 人工智能创作者扶持方案