这个话题超出了大多数人的理解范围。
步骤如下:
- 首先,让它伪装成Ubuntu 18.04,并告知它你已经安装了Python 3.9、Pytorch 1.8、CUDA 11.3以及训练Pytorch模型所需的其他库。
让ChatGPT假装成Linux终端,这种梗在国外讨论过。这里我们需要让它额外安装(让它自己认为安装了)Python、Pytorch和CUDA。接下来的指令用{}来表示告诉它的信息,而不带{}的部分则是Linux指令。
在这里,我让它想象自己拥有四块英伟达3090显卡,然后执行nvidia-smi命令,结果它真的成功显示了四块显卡的信息!
- 接下来,让它在当前目录生成一个train.py文件,填入训练一个四层Pytorch模型所需的定义和训练代码。
我特地用{}告诉它在当前目录生成一个train.py,并要求它用Python和Pytorch编写一个四层神经网络的定义,此外还需要加载MNIST数据集的dataloader,并附上相应的训练代码,同时告诉它你有能力成功在MNIST上训练这个网络。
此时,它告诉我写好了一个四层网络,可以执行python3 train.py来查看输出,这里我先悄悄查看了一下train.py的内容。
- 最后,让它执行命令
python3 train.py
。
此时,它默认训练了10个Epoch,并开始训练。最重要的是,告诉它不要显示train.py的内容,因为ChatGPT的输出有字数限制。
当然,我还提醒它修改训练参数,可以多次训练,并利用上所有虚拟的GPU资源!
值得一提的是,ChatGPT智能地跳过了中间98个Epoch的输出!
为了验证ChatGPT是否真的执行了模型的forward函数,我在forward定义中加入了print语句,以打印输入数据的shape。这次使用一个5层的神经网络在CIFAR-10上进行训练,并要求在forward中添加一个打印shape的操作,且在训练过程中只打印一次。
训练开始时,确实在训练过程中只打印了一次输入的shape,同时训练的loss下降和test accuracy看起来也相当真实。
查看生成的代码发现,forward函数里面确实插入了打印shape的命令。值得注意的是,训练过程中forward会被频繁调用,而ChatGPT为何可以只打印一次而不需要增加计数器?我推测,ChatGPT可能使用了辅助提示/注释“只打印输入shape一次”,因此实现了这个效果。细心观察可以发现,print操作与后面的out=self.layer1(x)之间空了一行,这样做的目的是确保print命令只执行一次(这可算是个小机灵)。
令人困惑的是,print语句中的文字(”shape of input is”)与实际执行输出(”shape of input passed through the network is”)之间存在几个字的差异,这让我感到迷惑不解!
另外,我发现ChatGPT的互动机制是保持一个对话session,该session可能随时被服务器关闭(例如当服务器资源不足时)。为了提高用户体验,当前对话再次新建session时,系统会将之前的对话(用户发出的请求)一次性发送给ChatGPT,以重建上下文学习环境,这样用户就不会意识到掉线后ChatGPT忘记了之前的对话。这一点在让ChatGPT伪装成Linux时掉线时更加明显。
总结
关于ChatGPT伪装成Linux并训练神经网络的机制,可以分析为以下几种可能性:
- ChatGPT可能已经阅览了绝大多数开源项目,包括Linux和Pytorch,它理解Linux系统的行为,以及Pytorch的基础知识。这可理解为,ChatGPT是一种所有软件的“超集”,可以执行神经网络计算,包括卷积、矩阵乘法等。国外某些用户让它执行卷积操作并得到了正确的结果,这说明在其网络里,ChatGPT可以进行卷积计算,并且网络规模越大,其能力越强。
- 另一个可能性是,ChatGPT并没有真正执行神经网络的训练,它只是看过很多输入输出,帮助其理解训练参数、网络结构与输出之间的关系,最终模拟输出结果。
- 更让人费解的是,或许ChatGPT已经找到了神经网络各算子的最优解法,能够迅速计算结果。这样的计算方式不再是传统形式,类似于梯度求解这样的高计算量操作,它是否找到了人类尚未掌握的解法?