Tiny AI stories


这篇文章主要记录笔者作为一个AI菜鸟,在接触有趣或提升生产力的AI工具后的一些体验和感想。那么我们就从 ChatGPT 开始吧!

ChatGPT

22年12月初火起来的ChatGPT让我对NLP和AI重燃起了初识时的兴趣。因此,笔者按照CSDN上的一篇攻略注册成为了ChatGPT的体验用户(虽然花费了10¥,但比某宝上无良商家动辄收几十好多了😏)。在多次测试后,我发现这个模型即使只是出世不久且限时免费,但它已经可以替代部分程序员的工作了。更可怕的是,不管是中文还是英文,只要问题叙述清晰得当,ChatGPT所给出的solution具备相当的可参考性,足以说明其训练数据之多与泛化能力之强。

在完成注册后,我就迫不及待问了几个比较简单的问题,其中英文问题有:How to study machine learningHow to study math in machine learning ;中文问题则是:如何与心爱的女生相处 。不管是学术还是感情问题,ChatGPT给予的回答都可圈可点。在关于如何学习机器学习的回答中,它不仅鼓励人们学习ML,还给出了更详细的建议,如了解机器学习的基础概念,包括训练数据、特征、标签、模型、目标函数、损失函数、优化算法等;掌握常见的机器学习算法,如回归、分类、聚类、降维、推荐、强化学习等,并学会如何应用这些算法解决实际问题;熟悉常用的机器学习工具和框架,如 TensorFlow、PyTorch、scikit-learn 等,并能够使用这些工具完成基本的机器学习任务。在关于如何学习机器学习中的数学中,它认为了解机器学习中使用的数学模型,如线性回归、逻辑回归、神经网络、支持向量机、贝叶斯网络等,同时需要掌握机器学习中常用的数学方法,如梯度下降、牛顿法、拟牛顿法、随机梯度下降、概率密度估计等,还需要学习机器学习中常用的数学算法,如最小二乘法、最小角回归、主成分分析、聚类算法、卡方检验等。而关于情感问题,读者可以自行查阅,不过个人认为它的回答非常romantic 😘

ChatGPT对于编程生产力的提升测试

在测(tiao)试(xi)它几个问题后,我突然灵光一现,把之前写的一个很简单的python输入数组的小功能拿来测试一下,于是问:python输入一维数组的程序 ,而它的回复相当简单有趣:

# 使用 while 循环来接收用户输入
while True:
#     # 使用 input 函数来获取用户输入
    user_input = input("Enter a number (enter 'done' to quit): ")
#     # 如果用户输入了 "done",则退出循环
    if user_input == "done":
        break
#     # 将用户输入的字符串转换为数字,并将其添加到数组中
    my_array.append(int(user_input))

此时我还相当得意,因为我直接用一句 my_array = list(map(int, input().strip().split())) 就完成了。但突然转念一想,我是不是没有把问题说清楚,所以我又输入了一遍:使用python,输入以空格为间隔的一维数组 。此时,它的答案就和我完成的非常接近了:

它的第一种方法是使用 Python 内置的 input() 函数来获取用户输入,并使用 split() 方法将其转换为一个字符串列表,然后使用 map() 函数将字符串列表转换为数字列表:

# 获取用户输入
input_str = input()

# 将字符串转换为列表
input_list = input_str.split()

# 将列表中的字符串转换为数字
input_list = map(int, input_list)

# 打印输入的数组
print(input_list)

它的第二种方法是使用 numpy 库来更方便地处理数组。例如,您可以使用 numpy.array() 函数来将列表转换为数组,然后使用 numpy.split() 函数将数组分割为多个子数组:

import numpy as np

# 获取用户输入
input_str = input()

# 将字符串转换为数字列表
input_list = map(int, input_str.split())

# 将列表转换为数组
input_array = np.array(input_list)

# 将数组分割为多个子数组
subarrays = np.split(input_array, [3, 5])

# 打印分割后的子数组
print(subarrays)

果真,我的猜测没有错。原来不是它太菜了,而是我表述太模糊了 😧 实际上,已经有相当多的开发者来开发调用ChatGPT API的插件和软件了,例如中文版的VSCODE插件已经有过万下载了。事实上,ChatGPT也可以用来辅助学术写作。例如,我们可以像这个视频一样,先复制一段话,在结尾加上一句 Help me to paraphrase this paragraph more academically (关于使用ChatGPT来进行论文写作实在是争议多多,someone甚至可以取巧の问论文模板,再把模板填好内容问它)。最后,使用ChatGPT对于他自己的评价来结尾:ChatGPT是由 OpenAI 开发的一种大型自然语言生成模型。它是在 GPT-3 模型的基础上进行改进,旨在更好地处理聊天对话场景中的语言生成任务。我认为 ChatGPT 是一个非常有意义的模型,它拥有更强大的语言理解能力,能够更加自然地与人类进行对话。它可以应用于聊天机器人、翻译系统、问答系统等领域,为人类提供更好的交流和服务。同时,我也认为 ChatGPT 需要进一步改进,例如在语言表达能力、情感理解能力和语境处理能力方面进行增强,使得它能更好地适应复杂的自然语言场景。

你若诚心发问,ChatGPT will fix EVERYTHING

前几天在测试GPT的design&degug时着实让我惊叹不已。起因是一个平平无奇的AI assignment,其中一题是老师要求使用四种模型,分别是RNN,LSTM,CNN和FNN,来处理一个EEG时序数据集。费了好几个小时终于从网上缝缝补补写了个过得去的LSTM后,突发奇想要是用ChatGPT来搞一个end2end的训练会是怎样。于是乎,直接使用OPENAI很早之前更新的Advanced Data Analysis,上传目标数据集(目前只试了直接上传数据集文件但未在大数据集上尝试过),然后加上相关叙述和一些常用的指令:

As an AI model designer and ML master, you should use a deep neural network to do time series classification. The uploaded dataset is from http://archive.ics.uci.edu/dataset/264/eeg+eye+state. Task: Please use Recurrent Neural Network (including standard RNN and LSTM ), Convolutional Neural Network, Feedforward Neural Network in pytorch to do classification and compare their performance.

它的答案会先分析上传的文件,而后输入时你需要表明 You should design well-structured Pytorch codes and show them to me. It’s okay that I can run it on my machine. 这里需要提出两个点,一个是你需要使用Pytorch来设计模型,其次就是你可以在local machine跑代码,不然GPT4在生成代码时常常会因为Pytorch或TF库无法正常工作而报错。而后,他会逐步生成4个model和traning,testing modules。其中traning和testing modules如下:

# traning phase相当naive,缺失了很多tricks,比如Gradient clipping,Learning rate scheduling等,需自己补足
def train_model(model, train_loader, criterion, optimizer, num_epochs=10):
    model.train()
    for epoch in range(num_epochs):
        for i, (x_batch, y_batch) in enumerate(train_loader):
            x_batch, y_batch = x_batch.to(device), y_batch.to(device)
            optimizer.zero_grad()
            outputs = model(x_batch)
            loss = criterion(outputs, y_batch)
            loss.backward()
            optimizer.step()

def evaluate_model(model, test_loader):
    model.eval()
    correct = 0
    total = 0
    with torch.no_grad():
        for x_batch, y_batch in test_loader:
            x_batch, y_batch = x_batch.to(device), y_batch.to(device)
            outputs = model(x_batch)
            _, predicted = torch.max(outputs.data, 1)
            total += y_batch.size(0)
            correct += (predicted == y_batch).sum().item()
    return 100 * correct / total

其他生成整合步骤暂且不提,还有一个惊艳的点就是使用它自己生成的代码来debug是可以准确定位问题,比debug时自己输出layer output简单多了。例如我在使用他提供的LSTM model时遇到了RuntimeError: For unbatched 2-D input, hx should also be 2-D but got 3-D tensor" in "train_model(rnn_model, train_loader, test_loader, criterion, ptimizer)和输入维度不匹配的问题。如果是平时的话肯定看每个layer来debug,但是如果直接输入bug后他可以非常快地定位问题。而当发生改了一次又出现之前的错误时,可以使用 Now there is a previous error: “RuntimeError: For unbatched 2-D input, hx should also be 2-D but got 3-D tensor”. Please go deeper into the codes and help me fix them! 我们可以要求GPT go deeper去解决问题。在解决完code的问题后,我们甚至可以要求它根据自己写的代码来写一篇brief academic thesis (Can you write a brief academic report explaining the four models and why there is a big difference in processing the multivariate, sequential, and time-series dataset “EEG Eye State.arff”?)。


Author: Minster
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Minster !
  TOC