本篇内容依然不少,而且也是理论+实践。会谈到这么几个部分:
首先需要请各位朋友做好准备,接下来的文章内容会涉及到部分类似y=ax+b这种初中代数知识,不过也仅限于此,请安心服用。那么开始。
这个词在建筑领域是一个非常神奇的存在,就如同多年前的“参数化”一样,它也曾经(或许现在仍然)是一个大家都在说,但是却大家都不太知道到底是个啥的词儿。和参数化不同的是,“非线性建筑”这个词实际上是个毫无意义的表达,而不仅仅只是误读而已。且听我说。
这个词本来是从数学领域借来的,有“非线性”(non-linear),那自然就得有“线性”(linear)。这里头能很明显地发现他们的词根都是“line”,那line是啥?熟悉Grasshopper运算器的朋友肯定会想起来line和crv的区别,没错,line是直线,只需要用两个控制点描述的那种。用数学语言描述就是y=ax+b。它的特点是x和y脑袋上都没有幂次。
提到线性函数y=ax+b了,我们一起来回忆一下,那是一堂中学的数学课……
收。y=ax+b这件事情里面,x和y叫做变量,a和b叫做参数。这两个参数定义了这个函数。(就如同“层高”这一个参数定义了一栋被参数化好的建筑一样。)参数变了,函数/建筑就会跟着变,进而函数/建筑所具有的特性也会跟着变。复习完毕。
在最单纯狭义的层面上理解时候,“线性”就是“直的”,“非线性”就是“弯的”。(当然,还有很多广义的引申和拓展之后的所指,后文会提到。)
那是不是说“非线性建筑”其实就是在说“弯的建筑”呢?显然不是。
我们都知道数学是一门很神奇的学科,除了大佬们的智力游戏那部分之外,个人认为它最有魅力的一个部分之一,就是可以用一些运算符号把自然现象中的某些规律抽象出来。
比如”获得“的抽象:加法。我没有苹果,获得了一个,于是我现在有0+1=1个苹果了。
比如”出租车计费方式“的抽象:线性方程。有一个出租车计价器的计价规则是:”起价10块钱,每公里2.2元。抽象成函数就是,车费=2.2里程+10。因为这个函数画出来是一根直线。我们就可以说当里程在5公里以上时,“总里程数”与“总车费”之间呈线性关系。
比如抛物线的抽象:圆锥曲线方程“y=ax²+bx+c”这种方程竟然可以用来描述抛物线。(这里就不展开了,但这个方程的图像画出来变成了一根曲线,所以“抛物线”问题里的“x轴位移”和“y轴位移”两个变量之间的关系,就可以叫做“非线性关系”了。
笔者注:此处为非数学专业的野生选手主观臆断,不可作准,如果有数学大佬请一定指点。
简单的非线性关系可以只是一条抛物线,但也有非常复杂的。比如说“每年全球的碳排放量”和“本年度全球平均气温与上个年度之差”,此两个数据的关系,不出意外的话,凭人类的能力目前大概还找不到精确描述这俩数字之间的关系的那个函数式。但我们清楚地知道一件事情:这个函数式如果真的写出来了,它的图像也不会是一条直线。所以这个问题也属于非线性问题。
那这么看,小到抛物线,大到全球气候,岂不是世界上基本所有的问题都是非线性问题了……这样的话这个词好像就没啥用了。所以,后来它的词义被引申了,广义上专门指那种我们无法精确用数学方式去描述的“复杂问题”。这种语境下,非线性这个词变成了一个不是那么严谨的引申比喻,指足够复杂的问题。
说回到建筑领域,最初在建筑领域里面使用“非线性”这个词的人已经不可考了,但是我猜有五成可能性(另外五成是故意为了让别人不明觉厉而不说人话。),他想要表示的是“场地条件和建筑方案之间的关系是很复杂的”这件事情。也就是说,在做建筑设计的时候,每个输入条件,和每个输出条件之间的关系,是很复杂多变的,绝不是单纯而且明晰的。
那么说到这里各位是不是有点意识到了什么……如果非线性的定义是这个的话,那所有的建筑设计不都是非线性的设计吗?没错,就是这样。而且非常显而易见,上文所举例的那个塔楼的得房率问题,不论设计方案是什么形状的,解决它的思路都是类似的——这个问题和设计的形式风格关系并不大,并没有因为用了自由曲线的形式,决策的复杂性就变低了(或者高了)。
最后,其实还有第三种可能的解释:非线性只是一个比喻,用于说明我们可以做比以前更复杂的设计了。表达的是一个量变,而不是质变。
因为我们的设计技术和建造技术发展了,所以我们现在可以用更强大的计算机,来统合更复杂的场地条件。以前似乎只能在人脑的“黑箱”之中做的很多博弈取舍,非线性决策,似乎都可以用程序来解决了~ 于是人脑可以腾出时间,去考虑更高层级的东西。所以这个观点上说的“非线性”,实际上,是“更非线性”。它只是一个程度上的改变,而不是从“线性”变到了“非线性”的质变。不过遗憾的是,这个量变其实并不成立。因为在建筑设计这个行为中,这种人类把复杂博弈决策问题丢给计算机的尝试,从根本逻辑上就是有问题的。具体我们会在后面针对参数化的反思中细聊。
注:经过评论区大佬提醒,本篇后半段对“回归”的论述可能稍有晦涩,以及非必要地深入到了原理层面。如果读者对其底层原理或机器学习入门并无兴趣,请仅参考本文前半篇内容。
这又是一个数学领域的词,常见的提法应该是“回归分析”(这回解释起来容易一点,因为咱们建筑领域并没有把这个词借过来用,也就没有误会。)做出“回归分析”这个动作的目的,是试图找出一种定量的规律,得到一个如上文所说的那种的函数式。也就等同于把一个自然规律抽象用数学语言概括了出来。那么有了这个函数式,我们以后就可以用它来解决其他类似的、符合这个规则模式的问题。
还记得第一部分提到的y=ax+b这个函数吗,只要ab的取值变化,可以用来描述一切xy坐标平面上的直线,所以关键就是这个ab。那么如果我们猜测一个问题里面的x和y之间的关系成线性,我们就会用这个函数去尝试套它,然后求解出相应的ab,这个求解ab的过程,也就是回归的过程。
上文有个y=2.2(x-5)+10的例子,不知道各位是否还记得。这个问题我们换一个思路,如果说我上了出租车之后,师傅不告诉我具体的计价规则,而是说“你自己研究吧”,然后就开始开车了。那么比如我前后一共坐了9次车,记下来了里程数和车费,然后画到了一张纸上,看起来是这样子的:
有没有感觉到我们人类的大脑很nb,好像一眼就看出来规律了~
明显是分成了两段直线,所以我们尝试把这两条线画出来,然后写出各自的方程,这个神秘的出租车计价规则就被我们找到了。
但是光找到还不足以让我们安心,下次打车的时候我们把这张纸打印出来了,然后为了求证死盯着计价器,每次出租车计价器数字变动,我们都马上记下来当时的里程与价格。最后发现记下来所有的点画在这张图上,都落在了我们的红线之上。
于是,我们宣布,找到了“出租车里程与车费之间关系的终极真理。”以后只要知道里程,哪怕是1249853公里这样子的奇葩数字,只要我们掌握了这个“真理”,就可以一秒钟算出最终的车费。
各位是否有发现,上面这个例子里面,最关键的步骤其实是那个“一眼就看出来规律”这个瞬间。在这个瞬间,大脑帮我们做的事情,就是“回归分析”:只有寥寥的几个点,但已经足够让我们的大脑瞬间总结出其暗含的规律了。进而就可以找到符合这个规律的参数ab,然后把上面的函数写出来。
可现实中的问题却都不是像出租车计价规则这么简单明了的,比如“房子的面积”和“每平方米的价格”之间的关系,画出来显然不太可能是一条直线,便属于非线性问题了。肯定不能每次都依靠自己目视的方法,去“看”出规律。如果能够用量化的方式来做这件事情,就可以全权交给电脑了~怎么能够用数学的方法去做这件事情呢?方法论是这样的:
先写一个“元方程”,留出一些未知数的参数,把一切可能性都包含进去。(就好像y=ax+b,通过留出未知的ab两个参数,这个函数就包含了xy平面上一切直线的可能性)
通过一些已知的x和y的对应组合(样本)去尝试解出这个方程里面的参数来。顺便验证它的有效性。
最后,得到一个能 (近似)描述变量之间关系的方程。
一旦有了这个方程,就等于掌握了这俩参数之间的规律,给一个x,就能直接算出一个y来,反过来也行。非线性问题呢,只不过就是方程复杂一点,参数多一点罢了。
所以这里头唯一的问题,就是到底怎么求出方程里的那些参数来。因为现实问题中很多时候样本只是近似地分布在那根曲线周围,而不是精确地就在曲线上(如下图),所以不是每次都能用解方程组的技能得出答案。
如此面对如此放飞自我的样本,我们的任务,也不是找到误差为0的那个曲线,而是找到足够近似的那一条就可以了(比如图中的蓝或绿线)。
到这里,熟悉遗传的朋友是不是感觉DNA动了?没错,在一个包含了天文数字可能性的“元方程”中,尝试各种参数的组合,最后选出近似最优解这件事儿,可以用遗传算法去做。不过做回归的时候更常用的算法叫“梯度下降”。和遗传算法的作用很象,都是不断地尝试各种参数的组合,然后快速逼近最优解。
这里不做太多展开,不过这部分内容可以作为机器学习入门的铺垫。如果看到这里各位还没晕,可以简略了解一下:深度神经网络的训练也是一样的东西。
深度神经网络可以理解成是一个超级复杂的函数,复杂到了几乎有能力拟合一切形态的曲线/曲面/或更高维度的曲XX。它有老多老多的参数,通过不断尝试各种参数的组合,最后得到一个能够比较好地适配已有样本的近似“最优参数组合”的过程,就是回归的过程,也就是神经网络的“训练”过程。训练的结果就是一组近似最优解的参数(如通上面坡儿例子里面的a=1 b=0),参数定了,这个函数也就确定了。从这个角度上看神经网络就等效于一个“足够复杂以至于几乎可以拟合一切非线性形状规律的函数”。所以训练神经网络的过程,本质上和我们用遗传算法优化一个建筑方案或者做一次回归,是等效的。
“非线性回归”和我们建筑领域有啥关系?有一个相当实用的例子,就是描绘地形。
里面各位会找到三个文件,一个rhino一个gh不用说了,那个看起来很可疑的luchbox开头的文件是一个gh插件,里面包含了非线性回归的电池。如果没有请先安装那个。这个和之前的遗传算法那篇的案例不同,稍有复杂,所以我更推荐各位直接打开笔者提供的文件,边看边研究。
那么正式开始介绍这个案例。现在我们要做的事情是:用一些高程点快速生成顺滑的地形。
1,先写一个“元函数”,留出一些未知数(参数),把一切可能性都包含进去。
2,通过一些已知的x和y的对应组合(样本)去尝试解出这个方程里面的未知数(参数)来。
3,最后,得到一个能描述变量之间关系的函数。
显然我们需要做的事情是,用这些离散状不连续的零星高程点,通过回归,来找到能近似描绘这些点之间关系的那个函数式。理想状态下,当我们找到了那个函数式之后,随便给一个高度未定的点a(只定了平面位置),哪怕它不在我们现有的那些高程点的附近,这个方程也会给我们一个结果,告诉我们这个点a的高度应该是多少——这个高度,就是依靠回归之后的方程算出来的。如果我们的回归成功了,得到的那个方程描述的,应该就是一个近似经过所有样本点的顺滑曲面,它给我们的a点高度,也就是把a点放在这个面儿上的时候,它的高度。
于是,我们就可以用很密的密度取很多个点(一个方阵),最后每个点都让方程告诉我们它应该多高,最后,用这些点来生成一个顺滑的曲面,补足这些离散点之间的空白部分。
那么我们需要思考的第一个问题就是:在这个问题里,自变量(输入)和因变量(输出)各自都是什么?
很显然,经过上面的描述,我们最后希望的效果,是给回归之后的方程一个xy坐标,然后它告诉我们对应的z坐标。于是输入就是“点的平面位置xy坐标”,输出则是“点的高度z坐标”。便如下图所示。
这里的“inputs”和“outputs”都是样本数据。inputs就是自变量,代表我们期望它回归好之后帮我解决问题的时候,我们会给他输入的已知条件(这个问题里也就是xy坐标);outputs则是因变量,代表它拿到已知条件之后,我们期望它给我们的结果,这个问题里也就是z高度。(之所以区分输入和输出,是因为有时候每组输入和输出的数据个数不同,比如我们的这个例子里,输入是x坐标和y坐标两个数字,输出则只有z一个数字。)
这里面的Sigma和Complex分别是预测方程的“阶数”和“复杂度”。(这个我没核实过不敢瞎说,暂且理解成咱们上文所说的“元方程”的复杂程度即可,阶数越多,复杂度越高,这个方程就有更大描述复杂规律的潜力。在我们的例子里,就是那个曲面上的折皱可以更多。)但同时它的参数个数也会相应增多,所带来的,自然是更加难以快速找到最优解组合。这个大家可以随便修改着看看效果。
那么,如果一切顺利,这个电池已经通过样本高程点的xy坐标和z坐标找到了隐藏在其中的神秘规律,我给他从test输入方阵点的xy坐标,它应该就会在Result给我输出它通过这个神秘规律所预测的对应的z高度。来把仿真点的xy坐标输入到test接口。
然后我们尝试把它从右侧输出的这个z高度(Result)赋予之前的方阵点,嗒哒~
得到了一个近似经过每个高程点的顺滑密集3d点阵。说明这个非线性回归电池成功完成了它的任务:从样本中“学习”到规律,然后用这个规律,去把样本之间的空白补上。
当给定了一些高程点,要做地形的时候,还有一个传统方法:直接画一个边框,然后把边框和点都选上,执行patch命令,再调节一下硬度和uv密度等参数,获得一个近似的地形曲面。
大家可能注意到了,rhino文件打开之后,在右侧其实还有一个曲面,这个曲面就是直接patch出来的。
比较之下,右侧的曲面劣势还是比较明显的。比如曲度分布不均匀,很容易从缓缓的曲面突然变成尖尖的曲面,还有边框只能按着给定的曲线收齐等等,都是会影响生成结果的。但这都不是最神奇的,最神奇的是,做有两种方法的uv密度都是100*100,但是当你随意拖动一个高程点,样本变动的时候,左侧非线性回归更新出新曲面的时间大概不到0.5秒,右侧的patch却需要卡住17秒左右……所以各位可以想象一下如果你实际工作中拿到的高程点有几千几万的话……这个差异还是相当可观的。
“非线性建筑”是个容易被人当作神棍的危险词汇,谨慎使用。
“非线性回归”已经在gh里面准备好被你研究了,请尽情探索。
其实除了回归之外,刚才装的那个很可疑的Lunchbox里面还有一些其他机器学习的电池,也蛮好玩的,可以研究研究~
评论区
共 20 条评论热门最新