人工智能学会在20秒内成倍增长
如今,人工智能正在完成曾经被认为是人类无法胜任的任务。 从检测视网膜病变的眼睛到威胁生命的肿瘤,AI很快就可以处理所有复杂任务。
今天,我们走下坡路,看看AI如何完成现代计算机最简单的任务之一:乘法。
> Stock Image by Canva.com
在本文中,我们将尝试讲授机器学习模型以进行乘法运算并观察其性能。 帖子将以最少的代码(精确到14行)朝着ML的初学者侧倾斜。
免责声明:在现实生活中,您永远不会希望ML算法为您执行乘法。 这篇文章仅引导您完成一个实验,尝试建立一个执行算术的机器学习模型。 让我们开始吧。
我们的目标是开发一个模型,该模型将整数作为输入并给出输出乘以某个数字的输入,让我们将此数字设为5。因此,如果输入10作为输入,则必须 期望输出50。 确实知道我们不会告诉模型我们正在寻找的任务是一个简单的乘法; 它必须自己解决。
> Image by Author
我们的第一项工作是通过查看模型来创建示例数据集,模型可以了解我们正在寻找的任务是乘以5。我们将使用1k至300之间的10k个随机生成的数据点。因此,我们有10k个输入 数据点[20,120 ….. 5,15]和10k输出数据点[100,600 ….. 25,75],即输入点乘以5。Python中相同的代码如下。
import random
X=[]
Y=[]
for i in range(10000):
n = random.randint(0,300)
X.Append(n)
Y.append(n*5)
#X is the input array and Y is the output array
答对了! 我们已经准备好数据集。 现在,让我们设计一个可以学习任务的神经网络。 基本的教科书ANN设计看起来像下面的图(图1),其中有许多隐藏层和许多神经元,但这是用于诸如数字分类之类的复杂任务的。 对于我们的简单乘法任务,仅具有一个隐藏层和一个隐藏神经元的简单神经网络可能就可以工作。
> Image by Author
让我们在图2中编写该架构的代码,看看该模型是否可以学习乘以5。我们在Tensorflow之上使用Keras(高级ML库)。 我们了解到,我们试图构建的架构是一个简单的顺序网络。 我们添加一个带有一个神经元的密集层,这将是我们的隐藏层,然后再添加一个带有一个神经元的层,它将保留我们的输出答案。 我们对所有神经元使用" relu"优化功能。
我们使用均方误差来查看模型预测和每个步骤的真实情况之间的误差,并使用" Adam"优化器优化损失。 启用"指标"参数后,它会显示训练过程中模型的统计信息。 设置好架构,现在该模型就可以学习了。 我们最终使用model.fit()函数,其中模型试图理解输入和输出之间的关系。
我们传递输入(X),输出(Y),批大小:重置模型权重和偏差之前要查看的数据点数,验证分割:用于验证和时期的数据集的比例:模型经过的次数 通过整个集合。
from keras.models import Sequential
#using Keras Library
model=Sequential()
model.add(Dense(1,activation='relu',input_shape=(1,)))
model.add(Dense(1,activation='relu'))
model.compile(loss='MSE', optimizer='adam', metrics=['accuracy'])
model.fit(X, Y, batch_size=50, validation_split=0.1,
epochs=100, verbose=1,shuffle=1)
让我们看一下训练模型时打印的一些统计数据。
#From 10k samples, since validation_split=0.1, we trrain on 0.9*10k i.e. 9k samples.After First iteration
Epoch 1/1009000/9000 [==============================] - 1s 148us/step - loss: 625973.1757 - acc: 0.0038 - val_loss: 577468.6391 - val_acc: 0.0020After 74th iteration
Epoch 74/1009000/9000 [==============================] - 0s 24us/step - loss: 0.0723 - acc: 0.9583 - val_loss: 0.0595 - val_acc: 1.0000
看一下第1步和第74步之间的精度差异。 开始时的准确度为0.0038或0.38%,这表明模型不知道开始时输入和输出之间的关系是什么。 一开始的损失也是巨大的。 随着训练的继续,模型开始具有数据意义,并且准确性提高,并且损失(错误)减少。
在执行第74步之后,该模型的准确度为0.9583或95.83%,即能够以95.83%的确信度判断该任务是乘以5。我们可以看到,验证损失在74内也从0.20%提高到100% 迭代。 经过100次迭代后,训练精度(acc)和验证精度(val_acc)均达到100%,表明我们的模型成功发现该关系乘以5。
在配备16 GB RAM的NVidia 940 MX 4 GB GPU上,训练过程大约需要20秒才能完成100次迭代。 确实,这是快速的学习。
最后,该测试我们的模型了。 让我们在test_array中获取任何五个数字,并使用上面构建的模型来获取预测。 理想情况下,输出应为test_array元素乘以5。
test_array=np.array([4,27,100,121,9])
print(model.predict([test_array]))
做出最终预测的时间。
[[19.9995174407959], [134.9995880126953], [499.9997253417969], [604.9998168945312], [44.99952697753906]]
我们看到我们的模型几乎就在那里。 实际值为[20,135,500,605,45],如果将预测四舍五入到小数点后两位,我们将看到预测与预期结果相同。
> Canva.com
这样就可以了,一个简单的AI现在已经学习了乘法。 但是,要考虑:尝试给定负值并检查输出,您会得到什么? 我想让您尝试,试验并提出使算法更准确的技术。 另外,尝试更改体系结构,例如添加更多的层和神经元,并查看指标的差异。 如果您有任何疑问,请在评论中让我知道。
我希望您喜欢这篇文章,并幻想构建一个AI,该AI被编程为执行非常简单的乘法任务。 下次见。
(本文翻译自Nemath Ahmed的文章《AI Learns to Multiply in 20 Seconds》,参考:
https://towardsdatascience.com/ai-learns-to-multiply-ce844c68aefe)