首先给出答案:可以,但不完全可以。
这是我尝试之后的答案。可以是因为经过尝试确实可以在grasshopper中实现训练并部署人工智能,但不完全可以是因为grasshopper的程序构架对于人工智能的支持并不友好。
人工智能在GH中的表现
(左侧为AI对图片的分类,右侧表示该分类是否正确)
1.本次的尝试,用GH实现一个识别猫的人工智能
说到grasshopper,我们都知道这是一个可视化编程的平台,提供了很友好的界面,可以帮助用户快速的处理一些重复的工作。
可是grasshopper的参数化离人工智能有多远呢?这里的人工智能是指以深度学习(Deep Learning)神经网络为代表的复杂模型下的人工智能。
我们今天就做一个在grasshopper训练并部署一个人工智能的尝试,一个识别猫的人工智能。
如果能成功,那么理论上在深度学习框架下的各种成熟的ai就都可以通过grasshopper这个友好的界面部署在设计工作中,这意味着设计师可以在grasshopper中调用各种人工智能领域最新的成果,可以部署比如说识别不同的设计风格,推测下一步设计动作等等一系列能改变当前设计模式的人工智能技术。
2.实现人工智能的深度学习模型
2.1二分类(binary classification)
想要实现一个识别猫的图片的人工智能,实际上是一个典型的二分类(binary classification)问题。
例如假如你有一张图片作为输入,比如这只猫,如果识别这张图片为猫,则输出标签1作为结果;反之则,输出标签0作为结果。如下图示:
二分类的典型例子
资料来源:Deep Learning Specialization,Andrew NG
接着我们来看看一张图片在计算机中是如何表示的,为了保存一张图片,需要保存三个矩阵,分别对应图片中的红、绿、蓝三种颜色通道,如果你的图片大小为64×64像素,那么你就有三个规模为64×64的矩阵,分别对应图片中红、绿、蓝三种像素的强度值。
图片存储的形式(RGB三通道为例)
资料来源:Deep Learning Specialization,Andrew NG
如果把这些像素值放进一个总的特征向量,我们就能得到一个维度为分辨率*颜色通道的特征向量,在这个例子中是一个12,288(64*64*3)维的向量。
所以在二分类问题中,我们的目标就是习得一个分类器,它以图片的特征向量x作为输入,然后预测输出结果y为1还是0,也就是预测图片中是否有猫:
特征向量与预测输出的关系
资料来源:Deep Learning Specialization,Andrew NG
2.2逻辑回归(Logistic Regression)
换句话说,我们想要一个算法能够输出预测一个值y^,它是我们对实际值y的估计,并且我们希望y^与y的差距越小越好,越小意味着我们的预测结果与实际结果越接近。
首先我们可以用逻辑回归(Logistic Regression)来构造一个单层的神经网络,我们可以用来w表示逻辑回归的参数,这也是一个n维向量(因为实际上是特征权重,n维度与特征向量x相同),参数里面还有b,来表示偏差z。
由于最后的输出值我们希望是一个0到1的值,所以我们可以再套一个sigmoid函数,来将z的输出值映射到0到1的区间得到y^。
grasshopper中实现的Sigmoid函数
y^输出与Sigmoid的函数图像
资料来源:Deep Learning Specialization,Andrew NG
整理后,我们可以得到一个计算框架图:
神经网络的计算框架
资料来源:Deep Learning Specialization,Andrew NG
2.3梯度下降(Gradient Descent)
既然我们已经能得到我们的神经网络对于结果的预测y^,那么下一步就是求出y^的预测与真实值y的差距,并且希望它尽量的小。我们可以构造一个损失函数(Loss function)来描述y^与y的差距:
紧接着对于训练集中多个样本的损失函数进行一个加权平均,得到总的代价函数(Cost function):
然后用这个代价函数J(w,b)对于w,b求导,再根据w,b的导数,调整w,b,再不断重复这个过程。这样代价函数就能一步一步的调整到更小的位置,其中每一步走的步长就是学习率(learning rate)。
就像是从山顶下山,每一步都朝着更低的方向走,步数多了,总能下到一个足够低的地方。
梯度下降的典型图示
资料来源:Deep Learning Specialization,Andrew NG
3.在grasshopper中的实现,以及会遇到的问题
说了这么多理论,终于说到在grasshopper中实现的部分了。其实从程序的角度看,就只有三件事:
1.初始化模型,2.模型优化,3.部署模型并评估结果
首先,我们从最简单的部署模型入手,根据深度学习的数学模型原理,在grasshopper中构造出这个预测函数,让gh能根据训练好的ai参数(w,b)给出对于图片是否是猫的预测判断。
gh中的预测函数
其次,我们需要构造一个人工智能模型优化的grasshopper电池。
原本我希望用grasshopper原生电池来实现这个功能,但是由于grasshopper本身程序构架的问题,算第一步的对应相乘(矩阵的点积)就要1.3分钟(78秒)。
gh的友好界面所需的程序构架,导致gh的运算性能非常拉胯
这比直接调用CPU计算相同的任务要慢上万倍。于是我选择退而求其次,用CPython电池直接调用CPU实现深度学习模型的优化运算。如果调用GPU运算速度还能再提高上千倍。
处理相同的运算时,CPU的运算性能是gh的上万倍
处理相同的运算时,GPU(3090)的运算性能又是CPU的上千倍
由于模型优化是一个典型的循环结构,而grasshopper原生是无法实现这样的循环的,所以我们需要对于grasshopper做一些非常规操作。
gh原生不支持循环的操作
我们用一个c#电池(transfer data)来接管这个gh文档,将一轮优化完的w,b传输到c#电池,再由这个c#电池将收到的信息发送给优化前的w,b,这样我们就能构造一个循环结构。
蓝色为C#电池(transfer data)实现的数据传递路线
聪明的读者可能已经发现了此时的问题。由于此时数据是不断循环流动的,所以grasshopper理论上会一直卡在运算过程中的,这不是我们想要的效果。
不过好在此时贴心的grasshopper会爆出一个提示,告诉你出现了一个死循环,问你是不是只运行一次这个循环,选是就可以了(当然理论上你也只能选是,因为选否会紧接着再弹出一个同样的提示)。这样c#电池(transfer data)就会只运行一次就停止。
但是由于训练一个神经网络需要成千上万次可控的循环,所以我们需要再新建一个c#电池(loop counter)来输出一个变化的值,用timer控制其更新,而其结果的更新会导致连接它输出的c#电池(transfer data)的更新,从而让CPython的核心优化电池的进行一次运算(这一系列操作牵扯到GH底层的更新机制,以后可以展开讲)。
这系列的更新构成对于ai的一轮训练。
C#电池控制下的GH电池组的更新顺序
至此,我们就得到了一个能用来做人工智能模型优化的grasshopper电池组。
最后,我们构造一个初始化模型参数的电池,由于w,b的数据是需要被c#电池(transfer data)不断更新的,所以我们无法用连接电池的方式将数据传给w,b。
那么我们可以依照之前c#电池(transfer data)的技术路线,做一个c#电池(inti wb),同样接管这个gh文档,将初始化的数据发送给w,b就可以了。
隔空初始化w,b的参数
至此,终于我们构造完了所有神经网络的模块,也就是说:
我们成功在grasshopper上实现了一个人工智能!
4.最终效果
4.1训练ai模型
我们先点击初始化模型的开关来初始化模型,之后点击timer就可以开始我们的训练了。
神经网络的训练过程,可以看到准确度不断的爬坡
我们可以看到开始训练之后神经网络的损失函数在不断的降低,这意味着ai的预测值y^与实际的值y在不断逼近,同时ai的准确度也在快速的爬坡上升!
在大约40轮训练之后(出于时间开销的考虑我在CPython电池中设置了一轮训练优化10次,一轮训练大约耗时1秒),也就是我们的ai在经过了400次小步慢跑的梯度下降之后,就能达到90%的识别准确率了!
4.2部署ai模型并评估结果
我们在训练完200轮(也就是2000次梯度下降)之后,将训练好的w,b的数据输入预测函数,就可以把神经网络部署在grasshopper中了。
在gh中部署的预测函数,将ai的判断输出到图片左下
启动我们的c#电池作为计数更新器,就可以看到这个人工智能的表现了。
人工智能部署后的运行效果
人工智能对于学习过的样本基本全对。对于测试集的正确率70%,尽管有些过拟合的情况出现。但平心而论,ai在学习某些特定领域时确实比人快的多。
5.总结
尽管这是一个很简单的人工智能,但它证实了:
grasshopper是可以实现人工智能的!
尽管实现中遇到的困难也有很多,尤其在算力以及循环这两个问题上。
关于算力,grasshopper提供了非常友好的互交方式,不过背后的代价就是成千上万倍惊人的算力折扣,在部署模型的环节还能勉强应付。但是在训练人工智能的环节与python平台好几个数量级的速度差距,基本就排除了GH原生条件下训练模型的可能性。
换句话说,grasshopper程序构架所能提供的算力上限不足以支持大多数运算密集型的算法(包括人工智能的训练在内)。然而不幸的是,绝大多数面向未来的新技术都是依托于算力以及大数据的。那么如果想把计算机科学发展的新成果通过GH应用到设计中,那就需要我们能把一些运算密集型的任务从GH中拆分开来,交给合适的运算器或者云端。
关于循环,grasshopper是支持循环的,但是默认不开放给用户,需要一些技术门槛很高的特殊操作才能调用。这就让实现人工智能在grasshopper与在python中相比,要来的更难且更慢。
所以,我认为人工智能介入设计师工作的合适技术路线是:将在本地或者云端训练好的人工智能(Pre-Trained Model),部署在grasshopper上被设计师用起来。
而这个未来应该不远了,让我们共同努力!
grasshopper文档截图
参考文献:
1.Deep Learning Specialization,Andrew NG,https://www.coursera.org/specializations/deep-learning
2.吴恩达深度学习笔记,http://www.ai-start.com/dl2017/
11.11,YJK-GAMA公测开启
加入QQ群,您有机会成为我们
首批尊贵用户
转自:非解构-公众号
转自:非解构-公众号