在一间宽敞的厨房里,各种厨具应有尽有,当然还要有一位技艺高超的大厨,桌上原本摆着土豆一个、茄子一根、青尖椒一根、大蒜三瓣、葱一根、二两食用油,酱油两勺、淀粉一勺、盐一勺,转眼间所有食材和调料就被加工成一盘热腾腾的美味地三鲜。如果把这些原材料看作是一个数学函数的输入,那道做好的地三鲜就是函数的输出,大厨使用各种工具做菜的过程就是函数本身。
当然函数有很多种,有的非常简单,比如只是把两个数加到一起,两个输入分别是2和3,输出就是5,有的则非常复杂,比如预测全球气候变化的复杂函数模型。函数输入和输出之间的反向关系也很微妙,如果端给你一盘地三鲜,你大概也一定能看出来里面有土豆,茄子和青椒,把“函数输入”的原料说出个大概,也就是说这个函数从输出到输入是基本可逆的。当然如果遇到的厨师是拥有祖传调料秘方的几十代传人,完全恢复出输入还真有点难度。但是对于求和的函数,告诉你输出是5,猜测出输入并不难,而且你会发现输入有很多种可能性,不仅2和3可以,1和4可以,0和5也可以……。
但也有这样的函数,告诉你输出之后,获得对应的输入是非常困难的,哪怕只是寻找到很多个正确答案的其中一个也很难,除非穷尽所有的输入可能性进行搜索。这样的函数是有去无回的“单向车道”,相当于是大厨会把熟悉的原料做成完全看不出本来面貌的超级黑暗料理,会产生不可逆的输出结果。这样的函数往往无法用一个简单的方程直接表示出来,但是电脑上运行一段代码就可以表示从输入到输出的计算过程,正方向运行的速度还是会很快,至少比做一盘菜要快很多。
单方向的函数并不容易设计出来,需要专门的数学原理,研究人员可是花了好多年才寻找到的,它们用途非常广泛。
举个例子,你一定面对面和别人玩过石头剪子布,有没有想过在电话里怎么玩?看不到对方还能玩吗?如果你和对方在电话里轮流说要出什么,你先说了石头,对方一定说布,对方先说了剪子,你一定说石头,谁“占得后机”谁就会赢。当然你可以和对方约定,我们都做个“不说谎话的诚实好孩子“,事先心里想好了出什么,到时候就不能变,听到了对方出了什么之后也不能改。但是到底究竟谁说了真话,谁说了假话,又如何知道呢?
单向函数在这里就可以显神通,比如石头,剪子和布分别用数字1,2和3来表示,每个人把自己要出的手势加上一段设定的随机数字字母,比如1m94DxjHr5(表示出石头)或者20nS5hs54Js(表示出剪子),然后各自把自己的数字字母串输入到单向函数,会得到各自不同的输出结果,两人玩的时候,先轮流说出自己的函数输出结果作为一个”防伪标签“,由于从输出无法看出输入,也就无法根据对方的信息临时改变主意,然后再轮流说出自己原本要出什么手势以及自己设定的密码是什么。如果怀疑有人为了取胜而作弊,可以当场用函数验证声称的输入是不是对应预先说的输出,这样在电话里公平地玩石头剪刀布就成为可能。
如果说电话里玩石头剪子布只是多此一举,那么大量网站既要验证用户的权限又无需保存用户的真正个人信息,区块链数字货币中要保证只有真正挖到矿的使用者才能获得奖励,单向函数在这些实际应用中可就发挥不可或缺的作用了。
而更多时候,我们面对的函数并不像上面所说的单向函数那么难以反方向还原。从输出获得输入虽有些难度,但也不是不可能,不至于要超级计算机花费成千万上亿年才能实现的地步。使用身边的一台普通笔记本电脑就足够胜任任务,只是计算时间上我们希望越快越好,能用一星期不用一个月,能用一小时不用一天,高效准确是理想的目标。
在光学器件设计中,有不少的任务就是这种类型,比如下面图1中这种多层薄膜结构,看起来像粤式早茶中的相邻两层深浅颜色不同的千层糕。千层糕里面红白层分别加了红糖和椰浆,而薄膜器件中则是二氧化硅和氮化硅两种材料很多层交替叠在一起。虽然其中的每一层都非常薄(数十数百纳米级别,比人的头发丝直径还要小),但是每一层厚度怎样设置,可“事关重大”。我们并不需要像千层糕那样让每一层薄厚均匀,看起来美观,而是要优化设计为适当的薄厚,比如可以第一层二氧化硅很厚,第二层氮化硅很薄,第三层二氧化硅又变厚……。
图1 二氧化硅和氮化硅材料交替的多层薄膜光学器件
当一束光照射到这样的多层薄膜结构并从另外一侧穿透后,不同频率(波长)的部分透过率会不一样,比如对于可见光,不同频率就意味着红绿蓝不同颜色的光,最后透射率与频率之间的关系会是一条曲线,而这一曲线正好与每一层薄膜厚度分布的密切相关。我们面对的函数输入就是每层薄膜的厚度分布,输出是对应结构的透射率频谱分布,从输入获得输出可以在电脑上通过物理仿真模拟比较容易实现,而反过来,给定了目标的输出,要获得一组符合要求的目标输入,却是一个“逆向设计“的困难任务。
图2 多层薄膜光学器件的透过率频谱分布曲线
在各种光学应用中,我们会专门需要让某些频率的光透过,同时不让另外一些频率的光透过,事先会有一个像图4那样的目标透射率频谱分布曲线,我们的任务是利用函数寻找到对应的输入,也就是逆向设计出最佳“千层糕”的结构。假设“千层糕”一共10层,每层的厚度有10种不同尺寸可选,随机组合一下,最后可能的结构就一共有多达100亿种,虽然每次把其中任何一种结构输入给函数,都可以得到对应的输出曲线,但是逐一尝试数量巨大的所有可能的输入,“遍历全搜索”看哪个输出最接近目标,是一种“愚公移山”式的低效笨拙方法。而计算机上有更智能的算法来帮助我们逆向设计寻找答案,像遗传进化算法和深度学习,可以用尽可能少的搜索次数获得正确答案。
在达尔文的进化论中,世界上各种生物能够变成今天的样子,是因为基因的突变以及环境的筛选,优胜劣汰,适者生存,不适者被淘汰,而优胜者的后代往往有更强的适应力,经过很多代的进化之后,有些动物从不会飞变得会飞,从笨手笨脚变得可以轻易藏身丛林中,从体型庞大变得轻盈快速,一切都是因为生存的压力。这表面看起来好像和我们要解决的问题“八竿子打不到一起”,但实际却是“异曲同工”,对于进化过程的模仿也成了反方向求解函数一件利器。
遗传进化算法把自然进化的过程搬到了计算机上,可以用来解决光学器件逆向设计的问题。假设每一种薄膜层厚度不同的分布而形成的结构就看作是一只动物个体,最开始先随机生成相当数量的不同个体,然后如上所说,我们用物理仿真函数,可以获得每只动物对应的输出,也就是透射率频谱分布,它们中有的和设计目标相对接近,获得的适应度分数会高一些,另一些适应度的分数会低一些,这也预示着这群“动物”的命运,适应者就有比较大几率留下来,不适者就有比较大几率被淘汰。然后我们还会让分数高的个体交配产生后代,当然这里并没有真的交配,只是让两个结构的不同薄膜层厚度取一下中间数值,这样产生的新结构也意味着有可能产生更高的适应度。除此之外,我们还会产生一些随机变化,比如让一个较好的结构里面某一层突然变厚或者变薄,看适应度会不会提升,以探索新的可能性。
事实上,以上的过程就像我们寻找美食一样,一种方式是根据自己曾经去过的喜爱的餐厅,继续发掘菜单上没有尝试过的菜品,可以比较保险地获得满意体验,但天花板上限也可见,另一种方式是去光顾没去过的新餐厅,虽然有不确定踩雷的风险,但也许会有更好的发现,最优的策略就是将这两种所谓的“局部搜索”和“全局搜索”相结合。遗传进化算法通过对大量个体的不断筛选,交叉和突变,经过一代又一代的进化,最后搜索获得的最优结构中不同薄膜层厚度的分布对应的输出曲线会与目标非常接近,完成了所希望的器件设计任务。在整个寻找“最佳千层糕”的过程中,100亿种可能的组合中也只有很少一部分被尝试,遗传进化算法却可以利用较少的搜索次数,智能高效率地给出一个不错的逆向设计结果。
而近年来流行的另外一种用于光学器件逆向设计的智能算法则是深度学习,原本通过物理仿真函数,从输入获得输出容易进行,反过来则无法直接实现。不过这没有关系,本着“世界上本没有路,走的人多了,也便成了路“的精神,我们可以尝试大量不同的输入(当然相比 100 亿所有可能性还是一个小数目),把从已知函数获得的对应输出结果也都记录下来。然后我们使用深度学习这样一个模仿人类大脑神经元连接的黑箱模型,对于从输出到输入的反向关系建立数据模型,用大量输出和输入对应的数据来训练深度学习网络,使得网络中的参数具有最优的数值,这样一个训练好的人工智能模型也就具备了从给定输出中推测输入结构的能力,也就是说给定一个所需的透过率频谱分布曲线,深度学习的输出就可以直接告诉你薄膜中每一层厚度应该怎样设计,也同样比遍历全搜索的方式聪明很多。
图3 深度学习用于光学器件逆向设计
实际中我们要设计的光学器件各式各样,不只有像千层糕的,还有像巧克力方格,变形软糖等多种结构,有了各种逆向设计智能算法,它们就总能乖乖地按照预想的方式来与照射光你来我往。
作者简介:
焦述铭,鹏城实验室助理研究员,香港城市大学电子工程博士,从事全息三维显示算法,单像素成像,光学计算,图像处理,信息安全,机器学习等研究,曾获得香港特区政府Hong Kong PhD Fellowship Scheme和广东省“珠江人才计划”海外青年引进计划(博士后资助项目)。在Optics Letters, Optics Express, IEEE Transactions on Industrial Informatics, Engineering等期刊上以第一或通讯作者发表论文20余篇,获得2020年国际显示技术大会(ICDT 2020)优秀论文奖。担任《应用光学》和《液晶与显示》期刊青年编委,中国光学学会全息与光信息处理专业委员会委员,中国图像图形学学会三维成像与显示专业委员会委员,中国图像图形学学会三维视觉专业委员会委员。担任中国科普作家协会会员,Light科普坊科学家顾问团成员,曾在果壳网,科学大院,南方都市报,读者原创版等网络和平面媒体撰写科普文章,2013年第六版《十万个为什么》图书数学分册和电子信息分册作者之一。