如果说GPT模型是无敌战舰,那minGPT大概就是一艘还能乘风破浪的小游艇。近日,“史上最大AI模型”GPT-3风靡全球。GPT系列可以说是人工智能领域“暴力美学”的代表作。2018年诞生的GPT拥有1.17亿个参数;2019年的GPT-2有15亿个参数;2020年的GPT-3有1750亿个参数。短短一年时间,GPT模型的参数数量呈指数级增长。在GPT-3发布后不久,OpenAI就向社区开放了商业API,鼓励大家用GPT-3尝试更多的实验。但是,使用API需要一个应用程序,而您的应用程序很可能无处可去。那么,除了使用官方的API,我们还有什么其他的方式可以让我们入门这个“最大的模型”呢?最近,特斯拉人工智能研究负责人、前OpenAI研究科学家AndrejKarpathy进行了尝试。基于PyTorch,他写了一个只有300行左右代码的小型GPT训练库,并命名为minGPT。Karpathy表示,这个minGPT可以进行加法运算和字符级语言建模,准确率还不错。不过在运行demo之后,AndrejKarpathy发现了一个有趣的现象:2层、4个attentionheads、128层的GPT在两位数加法运算中计算出55+45的结果为90,而其他加法运算则没有问题.目前该项目24小时未出现在GitHub上,但star数已突破1000。minGPT项目地址:https://github.com/karpathy/minGPTminGPT:仅用300行代码实现的GPT训练如果说GPT模型是一艘无敌战舰,那么minGPT大概就是一艘还能乘风破浪的小游艇。在项目页面上,Karpathy表示:由于现有可用的GPT实现库有点乱,他在创建minGPT的过程中试图遵循小、简单、可解释性和教育意义的原则。GPT并不是一个复杂的模型,minGPT的实现只有大约300行代码,包括样板文件和一个完全不需要的自定义因果自注意力模块。Karpathy将一系列索引转换为一系列变换器块,从而出现下一个索引的概率分布。剩下的复杂部分是巧妙地处理批处理以提高训练效率。核心minGPT库由两个文件组成:mingpt/model.py和mingpt/trainer.py。前者包含实际的Transformer模型定义,后者是与GPT无关的PyTorch样板,可用于训练模型。一个相关的Jupyternotebook展示了如何使用该库来训练序列模型:play_math.ipynb训练一个专注于加法的GPT;play_char.ipynb将GPT训练为可用于任意文本的字符级语言模型,类似于之前的char-rnn,但使用transformer而不是RNN;play_words.ipynb是BPE(Byte-PairEncoding)版本,目前还没有完成。使用BPE编码器、分布式训练和fp16,此实现可能会复制GPT-1/GPT-2结果,但Karpathy尚未尝试过。至于GPT-3,minGPT可能无法重现,因为GPT-3可能不适合GPU内存并且需要更精细的模型并行化。使用示例Karpathy在minGPT项目中提供了一些使用示例。这些代码非常简单,只是hackinline,而不是“使用”。当前的API如下所示:minGPT是如何实现的?在实现过程中,Karpathy参考了官方的OpenAIGPT项目,以及其他组织的例子。代码OpenAIgpt-2项目提供模型,但不提供训练代码(https://github.com/openai/gpt-2);OpenAI的image-gpt库在其代码中做了一些类似于GPT-3的更改,是一个很好的参考(https://github.com/openai/image-gpt);Huggingface的transformers项目提供了一个语言建模的例子。它功能齐全,但有点难以跟踪。(https://github.com/huggingface/transformers/tree/master/examples/language-modeling)论文+实现笔记此外,项目作者还介绍了相关论文和实现细节。1.GPT-1:《Improving Language Understanding by Generative Pre-Training》论文地址:https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/language_understanding_paper.pdfGPT-1模型大体沿用原文Transformer,一个仅由12层解码器组成的transformer,带有maskedself-attentionheads(768维状态和12个attentionheads)被训练。具体实现细节见下图:2.GPT-2:《Language Models are Unsupervised Multitask Learners》论文地址:https://d4mucfpksywv.cloudfront.net/better-language-models/language_models_are_unsupervised_multitask_learners.pdfGPT-2将LayerNorm移动到每个子模块的输入,类似在预激活残差网络的基础上,在最终的self-attention模块之后增加了额外的一层normalization。此外,该模型还改变了模型初始化(包括残差层初始化权重等),扩展词汇表,将上下文大小从512个token增加到1024个,使用更大的batchsize等。具体实现见下图details:3.GPT-3:《Language Models are Few-Shot Learners》论文地址:https://arxiv.org/pdf/2005.14165.pdfGPT-3使用与GPT-2相同的模型和架??构,不同的是GPT-3交替密集Transformer的每一层都使用了local-band-sparseattentionpatterns,类似于SparseTransformer。具体实现细节如下图所示:AndrejKarpathyAndrejKarpathy是计算机视觉、生成模型和强化学习领域的研究员。博士期间师从斯坦福大学计算机系教授李飞飞。博士期间,他曾两次在谷歌实习,从事Youtube视频的大规模特征学习。此外,他还与李飞飞等人一起设计并教授了斯坦福经典课程CS231n。2016年,Karpathy以研究科学家的身份加入OpenAI。2017年,他加入特斯拉,担任人工智能和自动驾驶视觉总监。如今,Karpathy已晋升为特斯拉人工智能高级总监。他的团队负责特斯拉自动驾驶系统Autopilot的所有神经网络设计,包括数据收集、神经网络训练和在特斯拉定制芯片上的部署。就像在教授CS231n时,Karpathy希望自己业余时间做的minGPT也有一定的教育意义。他的简化得到了很多社区成员的赞赏:除了minGPT本身的讨论,还有人问:是否可以借助社区来训练GPT-3?也就是说,如果在GPU空闲的时候(比如晚上)有成千上万的开发者贡献,最后是不是可以训练出一个1750亿参数的GPT-3?这样的话,大家只需要分摊电费就行了。不过有人指出,这种分布式训练的思路很有意思,但可能会遇到梯度等瓶颈。有人开玩笑说,众筹电费买云服务不是更方便吗?
