GAMES 图形学系列笔记(九)

16.计算照明 (I) | GAMES204-计算成像 - P1 - GAMES-Webinar - BV1HP4y1U7QV

今天给大家分享一下照明系统吧,像之前我们已经讲到了啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从最开始的呃整个的一个脉络哈,然后光学系统就是整个成像的正向过程,然后随后也大致给大家讲了整个image的一个tbs,然后再往后就是computing,就是计算的一个computing,一个tops。

其实讲到了就是上节课我们已经啊完整的cover到了整个的一个嗯,就是整个模型的一个建立,我们怎么样把这一个成像的模型建立,然后根据我们一个物理学的约束去解一个这样的问题。

但实际上本身呃原本是想给大家介绍一下神经网络去解这些逆问题的,但是后来因为看到了网上有很多教程啊,而且这个东西它比较简单啊,用神经网络去解决这些逆问题的时候,基本上就是我主要任务就是造数据队,就造数据。

对这个地方就跟本身我们就是求解禁问题的关系不是特别大,我们其实实际生活中面临的很多就是计算摄影的问题,就是大部分时间是没有这样的数据的,所以说这个时候啊这个东西在工业界应用的也不是很多。

就是它只是在一些啊极少的一些环节里面,我们可以用一个小神经网络替代,所以说这一块咱就不讲了,因为讲起来就实在是没有内容,它还是比较简单,因为整个计算摄影里面能用到的神经网络基本上就是看unit呀。

nf呀,这些整个的一个思路就是decoder,encoder,就是特征的提取跟特征的重建,所以说这个就是神经网络这部分是呃比较无聊,所以说就给大家直接进入到下一个阶段。

就是我们真正的从我们计算成像的一个四个新开始入手,我们新的光学系统,还有新的传感器,还有新的算法,这个时候今天就给大家正式步入一个新的照明系统,就叫competitional illumination。

这个应该这节课应该会持续个3~4节课,我们会从呃整个照明的一些特性分析啊,就整个计算成像问题的分类,空间呀,嗯光谱啊,或者是加上编编码呀,加上偏振啊。

整个所有的光学特性都会反映在这个competitional一个illumination,这里面,就是这个照明啊,其实啊对我们当下的一个成像系统其实已经变得非常重要啊,举个例子哈。

就是已经大规模应用的一个叫top成像,time of flight camera啊,这个就光这里面就有好多种的一个呃,对对时,对时间啊也好,还是对空间也好的一个调制。

比如说我们一个连续播的一个time of flight,就continuous wave的time of flight,这个就是我们发射一定的连续波,然后去测,然后呢这个连续波发射回去之后。

我们有一个参考的一个波,我们用在我们的一个像素传感器里面做一个相关,就是做一个就是自相关网,就correlation,这个时候我们就可以通过检测,就是这个correlation的一个相关性。

然后在不同的相位下的相关性,这个时候就可以算出来我们的深度是多少,那简单粗暴一点的呢,我们可以用一些像direct time of flight,就发射脉冲光,我直接测这个光与光之间的一个就是时间差。

但这个技术目前来说工业界还不是特别成熟,玻璃倍增管叫p m p,这个就太贵了,而且做成阵列成像不大现实啊,另一个就是spa的期间,spa期间这个这几年变得非常热啊,像单光子探测。

这个spa是可以做成阵列的,但现在工业界并没有说呃真正的大规模应用,当然这个因为它有很多难点并没有被克服,比如说这个随温度的变高,它的一个就是叫黑暗技术吧,就是我们就counting时候的噪声会变大。

但热稳定性就不是特别好,本身的封装工艺测试工艺也没有特别成熟,所以说这个目前工业里面应用的还是以像双目结构光啊,还有呃他们flash为主,这个就是对时间的一个调制,但还有一些很奇怪的哈。

今天呃就正式给大家讲一下,competitional illumination,这个非常有意思,大家可以仔细听一下这节课。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就今天因为这个ination这个课程内容会比较多哈,就今天可能能覆盖的内容不多,所以说我们会拆成把这个整个拆成几节课去讲,今天就可以讲就是前1/4的部分呃。

第一部分就是duration has intensity,就是我们在拍摄照片的时候,或者是avideo的时候,没珍它的一个持续的一个时间就曝光了时间,还有他的一个intensity强度的一个问题。

然后第二个课题我们今天会讨论到的就是我们光源的位置,还有光源的一个嗯,就是照明的一个方向吧,就我们会给大家讲一下,这个通过两个例子啊来举个例子,像reliant这种,就大家做那个拍电影。

我这个人在摄影棚,但是我想要拍到这个像星际穿越哈,我们要拍到另一个星系那种感觉哈,这个时候我们这个天上那个太阳可能一个太阳就变成两个太阳,这个时候我们那个照明咋办呢,但实际上拍的大家都是摄影棚哈。

我们这个时候那就需要有一个reliant的一个工具,像传统的一些摄影里面,这个reliance通常都是先捕捉到一个目的地的一个光源,就是我要拍,比如说我要把这个人在摄影棚。

我要拍一个比如说洛杉矶的一个背景,我先把洛杉矶那儿放一个摄像头,我把他的一个我用一个呃反射的一个球啊,把他的一个lighting,一个condition捕捉到,这个时候在我的一个摄影棚里。

我有一个呃大一个球形的一个光,可以编程的光源,然后可以根据我捕捉到了一个关心的情况来给他做了重照明,而这几年这个技术变得先进了哈,这个大家可以很多时候会用一个小神经网络的办法。

就是直接把这个reaction给做了,当然这个时候还会有很多artifacts没有很完美,然后再一个例子就是呃我记得我们深度深度图像的一个边缘,这个是怎么捕捉的。

这个是用一个multiflash的一个方式来,今天就给大家正式讲一下这个lighting的一个,但我们想到照明的时候,其实是最古早的一个照明的话,一八几几年的时候。

那个时候其实没有很多一个符号广泛关注照明这个问题,其实大家那个时候只是我能拍到这个就可以了,所以说对照明不是很关注,哪怕到了今天啊,就是大家可能拍照的时候也没有特别留意这个照明的一个情况。

就这大部分的一个,而同学们都没有注意到这个照明的情况,但实际情况就对一些比较专业的一些选手,我们会选一些就是光线情况比较好的时候,比如说大家喜欢啊做直播,这个要显得脸皮肤比较好,就打的比较光比较强。

显得比较白,这个也跟舞台相关,没有影子,这个我们足球场我们也需要呃几个方向的灯,同时达到这个足球场来避免这些影子对球员的一个干扰,那么还有各种各样的打光的光源,像我们摄影棚里面会有各种各样的一些光源。

当然我们这个照明的一些设备也变得就更加聪明,就是现在照明的设备还是又可以调时间,也可以调它的一个色温,所以说这个但这种可以编程的一些光源还是比较贵哈,一般好一点的光源还是要几万块。

和今天刚买了一个这个光源,就很很高兴哈,花了几万块钱买了一个光源,但是这个是真的是十分有必要,而我们在这个照明的时候,我们有哪些参数可以去调节呢,我们第一节就讲的是我们曝光的一个时长duration。

还有它的一个光的强度,intensity,然后第二个章节我们讲的是就光的一个位置,我们光源的位置,还有光光源照射的角度,然后第三个呢我们是要考虑这个就是光源的一个背景啊,就是就是背景光。

背景光是什么样子,当然本身光源自身啊,还有一些它的颜色啊,它的一个波长啊,还有它的一个偏振啊,这些因素统统都要搞定进去,他除此之外,其实呃近期的这这近几年的一些文章啊。

大家通常会对一个空间跟时间的一个调整会比较多,举个例子我们空间的一个调整哈,比如说我们的最早的一个connect的一个3d相机散班结构光,当然还有现在这个条纹结构光诶。

通过这种结构光的一个方式来把一个三维的,一个呃形状重建出来,这是一个应用,举个例子怎么调时间呢,比如说像hdr modation,就是我们嗯要曝光不一样的时间,然后把这个光线强度调的不一样。

这个呃比如说hdr,比如说像刚才讲到了一个time of flight image,这些参数是我们列出来的,就是大部分的一个嗯参数我们可以调节的,那说说这个还有so啊啊这些参数。

下面来看一下这些到底是怎么应用的,首先第一节我们讲到的是一个duration intense的一个问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当我们回想到一个高速摄影,比如说我们在呃1930年代这个时候叫这东西,叫啊sos scopy,这个shop,就是呃就是闪就是那个闪光的那个意思,这是那个时候就是在上个世纪的时候。

人们就已经可以通过电信号呀,或者是声信号或者光信号来同步,我们在一个高速的一个摄影,就是我们要拍到这个子弹穿射这个苹果这个视频,因为我们不想要太大的数据量嘛,这个时候我们就需要一个精准的一个时间同步。

时间同步之后,因为这个速度非常快,这个我们这个本身相机感光度有限,还是我们目前啊我们用到的一些像ccd啊或cmos啊,这种数码相机,这个时候,我们都需要一个很强的一个闪光灯来保证在我极短的时间内。

我可以捕捉到呃一定的进光量,这个时候啊这个intensity本身就变得非常重要,所以说呃通常大家是用一个强闪光灯来跟这个枪做一个同步,这个时候大家就可以嗯拍到了这个整个子弹穿过苹果的这么一个过程。

嗯还有一种有意思的玩法就是叫multiflash screenshoal photograb,这个我们在你看我们下一行,下面那一行是整个相机曝光开启了一个时间段,唉这个时候我们在全局曝光。

然后我们的一个flash我们可以看到那个黑色的部分,flash开启的部分,这个时候就可以拍到诶,我们挥舞球杆的这么一个过程,这个很有意思啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当然这个我们之前课上还讲到过,像flash and not flash grab,再举个例子哈,我们再recall一下,我们捕捉到了一个呃,这个没有flash的情况下。

我通常不会觉得这个背景实际上是比较真实的,这个是我们我们啊实际上就可以看到的这么一个呃情况,当然我们在有flash这个情况下,这个因为在没有flag的情况下,整个光线会比较昏暗,比较弱。

这个时候它的图像的信噪比不是很高,但是它有个特性就是比较真实,就是它真实的环境就是这个样子,这个时候会有细节的丢失,但是我想通过flash来弥补这个不足,但是,flash拍照的图像又是什么样子呢。

我们可以看到下面这一部分这个flash拍照的图,它有非常多的一个高频的细节,对不对,而且整张的那个图的信噪比是比较高的,因为它光线比较强,它的信噪比比较高,这个时候。

但是这个时候跟我们真实拍摄的到这个昏暗的场景是不一样的,我们想把这两张图的一个优势的信息也融合在一起诶,最后我们通过一个flash and not flash的一个融合就可以拿到右边的那张图。

它既摆脱了噪声的影响,同时也保住了一些像高频的边缘啊,这些信息,他有兴趣的可以话,可以读一下这几篇论文啊,这个表有兴趣了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个这节课讲完,这个新作业就布置下去了,这个论文肯定是要看的,那具体是怎么实现的呢,我们这个有两张图哈,一张就是没有flash的一个图,还有一张在flash的情况下拍的图。

我们是用了一种方法叫重by letter future,这个地方对这个没有flash的image,我们呃先对先用一个bt future把他的一个intensity给它提取出来,我们叫a base啊。

把它叫dels,叫a base,然后我们的这个这是它的一个低频成分啊,这个低频成分很重要,然后第二个部分是我们通过一个种子by letter future,把它的一个颜色信区啊,这个颜色信息啊提取出来。

他对flash imaging,我们是想要得到这个flash image的一个details,就是它的一个细节上细节的一些边缘的一些东西,当然这个开那个flash会有很多问题啊,比如说像我们这个影子呀。

还有这种闪光,有很多耀斑啊,那个点,这个时候我们对这些影子跟这个speker的地方通常是加一个mask,把这个给扣掉啊,这个就这个加一个人工的一个mask,把这个给扣掉。

这个只能影响我们最后呃融合的一个结果,到最后我们就可以通过下面这么一个式子,来把这个呃左边的一个diy的一个information,就把他的一个真实的背景环境,光跟右边的细节融合在一起。

就得到了我们又干净又,符合真实人眼观测到的一个环境下的啊,这么一个呃融合过的一个flash,not flash amazing,这个我们要得到这个details。

首先我们要因为我们拿到的是一个intensity,在一个y u v月哈,我们这个外通道达到一个intensity,经过一个filter之后,我们拿到一个低频的一个largesgo的图。

我们把这个两张图按像素一除,这样就拿到了整个它的一个细节的一个分布。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那除此之外啊,这个flash跟not flash photography通常还用到这个flash hdr也没几,就是有时候在我们夜间啊,比如说像左边那个场景,就是他比较昏暗,远处的地方比较昏暗。

进去的地方呢面有一个灯的影响对吧,它这个动态范围差的比较大,但是这个差的有点太大了,远的地方近的地方这动态范围差太大了,这个怎么办呢,就哪怕我这个对就我这张图进行了一个mtt的图者,把它few在一起。

但是这个动态范围差太大了,就很多暗的地方还是有点暗,就是我做tomap的时候,也没办法对这个很大的动态范围进行一,个很好的压缩诶。

这个时候人们就想我可不可以把一个flash我既变化我的export time,同时也调整我的一个flash的一个就是illumination time,这个时候我们通过两个维度的一个调制诶。

来获得这么一个flash的hdr美景,是啊,左边这个是我们调曝光时间,调不同的曝光时间融合到了一个hdr图对吧,右边我们是调不一样的一个flash的一个亮度来融合到了那么一个图诶。

把这两个图结合在一起就可以拿到了一个呃又保持到细节。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后呃背景啊,前景的细节都保持得比较好的一个呃这么一张flash nor flash融合的一个hdr,图像啊,这个是呃flash fhdr一面镜的一个应用,但我不知道现在手机上有没有用到,这个可能有哈。

大家可以呃,我估计可能那个google pixel 7可能会有,大家可以搜一搜哈,这不是很确定,那这个是我们课上讲到的哈,这个是我们可以去通过啊。

flash can not flash hotogra费来去除啊,我们这个flash上的一个这个一些反光的一些artifacts,这个原理呢就是大家刚才也讲过,他就是对一个规定的一个投影,通过这个投影。

因为我们知道这背景光跟这个闪就是闪光灯闪出来这个光,它那个鬼点子一个方向应该是一致的,对不对,所以说但是整个这个reflection的一个layer,就是我们这个鬼点。

它就跟我们这实际上这个画了这个detail这个规定,它它应该是不一个方向的,所以说通过这一个矢量的方式,我们就可以,很轻松的把这个呃背景跟这个反光是分离啊,拿到一个比较好,像这的一个呃,再放一张画。

然后第二部分我们讲到重点了哈,这个叫light position,还autation,也就是我们光线的一个位置跟照明的一个方向啊,这个是比较重要的一个课题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

嗯很古早的时候就是1992年啊,paul hair valley,这个时候嗯大家想搞一个呃synthetic来听,就是我们合成的一张光源的一个图像,当然这个问题就变得非常简单,这个非常简单的一种玩法啊。

左边一个灯照亮了整个c的一个左边,右边一个灯照亮了整个c的一个六,右边诶,这两张图一减,我就拿到了,像最后下面这一张人工合成的那么一张图像,诶这个是很古早的一个工作哈。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但到了2000年左右的时候,这个是当时啊paul that week,那时候最早是在uc berkeley做国货的时候,就开始了他的一个listage的工作,但现在可能已经到了好多代了哈。

已经到了七八代十几代了,到x代了,这个是什么样呢,他是做了一个programble的一个啊灯箱就是我们这一个很大的一个大球啊,还有啊很多个相机,还有很多个这个呃可以编程的一个光源。

但同样的这个工作大家也可以参考一下这个我们上课大的余景逸老师,他那也有一台,他们自己搭了一套非常大的一个设备,这个很有意思,哎这个有什么作用呢。

比如我们想要实现这个一个image base relion,我们要实现一个纯打光,我们面临这么一个场景啊,比如说我们我们的一个actor在他的一个摄影棚,比如说我们在洛杉矶。

他在一个摄影棚里面要拍摄这么一个场景,但是我想要的背景啊,实际上是不是在意大利的米兰对吧,然后这个我们要怎么样在摄影棚里面拍出来,跟在米兰一样的这个灯光的一样效果呢。

就是我们想要这个人完美的融合在这个背景里面,而不是简单的把这个人扣进来,然后再放进去,对不对,就我们之前我们讲到过呃,这个pom blinding,也是pos融合。

这个泊松融合是可以把人比较好的融合到这个背景里面,但是比如说我们人脸面部的这个光,怎么样才能跟背景的自然光去完美的就是融合在一起呢,所以说这个时候这炮台这个listage就起到了一个很关键的作用。

这怎么实现呢,比如说我们第一步我们要背景是在米兰哈,我们要捕捉到一个米兰的一个光线,怎么办呢,还是用一个足以写比较常见的办法,我们用这个光球就一个呃镜面的一个球吧啊这个地方还做了hdr。

我们就不同曝光性方面下了一个这个a c r的这个,光球这个时候是捕捉到在米兰那个地方的一个呃光的一个背景对吧,这个时候啊这是抠图,但是在抠图啊,这个土豪妹同学问这一步也是抠图,这是抠图不假。

但是在抠图之前,我们要先把这个就是我们背景图像的一个光线情况,来反映到这个模特身上,就是比如说我这头顶上照着这个脑袋是吧,这个我们要跟后面的背景一样,在头顶上照着这个脑袋对吧。

所以说第一步我们是要捕捉在这个比如说在米兰的这个地方,它的一个光线的一个情况对吧,我们知道这个光线的情况之后,然,后我们在摄影棚里面就可以通过这么一个大的一个这个,对这个小伙说的很对。

这个live cg就模拟一个天空盒,这个想法就很对,哎我们就可以通过这么一个光球诶,根据这个捕捉到了这个这个光线情况来给这个actress,就是个演员来做一个realizing。

这个时候对这个演员的一个照明,就感觉跟这个呃在我这个米兰这个本身的这个环境里面是一样的是吧,但这个本身也是经历一个抠图再放进解决过程,那这样的情况下,整个光线啊,像这个我一定中奖同学说的一样。

就是它的光光源保持了一致,唉这个是就是20年前的一种玩法,到今天可能变得更先进了,但我不知道这个电影里面用没用,但是这个像我们今天讲,这个是已经在电影里面得到应用的。

当然现在有一些更先进行一些与拉近的方法,就是直接我们先把这些图采回来,要通过gpu搞一个假的光源,再给他做reaction,有时候也通过神经网络给他做一个reacing啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这种啊很多玩法都有的哈,对这个是的,那我们可以看到像我们比如说不知道这么一个图吧,当然我们对这个呃不好意思,我这个,卡了,诶,这段剪掉,所以这个跟服务器联系联系不上了,但这个时候效果可能还是不如真的好。

还是这个搞个大的盒子比较好,像这个东西啊,以前像最早是在berkeley,那时候叫paul rc,后来pvc就去了别的地方了,当然这个东西一直在做,到现在可能还在继续做,一共可能有20年了。

但后来像这个last stage这个东西也慢慢的发展,因为我们除了光源自己啊,我们还是可以呃加很多相机的,这个加了很多相机之后,我们各个视角的相机,我们就可以把它当做一个工厂。

实际上它也是一个广场捕捉的一个东西,它可以对人脸啊或者人体啊进行一个很高精度的一个三维建模,因为我们都可以用4k8 k相机嘛,这是没有问题,然后做个同步,可以对这个人脸进行很高精度的一个建模。

这个建模之后呢,我们就可以根据这个模型,然后再用graphic方式给它做relighting诶,这个时候也可以把这个数字能完全重建出来,这个呃多得了一些比较广泛的应用诶。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个给服务器联系上了,我们继续。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当然我们可以看到我们这个整个人头放在上面,反对这个光源的反应。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

唉我们用一个呃,就是mask把这个标标记出来哈。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当然这个像这种东西就变得会比较昂贵,但是我们后来哈有有一个叫叫bobby,bobby,跟这个cindy这几个人就做了一个非常便宜的一个table top的composition lighting。

就是什么背景呢,我们要呃捕捉到一个呃非常清晰啊,像右边那个图哈,我们可以看到每个地方的细节都捕捉的非常清晰,它没有一个明显的阴影对吧,也没有一个明显的一个specular。

我们怎么样获得这么一个呃干净清晰,不受背景影响的一些图呢,这个我们一项之前比如说我们要规定一个很大的一个listage,这个是非常昂贵的,就我们知道可能之前上课大内余俊逸老师,可能那一套叫超几百万啊。

这个很贵,一般人大家都搞不起啊,这搞不起咋办呢,这个就有便宜的办法哈。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在我们拍到一张图的时候,通常我们看到这这么一张图上面这个地方过曝,我们想要把这个上面这个地方加暗一点对吧,他是受到一个呃有一些就是specter的反光的一个影响,然后这个地方呢又又有阴影的影响。

诶本身这个就是茶壶啊,它的一个壶体有点太暗了,它本身这个呃也是受到了一个呃shadow的一个影响,就是一个影子的一个影响。

但我们这个时候就可以通过一个sketch做一个sketch的optimization,来把这些地方都抑制住,然后亮的地方优化上来,按亮的地方优化下去,按地方优化下来。

是不是这个时候通过一个target这个sketch是可以把这个呃都优化掉的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当然这个时候也要结合我们的一个照明,首先我们要对这个这几个方向啊,就拿到这么一个照明来,拿到一组就是basis mage,叫基图像,基图像的一个一组基图像。

每一组基础项我们是已知这个光源照明的一个呃位置的,比如这四个变化就是照明就对应的啊,这12344个位置啊,这个也很明显,这个横着的地方影子越长啊,这个很明显。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但比如说像我们像像刚才那个情况,我们要避免我们像一些speculate的一个反光呀,其实呃像这个top的image实际上就是用一个模拟了,一个用一个模拟了,就打到一个天花板上。

让一个天花板的一个漫反射来做一个公园,然后再通过我们不一样角度的一个呃调节调节吧,最后再把这个图fs起来,就可以拿到一个像我们刚才看到了各个地方都非常清晰的这么一张图。

我们可以看到这个我们这个照明这个打光这个东西是可以,也就是我们上面这个面光源是可以呃,不买各个地方的啊,这个就比我们搞一个大的一个呃last stage,这么一个照明阵列就会便宜非常多。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

便宜非常多,那这个右边这个好,这个看着像机器人这个东西啊,它不是机器人,它实际上就是就我们刚才讲的那个光源,关于达到天花板或者墙上各个位置诶,我们这儿摆了一个相机。

然后我们就可以对我的一个目标物体来进行,就比较便宜啊,这个比alice day还是便宜很多。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

它本身哈假如说我们要用一个点光源的时候对吧,我们要假如说我们呃特别是我们嗯早期哈,早期我们做这last stage时候,他有很多很多的点光源,点光源打断一个物体的时候。

我们就它的一个影子的边缘是非常锐的,影变也非常锐,这个时候我们就挺不喜欢这个,我们其实是想模拟的一个这么一个面光源,shadow也比较soft,面比较大的时候呢,比如说360度的一个完整的一个面光源。

照出来这个图像就是非常完美的一个弹射好,所以说像刚才那种玩法,就是通过,墙面的漫反射来造成一个比较大面积的一个面光源,来实现一个更smooth,哎这个东西慢慢的也被大家就是玩出花了哈。

这个这个东西叫light wi,就当时人们在拍摄这么一个车的这个场景,大家把像这像头固定住,然后这个呢有一个老哥就拿了这么一个就是光源,然后他挥舞的这个光源,然后在这个车各个角度给它进行照明是吧。

这个时候我们然后这个同桌人看了,通过这个东西干了什么呢,我们在这个挥舞的时候不断的拍摄图像,就拍摄了好多好多张,我们就可以,我们人类是通过这个东西啊,实际上是啊恢复了整个光线的一个角度哈。

就是大家直接把这个照明的这个每个点的位置直接给估出来了,这个这个时候就变得非常有意思,实际上是拿到了一个比较完美的一个就是多角度,一个就是lighting box吧。

就是我们在一个各个方向都拿到了一个照明,就把它合成起来,那同时我们也可以把这个啊光线照明的一个角度来给恢复出来。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当然我们本身我们这个competition 1 ation叫计算照明,有时候我们还是想要实现一些嗯4d的一个ation,比如我们新型的相机啊,就是这个比如就是说白了就是拉黑的camera,就光场相机诶。

这个时候我们实际上是想对我这个光线的一个角度进行捕获啊,同时我们还是想希望有一个light to display来把这个角度来呈现出来,哎这个时候我们就可以直接a观测到我们这个裸眼的一个3d。

假设我们屏幕可以啊,实现这个广场的一个显示,我们跟各个视角都有不一样的一个观察,这个时候我们就可以看到一个裸眼3d效果,这种就是比较小高话题的一些产品,比如像google的一个style。

这个就是大家一边放了几个3d相机,然后我们这边放一个裸眼3d显示器,重建之后诶,比如说咱同学们在家里也摆了一个裸眼三的一个显示器诶,再摆一个三维重建的一个实时三维重建的一个设备。

这个时候在上课就可以那种面对面的交流一样,就不再有一个呃屏幕录像的这么一个隔阂,当然这个是怎么做的呢,实际上像这种我们可以对像除了对,因为以前很多玩法,或者是一个叠层的lcd。

但这个时候我们是可以通过调这个4d的一个illumination来实现的,一个这个light fi的一个capture,实际上我们就是对4d一个4d的照明的一个厂的一个嗯,就是一个调制。

再加上时间的调整,加上波长调制,哎我们这里又拿到一个8d的一个remodator是吧,我们拿到的信息是8d的,有啥呢,xy对吧,时间xy俩了俩俩维度了呃,时间第三个维度rgb诶,六个维度。

光线角度fda,这个又是两个角度,哎,这个时候我们捕捉到一个八维的一个图像啊,这个很很很恐怖的,对不对,但是我们可以把这个八维图像通过like to play就可以给大家呈现出来。

它是一个很高纬度的一个信息,这是给大家科普一下,后面,会给大家专门讲到一个let field呃,eming and display,这个地方非常有意思,这个广场其实很多时候就是做计算摄影和计算成像的啊。

同志们经常会把这个that field当成一个整个计算成像的一个,灵魂性的一个东西,就哪怕到了今天也不是很完美,就和相机阵列呢就是像素密度像素太多,大家上动用light field,用用一个呃。

像maplex array呢摆在一个胶面上,这种会便宜,但是它的分辨率有限,那这个就没有很令大家完美的一个事儿。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么有很多呃4d lis是一个呃例子哈,比如说像我们这个pol demic,2000年就是最早的一个last stage工作,但后来这个这当那个时候古早时期大家反色都比较简单哈。

就是通过手拿着这个照明啊,然后来在拍摄,然后还有后来就慢慢达成一个一个小阵列了,一个各个方向的一个小阵列,这个时候我们可以解释它的aido哈,我们是可以对他的abele进行recover。

到了后来就有last stage 3,这个2000年作为一个last day 3,但后来后来也有非常非常多的工作,到了今天,就是这个时候,摄影棚里面已经是真正的得到了,一个工业化产业化的一个应用。

哪怕它的市场不是很大,但是也是做到了一个产业化的应用,那除了这个之外,我们举第二个例子讲,now forealistic camera,这个时候我们是想捕捉到我们深度信息的一个边缘是吧。

我们怎么样捕捉到一个深度信息的边缘呢,就是像我们这么一个装置哈,我们通过四个flash,我们再看看这个看这张图啊,12344个闪光灯,我们把这四个闪光灯分别的放在我们这个相机的四周。

这个是为了解决什么问题的,因为我们现在好,我们捕捉到一张图,我们可以用一些像就是图像处理的办法,比如像呃sober filter或者是呃高级一点。

我们用candy canny算子是可以把它的边缘提取出来的,但是这个边缘只是它强度信息的边缘,它深度信息的边缘是怎么提取呢,就是很多时候我们没有一个深度相机啊,一个专业的深度相机。

我这个深度的边缘不是很好提取,所以说这个时候通过这种呃四个就是方向的照明的地方,我们是可以把深度图像的一个边缘来提取出来的,这个时候也可以,结合一些深度相机一起用啊,这个两个这个边缘应该是挺好的。

就可以结结合在一起的,来举个例子,哎这个东西我们之前rua起了个名字叫depth age camera,就是我们现在我们的灯右边那个闪光灯亮的时候,我们照明到这个物体上。

我们可以观测到诶这个地方有些影子,这个方向就是给它嗯,顺着这个光线照过来,这个后面那个方向是有些影子的,对不对,我们换一个方向,发现影子变了,变到下面这个地方,诶,我们再换一个方向。

把这个灯下面这个灯亮起来的时候,我们可以到这个影子变化就在这个地方,同样的原理,我们把这个放到最左边,椅子就会变到了右边,我们可以看到这个影子的产生,阴影的产生啊,就在边缘,这个阴影的产生。

它是会随着光线照射角度的变化而变化的,而且这个并不是跟他强度相关的一个东西,这个是这个影子是随着它的一个深度变化而变化的,对不对,所以说这个时候我们就建立起了这个光线照明跟这个深度图像呃。

深度信息它边缘的一个关系叫depth camera。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个时候我们通过把这四张图像然后一起合成起来,通过这个internal external的一个呃,就形状的一些边缘啊,这个时候我们就可以提取我们整个深度信息的一个边缘的一个部分。

这个其实我们可以看到这个边缘还是比较完美的哈。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因为这种在不一样方向的照明,我们可以实际上得到的是啊,就是深度的一个就是随着物体有深度变化位置的一个投影对吧,我们可以看得到上下左右诶,四个方向不一样的照明,把它的边缘提取出来。

就可以得到depth的一个age。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们其实对比一下我们以前常见的一个概率算子啊,就第一张图是我们把这个看这扇子里面的西格玛调到九的时候,就是把这个滤波器调的比较强哈,这个是这个时候我们拿到了一个边缘,但这个边缘跟deft边缘是对应的吗。

实际上我们可以说是不是的,我无论看西格玛a9 啊,西格玛a5 啊,和西格玛一,西格玛一可能造成多一点,边缘会多一些,假设我们这个拍的这个石膏石膏模型,它是一张图,我这个时候用ky算子。

到时候我们这图里面的那些纹理啊,这是完全不知道的,对不对,跟这个我们这种方法呢,我们这个用四个照明来提取边缘,这个方法假设它是一张图的话,图里面的纹理就不会影响我最后实际上得到的边缘,我无论怎么照明。

也不会有一个阴影的感觉,他说这是一点提升好,这个时候是ky sans做不到的一个深度边缘的一个提取的,这是ky sans本身做不到的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个是源于一个det的一个discontinuity,就是deft的一个不连续的一个问题,大家可以看到ky算子,无论这是一个图啊,还是一个真正的物体,我都可以把这些就是边缘的地方就是都给搞出来。

但是啊要是这种四个灯泡给它照,照明不一样方向照明的时候,诶这个是实际上就是他真正的一个deft的一个边缘,就我们现在有很多深度的一些图像传感器哈,它的一个边缘不是很好。

其实这个地方就是可以对这个边缘进行一个引导,来给他做一个增强,诶这个大家有兴趣有兴趣的同学可以联系我给大家。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以搞篇论文做一做,像那除了这个之外,我们depth camera还有什么用呢,比如像我们这么一张发动机舱,就我们可以看到这个这是很油哈,这又有线啊,又有这些油啊,他这个是很复杂的哈。

这个乱七八糟我们并不知道里面的信息是什么样子,哎这个时候我们可以看到,当我们用这种depth camera,就可以很清晰的把这里面的一些边缘的信息都提取出来,这个就可以把他的sketch。

实际上就把它的一个sketch提取出来,像candy算子呢,我们也可以看到这么复杂,这么乱对吧,我们这里面的一些呃秀班啊什么的,这个看那扇子还是都给他,提出来的这个非常多的一些杂乱的信息,我都不想要。

假设我们看到右下角这张图,我们又看见扇子的一个提出来一张图,我们还能知道它的内容是什么呢,我们恐怕很难知道这里面究竟描述了一个什么东西,但是我们只是对它的一个depth进行提取。

实际上这个就是从一个搜索变成一个sketch,就这2年可能大家看到的论文有很多啊,像craft的论文就有很多,像sketch到一个photo的一个变化,那当年这个photo是怎么变成sketch呢。

哎这就是其中一种比较呃有意思的一种方法吧,就是它可以真正的把sketch里面想要的描述的信息提取出来,也就是我们深度的一,个边缘信息,但除此之外,大家都看到这个发动机舱了。

还有没有想到有其他的一些应用呢,那我们的说明书对不对。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们说明书想要表示有用的信息,那我们先看一下这个呃depth这个图是怎么获得的,你看我刚才那个还是那个相机哈,左右上下四张图,把它变化的部分诶,通过这个呃dex提取出来。

这个时候我就可以拿到一个很清晰的一个sketch mac,当我们看到这个时候,我们就恍然大悟,对不对,像左边这个左边这个发动机舱对吧,这么乱,要给用户看呢,其实是很难看到我们这个到底是怎么个情况的。

哎我们想要诶,我右边这个图我们就可以通过我们这个decamera一个方法,这是他的一个比如说我们要怎么样灌机油,我们这个这是机油哈,不好意思,我们把这个位置标出来。

我们就需要一个比较好看的一个sketch,跟我们的这个图像是相对应的,我们拍一张照,把它转换一个sketch对吧,这个时候现在这种方,法就变得非常的管用,这个这我是土豪米,同学是咋感觉完全改变了。

这是什么意思啊,这个是这个举个例子哈,这不是完全对应的,这是只是部分对应的,这个管子的地方还是对着的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那还有一些用法,比如像我们拍这个花的时候,诶,我们想把这个花的一个sketch,就是它的一个草图提取出来,对不对,当然我们要用传统的kenny下提取这个草图是非常非常困难的。

那这个东西实际上原理上是比较简单哈,就它是我们捕捉到一个shadow的一个呃位置来重现的这个嗯,把这个shadow的位置提取出来,来,把这个边缘就直接复现出来,这个很简单。

就我们整个我们可以看到camera啊,比如说这个是图形学的模型,这是我们一个点,我们图像传感器这个ik啊,我们这这是一个典型的一个图像reaction的一个模型哈,我们在这个就是把这个光线往前追的时候。

追到这个object的时候,诶,这个它的这个shadow就是可以沿着它的一个呃这个极限的这一个,这一个方向,但我们可以看到这个图像上在不一样方向打光的时候,我们就可以看到整个shadow。

就整个的阴影沿着这个我呃深度变化的一个边缘,它的一个分布,也就是我的一个极限跟我的一个呃阴影是在时间23嗯,一个相相相对的一个呃边缘哈。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对这个大家可以啊想一想这个最后啊,这个就是整个一个depth edge开放的一个模型,就是我们在相机四周放四个闪光灯,然后这四个闪光灯呢交替曝光啊,交替曝光,然后最后把这四张图像融合在一起。

其实这个整个算法是非常简单,这个西瓜论文啊,这是2000几年的时候,这个大家同学们可能也会感慨一下,这个出生的晚了,这个整个论文变得越来越复杂,2000年初的时候呢,这个就已经可以发c graph了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是到现在整个发c graph就变得非常困难啊,越来越困难了,这个是比如说大家偷偷懒,要想有两个光源,这不left flash跟ruflash诶,我们对这个拿到了这个边缘进行一个先归一化啊,先归一化哎。

我们这个变化的一个位置,我们要把这个变化的位置换出来,这个边缘实际上就是我们呃depth age的一个位置,我们把实际上把这个下降沿提取出来就可以了,就把第一个下降沿提取出来,那最后一个上升沿提出来。

这个时候也呃也是没有问题的,就就是我们left就是我们从左边照明的时候,我们就提取这个图像左边的这个边缘,右边照明的时候,我们就提取这个右边这个边缘。

因为本身我们这个可以看到这个shadow是非常粗的对吧,我们不可能把这整个这么粗的一个阴影去当他的一个呃,当它的一个整个deft的边缘,实际上它我们可以看到从左边照明我们这个阴影的这个整个的左边。

就是它的,一个depth age对吧,所以说我们嗯把整整这个信号打成一维就提取出来,看我把这个边缘左边那个边缘就当成呃这个depth age,然后从右边照明呢,就把右边的边缘到depth age啊。

这两个都提取出来之后,一相加就是整个呃出现了一个depa,当然这个换成四个方向,就是原理也是一样的啊,这个就非常容易理解,啊这个也有很多一些就是很多场景就是不是很好实现,比如说我们像户外特别亮的时候。

我们这个闪光灯比这个很亮的场景差很多的时候,这个就不大好把这个边缘提取出来了,但还有一些呃就是比较困难的那些场景,比如像透明的物体啊,像一些低照度的一些物体啊,还会像镜面。

这个都是一些比较困难的一些问题,还有像一些特别薄,特别窄的一些问题,比如说纸片,纸片或者竖着拍,这个就不行了,这个会有问题,但我们要解决还要解决一些问题的。

就是我们这个flash跟这个camera的贝斯坦的一个问题,它是大了小还是小小的好,这个时候我们要斟酌一下,还有像一些反光呀,speker的反光呀,嗯还有一些呃面光源的一个问题啊,这个总队要考虑。

因为闪光灯本身它不是一个点哈,它那个整个边缘它不是特别的瑞丽啊,这个问题我们都需要考虑,就是有时候如果不是很锐利,我们这个边缘它就会变得糊了哈,就是边缘就是变化不动距离了,这个时候提取的时候就不准了哈。

这个t恤的时候就不准了,说大家要真的做这么一个东西,干脆就自己做光源,直接用四个点儿是吧,这四个点就可以了,当然我们这个呃我们可以在就是不一样的一个方向这个照明啊,这这这个图会选择这个,有点冒犯了。

冒犯这哥们了,不好意思啊,没啥问题,哎我们就可以看到,诶这个sketch的一个提取,就是深度变化边缘的一个提取,实际上我们也是呃对这个左右上下左右照明的。

顺着这个方向的一个规定词来把这个depth的一个edge来提取出来,这个其实就可以很容易地得到它的一个sky一个图像。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

今天给大家讲了一个competition of illumination的第一课,这个问题就是我们举个例子啊,这些例子,还有啊像hdr capture的例子啊,还有一些像啊。

刚才讲到一个light position,还有oranorientation,还有刚才非常有意思的一个depth camera,这个怎么样是提取一个sketch,这是今天的课,比较简单比较简单。

大家可以很容易地理解到底做了什么,这个后面我们会逐渐的讲到我们这个illation怎么在实际里面做调制,然后面我们这个模型这个成像的模型会变成什么样子,然后在空域的调制,或者模型又会变成什么样子。

它会牵扯到非常多的一些逆问题,这个也非常有意思,也会有一些工业的应用来做这块的人呃,是是比较少哈,是比较少,这个也需要大家啊好好的去掌握一些专业知识,今天的课程就到这里,同学们有什么问题吗,升华。

好既然同学没有问题,那再次感谢大家来到kim 204啊,今天的课程就到这里。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

17.游戏引擎Gameplay玩法系统:高级AI (Part 1) | GAMES104-现代游戏引擎:从入门到实践 - P1 - GAMES-Webinar - BV1iG4y1i78Q

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Hello,大家好,欢迎大家回到games104,现代游戏引擎的理论是理论与实践,我是王熙,那个首先的话一周过得非常的快啊,然后这一周的话就是啊,应该来讲是我们压力很大的一周,待会再跟大家讲。

为什么压力很大,那首先的话呢很开心啊,上一周我们决定要给大家送我们的T恤,有的同学说我们是不是以讲课为名,实际上走上了带货的道路啊,这个帽子贴的还是挺好的,我们可以考虑一下。

将来以后我们要不要靠卖T恤为生对吧,支撑我们开games104这门课的这个经费,毕竟我司经费很紧张,然后的话呢然后呢因为这个要给大家发T恤,就骗了大家很多的社区,你的留言,然后就发现哇都是人才啊。

我觉得特别有意思,我这里面选几个比较好玩的,比如说有同学告诉我们说现在自己是准妈妈,然后的话呢,正好利用这个假期去这个学104课程,这就是算法胎教对吧,我们游戏引擎算法胎教。

还有同学说哎我们就是哎呀这个设什么来着,不好意思说那个词了,我们叫社会人吧啊说说实话确实是这样的,因为我已没有当过老师,所以我就是个程序员,那我就把我自己写程序遇到的所有的痛苦啊。

包括我发现我不懂的知识就跟大家一起去分享,所以相对来讲就比较真实一点,比较实战一点,然后很有意思的一个同学跟我们讲,说,他那个开始学104肢的时候啊,还是一个在学校里面有毕业这个课程,上着上着。

现在已经变成了社会青年一枚了,所以的话呢,就是说我觉得其实社区的同学们反馈,真的很好玩啊,还有人说要把很多我们游戏引擎的黑化,打印到我们的这个就是这个T恤上来,对此处的话。

我觉得我们我们get的这个商机的点子了对吧,我们后面的话就继续走在这个什么,以课程为为名卖T恤的这个不归路上,继续往前走,那么接下来就跟大家隆重的宣布,我们就是我们的T恤最后选择的是什么对吧。

那此处应该有什么当当当的效果音了,但实际上的话在B站上,同学们已经看到我们投票的结果了,其实两款T恤的这个就是选择是非常的接近的,真的说明什么说明都很好看,真的我自己也是很难挑的,我两个都想要。

那么最后的话大家选择了我们的第一款,那么这里面的话呢,就是说,希望同学们在我们每一节课的后面去留言,然后呢,我们每一节课我会选十个我们的幸运的同学来,我们会把T恤送给大家,到目前为止的话。

我们还没有任何的商业计划,怎么去卖这个T恤,我们都不知道怎么去收费,所以我们只能采取送的方式送给大家,那就是其实非常喜欢,就是同学们那个跟我们一起玩一起互动的,这也是我们104的精神。

我觉得真的有一个地方,就是让大家一起很开心的去一起学一些,我们觉得感兴趣的东西,因为真的创造这样的一个虚拟世界的感受,真的很快乐,非常的快乐,包括我这次准备我们这节课的时候,我一直在说,哇真的很好玩。

太太有意思了,我恨不得马上就去写代码了,所以其实呢我们从社区里面,其实真的有的时候蛮感动的,比如说啊有些同学他不会在社区里发音,但是他会给我们发那个笔记,他们自己会把每一节课的东西记下来。

然后我看了之后,我觉得哇太棒了,我一直在想说,我们花了这么大的心血准备了104的课程,将来以后能不能把它整理成一本书,这样的话就把我们说的内容整理成册,这样方便大家去看,那这也是我们后面可以想做的很多。

有意思的事情,而且就是说我觉得这真的就是社区的感觉吧,那我们为此呢,就是我们稍后我们的课程组小伙伴们商量,就是我们专门申请了一个新的邮箱,这个邮箱的话,你就大家如果有一些就是课程相关的。

一些就是非public的问题的话,比如说你做了一些有意思的建议呀,或者是一些好的这种笔记啊,大家可以发到这个邮箱里面,扣了引擎专用的邮箱里面就发给我们,然后的话呢我们这边的话,同学们的话如果看到了。

就是诶我们可以做什么的话,会给大家一些反馈,反正就是说我们这个community,对我们来讲是其实是最重要的,然后最后呢就是回答一下同学们的一些问题吧,我们发现这个这个星期的话,同学们的问题还是蛮多的。

第一个同学问我问题,就是说啊这个问题其实是蛮蛮蛮,怎么说呢,我觉得蛮黑暗的对吧,就是老头环里面,这个AI去读了这个玩家的书对吧,据说有rumor是这么讲的呢,这个玩意儿到底算不算AI未来主流的发展方向。

那说实话呢,这个从就是真正的就是叫经典教育上的游戏,AI来讲的话,我们会认为他是作弊的,因为很简单嘛,就是游戏AI的核心的一个,就是我们叫做一个啊叫道德规范,就是说你不能够超越玩家获取额外的信息。

否则你的那个行为看上去就是啊作弊的,就像我们比如说我们做啊cs的AI的话,我们不会说让AI知道整个地图,你必须是你能看见一个什么人,你只能通过你听到的脚步声,这样的话那个AI体的行为才像是我们的期待的。

这个就是人工智能体的行为,但是的话呢其实对于那种就是说动作打击,交互要求很敏感的这样的一些AI bot的话,确实你如果只是从玩玩家的这个最后的行为,比如说同他的位移啊,从它的位置变化。

你去反向推导它的intention的话呢,这件事情确实是很难的,如果你真实做过AI的话,就知道这件事情非常难,所以作为一个practice,就是说作为一个游戏研发者的话。

我认为就是老头环的这个选择是完全合理,可以接受的,因为这样会让他的AI更加的灵敏,更加的反应敏捷,其实是增加了我们的游戏乐趣,但是不是所有的游戏AI都这么做的话,那我认为这道大可不必。

比如说我们做个RTS游戏的话,我不要读对吧,玩家每一秒的这个双击操作,因为你做RTS游戏,大家知道就是我有大量的无效的点击,对不对,我就是手手抖,抖得很开心,我就点了,你怎么样嘛对吧。

那这个时候我要把这些input,放进我的AI体系里面的话,那肯定AI就疯掉了,都不知道你要干什么了对吧,所以的话这是我的观点,那么第二个的话,有同学问我们说,这个AI计算机的游戏引擎。

到底给多大的budget啊,这个问题其实啊是一个怎么说呢,我认为是一个呃仁者见仁,智者见智的问题,因为根据你不同类型的游戏产品来讲的话,我们给AIF的budget其实真的不一样。

你比传统的我们会给AI大概比如说一毫秒,2ms的计算时间,对不对,但是实际上如果你这个游戏的话,它就是一个策略游戏,打个比方,我是一个呃很复杂的一个那个。

比如说turn base的strategy game,就是回合制的策略游戏,它你有一个很大的世界,需要你模拟你上百个君主的这种行为,那么这个AI的话我就可以把这个给的高一点,让他大量的去进行精细的计算。

让这些那个那个就是说每一个NPC的王国的,那些君主的行为看上去很像人类一点对吧,那这个我的AI的bug就可以的非常的高,那么这里面做A我讲了之后,大家就能想象到什么什么游戏了,对不对。

什么著名的什么什么社对吧,他们的很多游戏好像跟这个都有点像,但是的话呢如果比如说比较real time,比如说像我们的,比如说这种射击游戏啊,或者是更快的这种设计,应该已经非常快了嘛。

那其实我们有的时候会给AI的8G的,相对小一点,比如像单机游戏里面,有的时候啊我们的AI体数量并不是特别多的话,我们的bug呢点的呢,对于每个单个的AIK的会比较高,所以你会发现。

其实为什么你们打网游的时候,经常会发现很多AI显得有点笨,但是你玩单机游戏的时候,你会发现AI很聪明,那实际上的话就是预算给的是不一样的,所以呢包括像这里面有一个小细节,就是同学们如果做AI系统的时候。

他的ticking并不需要每秒钟30帧,60帧,它跟rendering是彻底的分离掉的,所以AI可以相对低频的进行更新,比如说一秒钟几次问题也不是很大,甚至有一些比较复杂的运算。

你一秒钟更新一次策略也问题不是很大,所以的话呢就是说真实的一个游戏引擎,AI系统的话呢,它的架构实际上是分很多层的,然后有一些更宏观的东西,我会低频一点的更新它,有些这个就是啊低调的东西。

我会高频的更新它,而且呢这个后面会讲的,就是说其实很多的算法可以混合着用的好的,然后第三个问题的话,同学们就问我们说这个就是说稍等啊,我看看就是能不能用分布式的这个系统,把AI从客户端把它分离出去。

就因为AI里面做那个客户端里面做AI很费嘛,我能不能比如说把它放到服务器上,甚至放到云上去做这件事情,其实在现代的游戏里面,已经是很多的一个实践了,practice了,比如说在很多的网游里面。

我们已经可以把AI变成一个,独立的这样的一个服务器了,就AI服务器对吧,包括像那个pitch这种东西已经很成熟,那我们完全可以把AI,直接预购于我们的游戏引擎之外,它就变成一个服务在那。

然后呢我通过Python接口去调用它都可以,所以这个事情呢,我认为是未来的一个比较大的一个发展方向,但是呢这个也很难以一言以蔽之,因为什么呢,比如说我们假设玩一个手游,那手游它所有的计算。

它就在那个小小的那个那个那个那个方寸之间,那么你可能就要用手游自身的那个,就是AI推理芯片对吧,所以的话呢但是呢对于一个复杂的,比如说多人的mm或者是一个网上的虚拟世界。

我们确实是可以把很多AI变成一个独立的服务,那这里面的话呢就是这肯定是它的好处,因为这样的话,我的AI可以做的非常的丰富和复杂,但是呢他带来的坏处是什么呢,因为AI能计算它有个很大的前提是什么。

我们前面的课程讲的叫我要做perception,什么意思,就是说我要不断的从当前的这个世界里面,抓取各种各样的状态对吧,那这些状态从各个世界里抓取出来,然后呢,通过比如说网络那个transfer。

到我的AI的server的话,这个过程其实是比较废的,就是有的时候你计算本身可能还可以,但是你把这些这个perception的这些data,就what state status。

就是世界的状态那个packaging,然后serialize到DISCIALIZED到我的AI服务器,可能有的时候是很麻烦,而且如果你是分布式的AI服务器的话,我还得同时穿很多很多份,但这个事情的话呢。

就是这都是一个balance,就是说如果你的AI的计算本身真的是足够,expensive的话,我们认为这件事情还是值的,你要是问我,大家问我个人的观点的话呢,我我会比较喜欢这种架构,因为这种架构的话。

它很符合我们做引擎架构的一个叫decoupling的,一个一个一个原则,就是说我把各种那个就是说计算变成一种服务,那这个每个服务它都是独立的maintain,足系的独立的维护。

他彼此之间的话是通过一个数据协议去交换,这样的话大家想象一下,如果对于一个超复杂的一个虚拟世界的架构造,来讲的话,比如说某个AI服务器坏了对吧,那我的游戏还在玩怎么办,诶我可以重新再起一下这个服务。

把这个东西再pick up,把整个链接全部建立起来,那这样的一个架构,它是不是一个很鲁棒的架构呢对吧,所以我个人是很pro这个方向了,所以我觉得问这个问题的同学应该是蛮专业的。

因为这是个很专业向的一个问题,好OK那就是今天的话呢,我就挑了几个问题跟大家去回答一下,其实这个问题是我们课程组,课程组的小伙伴们挑的,但是我觉得他们挑的质量真的很好,OK好,那接下来的话呢。

就回到我们今天的课程的主题了,叫什么这个高级的AI系统对吧,这个也是我们这一次这个跟大家准备的很久的,这门这个这个这个section就是AIAIAI好,那其实呢实话实说啊,这一节课准备的啊。

它的惨烈程度远远超过了我们的想象,就是本来不是说我们AI本来只讲一节课,然后我们准备了一个180页的PPT,后来我们把最后的大概40页到50页摘出来,说我们单独讲吧,因为一节课实在讲不下去。

然后等我们开始再去准备,这一节课的内容的时候,发现它又涨到了150页,160页的PPT,而且的话呢我又内心产生了一个冲动,我说哎要不要把这个AI分成两趴,一趴,我们就讲一些传统的,比如说HTN啊。

GP啊,这些方法,包括蒙特卡罗方法,然后deep learning单独再去讲一讲一他,但是这个告诉大家一个坏消息,最后我还是克制住我的冲动了,因为实在是干不动了,所以呢我们这次今天的课程密度会非常的大。

就是我们会在一节课的时间里面把从传统的,比如说HTN呐,GP这些方法,然后呢,再讲到A蒙特卡罗的蒙特卡洛树的搜索的方法,然后再给大家讲a machine learning,那实话实说啊。

我这节课准备到后来,我的状态是什么状态呢,就是呃我写到就是我合到后面的PPT了,我已经忘了我前面在说什么了,包括我今天在上课之前的话,我在整个过这个PPT,我发现我已经忘了好多东西了。

就是那一页我到底在讲什么东西,所以同学们如果在课程中发现,我已经开始神情恍惚,然后开始去找我,为什么要写这些PPT的时候,请大家提前给我一个免死金牌,因为确实这个感觉是好几个不同的universe。

我们在一起来回的跳跃,但是没关系对吧,我们games104的课程是什么,就是互相比干嘛对吧,我们就是这个内卷到卷到极致,所以今天我们开卷好,那今天我们就卷一个比较硬核的,这个就是高级的AI系统。

怎么去做呢,首先的话呢我们来个开胃小菜叫HTM,就是说层次任务网络对吧,就是hierarchical task network,那这个东西呢实际上大家在上一节课,我们学过什么。

我们学过behavior tree对吧,行为数,行为数其实真的是个很好的东西啊,而且我对他的感情非常深,因为我以前是在BANGESTUDENT,我今天穿的就是halo reach的这个这个T恤对吧。

然后的话呢那那个时候呢,biai tree当时也算是班级给行业做了一个贡献,那么好,you try其实很好,但是呢它有没有问题,其实它有一个很有趣的小问题,就是说当我们的设计师在一个一个的构建内。

一个个的节点,比如说selector a sequencer对吧,我就依次规划我的行为,其实它更像是一个就是反应机器,叫reaction machine,什么意思。

就是说当这个世界给我各种各样的输出的时候,我要做出各种各样的反应,它更像就像我们讲的,就是我是一个呃,怎么说呢,我是一个无脑的条件反射的,像巴甫洛夫这样的一那只狗,我看见了闻到了什么东西。

我就做出以下几个动作,但是我们的人类的行为实际上什么是consciousness,就是我们有意识的,那意识最重要的是什么呢,就是我要有一个主观意图对吧,我想让我自己变得更好,我为什么要健身。

因为我想让自己的这个身材更好一点,我其实是有一个目标的好,实际上当我们的设计师在构建那个,behavior tree的时候,你看着他做的是一个一个节点的展开,但其实他更多的是说。

我希望这个AI能够完成这么一件事对吧,他能保护好自己,他能够成为这个战场上最猛的那个AI,能够让所有人都恐惧它,它它是有够的,那这个时候其实在hierarchy,就是大家就会发现。

be AI tree实际上是有一个很大的一个局限性,就是它不直观,但是今天大家如果真的去看一个,be AI税的这样的一个编辑器的时候,你会发现大家会做很多事情,在上面打个框,上面写个注释。

说哎我这一棵子树是做什么用的,这个时候是通过什么方式表达的,是通过注释的方式告诉大家说,你别看我这边一会儿用selector,一会用sequence,但实际上我做的一件事情。

就是说确保我的这个啊NPC不会饿死,或者确保我的NPC不会这个中毒之后,他自己知道把自己治疗的好对吧,我是有够的,那么HTN的话呢,实际上就是从另外一个角度来解决这个问题,他是从这个任务目标出发的。

那么HD这个东西呢其实用的人其实蛮多的,就是说比如像最新的那个horizon对吧,像这个就是说啊这个duck so对吧,这些大作产品都用了HTN这样的一个架构,那HN的话它的核心思想是什么呢。

其实就像人类一样去做一个计划,比如说今天我要去这个学一个东西,就是我要去学一门课,那我首先做一件什么事情呢,我首先要去查资料对吧,我的第一步我要准备学习资料,那这个时候呢。

他首先是他要把我要上这门课的东西,分解成好几部,第一个就是诶我要去准备资料对吧,我要到这个教室,我要开始学习,然后呢我要去在课程之后回答很多问题,做一些q and a,你看这是不是很科学合理,对不对好。

那我在这个准备这个学习资料的时候呢,其实我的选择有很多,对不对,我可以去选择去图书馆查资料,我也可以上网去冲浪查资料,所以这里面我们会出现一个selecting的过程。

所以你看这个行为是不是很像一个behavior tree,对吧,但是它的整个这个寓意感是完全不一样的,就是包括这一棵树状结构的东西,大家理解起来其实非常符合人类的知觉,这就相当于是说。

我们对任何一个AI体的行为的话,我们把它表述表述成若干个我要完成的任务,以及为了完成这个任务,我需要完成多种的子任务,包括每个子任务有哪些选项,这样的逻辑就清楚了,那么HTN的框架是什么样子的呢。

实际上它基本上你可以翻成这么几大块,第一块呢就是叫一个叫worst days,就是这个世界的状态,还有一个什么呢,感知器,感知器呢非常像我们之前讲的这个perception。

这个地方我是真的是要小小的吐槽一下,就是这两个名词呢,实际上是作者就是原文你们定义的这个东西,但是说实话这两个东西都非常的confusing,比如说worth state,我自己的感觉。

就是我觉得初学者特别容易犯的,一个错误是什么呢,就是说大家会觉得worth state,是对世界的这个状态的一个真实的描述,比如说哎这个我面前有几个敌人呢对吧,这个战场的情况。

比如说我在这个关卡什么阶段呢,包括我自己的这个血量,但实际上这里的worst days,并不是真正的一个客观的世界的一个表达,是一个主观,就是在我AI体的大脑里面,我对这个世界认知。

你看这个做这个书算法的老哥,我感觉是有点哲学性思维的,就是说我们在那个就是在学哲学理论的时候,不是有一个叫什么主观唯心主义是吧,什么客观唯唯物主义嘛,对不对,主观唯心主义认为什么呢。

认为整个世界都是假的,都是在我的大脑里面,就是我就是我的认知里面构造了逐这个世界,它让我怀让我相信外面有个客观世界的存在,但这都是一个幻想,你看这么深奥深奥的哲学原理,就这么偷偷摸摸的。

就塞到了HTN的架构里面了,而这个地方是特别容易犯错的,就是说其实worst并不是真实世界的访问,而是在这个AIT大脑里面,他对这个世界的一些关键要素的一个一个思想,或者是一个一个提炼。

那么sensor呢更像是perception,就是他负责从游戏的整个环境里面,抓取各种各样的状态,这两个概念一定要分得很清楚,因为待会再算算法的时候,他他俩就会起作用,那么接下来的话呢。

就是说在这个TM的这个框架里面的话呢,我们有一个就是那个H键多M,这个多面里面的话呢,其实放的就是一个我们的很多的就是层次化的,像树状结构的task以及它之间的关联关系,这个待会展开,然后呢。

当他这个就是树状task全部在里面规划好之后,根据现在就是AIT看看到的这个,他感知到了这个世界的状态,然后呢他会做一个计划,比如说我会当然了,我首先会选择一个task,比如说我的task是上课堂。

那我接下来就会规划,我要做12345很多的这个task这个事件,这些task就是通过一个planner把它放到这,就make a plan,当你的一个plan有了之后。

接下来有一个就是plan那个runner,他就会依次的执行这个task,但这里面有个细节,就是说我们做好一个计划,我们去执行它的时候是不会一帆风顺,应该不会对吧,中间比如说整个世界会发生很多变化。

或者说我高估了自己的能力,比如说我觉得我三天可以学完高等数学,想想哎呀,等我考试前学到第二天的时候,明天后天就要考试了,其实我已经放弃了,因为我觉得高数这门课算了,我放弃吧,对不对哦。

我在我在我在大学的时候,我经常是这样子,我最后三天准备一门考试,但是学到第二天的时候,我觉得啊算了,我放弃治疗了,这门课学分我不要了对吧,那其实TX在执行之后,你自己也会产生很多的问题。

比如说血量不允许了,对不对,你本来觉得你可以干掉那个小怪,但是呢这个时候突然背后冒出了一个小怪,他背后射了你一箭,你血量其实已经不够了,你本来觉得你能干得过他,但你干不过他,对不对。

那这个时候实际上ta runner,它会监控所有在执行的这个task的状态,如果发现你干不了的时候,诶他会告诉你,接下来会启动另外一个课程,后面会详细的展开去讲,叫做replay好。

所以同学们的话首先理解这个HTN,它是这么一个架构,这个架构很有用,因为待会我会跟大家去讲另外一个算法叫GP,就是面向那个目标的这样的一个优化算法的话,其实这个架构这两个架构非常的接近。

那么这个时候诶我们怎么去构建这个事件呢,那你首先要构建的东西是什么呢,是task任务到底是什么,在HTN里面的话呢,它定义了两种task,第一种task叫primitive task。

它是最简单的用task,它更多的就是一个动作,而第二种呢我们叫做compound task,叫符合任务,符合任务的话,它其实是HTN的核心破,它或者是它的精华好。

我们先讲最简单的这个primitive task,那么这种原子形的这种任务啊,它跟我们之前halo trade里面的话,有一些小小的不同,大家还记得我们在别墅区里面的话。

我们并没有强制要求说每一个立业节点,我一定会给他加一个precondition,对不对对吧,包括我们一个动作做完之后,对世界有什么影响呢,其实在B车里面并没有明确的去讲,对不对。

但是在这个就是HTN里面的话,我们每个premiere task,我们实际上是有三个关键要素的,第一个当然是你动作本身,动作本身怎么办呢,你写个脚本执行也好,写个什么执行都好对吧。

但是你要给你的这个动作要加一个precondition,就是说你在你的word里面哪些state满足了我的条件,哎我这个task才会真的去执行,否则的话我会返回一个force。

第二个这个task执行中间的话,我肯定也有可能会失败,并不是所有task他一定会成功,虽然你就算所有的PREGENTATION全部满足了,这一点大家一定要注意诶。

最后做完之后我呢还会去修改这个世界的状态,对不对,我做了动作的目的,为什么不就是改造世界嘛,对不对,所以当我们去构建一个HTN的网络的时候呢,哎我们这三个东西要素一定要有,这三个要素呢其实是有妙用的。

但是呢这里面大家注意一个事,就是它的前置条件,它其实是对stage的一个毒的操作,就世界状态的一个毒的操作,对不对,那么effect或者叫EFFECTURE,就修改就叫修改器的话呢。

它是对这个世界的一个反向的一个写的操作,这里面举一个例子,比如说我们第一个print task就是这个啊,我们要用这个解药对吧,那它的前提是什么呢,我首先要有一瓶解药对吧,那我最后如果这个用解药。

就是我这个喝完这个解药这个动作成功了之后,我对世界的修改是什么呢,诶第一个,我现在这个我的这个这个,这个就是说我的解中毒的状态,会被我解消解除掉,对不对,第二个呢很悲催的是。

我的那个解读药水数量得减个一,你看这个是不是很简单对吧,那么包括就是说诶,我们假设用一个超强的这样一个解药的话,我们会发现,就是说第一我首先要确保这个药物是有的对吧,但是呢哎我这个万能药我用完之后。

首先我万能药很悲催的要减掉一个对吧,但是呢我无论是被中毒了呀,还是被这个什么sleeping玩家,这个状态我全部给解掉对吧,你看很简单吧,但是的话你会发现就是刚才刚才我们讲的。

就是说PREGNITION是读取世界的一个状态,确保我这个动作是最基础的条件是能满足的,我能执行的这个动作,假设执行真的成功了之后,我会去写这个世界,这跟我们人类一样的。

我们人类perception感知世界,然后我的consciousness,我的主主观意识让我做出很多行为,但我的这些行为最后产生的结果是什么,我们又会改造这个世界对吧,否则的话这个世界就太无聊了嘛。

一定是要我们来改造的嘛,好那primitive task就很好理解了,那接下来就来了一个最有趣的了,就是哎符合任务,其实符合任务啊,他我觉得一个最简单的一个解释是什么呢。

就是首先首先跟他讲原书上的定义啊,他就讲说哎一个符合任务呢,他首先是有很多的method构成的,那么每个message有一个一组precondition,就是那这个method的。

其实他从上到下本身暗含的是什么呢,叫priority,就是说当我一个任务过来的时候,我每一个message,你可以认为完成这个任务的一种方案对吧,那么我有三种不同的方案。

那最后我会让你优先的选择第一种对吧,如果第一种的precondition不满足的话,不好意思,那你就选择第二种吧,对不对,如果第二种不满足的话,那你就尝试第三种呗,那么如果三种你都不满足怎么办。

我就算我失败了呗,所以这里面是个什么东西呢,大家如果回想一下,上节课你看隔了一个星期,其实说实话我已经忘了,但我希望同学们不要忘了,就是上节课我们讲了什么,讲了behavior tree对吧。

halo里面那个东西叫什么叫selector,对不对,那其实就component task里面的,它的method之间的话,它更像是构建了一个selector,诶,更有意思的东西就来了。

他每个method叫我完成这个task的任务,我们完成这个task5的方法,实际上呢它不是指向一个单一的task,它可以放一串task,那为什么他要放1tron task呢,这个是什么呢。

就是说哎我这个完成这个任务的目标啊,其实我要做很多次任务,这些子任务你必须要依次成功地执行完,我这个方法才是真的成立的,诶这个地方像什么东西了,是不是很像我们上behavior tree里面讲的。

那个叫sequencer对吧,依次执行,所以其实你去理解他的common task,就是有的时候你就觉得很生气啊,你说你写HDN的文章的老哥,你非定义了这些东西。

如果你给我做一个behavior trade analogy的话,我不就秒懂了吗,说实话我当时读那个paper,我读的很透很透的,我们团队讨论了半天啊,就大家就是各种细节的讨论。

但最后的结论是他两个东西,它就是一个这个selector,再加上一个sequencer,形成了一个组合,当然这里面肯定不一定准确,还是有很多细微的差别,但是呢作为大家去理解这个符合任务的话。

这个大概也明白了,说你很多后面的算法你就大致能看得明白,但是我这边要提醒大家,就是说真的同学们实现一个自己的HTN的话,还是有很多小细节了,大家千万别为我这个就是简单的类比,给带到坑里面去了。

好那么这个逻辑的话呢,实际上我们去看这个就是诶,我们构建刚才那个案例里面,是不是变得很简单了,比如说我想要解读的这个任务,那我首先就问说啊,你有两个选择,看见要我就先喝解药,我就先喝下去。

但是说实话这个我们都是小气的人对吧,那我首先干嘛呢,我优先看看我能不能造出药,这样的话减少我要的损失对吧,所以呢我的第一个选项就是诶,我是不是有足够的材料,如果有足够的材料,我干嘛我开始造谣啊。

那怎么去造药呢,我的我的,我的这个方法里面的第一个task是什么呢,Make a portion,就是我先造解药,那造解药的话呢,就是哎你以为你的挑战,其实这个地方写的不够严谨啊。

实际上make a potion,那个power,前面preparation还可以再去check一下你的材料够不够,这个时候哎如果我材料够的时候,我把材料给它剪掉,然后呢哎我的药数量就会增加。

第二步是什么呢,诶我来去use a portion对吧,就是我首先再次确认一下我是有药的,然后呢接下来我把我的状态,整个我假设我的喝完药水之后,这个动作做完之后,那我的状态肯定会恢复吗,对不对。

然后我的破损数量减一嘛,但是呢如果这个时候诶,我第二个选项哦,这讲错了,第二个选项是什么呢,我实在没有材料怎么办呢,我去买一个破损对吧,你看这个这个这个NPC是很小气的,他身上有药水,死活不用,他。

首先是要么去造,要么去买,实在不行才用自己的好,这个时候我就去买,那买的话呢,我的我展开的第一个方法,就是说我先去买一个portion,然后我才去用它,但这里面再展开就很多的细节了,大家会发现诶。

实际上用这种方法去展开一个行为,书的话,展开一个行为,就是这个这个NPC行为的时候,是不是非常符合人的这种直观的理解,这也是我个人觉得,我对HTN的一个很好感的一个地方,就是说他确实就是非常方便。

就是设计师去构筑他自己的逻辑体系,因为别说去的话,包括我们之前跟设计师一起讨论的时候,会发现,其实理解和陪,就是大家训练起来还是比较抽象的,很多人是要花很多时间去理解。

就是这为什么我用怎么用selector sequencer,去构建一个比较合理的逻辑,20天的话,在我的理解中更像是把这个东西直接打包了,你呢就不用理解什么select a sequencer。

你就理解成就是单一任务,就是原子任务和复合任务,原复合任务里面它它永远只有这一个策略,就是你有一组的选项,你可以优先选择谁,选择之后,那接下来你就12345,依次完成这个任务就完了。

那么之间它到底是用selector还是用sequencer,这些抽象的名词,你就不用去记了,因为其实理解select sequence,这两个抽象名词本身也是很费时间的好,这就是我们这个HTM的两大。

这个这个就是HDMDM,就是我们DM就是它最核心的这个这个空间里面,两两大核心,这个这个这个怪神兽,一个叫primitive task,一个叫compound task。

那其实这个时候我们有了这两大神兽之后,我们就可以这个构建就像零一样的,我们用零一就可以构建整个HTM的这个DAI,就是它的空间,那么这里面的话呢,有唯一一个特殊的东西是什么呢。

哎我们需要把一个task定义成一个叫root task,就是我的根节点的task,那所谓的root task其实想想也是很简单的,就是说一大概率他应该是一个component task,对吧。

是一个符合task,然后他就定义了我作为一个,比如说我作为一个精英小怪,我最核心的几大行为是什么,我作为一个精英小怪,我首先是要砍人的,对不对,但是呢如果我血量不行不行了,比如说我中毒了怎么办。

我得救自己对吧,如果我看见一个一个一个老哥,我打不过怎么办,我得逃,对不对,然后实在不行,如果什么敌人也没有对吧,我也没什么状态干嘛,我在那得闲晃对吧,所以说其实root task他是核心的。

就是是非常方便我们的设计师的理解,就是我从最high level去定义,我的这个老哥的几个关键行为,然后呢你再一次一次的把它展开,直接涨,一直展开到什么呢,Premium task。

所以说呢HTN的这个网络的话,就是其实那个树看上去蛮干净的,蛮好看的好,那么其实呢就以刚才那个为例的话,比如说我们一个就是小怪的行为,他首先是什么诶,首先确保自己的活命,所以首先如果发现我中毒了。

我首先优先保证自己不要被这个中毒了,如果看到一个牛逼的精英怪,我首先干嘛呢,我要逃跑对吧,保命要紧,如果发现是个普通小怪干嘛,我要去进攻它,你如果按这个逻辑,你看这是一个很简单的一个bot的AI体系啊。

你就可以这样把它recover,怎么去保密的地方,我们就展开了,对不对,这个地方他的就是你从这个就是啊解,就是解读这个这件事情呢,这个任务来讲的话,诶我会把它分成三个选项。

第一个选项是说第一种可能性是说如果有药水,我优先使用药水,如果没有药水,我去找一个药水对吧,如果这个药水也找不到怎么办,我就用我的万万能药对吧,那接下来依次展开了,比如说我怎么样子去这个找一个坡式呢。

那我首先的话去造一个,造一个的话就要找材料,要不要去造,但是呢如果我造不了怎么办,我去买,那我买的第一件事情干嘛呢,诶我要先去跑到那个npc store,怎么样,很好理解吧。

就是其实这个s ti我觉得它设计的巧妙的地方,就是其实我拿着一颗behavior tr,跟一个这个怎么说呢,非游戏行业的同学去解释我想干什么的时候,很多时候大家会懵掉,但是HTR它已经简化到叫做。

我觉得我跟一个就是啊就怎么说呢,这个中学生小学生去讲这个游戏是怎么设计的,他才能告诉我说我AI就这么设计了对吧,所以我觉得这个事情还挺牛逼的,已经一个一个一个点好,诶。

当我有了这样的一个就是tn多man之后,接下来我干嘛,哎我要开始做规划了,做planning了,这个plan的过程其实刚才讲完之后,大家就会觉得已经不难了,对不对。

那我首先的话呢根据现在的worst state,你不是有一个root task吗,那我实际上就可以根据你们的priority,我就知道咱们优先选一个我的go,就是我的当前的目标的这个task对吧。

那第二件事情呢,就是哎我既然你有了目标的task,那我就从你的method开始,去把你所有的task开始去展开一层的展开,对不对,一直长到你的primitive开始,但这里面呢有一个细节来了。

这个细节是特别容易犯错的,就是说其实我在这个展开的推演过程,这个过程呢是电光火石之间呢,就是我现在脑子中产生的一个概念,叫做我要去啊解读,那这个解读我现在想到了,说诶我就要去买这个这个解药。

那买解药的时候,这时候我就需要去这个去找到那个NPC多,其实这里面的话呢,我的每一个premium task的话,它都会有一个effect,就是如果我这个任务完成了,假设成功了。

我对这个世界的状态是不是有个修改,对不对,所以呢你会发现,如果你脑子中只是这样在展开,实际上你的这个对世界的修改它不会存出来,但是呢你接下来的计划就没法做,为什么呢,因为你比如说你去买到一个解药。

实际上是你后面用解药这件事情的precondition,那你后面的这个计划过程就会失败,所以呢他在这里面有个细节,就是说他把worst day做了一个,在大脑中的一个拷贝。

你可以想象成就是我把世界的状态变成一张,抄下来,放到另外一张草稿纸上,然后我脑子中就在推荐说,我如果按照你的这个HTN的这个计划,去展开的时候,我做的第一件事我找到那个NPC。

那个shop可能会成功对吧,如果做完了他就成功了嘛,那我就可以找到那个NPC好,第二件事情就是好,我mp我已经在那个那个shop里面了,这个时候我开始进行买的新闻,买了新闻之后,我假设成功了之后。

我就会把药水数量加一好,又是钥匙数量加一的话,那我就可以启动下面的使用药水这个操作,所以呢实际上他在做计划的时候,他会假设所有的action都会成功的,诶这个地方就有看了,对不对,大家会发现怎么可能呢。

你这个比如说因为你这个计划做完之后,你真的执行,他可能需要几秒钟甚至是几分钟的时间啊,在这个几秒钟或几分钟的时间里面,会很多事情发生啊,对不对,但是呢他在计划的时候,他是假设一切一切成功的。

接下来我们会讲到一个细节,叫做REPLANNING的话呢,他就在解决这个问题,所以此处呢大家暂且认为他所有的计划都能够,Task,都能不被成功地完成,那这样的话呢实际上就是说。

但是呢我们在计划的时候也是会发现,就是说这个precondition他是没办法满足的,那怎么办,或者说啊,因为有些PREGNITION是整个世界的环境不允许,怎么办,那我只能返回一个force了。

就计算机中间他钻钻钻钻钻到某一步,task说诶你要去买解药,你就必须比如说你要有一个坐席吧,他之后发现其实此时本人已经没有作息了,而那个时候NPC的那个那个那个商店,是在另外一个城市。

你没有办法那个teleport,没有办法那个飞跃,那怎么办,那你就怂了呗,所以那这说明什么呢,他就把这个错误的信息一路往回返,一直就是只要错了,他就往回跳,跳了之后呢,如果发现每一次都没有更好的选择。

他可以一路打回到这个root task的,打回到root task的时候,这时候说哦,那就意味着我的第一个task就是整个失败了嘛,那我就依次往下去走嘛,但这里面有个细节是什么呢。

就是当我们的设计师去构建这个root的时候,有一个细节就是,千万千万要设置好足够鲁棒的default task,你千万不要让NPC不适合看,否则的话,你如果想的所有的task都是那么有挑战,那么有意义。

有可能当世界的条件不满足的时候,你看到的NPC干嘛就傻站在那儿了,就是诶这时候是不是系统出了bug,其实系统没出bug,只是因为现在的很多环境变量并不满足,所以的话呢NPC没有任何输出了。

告诉他该干什么了,所以一般来说我们会配一个什么,比如说default idol啊,比如NPC在那边实在没事干,干嘛,搔首弄姿啊,对不对,给你打打招呼,挥挥手啊,这个这就是很多我们在设计一个。

好的游戏的时候要注意的一些细节好,那这样的话呢,其实当我们去这样的依次的去traverse,就是我们这时候当那个task不行的时候,我们去找下一个task,这样我们就依次循环做完,那到最后的话呢。

实际上我们就会把整个这个数渲染,那个整个整个traverse1遍,那最后的话呢一般来讲,只要你设计师没有做坏的话,我们会输出一串的,我要完成的原子形的task,注意啊。

到最后你HTN它实际上是有component task,和permit task构成,但是这棵树你traverse完之后就是按这种方算法,你整个便利完之后,形成你的这个那个你的这个task序列的话。

它一定是一串premiere task,那这样他就依次执行完,在接下来的话下个什么呢,交给plan runner,就是说A计划执行者开始愉快地执行,我现在定好了这个这个计划了。

英文中有个词叫sounds like plan对吧,听上去我们好像有个计划了,那我们就开干嘛,好,这个这个时候这里面举个案例吧,就是比如说还是刚才那个案例,你会发现就是我一开始去找解读。

解读之后发现第一个use portion那个地方坏了,搞不定怎么办,我就要found a portion对吧,因为我现在没有portion好,那这个时候我就去看看能不能首先优先选择,能不能造一个破损。

造一个破损的话呢,这时候我发现我的第一个message的话呢,是这个就是啊我就好,这个就是我去make a portion,这个事情我也失败了,因为我没有材料,那怎么办。

我我选择了就是bia portion,那这样的话你看那个链路,最后它就形成了几个,最后输出的其实是BIOPPORTION,use portion那个task列表,就是你首先要去买一个portion。

然后呢再去用这个portion,这个是一个极其简单的例子,如果刚才我讲的那个分解的话,你得先跑到NPC,那然后再怎么做一大堆很奇怪的事情对吧,跟他做一些很奇怪的对话,你才能完成,但是呢这不重要。

这都是细节,你只要理解了这个HTN的这个基础结构的话,作为一个设计师,我们可以把这个东西变得无无比的复杂,所以这个呢就是HTI的一个基础的运作模型,那么其实呢当这个时候呢。

我们就会依次的有了这个计划表之后,我们plan runner就会依次的去执行这个计划,但这里面有很重要的点,就是当我们在写这个东西的时候,你会发现诶我的这个这个task可能会失败。

刚才我已经反复解释过了,就是说因为整个AI at它在游戏世界里面,游戏世界是个非常动态的对吧,AI体会对世界有很多的假设会执行,但是玩家也好,其他的AI也好,他们都对这个世界形成这样一个输入。

大家听说过著名的三体理论,对不对,当这个世界的参与者,不再是单一的一个个体的时候,这个世界是个什么东西呢,它其实是个混沌系统,哎这里面我就讲游戏AI非常有意思的地方,就是说你可能每个AI的算法。

是一个非常简单的算法,但是呢如果我给你放入足够多的AI,然后呢放在一起,我既是一个最简单的AI模型,其实整个这个系统的output它其实是不可预计的,诶这个很有意思了吧,所以说我觉得做游戏引擎做到后来。

你真的有的时候会对这种,就是这种这种很玄学的东西很感兴趣,因为你会发现你真的在做世界的模拟,那真的就像我我有的时候比如说我做,我,因为我个人蛮喜欢AI这个东西嘛,就是做完一个AI之后。

你会静静的看着你的AI互打互殴,你可以看一个小时到两个小时,真的这个这个大家如果有机会,你们自己做游戏的AI的时候,你就能体会到我讲的这个乐趣,就是你做了一个bot对吧,然后你就看那些bot在一起打架。

你可以看一个小时,一点问题都没有,觉得很有意思,然后呢打着打看着看着就觉得不过瘾,就开始改它的参数,再让他们再打,直到这个这个这就有点像养蛊的感觉一样,所以其实呢就是说在这样一个混沌的KOS。

这样一个系统里面的话呢,实际上你很多的task他可能都会失败的,那么这个失败的时候,那我们这个task,其实实际上的话就是他就会,我们认为整个这个计划就失败了,对不对。

但这个时候就要启动我们很悲催的行为来,叫什么呢,叫REPLANNING,我们要重新计划了,所以的话呢一般replay一般是这么几件事,第一个就是呢哎我们的这个现在没有计划对吧,还有一个是什么呢。

我当前的计划已经成功地执行完了,或者执行到一半我失败了,还有一个很重要的东西,这个东西其实也是arguable,就是说如果在我的主观意识里面,这个世界已经发生了一些改变,就是sensor告诉我说。

诶比如说你现在做的所有的计划,是假设现在在游戏的前期没有,你比如说我方没有丢掉任何一个夺气点对吧,但是这个时候假设说我的,你现在做的所有的计划是什么,诶我要去抢一个补给点,去支撑这个这个A点的夺取。

打个比方啊,但是这个时候呢,你突然发现世界的状态发生变化了,就是A点丢了,所有人都向B点去冲了,那怎么办,诶这个时候你的计划需要重新制定,所以这个也是很重要的一个细节,就是说就是其实我做的任何一个计划。

你不能僵化的执行,就是我们经常讲就是我虽然永远是有计划,但是呢并不代表我会避,而就是闭目塞尔,就是不关心外面发生的事情,如果外面的情况就是大的格局,大的变量发生了变化的时候,我的计划必须要重新制定。

所以REPLANNING,实际上是HTN网络的一个,非常重要的一个体系,就是很多系统做的好不好,其实REPLENTY这个东西影响非常大,好那讲到这儿的话,基本上我们把这个HTN的这个东西啊讲完了。

那么HDN实际上呢,我认为就是说它是一个非常好的一个东西,就是它跟BT很像,我个人觉得是对BT一个非常好的抽象和总结,那么很容易让人去理解,然后呢,他非常方便的。

让我们的设计师能规划一些长期性的这些行为,那更重要的一点是什么呢,就是说它执行效率其实比BT高,因为BT大家记得我上次讲过一个细节,就是BT他在每一次就是AI被唤醒tick的时候。

他都要从root全部跑一遍对吧,实际上你会发现90%的时候,从root那边TK1边是没有意义的,因为它最后就是停在了那个节点,跟上一次tick没区别,上次那个action没做完。

你这次还等着action做完,但是呢你去把BEAIREE,整个tick和一片那个事儿本身就非常的费,这个地方的话,我们自己做引擎是有血泪的教训的,就是说把那棵树整个traverse1片。

它本身可能吃掉你70%到80的,这个计算的这个那个budget,那么实际上的话呢就是说HTN的话,他就很聪明,他就说哎除非世界发生改变对吧,除非那个你之前的那个task失效了,或者没做完。

我这个HTI我就不用再算了,所以它其实是比那个就是比halo train更高效了,但是我在上节课也讲的就是比AI,却很多时候他们也会做一些优化,但这里面就不会再复述了,但是呢就是说我觉得。

其实这个就是说HTN的话,它有它自己的一个缺点吧,就是说我认为就是第一个呢,他去配置很多的precondition,和他的这个condition和他的effect的时候,它实际上形成了一个。

就是我们叫做一个逻辑链路,就是说我前面规划的动作,他对这个世界的改变,正好能够符合我后面的某一个动作,可能不是紧邻的,可能隔了几步的动作,它的正好的precondition,那么当我有这么多task。

依次的在修改这个世界状态的时候,有可能你这个task本身啊,他很可能形成不了,但是呢设计师当你面对就是说几十个,上百个这样的一个primitive test10设计的时候。

实际上很容易会出现一些小的错误,就是说诶实际上我的这个计划是没办法形成的,这样的话呢,其实说HTN的话呢,至少我自己会认为说,我们需要做一些静态检查工具,帮助设计师的话,能够及早的发现这样一个错误。

就比如说很容易出现的一个错误,就是我设计了一个premiere task,但是我忘记了给它加上一些effect,结果当我这个HM跑起来的时候,这个任务老是生成不了诶,不是说好了吗。

这个上一个任务执行完之后就要执行下个任务,但是呢他自己进行这种可行性检查的时候,他总是发现那个有个state的满足不了,所以他就跳过去了,所以这个事情就很麻烦对吧,那么包括呢。

就是说对于一个长期的一些行为事件的时候,其实呢这个task呢就是你做了一个plan啊,这个plan他链路很长,其实很容易在中间fail掉了,那么你们想一想一个事情,就是说。

假设我们在一个高度不确定性的一个环境里面,我们一个同学他特别的勤奋,他总是做他的这么比如说一年的规划对吧,每一次他会花一晚上时间写出一年规划,但是呢因为环境发生了变化,他每一次执行个不到呃。

几天一个星期这个计划就失效了,他被迫又开始重新做计划了,那么从从他自己来讲的话,他很辛苦,很勤奋,对不对,总是在不停的更新他的计划,但是的话呢站在一个外人的角度,你有没有发现这个这个家伙的行为。

是不是好像很不靠谱啊,今天说了,我要练成一个什么这个世界冠军的肌肉,明天说我要当游泳冠冠军,后天我要说我要做数学小能手对吧,因为一会儿大家觉得这个这个目标好,一会儿觉得那个目标好。

那你会觉得他的行为就很怪异,所以说在一个高度不确定性的,这个环境里面的话呢,实际上HTN这个网络的话,如果你做的计划过过于长,过于缜密的话,反而会导致这种就是AI的行为。

一种我可以称为叫震荡或者叫不稳定性吧,所以这个也是他HTN本身可能有的,这样的一个问题,好讲到这儿,我们H点讲完了,我们第一趴好,那接下来呢给大家讲个更有意思的东西了。

叫go oriented action planning啊,这个呢就是基于目标的,这个就是action planning诶,这里面讲了一个planning这个词,大家对planning这个词怎么理解。

刚才我们讲了planning叫计划对吧,这个地方的话呢,我觉得实际上它最好的一个一个翻译是什么呢,规划大家学过动态规划吗,我相信所有学过数据结构,学过算法的同学,提到这个规划这个词。

是不是突然觉得背后这个汗毛一竖,因为规划问题,动态规划问题是个np hard问题对吧,几乎所有的算法神坑,都在这个动态规划问题里面,那么包括那确定性的规划还好,如果是加上一些随机变量的规划。

那简直就是哎呀欲生欲死,所以呢唉这帮人就想着说哎我们不怕,我们算盘很牛逼,我们就是要把这个就是记忆目标的,我把你的action全部给你规划起来,所以这就是构图的这个这个算法的这个产生。

那首先的话呢科普这个算法,实际上还是一个很很厉害的一个东西,像很多大作,比如像tom reader啊,刺客信条的奥德赛里面,他都是用GP这个结构,那么其实呢它实际上的话呢,他做出来的这个AI的行为啊。

我个人觉得确实更会更加动态,而且更加具有环境的适应性,而且呢它并不需要我们的designer,做很多的这个预先的这些啊,action的这个梳理,待会我会讲到细节,为什么好,他构图的这个。

它整个基础的算法结构是什么样子的,诶大家看这个图,为什么我刚才说我们讲HT n的时候,那个大家一定要记住这张图呢,因为你会发现GP的结构图,好像和HT n好像好像啊,对不对。

你上面还有个sensor对世界的感知,对不对,然后呢我旁边有个什么呢,我旁边有个worst day,我主观上对这个世界的认知好,我旁边我中间的那个H原来的HTN多man,被换成了一个叫goat。

就是那个我的目标集为AI said,我的动作集,然后呢这个时候我通过计算,我会产生我的plan对吧,然后呢生成我的plan之后,我plan就开始被执行一个plan renner。

几乎你看是这个一母所生啊,事实上我一直高度怀疑,就是GP这个东西可能和那个HTM是一个,怎么说呢,是一个同门师兄弟吧,师兄和师弟的关系,确实这里面有很多的思想是很接近的,但是呢这里面接近的东西我就不讲。

我就讲他们的区别诶,这里面很核心的三件事,就是在GP里面的话,第一个你有一个目标题,就是说我所有可以达成的目标,那大家会发现就是刚才我们在讲HTN的时候,不是讲说每一个task,它其实是个目标。

你看我讲的时候经常不小心把task讲成目标,但是呢那个在HT里面的话,那个目标并没有显示的被定义出来,实际上是通过那棵树的结构,你能看出那个目标,所以那个目标是怎么样,那个目标是写在注释里面的。

它还不是真正的目标,但是呢在这个GP里面的话,这个目标我们是要有非常严格的数学定义的,待会我会去讲,哎,你说就是说把所有AI能够完成的事情,我要把它定义成一个一个,可以用数学的方法表达的目标。

第二个呢就是我的action,就是我能做很多的动作,这个听上去和刚才讲的那个premiere task,里面的诶,中间那action不是很接近,确实很像,但是有不同,那最后呢我们有一个叫规划问题。

就是说如果我有了个目标之后,我怎么规划出一个序列的action去完成这个东西,这个里面这个planning不是做计划了,它其实是规划问题,待会儿会讲这个规划,这个地方还是有蛮多小坑的。

那其实go set的话呢,在GP里面的话呢,我觉得有跟大家之前讲的那个HTM有相似的地方,比如说首先它扔到这个go set,这个里面的话,很像一个HTN的compound的那个task。

它是有priority的,就是说你第一个塞进去的go诶是你最想达成的,然后第二个是你其思想达成的对吧,我形成了这样的一个prioritize,这样的序列,此处是不是很像诶,第二个呢。

我每个go呢我一般会设一个precondition对吧,那为什么就是这个go我想优先达成呢,是因为当这个条件满足的时候,那我就肯定优先这购,比如说我最优先的go是什么,保命对吧。

如果我发现我的第一个prefect,是说我现在中毒的话,那我最优先的go是解读,而不是杀死敌人,对不对,那么如果我发现我没有中毒的时候,我才会说诶旁边有没有敌人,我的第二个才是我去争取杀人得分啊。

杀死敌人得分对吧,那依次展开了,所以说这个precondition就形成了一个有效的这个,prioritize的这样的一个一个一个序列,但是呢最不同的地方是什么,其实它每一个go。

它是要用一系列的状态去定义的,什么意思,就是说我希望你做一系列动作,你做完这个动作之后,这个世界的以下比如说五个state要满足我的设定,比如说我希望比如说啊我的存活是true对吧。

然后呢我现在中毒状态为false对吧,等等等等等等,他这个一般来讲的话呢,都会用一些布尔值去表达,因为你其他的比如说用比如说变量大于等于,或者一些其他的没有办法表达的变量的话,实际上比较复杂。

所以这是GP系统一个很高的要求,但是我在解释,为什么这个东西它你要做的这么紧致,但其实你可以做的更广泛,但是它会给你的系统添加很多不必要的复杂度,所以这就是和前面无论是behavior tree也好。

还是HT好,我认为这个本质的区别就是,在BEAIREE也好也好,在那个H也好,你的目标,很多时候是隐含在你的树状结构里面的,虽然我们认为你可以表达,但是你只是写在注释里面,但是在这个GP里面。

这个算法里面的话,你的目标就是用一系列,你期望最后世界上的达成的状态,去定量的去表达的对吧,所以这是一个很核心的一个点,而且呢注意它不是一个单一的一个,世界状态的要求。

它是一个就是connection of the states,或者说一个combination of the state,就是一个世界上,我我认为我目标状态的一个组合。

那接下来的话呢就是说其实这里面举了个例子,就是说哎我如果用构图的方法去表达,我们的游戏AI的时候,刚才一样的例子就是说诶如果我发现我中毒了,我第一件事情我要我最高目标是要解读。

如果这个时候我发现是个精英怪,我最高目标是什么呢,就是逃跑,如果我发现这个小怪干嘛,我要去攻击它对吧,那这个简单的就是用这个方法去表达了好,那么action set的话呢。

跟那个primitive task非常的像,对不对,我每个action我首先有个precondition,因为只有pk肯定是满足我才能够去执行它,然后呢我做这个action的时候是我的动作。

但是呢我最后的结果我还有一个affect your,这个世界状态的改变对吧,就是我对世界状态的毒和对世界状态的血,但是这里面加入了一个额外的东西是什么呢,就是cost,就同样。

比如说因为在整个构图这个算法里面的话,我们不会有一个有一个树状结构,或者是图状结构,把所有的action串在一起对吧,我没有这个东西,那最后当我一个目标放在这的时候。

我是选择a action这个方向去做呢,还是选择b action方向做呢,那是不是有一个好坏的评价,所以这个时候我们的设计师就起作用了,设计师会说你现在呢这个造草药,这个cost是最便宜的。

但是呢你现在如果要去买草药,你要干嘛,你要徒步走到那个这个这个这个要那个那个NPC,商店那边去,要花很久,而且中途你可能会被会被冒出来的,这个怪怪物给打对吧,那他的cost是高的。

所以这个地方就是设计师的一个经验输出,告诉你说这个action set到底是啊有没有作用,所以这里面就引入一个量叫cost,唉大家想想为什么地方要cos呢,因为想象一下我们几乎所有的动态规划问题。

是不是都要考虑cost对吧,从最简单的最短路径来讲,不就是要希望我们的这个成本最低吗,cos最低吗,这个地方planning的这个词又被激活了一下,那其实呢我有了这个一组的整个的这个目标,对吧。

我随便我我选一个最高优先级的,我又有很多的可选的动作集,接下来就看我怎么演出了呀对吧,那我有了目标,我怎么演出了,这个里面的话来去理解构图啊,其实有一个最简单的理解方法。

就是想想我们人类是怎么思考的对吧,人类去达成一个目标的方法是什么样的,很少有人就是正确的做法,一定不是正向的推导,一定是叫什么叫以终为始,就是以你的目标倒着去推,我怎么来,比如说我将来就是要什么什么。

这个这个这个什么成为社会精英,我要什么怎么怎么样,那怎么办,那我要成为社会精英,那我就得获得一份好工作,对不对,我要获得一份好工作,那我就得要读个好学校,对不对,我要读个好学校,我现在在学校里。

我就得认真读书,对不对,我认真读书的话,那我怎么办,我就得需要这个先去图书馆找找几,找几本书来看,看起来对不对,那你看你会发现你,然后最后你的就你的最后的决定是说,OK我放下我手头正在打的游戏。

赶快这个和这个这个合集,我的电脑跑到图书馆开始读书去了,就为了10年之后我能成为社会的精英对吧,那么但是的话呢,这个其实这就是人类的思维决策方式,而构图系统它最核心的一个点。

也是这个就是我是倒着去计划我的每个action,比如说在这里面就是说我们的目标是什么,我中毒了,所以我要解读,那第一件事情是什么呢,我知道我要解读,我必须要做的动作是我要去喝解药。

所以呢我的最后一个action一定是喝解药,对不对,好,我找到了喝解药这个action,那接下来的话我就会说你要喝解药,你得怎么办,你的首先你得有解药,对不对,那你有两个选择了。

比如说你去喝那个万能药对吧,你也可以和专门的解毒药,OK好,这个action我也能找到,就是我要去获取一个这个解药水,好,我为了获取这个药水的话,我要干嘛,我要去先走到那边的一个NPC商店去买它对吧。

所以说你看这样的一个gop planning,它是不是很像我们人类的倒叙的思考方式,这个就是它的算法的一个核心点好,那么接下来我们就想当我有了一个目标之后,大家注意啊,知识目标它很复杂。

因为目标一般来讲都不是单一的state,那我这个时候呢就在我的整个action set里去寻找,那我先选择第一个,我先把我的GP的这个这个state就是我的gold。

这个这个state和当前的设计是不state进行比较,你会发现有些state它已经满足了,那我不管它了,ok great我我成功了对吧,但是呢会有一些state不满足,那说明什么。

说明我的这个go没有达成,那怎么办,我这个时候就会在整个的这个action set里面,去寻找哪一个action,它的precondition现在其实是能满足的,同时他的effect or。

正好又能把我想要达成的那个state给他写过来,这个时候呢我就去找这样的state,那哦对是在这个地方,那么这个时候我就去找到这样的一个这个action,去满足他。

但是呢你大家注意这名action就很有意思了,就是action他会把state改掉对吧,但是他会满足我的一些需求,但是呢这个action本身他可能本身要求也很高。

他说我需要你的worst states的话,这个这个应该是下一步了,就是说我我需要,我要为了我为了执行这个action的话呢,我实际上还需要一些precondition。

如果这些precondition本身不满足怎么办,我把它反向的加回到一个列表里面,这个列表是什么呢,我们叫做unsatisfied state,所以说其实我会构建一个堆栈。

我把现在所有不满足的这些这个go,你们把词放进去,然后呢我选择了一个action,满足了你部分的这个stage之后,我会把它移出去,但是呢因为我为了完成这action的话呢。

我又要需要这个action本身需要一些precondition,那我把这些这些state呢又加到这个stack里面,我的目标是什么呢,就是我要不停的去往后面加加加加这action。

最后使得所有的这个这个这个unsatisfied,这个就是那个state stack的话呢全部清零,这其实就是我们的目标,这件事情讲起来有点抽象,但实际上的话呢,这也是GP系统最复杂的一个地方。

就是说如果任何一个go它是个单一的state,然后呢每一个action呢,它都是一个单一的state的一个一个链路,比如说PREDICTATION只有一个,那我的那个factor只有一个的话呢。

它其实就是一个很简单的图图的问题,对不对,我们只要沿着图一路寻找就可以了,但是的话它比较复杂的是什么呢,就是我的go本身是要五六个不同的state,然后呢我每个action的话。

它可能有几个precondition,它的affection也会有几个,他这个东西最后怎么去解这个问题,这个地方的话实际上在我们在学习GP的时候,我们是踩了很大的坑的,就是哈哈我们争论了很久。

而且也也在研究,那这里面我跟大家分享一个,就是我们对知识的理解,其实这个地方其实有点抽象,我们再讲一遍啊,这也是学构图特别容易踩的一个坑,就是首先的话呢我们选择一个go对吧。

这个go的话是对这个世界我们的一个需求,OK那么跟接下来的话,我们会把这个go里面的所有的state,和世界的state进行比较,如果已经满足了,我们就不管它,但是对于那些没有满足,就这里环伺的部分。

我会把它扔到一个,就是stock of unsatisfied的那个st,就是所有未满足的这些state的这样的一个,一个堆栈,我把它放进去好,这个时候呢我们就会比较第一个没有满足的state。

我们去找有没有action,他的effect or正好是能满足我这个state,如果这件事情的话,假设我们找到了的话,那我们就假设我们这个planning的时候,我们就说那我们就选择这个action。

那么好,那这样的话呢,我们就会在那个没有满足的这个C里面,把第一个那个state给它移掉,因为我以我的假设就是我执行这个action的时候,我就可以满足你这个条件了,对不对。

但是呢假设这个action的话,它本身就需要一个PREGNITION,怎么办,哎我们就会把这个precondition的话呢,就是反向的再写回到没有满足的目标,就为了就这个解释。

就是说我为了完成你的任务,所以我要做这个动作啊,但是呢我做这个动作又需要一个前提条件,这个前提下又变成了一个我需要满足的东西,所以这个stack of unsatisfied state的话。

是一个一直动态维护的东西,那我最后核心规划的问题是什么呢,我要规划出一条路径,当你按照这些action一次去执行的时候,哎我最后会让这个ANCESTIFY的这个stay的话,这个站全部清空,当然了。

我另外一个额外的非常,这个就是说过分的一个要求是,我还希望这些所有的action cost加在一起最小,这其实就是构图问题,算法中最核心的两个目标,我同时要达到,当然了。

我优先肯定是能够完成你的目标对吧,在完成你的目标的前提下,我再去找代价尽可能少的目标,这就是一个动态规划问题了,好,所以这个地方呢如果大家理解的时候,大家就会理解下面这个很核心的一个算法了。

就是说对于这个问题怎么求解对吧,其实大家仔细想这个问题求解起来非常的复杂,比如比如说我现在知道一个够了,对不对,那我这个够有五六个state,然后呢我就在整个的action set。

就是我的动作空间里去寻找,那我假设有100个state对吧,我每走一步,我要展开100种可能性,然后呢再往下展开100个100个100个,大家想想看这个是不是疯掉了对吧。

那这个就这就是为什么我们讲动态规划问题,它是个mp HT的问题,就是这一点,所以的话呢这里面有个非常重要的一个变换,就是说我们要把这个构图的问题啊,把它变换成一个图的问题,这个图构建起来怎么构建呢。

就是大家会很自然的一个想法是什么,我们会把这些啊就是state,把一个state作为他的note,就是这是我要达成的目标对吧,那我的AI是什么,这里面就会讲一件事情。

就是说其实这是购物系统非常巧妙的地方,他把state动作和cost构建了一个有效的图,这个图呢它的特点是什么,第一个讲它的node是什么,node就是我们的state的一个组合,注意啊。

这里面最容易犯的一个错误,就是说大家会认为node表达的是EXCE不行的,它是一个node的组合,比如说我的优化的起点,比如说我的go就是我的起点,刚才讲了我们这个逆向了,对不对。

所以我们的优化的起点是我们的目标,哎这个有点意思对吧,然后我优化的终点是什么呢,是我当前的state,所以呢在这个图里面的每一个node,它实际上是一组state的combination。

就是比如说我的go里面,我最需要的那个五个状态都是true好,那把五个状态都是竖写进去好,接下来按照刚才的原则,我们假设他所有在这个状态下,在当前思想我能做的action,注意啊。

不是所有的action都是有效的,为什么呢,有些action在当前这个倒叙的状态里面,它的PREGNITION是不能满足的,大家能理解吧,诶我把所有的可能的状态。

我延长出这个所有可能做的这个action,变成它的一条条的边出去,那么这个action的话本身是有一个什么有个cost,就是它的distance,对不对好,但是你这个action如果做了之后。

其实整个state就被修改了,对不对,它会产生一个新的state,哎我就新的state这个BC就在里边了,那么以此类推啊,实际上我可以根据我的目标,根据我的这个终点。

我可以把整个action展开成一个巨大的一个图,而这个图的话,我们核心的任务是什么,是不是就是在这个图上去寻找一个从go,就是从你的目标到我们当前状态之间,一条最短的路径,那这个地方的话呢。

如果这个图假设我们构建出来了,那这个动态规划问题,是不是变成了一个非常简单的一个,最短路径搜索问题,那这个问题我们的上节课讲过了,很简单啦,那我们就用这个大名鼎鼎的A星算法嘛对吧,那证明A星算法的话呢。

它实际上就是说他是个heroic算法,它本身的话就是对于世界的探索,但是这里面的话呢其实有个小细节,就是诶我的heuristic part在哪里,比如说同样两个分支,我优先选择哪个。

那这里面的话呢就是在GP的那个放算法中,他会说哎你就优先选择那个,就是假设你的这个current那个状态和,那个就是这个这个你的目标状态,和,你的这个就是说当前状态,就是最接近的那个状态。

那如果往这边走的话,你会发现实际上是你的current state,就是跟current最接近的state,我就有优先认为给他一个那个权重,说那个权重给的比较高,那这样我的算法就会优先的往那个方向去倒。

但是大家可以看出来,就是说A星算法它第一个能保证你,如果这条通路真的存在的话,它一定是能找得到的,但是呢它其实只是说约莫的可能是最近的路径,但并不能保证其实这种的不能保证最优路径啊。

实际上我们认为是个好的东西,为什么呢,当这个世界的状态一直在变的时候,其实NPC他也不会永远做那个最优选择,因为就像一个人一样的,如果一个人他如果做所有的角色,他都是最优选择的话。

你会不会觉得这个人像个机器人对吧,极度的冷血,极度的理性,这个人就觉得不好玩,其实我们在做游戏AI的时候,我们有时候也会这样,我们希望他有的时候会做一些很合理,但是看似很笨的啊,就是有点傻傻傻傻的。

这样的角色会让这个行为看上去更natural一点,所以我觉得这就是GP这个算法,有的时候你会觉得诶,他的AI有的时让你觉得很惊艳,很活的一个原因,那么所以呢其实GP这个算法呢。

我个人认为它其实跟NHTN其实是蛮接近的,但是的话呢它会让这个环境啊,就是让这个AIT的行为变得更加的动态,而且呢他第一次真正的把就是你的目标,和你的行为decoupling了分开来了。

因为无论是从有限状态机也好,到这个behavior tree也好,甚至到HTN也好,其实啊我们的行为通过一个拓扑结构,本质上就锁死成了一个目标,但是购物系统的好处是什么呢,因为环境一直在变。

即使是同一个目标,你会发现它的执行路径是完全不一样的,而且这个路径很多时候它会beyond,就超过我们的设计师的想象,所以有的时候你用go做的AI的话,他的行为有的时候会让设计师都觉得哇很精彩。

他居然会这么干,当然了,那个所以的话呢包括它能规避,就是说HDN那个算法的话,有的说如果我们设计师数据没有配好的时候,他会陷入一些思索的状态,但是它的缺点呢其实啊也是很明显的,就是什么呢。

我个人觉得其他的东西都不用讲,最核心的缺点是什么,就是他比较废啊对吧,大家想想刚才那个图的构建是不是很复杂对吧,然后的话呢也要做那个A星算法动态规划,其实那个东西是挺麻烦的,所以说这个他从计算量上的话。

实际上是会大于这个传统的BT和HTN算吗,尤其是HT,我觉得HTN的效率还是蛮高的,所以第二个一个很大的一个挑战是什么呢,我不能讲是缺点,其实你可以认为是一个挑战,就是说当我们用GP的方法。

真的把整个决策交给计算机的时候,事实上的话,我们需要对整个是游戏的这个状态,变成一个很定量的表达,如果你不你不去用一堆的布尔值,true force去表达游戏的状态的时候,实际上你的go是没办法定义的。

那你所有的action也是没办法定义的,但是呢对于一个高度复杂的游戏来讲的话,这件事情其实很复杂,大家想象一下,我假设用购物系统,我做新机的时候,那心机里面这个现在这个状态哇,我的天呐。

我怎么能用一堆true force表达我现在这个状态呢,我说实话我现在想想,我好像也没想明白该怎么做,所以说其实对于一些比较确定性比较高的游戏,比如说啊1V1对抗的时候,或者说几个小的AI对抗对吧。

我每个关节的环境我大概知道,比如说我关注的变量就是我是不是残血啊,我是不是中毒了呀,对手的是个什么类型的怪物啊,那么这些比较确定性的这些量,我能够把它量化成布尔值的时候。

我认为这件事情构图是个很好的东西,但是如果对一种比如像RTS这种超复杂的环境,多多维度的博弈的环境的话呢,其实构图它还还是会比较吃力,所以这也是就是说GP这个系统。

你会发现它apply的游戏很多时候是一个单机的,就是说顺序性的,我刷关这种游戏好,这个时候呢也是传统的,我们的这个人工智能的方法,对吧好,那既然讲了这么多有趣的算法了,你又讲了他们的不足。

那谁是这个世界的终极解决者呢,那就进入了我们今天课程这个最有趣的部分了,诶我们就哦不对,这个地方我跳了一下,这个地方我们课程中还在讲最有趣的部分之前,我们先讲一个啊,也是一个比较硬核的部分了。

就是蒙特卡洛树research对吧,Mcs mc t s,那么这个蒙特卡罗方法的话呢,也是一个比较经典的游戏AI的方法,但这个地方蒙特卡罗吹search啊,其实它已经有一点跨界了。

因为大家知道我今天课程要讲的,这个最有趣的东西应该是基于机器学习的方法,对吧,让我们的那个AI更加智能,但是诶这个蒙特卡拉吹测试的,它就介于这两者中间了,好哎呀,我已经讲了快一个小时了。

已经一个小时10分钟,所以今天我觉得有可能会超过两个小时啊,那要不这样,同学们都先小小的休息一下,我先喝一口水,然后接下来下半场的话,就跟大家讲一下蒙特卡罗的方法。

再讲一下我们的machine learning的方法,其实我会发现这两盘很有意思,就是说一个是讲这个阿尔法go的算法,一个是讲什么呢,一个是讲我们阿尔法star,就是一个是下围棋,一个是打星际怎么样。

好玩吗,好那不管了,因为今天的课程实在是量太大了,所以我怀疑可能两个小时我搞不定了,那我们就那个还是抓紧时间跟大家讲,就蒙特卡罗的tracer是这个方法,那么首先的话呢,就是蒙特卡罗推测这个方法的话呢。

实际上是非常了不起的一个一个算法了,就是说实际上他在很多很著名的系统,你都用到的,最大名鼎鼎的就是这个阿尔法go,就是这个我们做下围棋,把人类的这个就是所有的下围棋的,这个顶级高手。

全部打翻了的这样的一个算法,说实话我我我小时候蛮喜欢下围棋的,然后我我觉得我我其实挺难受的,我觉得这么好的一个一个一个一个东西,居然被AI给毁掉了,现在围棋学围棋界,整个就大家士气很低迷对吧。

那么另外一个的话呢,比如说像有一些呃大型的,比如turn base的游戏,比如说像全站他的几乎的最近的几座里面,基本上都是用摩托卡罗出色的方法,形成它的策略,其实后面我会讲,为什么像全战这样的游戏。

它非常适合用这个蒙特卡的吹四个方法,那么蒙特卡罗这个方法呢,其实呃他其实他从逻辑上来讲,很像人思考的方法,就是我们怎么去下一个围棋的时候,我怎么去决定我的下一步做什么呢,哎这个地方我是不是稍微科普一下。

围棋的规则啊,我们那个课程中有没有同学不会下围棋啊,啊我觉得可能是有的吧,我跟你讲围棋真的是世界上最神奇的一个C,就是包括我自己觉得就是如果大家想学棋类,我个人推荐啊,学两个习就可以了,一个是围棋。

因为围棋的规则非常的简单,但是很精妙,第二个是什么呢,是国际象棋,但是很不幸的是,这两个象棋两个棋类全部被AI打败了对吧,但没关系,我们可以假设AI不存在,那么一切的规则其实非常简单。

就是黑子白子轮流下,那么如果你只要你的子被对方围住了,然后呢你没有就没有,我们叫做气,你不能透气的时候,你的死就被人吃掉了,最后下到最后就看黑棋白棋谁占的空间,大规则其实非常的简单。

基本上一一小页纸就讲完了,但是它的变化是精妙无穷的,就是这里面空间有多大呢,就是它的测试空间应该是三乘,一个380一次方这样的一个空间,就大概是十的170一次方,那么大的一个search space。

就是以前呃好像我们的pony爸爸曾经说过一句话,他说你看我们的AI很厉害对吧,我们解决的问题比宇宙中的原子都要多,对他说的没错,因为宇宙中的原子数量是十的80次方,而围棋的变化是十的170一次方对吧。

所以当然了,这没有那么玄学,实际上我哈哈,那个我们的AI确实能handle这样的一件事情,那么其实蒙特卡罗推测是,它的核心精髓是什么呢,就是说我在选择每一步下的好坏的时候,我在脑子中推演了几百种。

上千种,我和对方在下棋的路数,最后选择一个我方胜利最大的方法,然后呢就说我再决定我的下一步怎么走,这个方法是非常像人类下棋的这个思路好,那么这个方法的源泉是什么呢。

首先我们得这个不得不说这个我们的大神啊,就是那个费米对吧,他在研究研究这个这个这个就是new的核聚变,核衰变应该用的裂变的时候诶,他研研研用了这个方法,就是蒙特卡罗方法,就随机采样,蒙特卡罗的话。

大家如果知道的话,就是欧洲的一个啊著名的赌城,我还去过那个地方,那个地方有个著名的F1赛道,特别有意思,就是那个城市就是那个一条主路,就是F1赛道,所以我一直在想象。

就是如果F1的那个时候我在那边住的话,可以听到那种喧嚣的F1赛车的声音,但是据说那个地方消费非常高啊,大家没事别去,那简直不是我们老百姓能消费的东西,我觉得反正我我是敬而远之的,看看可以了,然后呢。

那么蒙特卡洛吹测试这个方法呢,实际上是差不多在2006年左右吧,是有这位老哥,就瑞米这位老哥,他提出来的非常有意思的一件事情,就是说他是就是他其实这个工作不是他第一个,就是开创的。

其实在之前有很多前任做了很多工作,但这个方法他第一个要解决的问题是什么呢,哎就是下围棋,就是因为实际上大家知道在人工智能领域里面,我们一直认为围棋是人工智能的圣杯,就是在很长一段时间里面。

人工智能领域会认为围棋人工智能是搞不定的,因为就像他刚才讲了,他的search space太大了,他是这个三的这个380一次方,十的177次方,而国际象棋呢大概是十的50次方吧。

所以当时深蓝去beat了,这个人类的国际象棋冠军的话,实际上是一个暴力搜索法,本质上是这么个做法,而这个就是围棋的话,因为变化量太大,围棋的AI在很长一段时间里面,连业余选手都打不过,而这位老哥的话呢。

他是最早提出了用蒙特卡罗try search的这个方法,能够基本上达到了人类的业余选手的水平,当然到后面阿尔法go的时候,诶这个这个大力出奇迹对吧,最后能够干掉了人类的职业选手,那只是后话了。

但是呢我们不得不承认,就是MCTS的话是一切的foundation,那么这也是我们可以看到,就是说,当你面对一个巨大无比困难的问题的时候,他是一个非常复杂的,这个一个推荐和和演算的问题的时候。

其实你用随机的方法也能给你一个非常好的解,特别是对于复杂系统,那么其实蒙特卡罗推测是他的思想呢,实际上是非常简单的,就是说当我面对这样一个棋局的时候,我的白子要落的时候,其实我的棋谱会告诉我说我有以下。

比如说五种甚至更多种的落子的地方,注意啊,这里面不是不to force落实,实际上它还是有一些基本规律的,就是说包括像alpha go的时候,他不是说每一步棋,他都要想380一个可能落子的点,那不得了。

那个测试空间是实在太大了,而且它推荐出来的结果是没有什么意义的,所以它其实还是要follow1些落子的规则,那假设这里面我们规则告诉我们说,我们有以下几种落子的方法,那我到底落在哪儿呢,那人类的想法。

他其实啊至少我们下棋的人会知道哎,你的脑子中会做很多的演算,我漏了这个字,对方会落什么字对吧,对方有几个选择,他这样选择的时候,我到底是主动被动的,但是像我这种非常菜鸡,菜鸡菜鸡的这个下棋的选手。

我一般想到啊对方的两三步,我脑子中的这个memory已经不够使了,但是据说高手啊他可以下盲棋,下很多,那都是高手的非人类,我们不那我们大脑结构跟他不一样,那么当人类大脑中,其实推荐的过程真的就是过程好。

那这个时候呢,其实我们就想办法怎么样的,用一种诶数学的方法表达它呢,对吧,你看我们在计算机里面,其实计算机里面我做所有的东西,我首先要建模,这里建模不是那个建3D模型啊,这个建模指的意思。

就是我要把一个问题抽象成一个数学模型,因为计算机它只能处理数学模型,所以有的时候我们一直在讲,就是说为什么我们对宇宙那么感兴趣,我一直认为上帝他就是个他就是一个怎么说呢,我们的世界是去模拟出来的。

那么上帝他就是什么,他是个数学家,所以他是用一个数学model represent了,我们整个这个universe,你的everything,因为确实是这样,就是说当我们在计算机里面。

我们去表达一个东西的时候,我们能解决一个问题的时候,首先我们要把一个现实中一个非常模糊的问题,表达成一个定量的数学模型,所以大家很多同学我看过,就是在大学的时候参加过一个比赛,叫什么叫数学建模比赛对吧。

我相信现在还有,我最近看到好多同学都参加了数学建模比赛,其实数学建模比赛啊,真的是一个非常非常好的training,因为这是大家未来在工作中,在系统中你们最需要的一种能力。

就是我能抽象这个就是建模定量化处理论能力,那么对于刚才那个情况的话,我们就要对它进行建模,那首先的话呢我们要定义两个东西,一个叫什么呢,叫状态,一个叫动作诶,这个好像跟刚才讲的那个很像,对不对。

但这里面在MCTS里面的话呢,状态和动作是有更精准的定义的,第一个状态是什么,就是我这场博弈的现在所有的子的分布,这个状态你可以认为我take a snapshot。

就是我对整个局面take了一个快照对吧,那么action是什么呢,就是现状是这样了,唉我的动作比如说我要落子落在哪个点,那这个时候如果是围棋中的话,那就是XY坐标嘛对吧,我就落这个词嘛。

那好那假设我现在有一个state,那我根据我不同的动作,我是不是就形成了这样一个连接关系对吧,那我就形成了这样一个,一个只有一个子节点的一棵树,那如果我有很多很多的这个动作的选择。

我现在是这个state,就是起始的这个initial state,那我有十个不同的action可以选择对吧,那我这个数据可以展开好,我做了这个动作动作之后,对方有十种不同的action选择。

我继续展开对吧,那这样你会把整个这个棋盘上可能发生的情况,就变成了一个巨大的空间,这个叫什么呢,叫state space,但这个我一直认为state space这个词不是特别的准确。

我觉得更像是space train,因为在space很多时候我们只表示一个空间,就是所有的变量的可能性,但是这些state呢它不是一个就是只是支撑在那,它其实之间是有个拓扑结构的。

这个拓扑结构是一个树状结构,所以我我我会觉得它可能是一个,就是更准确一点,所以我我在描述的时候,我故意加了一个叫AI tree structured state space。

它是一个用tree structure去连接起来的一个state好,这其实就是我们的蒙特卡罗啊,这个算法就是或者说我们人在下围棋的时候,如果我有无限的算力对吧,我经常讲这个词,如果我有无限的算力。

我有无限的内存,那很简单,你肯定下不过我为什么,因为我把所有的这个情况没落子的时候,全部展开了,那我就可以选择出来,这个我该走什么一步,我记得好像在博弈论,还是那个某一个理论里面做了个推演。

他说对于所有的这种确定性规则的游戏的话,一般来讲它都有必胜策略的,好像是一个好像是个数学理论吧,但是就是因为这个search space过大了,所以呢我们没有办法完全对他的全搜索。

所以我们打不出这种必胜策略,好像他是有这么一个说法,所以啊这个整个space的话,如果全展开的话非常的大,但是呢理论上他一定能给你最优的解,而这个就是说在这个蒙特卡罗算法里面呢。

有一个细节是大家很容易会这个犯晕的,就是我构建了一个蒙特卡罗这个tree啊,它成本非常的高,对不对,那么但是的话呢,一个经典的蒙特卡洛吹测试方法的话,他根据当前的棋局的状态。

他就开始重新的去构建这个蒙特卡罗的这个,train来进行整个search,这是大家很容易犯迷糊的,因为我到最后只是决定我的下一步走什么对吧,所以呢我只要去找我下一步的目标就可以了。

但这个地方实际上呢啊如果你有足够大的内存,包括你不介意把算法写的足够复杂,实际上在两次蒙特卡罗的try searching之间的话,其实是可以reuse很多的node,但这里面就是。

所以我们我们今天在课程给大家讲的是,最古典的蒙特卡洛树的推测试的这个方法,但实际上呢我在很多那个就是前沿的一些工作,包括很多的实践中,他会对MCTS进行很多的优化,但是呢我们今天大家先记住简单。

就是每一次你的根节点就是你当前的状态,它是你的root,然后你就开始去探索所有的可能性,往后去展开,那所有的MCTS的核心是什么,就是我去探索这所有的可能性,我选择一个对我来讲最有利的一个做法好。

那怎么怎么样判断对我有利呢,这里面我要首先给大家介绍一个概念,这个概念其实非常的有意思,叫什么呢,叫simulation模拟模拟这个词大家都很熟对吧,我就模拟这个一个什么世界的什么什么东西。

但但在但是在蒙特卡罗的这个这个算法,你们这个模拟是什么呢,叫我要把这盘棋快速的下完,诶,这很有意思吧,就是比如说它的一次模拟的概念是什么呢,就是比如说现在局面已经是这样了,我决定在棋盘的左边。

那个这个比如说第十七十九这个位置,我下一个词好,接下来的问题就是我要让这个就是计算机,快速的用一个相对合理的方法,它叫default policy,诶,把我的棋下完,然后告诉我说这次模拟大哥你赢了对吧。

所以呢,这个模拟里面,其实有很多随机性的东西在里面的,而且呢它下的过程中呢,这里面有个细节,就是说它实际上不能够乱下的,它实际上是有一个就是下棋的基础的,这个操作手册,这个待会解释。

但是呢它的一个假设是什么呢,就是说当我这个从下一步走的这个状态之后,我往下做足够多次的这样的一个模拟的时候,诶是不是好像如果我做了很多次模拟,我好像这一步都赢了,面都很大的话。

这是不是一个很好的一个一个步骤呢,哎整个蒙特卡罗推测时的核心假设,其实就是基于这个假设,那么这里面的话呢就引入一个概念叫default policy,其实policy这个词在AI也好,在这个控制论也好。

其实是一个很重要的一个理论,就是大家这个我待会儿给大家提到,就是待会我们不会讲那个machine learning,机器学习嘛,其实机器学习的很多基础概念,并不是来自于我们的这个计算机。

也不是来自于我们的游戏引擎,是来自于什么呢,来自于机器人学,就机器人学他常年研究的几十年前,人家研究的就是这种控制理论,所以policy是什么呢,是一套操作的基础方法,举个例子。

比如说我们今天下围棋的时候,所谓的default policy是什么呢,就是我预先输入电脑的,人类的可能是几百张上万张的棋谱,就是AI,他在这个时候就是看到你走了这一步之后,他直接从谱子里面掉出来说哦。

因为你是这个局面,所以谱上告诉我要这么做对吧,这样的话就是它的好处是什么呢,就是他不用再去search了,它速度很快,第二个呢它的它的下棋的这个指点,其实相对来讲比较合理,第三个的话呢。

它其实可以非常快速的从头下到尾,所以这个policy其实你可以认为就是一个策略,就是我一个缺省的策略,但是呢真正你去做这个比较复杂的,比如像像那个阿法go这样的东西的时候。

其实在default policy里面有很多有意思的东西,比如说你是被捕的呢,还是你自己训练好的一个神经网络啊,这里面就很讲究,但这里面我们不展开,但是你可以解释成就,我就做一次SIMATION。

从头做到尾,那么最后他告诉我说,如果你走了这一步,我给你随机模拟完,我给你模拟完之后,我告诉你说这这一次模拟中诶,我到底是赢了输了,但这里面注意,有一个有一个概念上很容易混淆的地方。

就是说我这一次模拟了成功了,比如说我赢了并不代表我就一定会赢,大家知道吗,它只是代表了,因为你知道就是这个在这个就是围棋的这个,树状展开的时候,它有无数种可能性对吧,但后来他的数字就大的惊人。

所以它只是中间一个很小的一条链路,他表示我赢了,所以你再看蒙特卡罗,这个tracer是MCTS的,这个论文中的话,你经常会发现就是模拟它用一条小这个不折线,像条小蛇一样,就表示说那个就是一次探索而已。

并不代表我这个节点下面的所有的state space,它都是成功的,哎这就是模拟的一个核心的点好,那我怎么去判断我现在这个这一步,下一步走的到底是好坏呢,诶它这里面就引入了一个非常定量的东西。

叫一个是Q是什么呢,就是从我这个点出发,我做的,比如说先讲吧,就是说从我这点出发,我到底做了多少次模拟,比如说我做了100次对吧,那好那我的N就是100,那我这100次模拟完之后,到底有几次我下赢了呢。

哎我就有个Q,那可能是Q是50或者是这个60,那实际上我们通过Q除以N的话,我们是不是就可以算出来说我这个state,我的成功率是多少对吧,所以说这一对pair就是Q和N的话。

是蒙特卡罗MCTS算法的一个,很核心的一个数值,后面几乎所有的东西都需与它展开,那么好,那我们既然知道一个C的好坏的时候,我们其实在每一次进行模拟的时候,比如说我找到当前这个绿色的那个节点诶。

我对它进行一次模拟的时候,假设这次模拟诶我得到的结果他是失败了,那是不是我只在修改这个节点的,他自己的这个QN值呢,唉其实不是,这里面有一个很重要的概念叫什么呢,叫back propagation。

反向传导,那因为什么呢,因为你这个节点,你说我自己的这次simulation,我输了棋对吧,所以我N你要加一我的Q的话要加零对吧,我变了,同时呢你的父亲那个节点实际上也跟那边,为什么呢。

站在他的立场上看,它确实又等于又多做了一次模拟,对不对,所以呢你的父节点,所有的数值也依次的往上去调整,就是Q也往上加,N往上加,所以这些数值要往上去propagation。

这样的话当你做了足够多次模拟的时候,你会发现就是比如说你做了这个1000次模拟吧,那那个root节点上就会显示说诶,我当前是1000次模拟,然后呢我经过无数次分支的话,我发现我的我我当前这个状态。

我的肾区率可能是五五开,比如说是500,一杠1000诶,我接下来有我有七部选七种不同的选择,对不对,我七种选择里面,比如第一种选择,我模拟了这个100次,我的胜率是多少呢,比如说70,另外一个节点呢。

我可能是模拟了这个一百两百次,我的胜率是多少呢,是170多对吧,我这个Q也大,N也大,但是我会解释这两大有什么好处,所以其实你整个模拟做完之后,你会发现你对整个这个state space的话。

没所有你探索过的这些state,他都有这样的一个Q和N值,告诉你说我探索了多少次诶,我的是我胜了多少次,这个数值很关键,那其实呢你有了这样一个基础的,就是SIMATION是什么。

这个就是说那个我怎么去evaluate,这个这样的一个节点,那包括怎么做back back propagation,其实这个时候我们就可以跟大家讲MCTS,它基础的这个迭代步骤步骤了。

因为所以我在讲MCT书的时候,他上来就给你讲框架,其实很多人看了这个就会觉得很晕,这个selection到底是什么,expansion是什么对吧,然后呢simulation是什么。

然后back propagation是什么,那现在有了这个概念,就是大家可以知道,其实我们在MCTS的话,它实际上是一个一直在做的这个循环,它首先选择一个最有可能,因为你这时候走到一半。

你这个数已经展开来了嘛对吧,但是它展开了可能就有几十个节点,或者是只有啊那个几个节点,这个时候呢,我先选择一个最有希望,且没有被完全展开的节点,也就是没有完全展,就是所有的可能性都没有完全展开完。

接下来呢我要对它进行展开一下,再加一个新的探索,好新的探索之后干嘛呢,我要做一次simulation,看看这个探索的方向到底是好还是坏对吧,最后得出一个结果之后。

哎我把这个数据再反向的property回去,把所有的数据就全部更新一遍,这就是mc ts的话呢一次的这个迭代,那么它就会这样一直迭代下去,一直迭代下去,那他什么时候停呢,我待会再讲。

但是呢这就是MCTS的核心好,接下来的话呢给大家讲拿一个具体的案例,就是拿一个围棋的案例跟大家讲一下好,那么其实的话呢就是说这样的一个逻辑,按照mt s的话。

你会发现你要展开的这个state space是无限大的,这个实际上是啊,大家可以想象这是一个围棋里面,大家看到这个空间有多大对吧,你想想看这才推荐的几部啊,我要是往下一直推荐下去的话。

这个内存也不行了啊,算力也不行了,对不对,那MCS它的巧妙之处就在解决这个问题好,首先的话呢我们要定义一下,什么叫做可以被扩张的node,就expable node,它本质上讲的是说这个node。

它所有的可能性并没有被重进,也就是说啊我这个note下面我下一步可以走,其实按照七步告诉我可以走十步或者走20步,20种选择,但是呢我现在只试了,比如说十种,那意味着的话另外十种没有被探索。

那这个note呢它就是一个expment node,好,那我拿到一个这个就是状态,当前的状态的时候,其实我随着一次一次的迭代,我会慢慢的把这个树啊给扩张开来,那这个时候呢。

但这里面有一个非常有意思的一个点,就是说我们每一次选择一个点,从哪开始探索,那么其实有两种策略,选择,一种叫exploitation,什么呢叫开发,一种叫exploration探索诶。

这个听上去是不是这个好像有点,这个就是奇怪对吧,但这其实是在整个是那个深度学习,那个就是machine learning,包括像MCTS里面的话,一个很关键的一个概念,就是就是说我在进行探索的时候。

我是优先去找那个胜率最高的点,我去探索它,还是优先去探索那些我没有探索过的点,哎大家觉得有没有意思,其实你这个东西听上去有点抽象对吧,但实际上的话呢在我们的真实生活中,这个东西是很常见的。

比如说同学们看我们每天都在决策,对不对,比如说我今天决定吃什么,有些人策略是说我希望我去花了这笔钱,我得到的这个享受一定是确定性的,那我的选择是什么,一定要去我最喜欢且最熟悉的餐馆,我反复验证。

反复吃那个地方肯定都是最好的对吧,有些人就他就是这个倾向,就是他叫exploitation,就是说开发型的选手,那么还有一类选手是什么呢,它叫exploration,我是探索型选手。

就是我总是会逼着自己这个餐馆,我也不知道好不好吃,但是呢因为我没有吃过,所以我就冒着一次这个砸锅的风险,我也要去吃它一顿,万一它好吃呢,对不对,那其实我们人生的很多选择。

就是在这个开发和探索之间做一个balance,那么反应到这个数值上,你会发现就是说如果是exploitation的话呢,我会优先选择什么呢,第一个这个地方访问的次数足够多,就是模拟的次数足够多。

且胜率最高的那个点对吧,那我很多时候就选一个比首先N要比较大,同时呢我的Q和N的话比值也比较高,那么如果我是一个探索型选手呢,我就会优先选择那种叫做哎,我的这个就是N的那个数值比较小。

我就是去给他一个相对高的权重,所以其实整个MCTS算法的话,他在这中间找一个平衡好,那现在的话呢就是说这个探索节点的选择,其实有一个很著名的理论叫USB理论。

这个叫apple confidence bts,这个其实是一个很好的一个,一个一个数学工具啊,就是说啊它实际上叫上肢性空间,什么意思呢,就是说我对一个随机的世界进行采样的时候。

如果我的我已经采来的一些数值了,说这个概率,比如说他一直这样分布,但是因为我采样的数数量特别特别少,我并不认为这时候我采来的数值是偏低的,是因为它真的低,很可能只是因为我采样的数量不够,不够不够不够多。

所以呢他有一套数学方法,比如说你满足了我们的大数定理,或者满足我的高斯分布对吧,大数据基本已经满足高斯分布,那这个时候我可以有一套数学方法告诉你说,这个它的上肢性空间,就是说它的大概能大到什么样子。

我有个方法,这个方法这个工固定理呢其实本身很复杂,但是呢在我们的这个就是,就是蒙特卡罗这个方法里面的话呢,其实它很简单很纯朴,第一个我优先选择是什么呢,还是开发,就是说你如果Q和N的值比较高。

比值比较高的话,说明你的胜率比较高对吧,所以Q除N是我第一个考量的点,那么这就是满足你的开发的一部分,那么这里面我们就以那个建那个节点为例啊,但是我会跟你的父节点的整个次数进行比较。

如果发现你的那个你的复节点,说我已经完成了100次的探索,但是呢我自己发现我只有两次和三次,那他又做了个公式,就是取了一个自然对数的,你的这个附节点的访问次数,产生二。

除上一个你的这个这个你自己访问次数诶,我就相当于对他的这个置信空间,给出了一个up bd,这里面的话,如果这里面没有一个那个常数C啊,它其实是一个相对比较严格的数学定理对吧。

假设你的随机变量永远在零一之间波动,我做了几次采样之后,我算出了你的这个你采样玩家的期望,假设是比如说0。7,但是因为你采样数量足够小,那么你的附近电采样那个你的更大,更上一个信号系统。

采用那个次数很高,那我知道你可能这个数值你往上跑的时候,可能性,但是呢哎我们搞游戏引擎的人,或做一个这个计算机开发的人,其实很多时候我们是hack的对吧,那我们会怎么办呢,我们会在前面加个C这个常数。

这个世纪精妙就精妙在这个C这个地方,就是说如果你希望你的这个蒙特卡罗的策略,更加的aggressive一点,就是更多的我要去探索的话,你就把C给的大那么一点点对吧。

那就意味着什么那些被访问比较少的那些节点,它就会更大的可能性被这个select被选中,如果你希望我的这个策略更保守一点的话,我就把C给的小那么一点点,你看此处就有hack了对吧,那没关系。

但是呢其实这就是为什么我有时候开玩笑,我就想说做这个做这个人工智能,有的时候跟炼丹一样,就是说你要是很多地方需要上手,根据自己的scenario去调,但是呢他的基础思想还是蛮成立的。

就是说它实际上是做好了这样的一个平衡,那我们有了这个USB算法的话呢,其实我们就可以进行selection了,就是说当我这个每一次MCST的话,MCTS的话啊,不好意思,这里我给大家讲。

我每次讲MCTS主要讲的方便,MCTS就是蒙特卡罗ree search对吧,这个简称这样讲起来比较简单一点,就MCT的话呢,他再去selecting我下一个要探索的节点的时候。

实际上就是用这个USB形成的,这样的一个这样的一个一个一个数值进行比较,它具体算法的话呢,第一步是首先你每一次啊,就是你每一次整个这套迭代做完之后诶,你下一次再找新的一个节点去探索的时候。

一定要从root开始,注意啊,这个是这个细节,很有意思,你一定要从root开始,然后呢你先比较你的第一圈的,你的所有的这个child notes,然后呢,你去看第一个他们的USB的值到底怎么样了对吧。

那USB的值最大的那个,你就会作为你的下一个探索的方向,好,你再去问他所有的这个节点的这个它的子节点,你就往下走,一直走到什么呢,走到第一个可以,Expable,就是说没有被完全探索过的这个啊。

没有没有没完全展开过的这个节点,其实这里面不叫探索,应该叫expand的这个节点,找到那个节点的时候,你就把那个点作为你的current,就作为你的select node去展开,这个地方其实有点抽象了。

就是说所以我我我我我们内部在讨论的时候,我们在想这个MCDS让大家怎么去理解它,最好的一个类比是什么呢,我讲了一个非常不科学的说法,我说这感觉像是个广度优先搜索对吧,只是我这个数的数据一直在变。

但是我每一次选择下一个要展开的探索的时候,我还是从根节点一次一次的很公平的比较,我所有的child对吧,我的child如果我选中它,我觉得它诶本身是USB值最高的时候,我再去钻下去,他找他的这个子节点。

那这个大家会说,那我的假设我的child已经被封了,expend就完全被展开了,那我会不会就死掉了呢,实际上是不会,为什么呢,大家想象一下像阿尔法go的这种情况对吧,这个十的177次方。

就我们那么点可怜的计算机内存对吧,你把这个计算机算爆了,任何一个分支下去,其实你都是不可能探索完的,大家发现这个事情是很有意思对吧,所以的话呢这个时候我一定能找到一个。

就是没有被完全探索过的这样的一个节点,按这个算法,大家放心,这个肯定能找得到的好,那这个时候呢我们对它进行所有的可能的,就对它进行一次探索,这里面有个细节。

就是说其实呢你可以选择我从select node,我只往外去expand1种可能性,也可以expand1组可能性,这都是可以的,但是我一如果你真的算力允许的话,我觉得探索一种可能性可能会好一点。

但是呢这就意味着什么呢,每一种可能性诶,你要是不是要做一次simulation呢对吧,你的内存消耗这个快速增加速度也会更快,对不对,那但是呢这个你会让你这棵树更加的balance对吧。

那这个这个探索这个expand我就做完了,好expansion做完之后呢,接下来我们对于接下来我要尝试的,落子的这些方向之后,我每一个做它的一个simulation。

这里面大家看到我们画的那个小波浪号对吧,那我假设从这个点select,红色的那个select那个state去出发,我给出了三种探索的这个方向之后哎,做三次simulation。

那比如说第一次submit的结果是我们输了,第二种semi,结果呢是我们赢了,第三个,我们输了,那这个时候我们会把它的输赢的这个数值,就是它的每一个节点的Q值和N值,一层层的往上去传递。

大家仔细比较一下这两分数的点的数值,你发现没有,就是A比如说你现在select node,现在是零和一,就是这个这个点之前是被探索过一次的,他是零对吧,它它也失败了,但这个时候它就变成什么呢。

零要加上个加上个一,它就变成了一了,而它的N值的话,以前是一,现在加上个三,因为你探索四次三次嘛,就是要加上个三,其实以从他网上去找它的附件点,每个节点的Q值都是加一,N值就是加三。

所以整个竖的这一趴的,这条链路的数值全部被更新了,那你就这样呢就不停的去探索啊,探索啊探索你每一次探索,你本质上就是进行一次有效的,蒙特卡罗的simulation,但是这件事情你能不能一直做下去。

实际上是可以一直做下去,只要你的那个state space足够大对吧,现在我讲了,如果你想把围棋的state space探索关的话,那我相信把全世界的计算机加在一起,可能都不够,那所以呢你就必须要停止。

那怎么去停止呢,所以他的这种探索呢,会有一个就是这个bug的预算,比如说你的内存,因为这个数越变越大,越变越大,内存会炸掉对吧,那内存超过了一定的限额,我们就开始不探索了,或者是什么呢。

就是说哎我的simulation的次数,比如说我规定好每一次对于每一步的思考,我最多simulation一千一千次对吧,就是说我脑子中推荐1000次,把这个棋下完的情况,你想这个计算量其实并不小。

所以说其实你用蒙特卡罗推荐的方法去做这种,比如像围棋这种复杂运算的话,它的计算量还是惊人的,就是说它的内存消耗量也很大,而且它计算量也是惊人的,那么好,你设定一个competition的时间啊。

或者是那个simulation的次数,反正whatever,你只要你喜欢,你就让这个蒙特卡罗的这个搜索就整个诶停掉,停掉之后你会得到什么东西呢,诶你会得到这样的一棵树,这棵树那时候已经很大了。

接下来你要做的事情是什么呢,大家记得我们讲过蒙特卡洛吹search的话呢,它它的根节点就是你当前的整个棋盘的状态,这个状态大概率是你的对手下给你的,对不对,你这时候你其实你的选择只有一个。

就是我的下一步走什么,那你的下一步是什么,是不是就是你的所有从根节点下来的第一个,第一环的子节点,其实其他下面下面展开的那些东西,对你都是没有用处的,对不对,诶这个地方就很有意思,对吧好。

这个时候有意思的地方,黑科技就来了,就是说那我现在已经算已经测试过1000次了,那我接下来有十步可行的方案,那我到底选哪一步呢,这里面就这个就开始展开了,我们的各种玄学的东西来了,就是你个人所好了。

比如说我可以选择这个就是max child,什么意思,就是我最好的孩子什么,就是我的Q值最高,就是从我这一科分支走下去,我剩的盘数最多对吧,这个听上去好像有点道理,对不对,诶但是呢这个地方就有个问题了。

就是你Q值是高,但是你甲是N的很多呢,比如说你这个直接点对吧,被测试了100次,但你Q值是最高,你你最后达到了,比如说呃55次,但另外一个老哥他比如说测了80次,但人家的胜率是赢了70盘。

那你到底你这个选这个50次啊,不是40版吧,那假设你这个是不是选的就有问题,哎另外一种策略叫什么叫robust child,就是说最多被访问的子节点,我认为是最鲁莽的,也不是最充分测试过了。

那大家就觉得很奇怪的说,哎不最直觉的一个比较不是应该是Q比N嘛,就是我的胜胜利值对不对,但是的话你为什么说你敢选robustness,这里面其实就隐含了一个小细节,就是说大家发现没有。

刚才我在每一次selection的时候,我其实不是随机展开的,我是用一个UCB算法对吧,或者那个也叫UCT算法,就是你用UCB的这个公式去做research,有的人也有人也叫UT。

实际上他已经综合考虑的,你的Q和N的这个比值,所以呢一般来讲你被反复的试的那个节点,其实说明在整个前面数的这个展开过程中,他一直都被认为是很有这个希望的一个节点,所以访问次数本身。

也代表了这个节点本身的靠谱程度,诶这个节点也是靠谱的,而且因为它simulation的次数足够多,其实它很robust,有的时候你单纯按Q值其实不一定考诶,那另外一个人就说哎呀你们两个就别吵了对吧。

到底是Q值大还是N值大,是这个谁说了算呢,对不对,我的要求是最高的,就是Q值和N值都要大对吧,我要找到那个最大的Q值,最大的N值那个节点,那个节点才是我要走的步骤,你看这个这个就是小孩子做选择。

成年人什么都要哎,这个事情其实是有道理的,但我自己也认为,就是如果你要做MCTS的话,那这个这个这个max robust child,一定是最好的选择,但是他就说了,那这个大哥。

你这个跑完之后内存都吃光了对吧,那我这个这个已经没有了,这个这个找不到这个节点怎么办,诶他说我不管,如果你发现现在没有一个你直播的那一环的,child那个note满足我的需求怎么办,再继续跑。

跑到这个节点出现为止,你看很不讲道理对吧,但是呢诶他这个方法确实是个方法,那当然了,还有最后一种方法就是比较折中了,就是其实我们不是有这个USB吗,哎我们这时候把它反过来搞。

叫LCB上刚才讲的叫上肢性区间,对不对,现在我们讲我们来设计一个叫下肢性虚线,什么意思呢,就是说我综合考虑,第一个你的胜率就是Q除上N肯定要考虑,对不对,第二个我还考虑一件事。

就是说如果你的采样次数不够大,那我要给你一个下调,所以这个时候你看那个公式刚才是加号,这时候变成减号,意思就是说,那你采样次数高的那个那个那个节点的话,他在这个时候它的优势就会大一点。

唉这个其实是非常有意思的一件事情,但这里面老老问题又来了,这个C怎么设置,它又是个玄学问题对吧,但其实你会认为就是说,实际上这个这个secure chat,他用的LCB的这个公式的话呢。

是把max child和robot chat结合在一起,考虑了,给了一个神奇的数学变化,再加上了一个权重,两个都解决了,所以这其实呢是一个,就是我觉得在大家在写蒙特卡洛,TRISHA的时候呢。

会自己根据自己的萝卜白菜各有所爱对吧,你自己去试一下,看哪个更靠谱,你选哪个,然后你也不用长篇累牍的向别人证明,你这个东西是有道理的,反正只要work了就可以了,所以呢其实讲到这MCTS就讲完了。

那么我觉得MTTVS它有个好处是什么呢,它会让整个A镜的行为啊还是满灵活灵动的,因为大家知道这里面是有随机数的好吧,其实只要有随机数知识的这个事情,这个世界就开始变得有趣了,对不对。

然后呢就是说agent的这个决策呢,基本上是自己决策的,实际上你会发现就是一个你用MCTS设置的,一个这个AI的行为啊,其实已经超出了设计师的想象了,因为就像阿尔法狗样,下到最后人类已经下不明白了对吧。

他就不知道他为什么会这么下了,那么其实呢,就是说我们对于一些非常复杂的测试,space的问题我都能解决,那么它的缺点呢,其实就是说啊对于一些比较复杂的游戏的情况,你其实很难那么精确地去表达。

他到底是赢还是输,而且呢你很难精确的定义这件事情,我做了之后对这个世界的影响,所以的话呢,其实而且呢它本身的计算复杂度很高,那这个答案从我的这个算法描述中能看得出来,对不对,那么这里面我特别想多说一句。

就是MCTS我自己啊对他的理解,就是说我不认为它能够适合所有的游戏类型,就比如说比如说今天我做一个啊MOBA游戏对吧,我去做用它MCTSMOA,游戏的这个这个AI的时候,如果直接硬做的话。

其实是有问题的,我必须要对世界进行一个转换,那么实际上当然也有人用MCS做那个,有木板游戏的,你们的AI包括我们像一些回合制的战斗游戏,我自己的感觉,就是说如果这个游戏它是一个turn base。

就是说是你一下我一下的这样游戏,第二个呢,他每一个动作,他的就是输出和结果是非常明确的,比如说我们假设这个回合制战斗游戏,那么我输出一个技能,那么我可以精准的计算出来,对方会被我打掉多少多少的血对吧。

我自己会改变什么一个状态,所以它就像下棋一样的,就是你一下我一下嘛,那这种情况下,我觉得MCT其实是一个很好的框架,但是如果我们在做一些更high level的一些,就是更复杂的一些游戏环境的时候的话。

那实际上你会发现,就是你不能够纯用MCTS了,你实际上是把MCT和比特吹啊,或者是GP啊,或者是HTN呢,大家结合在一起用,那么其实到最后你可能下面会放一个S就,有限状态机都是有可能的对吧。

所以这个呢哈实际上是啊,我觉得就是大家真的在用它的时候,一定要把每一种算法放到他合适的地方,所以我们这里面举的几个案例的话,我自己个人是我能理解的,比如说我非常的理解。

就是比如像全站里面我用MCTS能做什么,比如说我要做这个大世界上各个NPC的事例对吧,那些那个那些领主,那些君主,他看这个世界不就是我这个时候该刨冰,我这个时候该去宫里的一座城,还是跟你结盟吗。

对他来讲就是我可以选择的action嘛,那每个省城的结果我其实是比较好的去估算嘛,所以他其实也是个turn base的游戏嘛,大家如果玩过旋转就知道,那这个它的战斗是实时的。

但是呢他大世界的策略真的就是turn based对吧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

17.游戏引擎Gameplay玩法系统:高级AI (Part 2) | GAMES104-现代游戏引擎:从入门到实践 - P1 - GAMES-Webinar - BV1ja411U7zK

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个终于到了我们这节课,我自己个人觉得啊,应该来讲是最最最硬核的一部分了,其实也不叫硬核吧,就是说我觉得料很足,但是呢实话实说啊,我给到我要告诉大家一个坏消息,就是说我们在准备这节课的时候。

我们第一part要讲mercy learning对吧,机器学习啊,积极的基础,其实呢我们这关于这一这个东西,准备了大概三三十多页,三四页,在最后上课之前,最后几分钟,我把最后那些最难的部分全部给删掉了。

因为那个实在是太这个这个太太太怎么说呢,这个对大压力太大了,所以呢我觉得在这一节课里面,我们作为games104课,我们核心讲的是游戏引擎,所以呢我们只会跟大家讲一下。

machine learning的最基础的结构和应用,而更多的去跟大家讲的是什么呢,就是说在这个游戏的这个scenario里面,我怎么去用machine learning这个方法。

我们举的例子就是alpha star,就是著名的这个就是google的DeepMind,用那个AI去打这个星际争霸的案例,我们从这个案例可以着手推荐大家去讲。

所以的话呢真正真正复杂的machine learning的,基础的算法理论,其实那是一个需要专门的课程去讲的,真的其实machinery真的是非常非常深的一个东西,而且很值得大家去系统性的去学习。

所以呢很遗憾,就是说在这个课程我实在没有办法展开对吧,而且包括很多概念,我觉得我自己掌握的都不是很好,所以的话呢也不能够慢慢弄斧,所以我这边就给大家讲一些,最基础的一些概念好。

那么首先much learning的话,毫无疑问啊,就是现在是当下最火的东西,我们认为AI几乎改变了我们整个时代,那么在我们的生活所有的地方,大家都看到machine learning了,对不对。

就基本上是无处不在,你基本上每时每刻他都在为你服务,只是你意识不到而已,好那么其实machine learning呢它是一个大的概念,你从它最基础的概念出发的话呢,它实际上几个大的应用场合。

第一个呢就是它会分为,就是比如说surprised learning对吧,Unsuprised learning,还有呢simon surprised learning。

还有reinforcement learning,强化学习,前面的是监督学习,非监督无监督学习对吧,半监督学习,最后一个是什么呢,哎强化学习,那这个概念听上去很高端啊,高大上,但实际上概念也很简单。

就是说所谓的监督学习本质上是个分类器,什么意思,就是说人类打好了标签或者whatever,什么数据告诉你这个东西,比如说这是给你1万张照片,告告诉AI说这是那里面有猫,那你们没猫。

然后我再给你100万张照片的时候,因为有那1万张照片的training,它就能够自动对照片进行分类,说啊这是有猫的,这是没毛的,这个其实在啊很多年以前就是有一个比赛,很有名的AI比赛。

他每天打的就是叫照片识别成功率,最早以前没有那个那个神经网,deep deep neural dn的时候,实际上哈那个真的是仁者见仁智者见智的算法,但一旦这个是那个那个那个那个深度神经网络。

CNN这些东西出来之后,这个这个比赛现在已经变得有点没有意思了,对吧,但是呢确实就是深圳那个就是说suprise learning的话,它最核心的基础其实就是就是一个分类器,包括他做很多回归的这个预测。

就是它的基础,那么对于enterprise learning是什么呢,我觉得是一个classroom,就聚类什么意思呢,就是我记得我记得小时候,我们学过那个一些基础的算法。

是我记得好像还有个叫fisher什么算法吧,就是给你一堆散乱点,让你找一条线,把它们分成那个两两趴,我好像有点不太记得了,但是呢其实就是给你很多数据,你对它进行聚类,那么就无深度学习的话呢。

它自动可以在数据中找到规律,对它进行聚类,这个东西其实是有用的,比如说我们在很多推荐算法中,我们要对用户进行画像对吧,用户画像有几百个上千个维度,那你就你没有办法,任何人可以告诉你说。

诶我怎么去定义什么什么类型的用户,最后呢他只能把这些海量呢,比如上一集的上10亿级的用户,这几百个上千个维度输入到这个AI系统里面,AI自动的用无监督学习,把它分成各种类型的用户画像。

然后呢人类看了之后说哦,你好像讲的是这种类型的用户吧,最后我们人类用我们的这个匮乏的语言,给他贴了个标签对吧,所以有的时候你会发现,AI是能帮你发现很多这个世界的规律的,也是用这种无监督的学习。

那么这个就是半监督学习呢,这个其实讲起来很高大上啊,但实际上他做的事情也蛮简单的,就是我们人类不用给你那么多案例,是简单的告诉你几个案例诶,接下来你就可以基于这些有限的信息,我对这个世界进行氛围。

就相当于你给这个无监督学习,做了一点小小的影子,这件事情有没有用处呢,实际上还是非常有用处的,因为这也是AI现在研究的一个,很重要的一个领域,就是叫小样本学习嘛,就是说我们人类是很聪明的。

就是说有的时候一个小朋友你跟他说那是老虎,他只见过两次,但是呢你给他看动物世界的时候,或者看什么东西,他马上跟你说,那是老虎对吧,它就是几个样本,人类就能学会,那是个老虎。

但是的话呢如果你交给如果监督学习的话,你可能要上万张照片,确定他说啊,这是老虎,这是老虎,那不是老虎诶,我们的监督学习才有结果,所以其实小样本学习的话呢,也是现在人工智能一个很重要的领域。

特别是我们未来如果走向那种叫强人工智能吧,我们其实很需要这个这样的一种能力好,那么最后一个也是最重要的东西叫做强化学习,Reinforcement learning,那么这个强化学习其实非常的重要。

就是说在这里面的话,没有一个监督者,也没有人告诉你这件事情是对的还是错的,但是呢他对这个世界呢,它有一个叫rewarding激励的这个函数,就是你做对了,他给你一点甜头吃。

做错了给你点那个那个反向的惩罚,那么这个AI算法,它能自己的去不断的优化和迭代,最终形成自己的一个什么呢,哎叫策略,叫policy,大家还记得我讲了policy这个词对吧,那么形成自己的策略。

最后能够使自己的结果达到最优,而强化学习这件事情呢其实是非常重要的,那么这里面就是很多时候,我们现在讲这个机器学习,很多时候都认为说,是不是最近几年神经网络的高度发达,所以我们这些概念都出来了。

事实上并不是,其实强化学习这个概念,在这个机器人学里面很早就提出来了,真的这个这件事情真的是非常了不起的,就是说我一直这样,就是如果我们对知识掌握得足够多的时候,你会意识到,就是说这个是我们非常感恩。

这个星球上产生了很多很优秀的聪明的前辈,他们真的给我们奠定了基础,就是在那个时代,就是大家就在提出各种算法和理论框架,就是怎么样的,让机器形成一个自我不断强化学习的能力,这种能力。

我后面再讲到这个心机的这个案例的时候,大家会意识到这玩意儿几乎就是你左脚踩右脚,一开始笨得要死,然后自己左脚踩右脚,最后让自己越来越聪明的这样一个神奇的过程。

所以我很我觉得reinforcement learning这个词,选的也是特别的好,那么其实reinforce learning的话呢,它本质上是一个就是try and error search。

就是尝试以及给你反馈错误的,这样的一个一个一个一个搜索,但这里面有个很难的一件事情是什么呢,就是说你你对这个系统的学习呀,很多时候他对你的rewarding是delay的,我举个例子。

比如说老鼠走迷宫的这个案例对吧,我们在迷宫的终点处放一个那个cheese,放一个奶酪,那对于老鼠来讲,我最后吃到那个奶酪,我肯定很高兴嘛,对不对,我在这个迷宫中间呢,我再放几个陷阱,你掉进陷阱里面。

你命都没有了,对不对,好这个时候我怎么去训练这个AI,让他去指挥这个老鼠的行动的策略,这里面一个很难的问题是什么呢,就是说老鼠它在每一步走到迷宫中,任何一个点的时候,我到底是向左走,向右走。

向前走的时候,其实他的rewarding并不会发生的,对不对,他如果如果我们设计说,我希望老虎老鼠尽快的走,那你每走一步,我会认为给你一个惩罚叫简易,你掉到悬崖里,我给你直接减个1万。

但是的话实际上最重要的,比如说到达终点的奖励是1万的奖励,那个掉进陷阱扣掉1万的这个惩罚,实际上都是非常deferred,他是delay的,那这个时候我的学习系统,怎么样能学习到这样的东西。

实际上这也是强化学习一个很难的一个问题好,那么其实整个这个就这这一类的问题的话呢,其实很早以前就数学上给出了一个定义,就是马尔可夫链对吧,马尔可夫决策过程,那么在这个就MDP了,这个东西的话。

我相信很多上过大学的同学,好像都理工科,计算机的专业都应该学过这件事情吧,就是说实际上在这个很早以前,我们就把这个概念已经给你抽象清楚了,首先呢我这个世界是什么呢,有一个AI t agent。

就是他呢会做出一个角色动作,然后呢会形成一个状态,这个状态的话,在和这个世界这个environment的形成互动,所以environment就是我们这个AIT所生存的,整个世界的总额。

比如像老鼠迷宫这个案例里面,老鼠就是那个agent对吧,老鼠脑子里面是有一套什么东西呢,我们叫做policy,叫策略,待会我再讲,就是他我很难按照这个PPT讲,因为你会发现当你讲这个AI的问题时候。

他真的都在一起,然后呢这个世界是什么呢,这个environment是什么呢,就是那个迷宫,对不对,这个迷宫里面这个environment会包括那个cheese,也包括那些陷阱,对吧好,那么好。

那其实呢在任何一个时候,我们的agent和这个世界会构成一个东西叫什么呢,叫做一个状态对吧,状态就是当前这个A键在感知到的一个世界,和这个整个这个环境,在游戏里面就是这个我们人类设计的环境。

比如超级马里亚里面这个state,就是我马里亚输出,现在到底站在哪个坐标点对吧,我的世界上各种比如金币在哪里,我的前面的小怪在哪里,对不对好,我有这样的一个state,接下来呢我有我行动的选择。

比如说以超级马里奥二为例的话,那我的action其实非常的简单,只有三个选择,往左走,往右走,往上跳对吧,所以你会发现诶他的整个动作空间很小,只有三个,但是的话呢当我在当前的状态,我做了一个动作之后。

诶我就会什么呢,我会形成一个新的state,所以你会发现马尔可夫过程它是个循环,它就不断的循环,所以呢他就会啊形成这样的一个,就是说一个就是他有的时候说一个叫tuber,就是一个一个三元数吧。

就是说啊哦这三样书里面还有一条,我待会再讲好,最后一个什么呢,就是奖励,比如说我吃了一个金币,你还给我加一分,对不对,如果我赢了这个游戏,你给我加1万分,但是如果我碰到了这个小怪,我被吃掉了怎么办。

那我就要扣1万分,我就游戏是失败了嘛,如果我只是在做一些无效的移动怎么办,你给我说的是零嘛,对不对,我就一来一去,其实你用这个就是说state action和和那个和reward。

其实就构成了一个这个世界的一个完整的表达,而所谓的马尔可夫的这个决策过程的话,就是无限的在这循环,就是你现在有个叫啊SSA,还有二的一个状态,这个时候我做出了一个A键呢,做出了一个一个一个一个一个策略。

我决定做下一个动作,下个动作之后我的状态就被更新了对吧,然后呢我的rewarding也会变化了,然后呢唉这个时候我又决定我下一个action是什么,所以他就这样来回循环循环循环好嗯,那么其实在这样的话。

我们就可以得到一个就是马尔可夫过程的一个,数学表达,这个地方,我其实已经把很多很复杂的数学公式,全部摘掉了,这个我我真的大家一定要那个理解我们的痛苦,因为我们发现就是这节课程。

我们不太可能会把这个machine learning的,基础的理论给讲明白,所以我们只会给大家讲一些最基础的数学概念,首先的话呢其实呃在这个过程中的话,其实它最核心的一个数学表达是什么。

就是一个叫一个词,一个叫测这个possibility,一个概率函数,就是说当我在当前的策略的S的情况下,我去take一个action,比如说A,那我达到一个新的状态的possibility多少诶。

这个很有意思啊,他不是说我在当前策略下,我就是做了动作,A我就一定能到S1撇的那个状态,但这里面其实可能是一个概率,这个是有道理的,因为在很多我们在决策的过程中,就是说我们康是我们的主观上。

会有很多我们自己的判断对吧,我认为这个事情我怎么做了,我就可能会赢,但实际上环境是不受你控制的,所以环境一直在变化的话,他有可能会让你的一些动作可能会成功,可能会失败,对不对。

比如说我假设让AI做一个我决定射箭的动作,对吧,我决定要打掉前面的小怪,但是大家仔细想想,我如果那个下一个状态是那个小怪,被我打掉的话,如果我是百分之百能把那个小怪打掉吗,或者AI来设计。

你觉得AI决定设计他就百分之百能卖你社死呢,其实不会对吧,玩家他会有很多的行为,所以我在设计这个马尔可夫过程的时候,实际上是个概率函数,比如说我精英怪准头很准对吧,我有八成的概率一枪秒了一箭秒了你。

但是呢我的我的我的这个其他的小怪的话,我可能经常设的设法不准,我只有1/10的概率能秒到你,所以说这里面的这个possibility of transform的话,transition的话。

of state实际上是非常重要的一个一个一个函数,这问题,所以其实其实我们在讲,那个我们内部在讨论这个事能力的时候,我们经常互相被我,我经常就被K说,王鑫你又搞错了,这个地方不是一个不是个函数。

不是一个量,它是一个,它是个什么呢,它是个随机变量对吧,它所有的可能性都有,我把我惹急了,我就说嗯好像我用量子力学可以理解一下对吧,就是这个原子对吧,它只是一个状态,它只是它是不函数。

他在这个1430之前的话,它的真正的值你是不知道,你只能知道他在这个点出现的概率是多少对吧,所以这个地方是个possibility,一个函数,第二个东西呢也是个非常重要的概念。

同学们要去理解的就是policy policy,那这个policy是什么呢,就是我们的AI系统的核心,你可以简单把它理解成,就是说我的,无论你是用neural network还是用有限状态机也好。

你还是用一个最土的一个表格也好,它呢它就会形成一个policy的一个黑箱,诶,它的策略黑箱,当你把一个状态输入进去之后,他给你输出什么东西呢,输出我现在该做什么一个动作,诶,这个地方最简单对吧。

我一个状态A进去,我就出来我做什么动作,这个地方听上去是不是很好理解,但是这个地方我讲的是错的,实际上呢它输出的是所有可能动作的概率,什么意思,就是说当我一个状态输进去之后。

我会说比如说以刚才超级马里亚为例的话,那么他有三个马里奥,他有三种可能的这个动作,对不对,他应该输出的是向左移动,概率可能是比如说0。7向向向右移动,可能是0。1,那向上跳可能是0。2。

它当然这个地方规划,所以其实呢我们状态之间的transition,它是一个possibility,是一个随机变量的随机函数,变量的函数的话,那其实这里面policy就是我的这个策略的话。

它也是一个随机变量,对这个听上去是不是很深奥,没关系,这些东西呢大家听听就好,因为今天我们不展开这个machine learning的细节,但是同学们一定要知道这个概念。

就是说因为其实我们无论是用神经网络,用各种各样的东西,它核心优化的就是这个policy的这个机制,这个函数你可以认为他这个函数,你是用那个神经网络,你还是用这个就是状态机,还是用刚才我们讲的一个。

当然我们前面讲的所有的东西,比如说构图也好,我们的HTN也好,那个有限状态机也好,be a tr好,你把它整个封在一起啊,你可以把它理解成他就是一个policy的,这样的一个就是一个policy。

它有一个输出状态的输出啊,输出它就会有一个动作的输出,大家想想是不是这样的好,那么最后呢就是我们要去算他的这个total reward,对吧,就是a total reward这个东西呢。

实际上有一个很巧妙的东西,就是因为你是一个马尔可夫的一个过程,马尔可夫课程最核心的讲的意思是什么,就是说我们要把这个世界上发生的事情,变成离散的,Step by step,那么而且因为未来的更多的步骤。

其实是没有被发生的,对不对,所以我是对未来的世界的一种预测,那么你对未来的reward预测最简单的直接是什么,就是说从我当前的这一步走了这个动作的reward,到我后面所有的reward加在一起。

是不是就是我的总reward加在一起,就是我的game对吧,但是的话呢马尔可夫的有一个就很多,在很多AI系统有一个假设是说,因为未来有大量的不确定性,所以呢我认为我走这一个动作之后。

我做了这个action之后,我到了下个state的,我获得的奖励是靠谱的,我能把握得住的,再走一步的奖励的话呢,他就有那么一点点不靠谱了,那我乘上个什么呢,诶我乘上一个系数与伽马,我可能设计成比如说0。

99对吧,0。999没关系,但是呢当你走了100步之后,你那时候说的是version的话,就是0。99的100次方,你会发现它很小了,它已经不起作用了,所以其实它就是一个就是这个东西是有合理的。

其他就平衡一件事情,就是说我们当时在讨论这个东西的时候,我们我们的AI的老同学们说了一个比方,特别有意思,他就说你看啊,你今天这个要好好读书,你将来以后就能够特别特别的成功,这件事情重不重要。

当然重要了,我将来能赚一个亿对吧,我就完成了我的人生的小目标,但是你现在会发现,你这个时候如果不去吃饭,你今天晚上那个几天之后你就会饿死,那所以你将来赚一个亿的目标的权重,有那么高吗,没有那么高。

所以你现在最重要的事情是什么,赶快找到一个地方把肚子填饱,否则你会饿了对吧,所以呢其实这个这个权重呢,那个函数它就在平衡,就是短期收益和长期收益之间的一个一个目标,所以当你做AI it的时候。

如果你希望它更加的就是长期的目标追问的话,那你就把伽马设置的尽量的靠近一,甚至就设成一也没有关系对吧,其实在不同的AI系统中的话,有的时候他真的就设成E了,但是你希望这个就是这个这个AI体呢。

更加的responsive,就是说更加的顾眼前,更加的响应速度快,那你会发现你把伽马设的稍微激进一点,比如说设计个0。99990。98对吧,甚至你可以设置成0。95也没有问题。

那这个时候你就不可能太太太低了一点啊,那么你这个时候就可以去引导这个行为,所以说其实你会发现,其实马尔可夫决策课程中间的话,它最核心的几个元素就是这个元素。

第一个就是说我动作就是我的state transition,它的这个possibility这个分布,实际上就是你可以理解成是一种,概率上的一种graph,第二个呢就是我核心呢我的policy。

我反复迭代和优化的就是我的policy,是我的策略方程,那么最后呢,我的策略方程优化的这个指引者是什么呢,实际上是我的就奖励设计,我的奖励设计的话,你可以设计成一种就是更加的平的。

也可以设计成随着时间衰减的都可以,所以这是MDP的一个数学的核心表达好,那么其实policy的话呢,在我们的很多的这个就是deep in里面,我们都会写成一个巨大的一个派函数。

他们他的核心的输出输出就能看到,我讲的是你给出一个状态的时候,我会告诉你说你做下一个动作的,做那个动作的possibility,比如说以马里奥问题,你看到没有,就是往左走,我们设成0。2了。

但我讲的不太好,但是没关系,那往右走是0。1,我这个时候往上跳是0。7,但实际上我觉得这个例子举得,为什么上上上上跳0。7呢,因为这个时候我的状态里面你发现没有,我头顶上有一只金币对吧,我前面什么呢。

前面有只小乌龟,如果我的AI没有做错的话,这是我的AI的策略,应该是跳起来吃金币,而且躲过那个小乌龟对吧,那说明这个这个policy这个系统,这个pad做的还是不错的,那么讲到这儿的话呢。

其实在这一页之后,大概还有六七页,我们给大家讲什么呢,讲这个叫V函数,Q函数什么意思,就是在每个state上面,我们有个微函数会说,告诉你说这个state到底是不是好的还是坏的,那么这个CD有了之后。

我们还有一个叫Q函数,告诉你说在这个世界上你做这个一个动作,它到底收益是好的是坏的,然后基于V和Q函数呢,我们有两种优化方法,一种是基于这种叫做policy gradient的。

这个这个这个就是SIRI,就是说哎我是用这个就叫做什么呢,我的这个梯度优化法对吧,如果我这个这个这个策略网络是一个可微的,那我找他的梯度,那我去优化我的整个这个策略。

那或者是呢我整个在全局的就是policy,整体的去优化它啊,这个想起来就什么actor actor critical啊,什么很奇怪的一些东西了,那这个地方听上去就是各种,这个不是讲人话的东西了。

所以呢其实我们最后在上课之前的话,决定写到这一趴就结束了,就不要再讲了,就是说因为这其实就是machine learning的一个,很核心的基础概念,但是他这些东西他具体怎么做,数学上它是怎么去证明的。

实际上那是一个很深的一门课,那门课一讲肯定是讲不完的,就大家如果学过一些那个B站上一些,非常好的一些,就是那个就讲那个深度学习的一些方法的话,我觉得你们会讲的非常的好,但是呢做AI做游戏AI的话。

我们知道这些基础的概念,接下来更重要的事情是,怎么把这些东西用在我们的游戏里面去,好那这些,所以接下来就讲一个非常有趣的东西,就是哎我们怎么利用这个machine的这个行业的发展。

来benefit我们游戏游戏AI,这里面注意啊,我讲的是游戏里的AI,不是用deep learning的方法去做,比如说游戏的内容生成,比如现在一个很火的方向叫PCC,就是基于这个AI的。

比如说基于算法的这个内容生成对吧,其实还有很多的,比如说我生成动作啊,生成这种让人物的行为更加自然,这些都是很多很优秀的方向,但今天的话呢我们focus会非常specific的讲。

就说我怎么让游戏里面的这个AI变得更聪明,那为什么这里面我们要在游戏里面考虑,使用像much learning这样的东西呢,其实有一点就是说他会发现,我们过去所有的前面讲的AI算法比。

无论是HTN的还是GP的话,它实际上都是人类的设计师设计出来的对吧,人类设计师一切对于比如说你的动作能做什么,你有哪些动作,包括你该以什么一种关系串在一起,已经一切了然于心了,所以这就意味着什么呢。

这就意味着就是说这个AI的行为,应该也不会超过我们人类的预期,而且他很可能我们的想象力,就直接决定了这个AI的上限,但是呢那么是learning的方法是什么呢,特别是强化学习,它是可以AI自己去进化。

不断的去创造各种可能性,所以它实际上就把游戏的这个行为,变得更加的无限可能,那这件事情为什么对游戏特别重要呢,因为想象一下,我们我们认为未来的游戏的发展。

它是给人类构建一个更加的就是believable的,一个像真实世界这样的一个无限可能的世界,那我们想象一下,为什么我们人类旅游,为什么我们喜欢结交新的朋友,就是因为当你面对这些新的世界,新的朋友的时候。

他会给你带来完全不一样的体验和感受对吧,让我们有新鲜感,所以说其实一个好的游戏,这是我至少我个人的believe啊,就是我认为未来的游戏,它一定是当我每一次登录游戏的时候,他要给我带来一些新东西。

我不想去,每次去主城主持人的NPC都跟我说同样的话,对不对,很讨厌对吧,那么但是大家回想一下10年前的游戏,是不是NPC永远的repeat the same words again again。

但是大家想象一下,荒野大镖客这样的大表哥的游戏,一进去之后发现诶,这NPC的行为好像看上去好像很human like的,对不对,但是呢我记得好像有一个B站上的一个up主。

他去跟了那个大表哥里的NPC更了好像是一天吧,他后来发现说诶,已经发现这里面有些repeat了对吧,但没关系,我不知道它里面是不是用了这种,我是能力的方法,但是我认为这已经push for了。

但确实在我们这个领域里面的话,我们确实在思考,就是用这种深度学习的方法,包括一些那个机器的这些人工智能的东西,让这里面的游戏AI真的会思考,会探索无限的可能性,这也是我们一直一个梦想好。

那么我们怎么样在一个游戏里面去构建一个,基于machine learning的这样一个firm work呢,这里面的话呢其实没有大家想象的那么fancy,其实在游戏里面你想构建这个它的。

比如说人工智能的东西的话,其实最重要的一件事情是构建这个游戏的这个,Observation,就是说你把游戏里所有的状态,能够定量化的表达出来,就以你作为一个游戏而言的话。

就是说你要把这个游戏里面所有的状态,用state表达出来,这样你这时候才能变成一个电脑可以感知的,这样的一个世界,那么你有了这样的一个世界之后,你反复优化的是什么呢,是你的policy对吧。

这里面policy又来了,就是说当我的世界在这个状态的时候,我这个时候我的AI应该做什么样的一个动作,然后呢这个世界会发生改变,而且对我会更好,所以它其实是这样一个大的循环,那这里面我就举一个例子。

哎这里面就讲一个更具的,因为这个问题讲的非常的抽象,其实如果我们用deep reinforce learning,就dire是stands for deep reinforce learning。

深度强化学习这样的一个框架去构建一个,比如像星际争霸的这样的一个游戏的话,我该怎么做,这里面的话呢,你会发现你有这么很重要的几步,第一步就是对这个世界状态的描述,我们叫做state对吧。

就是你大家想象一下我们打星际的时候,你看到的是什么,是一个一个的像素,对不对,那我们人会怎么样,我们的大脑会把这些像素抽象成各种语义,对不对,这是我的基地,只是敌人的冰,那是敌人飞在天空上的航母对吧。

这是我的机枪兵,这是我的那个那个那个医疗兵,然后小地图上红的点蓝的点,对不对,资源点看得一清二楚,对不对,那等等,还有我的血量各种状态,所以这些state实际上是需要有一个量化的方法。

表达给我们的AI系统,第二个是什么呢,哎我的我有了这个世界的表达之后,我要定义说电脑AI到底指挥我的这个这个游戏,做什么,你要定义你的action,其实action这件事情并不简单,因为大家想象一下。

我如果我的电脑控制的输出,叫鼠标的点击拖动是吧,这个就很奇怪了,对不对,其实比如说如果我让小兵让电脑打星际的话,实际上呃,他很可能是直接给那个小兵发一个移动指令,当然这里面有作弊的嫌疑啊。

所以实际上在真实的这个AI与人类对抗的时候,他甚至会模拟人类的手速,都是都需要去模拟的,但anyway,就是说其实action的话也是需要被定义好的好,第三个呢其实也很有意思,就是说大家想象一下啊。

我去打一场像星际这么复杂的游戏,那我一场游戏要打大概将近一个小时吧,长一点,短一点,30分钟,20分钟,那在这么漫长的时间里面的话,我每隔比如说一秒钟思考三次,我去做他的角色的话。

那我其实会产生几千步上万部,但是我怎么去知道这个东西胜负,是有道理的对吧,我要设计它的rewarding激励,最简单的revolting很简单,就是剩剩了给一分对吧,输了给零分,那个啊输了给一分。

假如评论给零分对吧,有的游戏是没有平局的,但是这个rewarding设计的就很粗暴,但是这个rewarding能不能work work,但是你如果希望这个AI更加聪明,更加有效的话。

实际上你要设置它很多的动作的奖励,后面我们会讲到那么好,第三第四件事情是什么呢,就是说根据你要做的这个,游戏的本身的结构和逻辑,你要构建你的这个neural network的这个拓扑结构。

和它的网络选型,这件事情其实是非常考验这个团队的基本功的,那么这件事情对于每一个不同的游戏,根据它的游戏的核心机制,你的设计方法确实不一样,最后呢就是哎你有了这个,你把世界抽象成了这个状态了,对不对。

你定义了所有AI可以指挥小兵做这个,指挥这个bot做的状态,然后呢你也设计了非常合理的几样零函数,你也设计了一个非常贴切的这个,这个网络拓扑结构好,你是不是都work了,哎没有那么简单。

你还要设置一个训练的策略,因为假设你不认真的设计训练策略的话,你的这个I其实也很笨,待会我们讲到那个阿尔法star的时候,大家会发现这里面很微妙,好,这其实他开发现就是说。

虽然听上去大家觉得这个人工智能,那个那个深度学习好像很强大,但是你把这样一个强大的工具用在游戏的一个,具体的scenario的时候,你会发现这个事很复杂,这里面我再多说一句。

就是说其实大家刚才我们第一个案例,讲蒙特卡的research mc t的时候,我们讲的是阿尔法go的例子,就是下围棋的例子,我们讲过围棋多复杂对吧,pony爸爸说他比宇宙的原子还要多。

但是我跟大家讲一件事情,就是说其实对于围棋这样的一个博弈来讲的话,计算机用这个方法,计算机用蒙特卡洛吹测试方法,再加上一点那个深度学习的东西,现在已经完胜人类了,那为什么呢,因为对于项棋类运动啊。

他的信息第一个是对称的,就是所有人看到的奇迹是一样的对吧,而我们真正打游戏的时候,什么我们有个叫战争迷雾,大家想想看,所以它是一个叫信息不对称的这样的一个博弈,第二件事情的话呢,围棋的规则你每走一步。

它的步骤是非常明确的,所以接下来我讲了,如果我有无限的算力,和无限的这个存储空间的话,理论上是有必胜策略的,好在这样的一种博弈里面的话呢,目前啊好像是人工智能已经干过了人类了对吧。

大家都知道围棋最近发生的事情对吧,但是在像游戏,比如像星际争霸这样的游戏里面,到目前为止,全世界还没有AI能够完善人类的player怎么样,我们人类的最后的尊严还最终保住了。

对对于这种超复杂系统的博弈来讲,我们人类的大脑,毕竟我们有1000亿个神经元嘛对吧,我们还是勉强苟延,残喘了我们人类的荣光,所以其实我这句我讲这句话的意思是什么呢,我想告诉大家。

就是说其实游戏的这个scenario里面,如果构建一个这样的一个人工智能的话,实际上难度还蛮大的,而且呢你很你真的想做的很好,其实非常的挑战好,接下来就讲一下这里面的很多的细节好,我们这里面的话。

我们就举个例子,我们就不叫举个例子,其实这也是我们发现的最好的例子,就是alpha star,阿尔法star就是我们的DeepMind,在几年前用这个就是它的这个神经网络,这个技术构建的。

是跟人类打星际的这样一个例子,那么他首先第一步是什么呢,我要对游戏的整个状态进行表达,那么第一个,那么整个一个星际界面打开了,你会发现没有,里面是有很多的哎,很多的图,很多的map小地图也好。

我一眼看见的东西也好对吧,然后呢我还有很多游戏的统计数据对吧,我还有很多单位在地图上跑,怎么样呢,我还有什么呢,还有我自己的各种数据都在里面,所以这些东西的话呢,是实际上就是我对世界的state。

那state的具体怎么去表达呢,这样的东西其实AI是不知道的,那我们就要对各种state进行定量的表达,第一种是什么呢,就是各种各样的map,比如说我的整个地形的高程图对吧,什么地方是高地。

什么地方是平地,如果打过星际的小伙伴,就知道高地的意义是很不一样的,比如说我的飞行单位可以去攻击任何高地上,高地上的目标,但是的话呢,我的地面单位如果没有条通很多高地,我上不了。

比如说我们以前那个星际地图,可以自己编辑的时候,有人会做个非常变态的图像,这个图像有无数的高地,都是都是孤岛对吧,就地面单位永远上不去,所以我必须要用航母啊,或者是那个就是那个飞行飞龙啊。

去攻击那些地方,第二个的话是什么呢,我的战争迷雾,它本身是不是也是一张图对吧,还有什么呢,诶我这个比如说地面地表的各种状态的变化,比如说在那个就心机里面有个叫重组重塑,它要在那个地方去渐进任务。

它首先什么要把那个地方先感染了对吧,他那个地方需要被感染掉,那么还有什么呢,就是我什么地方发生了警报,还有呢我什么地方可以寻路的,这个这个图还有什么呢,就是说哎其实很多的在AI这种设计中。

我的叫inforce map,就是比如说威胁图像这些东西在里面也会协同,在上一节课的时候,我们讲了game play的时候,也讲到了这个东西,所以其实啊我对一个游戏的态势的表达。

可以用很多层的这样的一个map去表达,这些东西呢,我们人类看起来是很抽象的,你看不明白的,但是你交给计算机,不妨碍计算机,它能够去读懂这些信息,所以你可以把整个战场博弈的态势。

转化成一层层的map传给他,那么第二点是第二种数据是什么呢,就是各种各样的unit的information对吧,你的哎你面前unit的type是哪些,对不对,是什么类型的,比如说是机枪兵。

护士兵还是这个什么坦克对吧,然后呢这些人到底是敌方友方还是盟友对吧,你还有这些人血量怎么样了,对不对,还有他们的现在的位置在哪里,这个我就不一一展开了,但实际上是让这些信息是什么呢。

它不是一个map信息,它是一个离散信息,一串一串串的数据过来好,你有了这样的一些信息之后,我们接下来干什么一件事情呢,我们要定义说我到底能做什么一件事情,比如说以星际这样的游戏为例的话。

我们就要定义说哦,你是moon attack build对吧,三个最核心的问题,但是呢这问题听上去很简单,你能做什么,但是你要知道who对吧,是谁去做这件事情对吧,因为心机里面你同时给个指令的时候。

有的时候给的不是一个单位啊,你给的实际上是一群人对吧,第二个就是你要攻击的对象也可能是个人,你到底攻击谁呢,你是攻击一个建筑物,还是攻击对方的一个,比如说飞龙,你还是打掉对方的一个什么。

这个就是一个一个一个坦克对吧,你自己决定那么打去,比如说你如果是木的话,你到底要去哪个点,因为有的时候我我去的点是只是个坐标嘛对吧,所以说其实包括你后面的,比如说如果我们有一定的planning的话。

我可能输出的动作不是只有一步,我可能好几步,比如说我要求你先移到那个点,接下来你在那个地方给我建一个基地,新一个分基地建起来,所以说其实action的定义对于游戏去做这个AI来说,非常的重要。

你要定义的非常非常specific,非常非常的清楚好,接下来的话呢我们要设置奖励,那么这里面的话还是有很神奇的事情的,比如说像我们去读那个阿尔法star的文章的时候,我们就很惊奇的发现。

就是说他说我的奖励设计的非常的直接,就是我只设置win and lost,就是win我给你加一一分,书就减一分,但其实呢它这里面还做了一个小小的这个,这个优化,他说呢就是说他会把游戏中很多的一些状态。

比如说这些啊,一些比如distant agent,agent之间的这个这个就是就是电脑算出来的,这个就是大家记得policy,对不对,我用我的我的电脑,给出了我下一步操作的这个动作,和人类。

如果在这种情况下,他做的动作我做过比较,如果他两个不一样的话,我对他有一个反向的惩罚,如果一样,我做过这样的惩罚,我我做一些的一堆的CRITERI去引导我的做法,就这个地方我们就看傻了。

我们就说哎呀大哥,你这个地方对吧,胜负只按正一去给,那你这东西到底给多少呢,你是给这个100还是给1万,如果你给100和1万的话,那显然胜负这件事就没有意义了,对不对,那如果给的太小,它也不起动了。

为此的话我们还专门请教了国内的一些大牛,他们告诉我说啊,因为我们自己没有实践过阿尔法star这边paper嘛,就是我们就去拜托他们,他们跟我说,他说哎,其实他们的大致的给了这个数值加了权重。

让这些所有的这一项的一些叫做relevant,这样的一个sudo relevant,Sual reward,叫伪基地的话呢,它的总加在一起的范围,大概值域范围大概在正一之间。

就是跟那个VR的loss基本匹配,但是呢就不会超过它,但这里面的权重怎么设置,怎么算,就是他们自己的黑科技了,但是呢这个是阿尔法斯的方法,但我个人觉得其实有很多其他方法,这里面举举另外一个例子。

这个例子就是那个OpenAI five,这个open范围也是很有名的一个AI系统,就大家如果喜欢打DOTA的人,肯定都听说过,就是这个是OpenAI做的一个就是啊就是打DOTA的AI。

那么打的应该是DOTA2,那么这里面很有意思的事情,他为什么叫five呢,因为大家想想DOTA上上场都是五个英雄对吧,那么他呢就设计的非常符合我们玩家的理解,比如说对吧,你胜负当然会给你分数了。

但是哎你偷了个塔对吧,你干掉了一个英雄,比如说你被人家这个,你你你你被人家砸中了一个一个技能,你受到了伤害对吧等等,所有的事情他都给你一个小小的激励,这些小小的机理在一起。

就形成了一个非常高频的一个rewarding系统,这样的话而且他还有一个很巧妙的地方,就是说因为你设置了这么多的小奖励,实际上你比如说把击杀英雄这件事情,他的reward给的足够高的话。

你实际上就能够定义他的AI的行为,就是非常的aggressive,他会更加的想去砍人对吧,如果呢你把它胜负看的这个特别重的话,这个AI就会怎么样呢,他会非常的这个这个非常的保守,非常的安全。

他就优先把这设计做,就这他就优先以胜负大局为重对吧,很有格局,那所以的话呢,其实我就可以通过这些变量的调整,就这些rewarding调整,让我的AI有各种各样行为的变化,那么其实跟新机一样。

就是到现在为止的话,open a f好像还是打不过人类的top tier的玩家,哎这个我们人类最后的荣誉还是保持住了啊,但这句话我觉得这个flag还是不能立得太早,说不定再过几年AI的发展。

真的把我们又摁在地上摩擦了我,我突然觉得有种莫名的荣誉感,你看啊,这个围棋这么古老的一个运动被AI碾压了,但是我们这么新兴的一个运动,电竞,到目前为止还是人类的圣光。

保持保持在我们的这个没有没有熄灭对吧,那这个灯塔的话,我们希望我们人类选手保持的越久越好,所以呢这里面单单从回到我们这个这个课程,算法里面讲的话,就是说其实当我们用这个啊。

就是deep deep reinforce learning的方法去做游戏的AI的时候,其实rewarding的设计,包括它是高频和低频呢非常的重要,就它直接会影响到你最后这个系统产出。

那么你有了这样一个东西的时候,诶,我们就开始要构建我们的这个训练的这个,这个神经网络系统了,大家看到这张图是不是有一点,这个非常的这个密集恐惧症啊,唉不好意思啊,这真的就是这个阿尔法star的。

它这个体系架构图,这几乎就是从原文上扣上来了,然后我们唯一做了一个工作干嘛呢,我们画了两个框,所以告诉大家,就是说它下面是一堆的各种各样的输入对吧,其实我们讲了stay的输出,比如说你各种各样的图对吧。

然后还有各种各样的游戏的数据,比如说有些数据是游戏的统计数据,有些数据是这个玩家的unit的数据,它扔到了不同的这个架构的这个神经网络里面,有的是用这个就是RESNET对吧,处理各种各样的图。

有的呢是用这个就是说啊transformer对吧,处理连续的数据,有的呢就是用那个MRP对吧,就这最简单的神经网络处理它,然后最后扔到了一个LT那个TM对吧,那这个听上去很高端了。

待会我们会解释整个这一段全部做完之后,干了一件什么事儿呢,他计算机就是这个这个AI,就做了一大堆很奇怪的运算,最后他encode了,形成了他自己这样的一个角色,但这个角色呢人类是读不懂的对吧。

他输出了一串的数字,水鬼没有人知道他在讲什么诶,它上面也做了一层网络,这种网络相对就比较简单了,他干了一件什么事情呢,它叫叫decoder,Decoder,就是呢把这一这一堆大脑算完的结果。

把它翻译成我们人类能理解的,他的整个行动,这里面就会说诶我有些有些decoder,有些行动就是说我到底要不要空兵,有些行动是我到底要移动对吧,各种东西它就控制好了,所以其实它的整个你去理解它的结构啊。

已经分成两层就好了,第一层就是神秘的角色,课程产生了一个谁也读不懂的一些数字,就像一个对大家如果看那个玄玄疑小说的时候,有一个极其聪明的,比如说这个智囊,他分析了整个这个这个天下局面。

然后呢给那个就是这个这个这个主公,在墙上写上了一行字,然后一般人看到强子完全看不懂他在说什么,但是呢主公再找一群模式,把那几个字逐字逐字的去解读,去理解,然后最后形成了韬略说啊,这个什么张将军。

你带5000人去杀到什么地方去,李将军,你赶快固守我的这个陈强诶,这个decoder就干了,这个事,然后呢最后我这个AI就可以行动起来了,怎么样,听上去是不是呃一下子觉得没有那么高大上了。

确实是你如果这么去理解的话,好像也没有那么难对吧,那其实最有意思的就是这个encoder,就是他怎么去决策的这事呢,说实话,就是这也是我一直以来对这个深度学习的一个,怎么说呢。

也是我个人不成熟的一个理解,就是因为我有很多朋友,就是应该是全球顶级的这样的一个,人工智能专家,这个地方小小的凡尔赛一下,是他们很优秀,不是我很优秀啊,这个说实话,我每次对他们的敬仰之心都滔滔江水。

然后当我每次呢因为有酸葡萄心理嘛对吧,我又我又做的不够好,所以我就开始酸他们了,我就说我说你们做的事情,就是一个那个炼丹的过程对吧,你们设计个丹炉,然后呢把各种材料往里面加面,多加水,水多加面对吧。

然后的话呢就是然后呢各种什么朱砂呀,什么这个什么铜铜铜须啊,什么都往里加一通火,烧完之后最后练出一个东西,哎这东西就好了就work了,那这个当为什么练出来的原理是什么呢,你也不知道。

大概猜猜可能是这个原因,但其实你也不能给出一个非常scientific的一个,数学证明对吧,那其实今天就是我们深度学习,有个很重要的一个研究方向,就是说为什么这个深度神经网络它就是work的。

虽然我能够用一些简单的概念解释它为什么work,但是其实在数学上,我去演绎他的work这些事倒还是挺难的一件事,但是确实有很多很优秀的科工作者在做这个事,所以的话呢其实我们去理解这些大佬们构建的。

这个就是这个各种各样的训练的模型啊,其实你就把它想象成这玩意儿就work了,而且他能处理什么样人类的问题,然后呢我们就像拼搭积木一样的把它搭起来,只能解决好我们的问题就可以了对吧。

所以很多东西你是不能深究的,至少深究已经超过了我们的智力范围,所以如果按照这种不求甚解的思思路的话呢,诶我们好像就能够把这个这一张神奇的图,就给他解释清楚了,那比如说大家看到其实我们的输入啊。

它其实有三类,第一类是什么呢,就是我们讲过的诶这个游戏的基础状态,比如说我的资源量对吧,我各种各样的气呀,我的这个这个各种人口啊,各种资源量在这边,对不对,这就是一个很确定性的,就是定场的一个数据。

对不对,他一个游戏中你就那么些数据,第二种是什么呢,各种各样的map对吧,我对游戏态势的感知不就是小地图对吧,我的各种各样的influence map对吧,这种map过来诶,我要对这种图像数据进行处理。

对不对,那第三种是什么呢,唉我现在目力所及看到了多少的敌方单位,敌方单位的坐标是什么,我方单位的种类坐标位置,但是这里面有个挑战是什么呢,它的长度是变长的,而且一直在变呢,对不对,你开发现没有。

就是说你很难说我现在只看着前1000个,但是如果你真的设计个maximum,然后的话你只用maximum的这个东西,就是所有的没有的,就是成林可不可以可以的,但是呢这个他的这个这个行为表达就很诡异。

那这个你的实践网络其他的要求就很高,那么对于这种三种不同类型的数据啊,其实我们的这个这个这个deep learning的先贤们,已经给出了非常好的AI的训练的方法,他怎么说呢。

比如说对于你定场的这些数据,我用什么呢,我用MLP,MLP全称叫multi layer perception,它其实就是最简单的多层神经网络对吧,然后呢你你给他一个输出,他就给你一个输出对吧。

这样的话你就反复的去反向训练它,它就可以去给出一个你想要的一个结果,所以对于所有的这种固定的环境资源类的数据,我就这样放下来,那么第二类的是什么呢,唉就是各种各样的图,那这个图就很好办了。

就用CNCN是什么呢,就convolutional neural network,就是卷积神经网络,那么这里面最大名鼎鼎的叫什么叫RESNET,RESNET的话呢,其实是那个就是孙健博士这道题了。

这个很不幸啊,孙健博士最近刚刚去世,其实他生前是我的一个好朋友,就当时我真的是我很敬重他,然后就是他提出了什么,哎我在就是因为因为以前CN还是一层层的嘛,他recenter提出来说。

我把前面的那一层的数据我一直往后跳,直接给他们,这样的话,当我就是看那个那个就是我的CN到后面的时候,很多高频的细节的数据都丢掉了,但是因为我有这样的一个跳的话,我很多细节能够传到前面去。

那这个像这种CN的东西,它有很大的好处是什么呢,它可以把一个图像数据直接囫囵吞枣,包括我们现在几乎所有的图像识别,都是基于CN的,那比如说我们假设作为一个RTS游戏,模拟人类去看这个世界的感觉的话。

其实你应该输出的是什么呢,是人类视角的这个深度图,然后用CNN去识别出来,那边有小怪,那边有敌人,这才是一个公平能力,如果那个人直接点标出来的话,那其实是不公平的,因为我们人类的时候在远处。

比如说对方穿了个迷彩服,你就很难发现了,对不对对吧,它或者它只有一个像素,但是如果你假设不用这种,就是啊一米几base的方法的话,你其实很多是在作弊,你说啊1000米之外有一个小怪,它只是距离很远。

那你说到底你算你知道还算你不知道呢,对不对,但是呢其实对于这个就是,比如说解决星际的这种图的,星际是一个很典型的RTS游戏嘛,它这个策略游戏,其实在这些各种各样的小地图也好,包括war fog。

它本身也是个图对吧,就是战争迷雾也是个图,包括就地球地图上的高低分布,还有地图上的这个我是否探索过的区域,我刚刚探索的区域,这些全部都可以用图来表达,那事实上就是你这些图就可以扔进我们的一个。

CNN网络进行处理,产生我想训练的结果,那么接下来第三种呢,就是大量的时间上的不定长的这个数据,那这里面的话就进入了一个著名的transformer,transformer本身是蛮复杂的。

就是但他基础思想实际上是在LP里出现的,就是说大家想象一下,我出了一个文本对吧,没头没尾,无穷无尽,第二个呢你很难把它归咎化成一个,比如说一个一个一个一个啊,一个表格或者是一个2D的东西。

所以呢transformer的好处,就是说它一直能叠在一起,然后你把数据一直一直一直往里面灌,但是它能够处理这种continues的,没完没了的这样一个变量,那么在这个那个就是那个那个那个。

alpha star里面的话,我们对这个世界上的这种,比如说unit这些不正常的东西的话,我们用transformer送进去好,那这三个东西揉到一起之后,他都是离散的,没有处理,对不对。

你只是各自好像扔到神经网络,做了一堆其实没有意义的计算,哎接下来怎么让它变得有意义呢,哎我上面再加一层东西,就是LSTM,那这个东西就非常了不起了,就是这个是最早大家提出来。

就是说我怎么样让这个神经网络,像人类一样思考,人类对一个信息的处理啊,它不是单纯的说你给我一个东西,我就处理完就出去了,不会的,我们人类还有个东西什么的,我们有个叫反馈和记忆,就是说我上次做了一个决策。

这个决策假设是好的或者坏的,其实我会把这个决策记下来,记下来之后呢,我就会影响到我下一次角色,比如说一个东西反复出现,那我认为这个东西可能是高频的,我可能会有些其他的处理模式,对不对。

第二就是说我的记忆不会一直持续,我的记忆可能会需要一段时间,我就是假设有不断的新的数据过来之后,那么我可能有些记忆会忘记,所以ASTM的讲起来比较复杂,但是你仔细看那个通路,这里面很有意思。

就是说你的信号S进去之后,它会产生一个结果,就H上一次那个H结果那个H那个结果呢,他又反向的回来去修改你的那个你的记忆,那记忆在哪里呢,就是你的cc是什么呢,就是你的脑细胞。

所以我们的大脑实际上比大家想象的复杂,就是说它不仅具有计算功能,它还有一个记忆功能,而且我们的记忆我一直认为是一个flash memory,就是闪存对吧,万一断电了,我的记忆就会失意。

你看很多那个时脑创伤的病人,如果缺氧之后,他就会有很多东西失忆了,说明什么呢,这个像上次一样断了个电,那你的信息就丢掉了,我们什么时候把我们大脑换成磁盘,可能就很牛逼了,但这个没关系。

这不是我要研究的范围,所以其实那个LSTM的话呢,它就像一个这个综合的大脑,它会把这三个不同的,比如说从你的这个就是那个mp,你的那个就是说CN和这个transformer,处理完的数据。

最后在我这汇总,但我这个时候建的就会比较复杂,它会具有一定的记忆功能,让我的这个AI能跑起来,那为什么记忆功能很重要,我给大家举个简单的例子,就是说比如说我们在在星际里面打策略的时候,对吧。

我前面看见了一个敌人,过一会WOLFA把它盖住了对吧,包括我前面我对方可能变化了一些策略,比如说刚才打五台,现在又跑了,那在当前的状态里面,实际上你并不一定知道他刚才打你的这件事情。

但实际上你有了一些记忆功能之后,你就知道说我这些人可能刚才被打过,你想很多是不是很像我们人类思考的过程,所以你用这样的一个东西的话,其实就构建了一个完整的,他这样一个决策的链路。

那么decode我们就不展开了吧,就是说实际上的话呢,我们在用deep learning的方法去构建,我们的一个游戏AI系统的时候,其实最重要的就是你选择不同的,neural network的架构。

而且呢这些neural network在一起,又本身就构成了一个architecture在一起工作,比如说就再重复一遍,就是比如说对于定常数据的话,用MRP基本上就够了对吧,对于不定长的数据的话呢。

我们会用LSTM或者是transformer来处理,那么对于图像相关的数据,我们用这个RESNET,但其实呢这里面还有一些更复杂的数据输出,比如说像recast的数据,大家会觉得为什么我们作为一个游戏。

i show recast呢,我给大家讲一下,比如说最前沿的一些游戏AI的研究,比如说我要模拟一个AIT向人类行为的话,我可能像人一样,我发出一系列的射线,我会获取对这个世界的采样。

然后我再去决定我的AI的行为,因为这样的话这个AIT它就会很真实,他会就是说他有些人看不见,而且他看不见背后的东西对吧,那这个游戏我就不点名什么游戏了吧,就是做的非常好的一个游戏,那么其实的话呢。

这个也是会作为我们AAI的输入,那么像整个mesh也可以作为输,所以这里面的话我就选了个open a f的这个例子,就是说他这个网站做的非常有意思,就是你可以看到在AI的实验里面选中每个单位。

你可以看到他所有的这个参数,所以我一直蛮喜欢open a fi,他的做事的方法就是非常的可爱,非常的符合,就是由gamer的这种认知好,那么其实呢,其实这个时候我们就训练我们的AI了对吧。

就比如刚才我们加了一个这么复杂的,这个这个这个这个神经网络的架构,不好意思放回去啊,那么好,那我要开始训练它了,那训练它呢,其实大家想想看最理想的方法是什么,不就是大家一直很敬仰的像阿尔法zero对吧。

阿尔法go背谱子的不值钱,没有本事,alpha zero只告诉你基础规则,你就可以去打了,这件事情听上去是非常的高大上,但是呢对于游戏这么复杂的一个情况的话,如果你真的像这个阿尔法zero方法。

就是你不去不给他任何的先验知识,直接去训练它那个神经网络,那又在这么漫长的reverting的这个链条下,那这个网络能收敛,能给出一个meaningful result,这个时间应该是极其漫长的。

时间漫长,你说没关系,我可以等,但是这里面还有一个东西是什么呢,诶是钱money,就是待会我会提到,就是说其实做这个就是基于深度学习的,这样的一个人工智能,其实成本是非常高的。

那所以的话呢一个reasonable的解法是什么,就是诶我们先把大量的人类的行为把它放进去,就是用监督学习的方法,首先衬出一个相对OK的这样的一个神经网络,哎这里面就很有意思了,那也就意味着什么呢。

就是我先让AI去模仿人类,就是说我把一个state的输进去之后,你如果AI就是因为我们有大量的游戏,有大量的历史数据,对不对,好把这四类数据后,如果你的AI不不去,按照我们人类的一样的去操作。

我就打你一下,说你错了,你要学我对吧,那这个时候就像小孩子一样学东西,他有样学样啊,那我想问大家一个问题,就是说你这时候要注意两个东西是什么呢,就比如说你更应该选择什么样的数据去测试呢。

唉很多人就这时候想到了,就是说我要什么呢,在人类的玩家的这个数据中,我要挑选那些积分比较高,排名比较靠前的人类玩家作为输出,对不对,这个事情这样做是对的,为什么呢。

因为就是说叫这个这个叫shooting the the the mars,黑田的墓,就是说你如果想让这个AI聪明一点,你真的要去找人类最低的这些玩家的行为,去训练它,但一般来讲你训练出的AI的话。

不会比这个原作者更聪明,一般都会比他笨那么一点点,但是这不妨碍我们这个AI已经有,就是相当于是能beat一个业余玩家的水平了,那么这里面的话就有一个有一个取舍。

就是说如果你选择最top tier的玩家的话,这个数据肯定是最好的,对不对,但是你的数据集比较少,那所以有的时候,我们会选择一个相对平衡的一个点,就是比较优秀的玩家数据输出来就可以了。

那这里面再讲一个有意思的概念,就是说,其实像那个那个那个阿尔法star的训练的时候,他用了一个叫kr divergence,就是这是个数学,这个这个数学解释起来就比较比较,比较比较高端了,叫什么呢。

叫叫就叫数值差伤吧,就他是用上entropy双商的概念,他就讲两个分布之间诶,他其实会形它两个差会形成一个伤,我要让这个商尽可能的少商为零的时候,就这两个分布基本一致,但是如果伤比较高。

说明我们两个的这个决策就差异度比较大,但我就认为这是个不好的网络还是优化的,所以其实在像阿尔法star这样的东西的时候,他一开始是用了大量的人类玩家的行为,去训练出它的基础的这个,网络的这个这个结构啊。

接下来的话呢诶我们要进行这个监督学习啊,那个真那个那个就是那个就是那个增强学习,reinforcement learning对吧,那么强化学习让AI开始进行自己互补,这里面其实他用了很多很高端的一些。

就是reinforce learning的一些方法,这里面我就不展开了,但是这里面讲一个很有意思的东西,就是说我怎么样子,让这个强化学习能够越学越强,其实呢你有一套强化学习算法。

你可以反复的优化你的policy,对不对,但是这种优化它本身还是有上限的,所以呢alpha star它有一个非常了不起的一个方法,这个方法我觉得就是如果我们去做这个嗯。

那个就是machine learning的方法做游戏的话,一定可以很很有参考意义,就是他研发了一套叫就是双手互搏的策略,他首先定义了就是它一个叫主a agent的,假设。

我缩写为A那么他每天呢是他还跟自己打架的,你就知道了,他这他要双手互搏,他每次都要想办法自己把自己打赢对吧,因为没有人类跟他打嘛,他只能自己打,一天要打个几10万局,上上百万局都没有问题,那么好。

那么他这里面不是永远只跟自己打,因为他一旦只跟自己打的话呢,它的这个AI就到一定程度,它就会诶卡在一个点上了,就是其实做deep learning的人都知道,就是你最怕的就是你的这个AI。

优化到一个局部最优解,而不是一个全局最优解,他就设计了这样一个策略,就是说首先呢我跟自己打35%对吧,那我剩下的呢我要跟另外一种卷的,我们就是跟所有过去的其他的agent的。

比如说啊这里面我们定义了两种选择,一种叫league这个exploiter对吧,还有一个呢叫main exploiter,这个待会我会解释就是是另外的两个agent的,两狼人类agent的。

我跟我跟他所有的过去去打,然后呢我还跟我所有过去的自己的A技能去打,打15%,这你们就觉得很奇怪了,就说哪有那么多的AI简易打的,但实际上并不是的,就是AI你就训练出一个版本,假设你只有一个版本。

你确定一次它形成第一个版本对吧,那我再确定一段时间,我就生成第二个版本,那我过去可能会生成100个历史的,就是阿尔法star的版本,原则上来讲的话,越早期的阿尔法star版本是不是越笨,对不对,好。

我就往下走,我现在是训练我的101了,那这个时候呢,那如果我跟只跟我101水,跟101打,他很容易被自己啊形成一个最优解,所以呢他怎么办呢,所以你先跟自己打35%,你应该知道就是知识它它自进化对吧。

就是双手互搏,自己跟自己下棋,但是呢他还和过去的100个过去,自己100个历史也去打,这是最后一版15%,但是呢因为这100个自己呢,也是他一路眼睛过来了,其实也并不能代表这个最高实力。

他还要逼着自己又开了另外两个分支,一个分支呢叫做这个legal exploit,什么意思呢,就是说他这一个这一组的agent,他专门就是跟自己和周边的最man的东西去对抗,他,说白了他他就要去找。

就是那个啊就是所有的这个其他几个agent的弱点,而且他是跟他们的历史去打的,是专门training的一个一个一个叫做legal,那个ELOITER,另外一个是什么呢,叫max por。

它的核心目的是什么呢,他就专门去找那个就是当前这个主分支的,这个agent的缺点,这个听上去有点抽象,比较复杂,但实际上你可以理解成,就是说因为真实的我在训练游戏AI的时候。

我其实可以训练出很多种不同的版本的,那么AI这个人工神经网络它有个特点是什么呢,你越确定它它就越强,但是呢他的某种能力越强的时候,他的能力就会越来越不通用,他就会越来越专门化。

大家去想象一下生物进化中是不是有这个特点,其实你去理解这个东西,你可以理解生物进化,就是说他如果在一个岛上,永远只跟自己去竞争啊,他会有些特征就会呃变得非常非常的强,但其他方面的特征就会变得非常的弱。

你看似他很强大,但实际上任何一个外来物种,什么叫外来物种,比如说呃假设有其他的人类玩家,人类因为人类玩家的风格多种多样嘛,那这个AI的话,如果正对位,他打起来很厉害,对不对,但是如果风格一旦不对的话。

他马上就输呗,失那个失败的其实就跟进化一样的,就是说那就这个生物也是一样,它进化的很强很强,比如说它的飞行能力非常强对吧,它所以跟自己的竞争中,他永远是有优势的,但是他一旦碰到了一个诶。

不按常理出牌的这个外来物种的话,他可能当场就没有,所以我们在以warning,就进化这个像阿尔法star这样的AI的时候,我会给他做三个完全不同的分身,而且每个分身都有完整的链路,第一个是主分身。

就是这是我最终输出的,他会和所有的人类去打,那么还有一类呢是专门去跟所有的其他的这些,分身去打的人,就是立刻立刻的意思,你可以联盟的这样的一个竞争对手,他这个东西相对能力会综合一点。

那么还有一个呢就叫做叫may exposure,就是他专门去找当前的这个主分身的弱点呢,他专门针对的去打,这什么意思呢,就是说呃有哎这个确实有点抽象,但是大家去理解一下啊,比如说我们去训练我们的军队。

那我们就会设计什么呢,叫红军和蓝军,大家都听说过红军和蓝军的故事,对不对,那这里面你们知道,我们中国有一支中一个重要的兵种,就是蓝军部队,他专门去找我们我军战法中的所有的弱点。

所以我们的红军呢自己跟自己会对抗对吧,但同时的话呢我们也会跟蓝军对抗,但大家注意你这边有个细节,就是说如果红军只和红军对抗,大家知道是有问题的,近亲繁殖对不对,但是呢如果红军只和蓝军对抗。

有没有有没有问题呢,其实也有问题,为什么呢,他们彼此就会针对性地做优化,那这样假设我碰到的敌人,他是用红军自己的打法打你的,你很可能会打失败,所以你为了让自己足够强的话。

你要故意造出几种不同类型的这个对手,天天去找找你的麻烦,所以这个架构其实很巧妙,真的很巧妙,就是我们这个看每每看到这一段,我就觉得r for a star的这帮人真的是不容易。

就是因为你又不可能找到那么多的高水平的,人类玩家去吹你,你的AI这个东西又不像围棋对吧,他的这个解空间,那么确定,他深深造出了三种不同的style的这样的一个选手,然后每天双手互搏,我们叫做左脚踩右脚。

最后好不容易把这个阿尔法star的AI,打到了人类这个相对高的这个水平,所以当我们用deep in的方法,去做这个游戏的AI的话,其实这一点真的是非常的重要,这个这个架构的话,大家有机会可以慢慢的理解。

就是其实读这个文字能够读得更清楚一点,好可好,那么其实呢就是在做游戏A的时候,我们真正这里面做个summarize,就是说其实核心的选择就是,你到底是选择用这个增强学习还是用监督学习。

其实对于有大量的玩家数据的情况下,我们会建议首先用那个监督学习,因为它会让你的training快速的收敛,而且呢如果你的数据量足够大,而且数据质量足够好的话,其实你可以达到一个人类相对不错的水平。

这里面取一个阿尔法,阿尔法star这个概念的话,就是他早期的用监督学习的话,已经达到人类相对高的一个,就是比如说业余选手的水平,但是后来再加上一个增强学习的时候,诶,他可以在网上去突破。

达到半职业玩家的水平对吧,那么reverse learning的话,它的好处就是说诶他真的这个上限足够的高,真的能产生很多让你觉得非常惊艳的,一些用户的行为,但是它的缺点是什么呢,就训练非常复杂。

而且成本真的非常的高,那么什么时候选择reinforcement learning,什么时候选择这个就是suprised learning呢,其实我们自己有一个不成熟的一个认知。

就是我们认为就是说如果这个游戏里面,你的奖励是足够密集的,就是说你每做一步,你就知道它的奖励是什么,比如说刚才我们讲的,像那个啊,像这个就是以TRA上的游戏为例,就是你每一步你的球拍的运动没几下。

你就能知道能不能打中一个目标的话,那这样你用增强学习,其实是很容易训练出一个好的AI,但是如果像这种比较复杂的什么探索解谜啊,但是你一个动作和你最终的结果之间的关联,非常的不直接。

就是他的奖励非常sparse的话,其实这个时候那个reinforcement learning,其实效果是比较难的,除非像那个阿凡达那样,你就真的花了很多功夫,才能达到一个比较好的结果。

如果是一个小游戏的话,你这样做实际上是很划不来,那么实际上的话呢,这个时候我们会认为supervised learning,可能是个更好的一个结果,那么所以的话呢,这个是我觉得我们觉得就是说啊。

这两个方法你一定要综合的来看,综合的去选择,那么其实这一点的话,这也是我们今天讲的这个machinery最后一节课,这节课这个PPT呢,实际上是我们这个在看那个帝国时代四,在tb c上的一个talk。

我觉得他这个就是作者总结的非常的好,他就说啊,其实当我们真的把这么好的一个,就是深度学习的技术用在游戏里面的话,大家千万要注意,这时候一定要考虑费效比,他举了个例子。

就是说DeepMind为了做这个alpha star,花了2。5个亿美金对吧,但是这里面肯定,我觉得不不应该是纯机器的费用,可能还有些人工费用,但是呢他说他每一次对这个策略进行探索。

他还额外的花1300万美金,我的天呐,这就是全是钱,其实现在大家讲的深度学习的时候,我们有个玩笑,就是说深度学习真的是个算法竞争吗,好像目前看好像没有那么可怕,其实真正重要的竞争是什么呢。

第一个是你的这个啊,应该来讲你的数据对吧,你有没有足够大的数据,第二件事情是什么呢,哎就是你的算力,就是你的钱,比如说像著名的gp three对吧,这个训练一次好像是几千万美金。

所以很多那个AIG的同人就去诟病,他说你这个算法没有什么了不起,就是你算力足够大对吧,所以其实当时我们在做这个游戏的,你们AI的时候,我们确实需要考虑这个成本,所以当时呢就是在这个就是呃。

就是那个微软的同学们,他在做那个帝国时代的时候,他就总结,就是说实际上你们在不同的架构里面,其实可以考虑把几种算法混合用,就是说比如说你用这种深度神经网络的时候,你可以在微观层面。

你外面套的是behavior tree f那个有限状态机,这种方法里面的话呢,我用一些一些小量的角色,我用这种neural network,让他有一些更human like跟人人性化,但他训练也好。

它的整个这个就是演这个就是说演义也好,其实成本非常的低诶在宏观层面的话,诶我首先用那个neural network做宏观的战略决策,为什么呢,因为他这样会让这个行为看上去,更加的具有这种策略感对吧。

其实如果你用这个,你把整个局面转化成各种各样的map,你用神经网络说决定,比如说我是要战争还是和平,这种角色很多时候还很真的很像人,但是你真的决定了战争之后,你做了什么动作,比如说我决定出兵。

决定造多少兵的时候,其实策划用BEHABREE,用有限状态机做起来可能会比AI做的更好,但如果你真的有无限的实力的话,你AI做也可以,所以的话呢这一点实际上也是。

这个就是当我们真的在游戏通用AI策略的时候,要综合的考虑,所以我一直这样讲,就说这节课中,就这两节课中讲的几乎所有的算法,其实在我们真实的一个游戏里面,可能都是有用的,就无所谓高下之分吧。

都是看你要用在正确的场合,那这就是我们这节课的内容,那这节课呢啊真的很硬核,我发现时间已经快三个小时了,那这节课硬核的一个另外一个例证是什么呢,就是我们终于创造了史无前例的reference。

这个案例就是参考文献,我们列了整整的七大页啊,大家可以欣赏一下,这几天是讲这个HTN的对吧,那这几篇呢是讲GP的,大家可以看一下,然后啊这几篇是讲MCTS的对吧,就是蒙特卡罗TRSEARCHING好。

这集也是讲什么呢,讲machine learning的,你看我们基本上把最近的GDC上的machine learning的文章,全部给扫了一遍,这个确实这节课的肝度绝对是感人的对吧。

包括就是machine learning在game行业里面的一些应用,我们都扫了一遍,确实为了准备这节课的话,我们的小伙伴我们有个小同学,有个同学跟我说,他已经连续21天没有休息了。

只写了我们游戏里面这里面的一个章节啊,所以希望这个这节课的内容的话,能够对大家的就是学习也好,对游戏引擎的掌握好有帮助,好的,那我们今天的课程的话基本上到此了呢,同学们有没有什么问题,我们留几分钟。

留几分钟的时间,大家有问题的话,我们可以尝试回答一下哇,这个问题问的太尖锐了,有同学问我说AI除了在游戏里应用,还能用在哪个地方,这个问题实际上是AI能用在很多地方,顺便手benefit了我们的游戏。

因为AI实际上是真的,今天生活的很多机会,所有的方面吧,比如说你上网搜搜索呀,你打开你的淘宝都是AI的支撑吧,那么就是说游戏的话,实际上是啊,但是游戏和AI的关系其实非常的,明明就是非常的密切。

为什么呢,因为AI是需要它首先需要training的,而在现实世界中的training的话,它成本很高,而且他很多输出输出是不明确的,但是游戏是一个模模拟事件嘛,所以的话其实未来的话。

我一直认为就是有用游戏引擎的技术,其实我们可以做什么呢,做对整个世界的模拟simulation,那么我们有了这样的一个simulation之后的话呢,其实我们可以train出更好的AI。

比如说像我们的无人驾驶对吧,它的training很现在有一个很重要的一部分,就是在我们的游戏引擎里面进行training,所以这就是一个相互就是帮助的这样一个过程,包括我我想象一下未来的家居机器人对吧。

一个复杂的家庭环境的模拟,包括这里面有很多人人类行为的模拟,那这些东西我们可以交个游戏引擎来做,那这里面训练出的AI的话也会更加的聪明,它反向的也会让这个游戏看上去更真实对,所以说我觉得就是这两个关系。

还是非常的密切哇,这个问题问的很专业了,就是AI游戏中的AI到底是在CPU上跑,还是在GPU上跑,那其实在现在的游戏引擎AI,因为就是那个演艺这件事情,并不是特别的计算量很高,因为在游戏的真实游戏中。

我不会在现场游戏中去training这个AI,所以呢很多时候我们都是用一些,就是现成的框架,那么其实现在的游戏AI呢,在CPU上跑问题也不是很大,就是利用ca芯片啊,利用将来的一些。

就是说像手机上还有很多tensor CORE啊对吧,这些在CPU上直接就是在CPU或GPU上,甚至是AI的芯片是直接加速这件事情啊,他应该就是个工程的问题,就是完全是取决于我们的工程选择啊。

第三问题还有有没有学习玩家输入的先例啊,这个我猜可能是有吧,就是我自己现在已经问我,我一时想不起来,因为学习玩家行为就是其实是很常见的,就是我们经常会把玩家的这个操作学下来,就是这个指挥啊。

动作啊决定成本,但是玩家的输出,比如说这个上上下下左左右右,这个东西有没有学习的先例,我猜大概率有举个例子啊,比如说我要去做一个,比如像拳皇这样的游戏的这个AI的话,我有可能就直接学玩家的手柄输入了。

这样的话我学出来AI看上去应该更聪明,更有意思,所以的话呢我认为这件事情应该是大概率有的,但只是我们可能没有找到这些相关的资料,好的,那我们今天创造了新纪录,整整三个小时对吧,我们终于又卷出了新的高度。

那我们接下来的话呢,就是在下一周我们可以好好的休息一下了,我要我要偷个懒嘛对吧,我下周我要好好休息一下,然后我们争取在下下周我们在新的章节再见好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

17.计算照明 (II) | GAMES204-计算成像 - P1 - GAMES-Webinar - BV1B24y1y7K4

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好,今天我们就啊正式给同学们,大家讲解一下这个competition,immolation的一个点讲,我们这么计算照明,哎我们之前上节课讲到了计算照明,就包括啊计算照明的一个就是intensity。

还有一个就是曝光的一个时长啊,后面还有讲后面又讲到了一些其他的内容,今天为大家继续讲解,我们其他可以调制的一个照明的一个参数啊。

包括我们第一个部分就是a light color and wareness,也就是我们对啊光线的一个波长,或者是或者你也可以说是光线的色彩啊,这个不是很等价,但是在这个时候可以理解写在一起没问题。

这个举一个古早的例子,1997年的时候,哎,这同志们用了一个色彩,去做一个水平方向的编码,大家可以理解为是一个呃用色彩做的一个结构,光是怎么做的呢,我们把这个图像用在SHSV的空间里面。

表示我们把这个saturation饱和度啊,还有我们这个intensity强度固定住,这个时候我调我的这个Q,那我们这个Q随着水平,这个X这个方向连续变化连续变化诶,我们就可以观测。

我们当我们的这个摄像头,放到我们这个物体的正上方,我们用一个投影仪诶来投出这么一个呃波长啊,这就是他的Q色彩,随着啊空间X轴变化的这么一个图案,实际上就是一个个数的一个彩色条纹了对吧。

这个时候我用一个彩色相机来捕捉,这么一个彩色条纹来调制的这么一个信号,诶,我通过计算这个结构的偏移,是可以比较精确的恢复出来,人脸的一个3D情况的,大家想象到这个捕捉到3D有哪些方法。

包括我们下节课要讲到了一个探望flight image,也就是光飞行时间,也包括啊直接光啊,间接光这两种方法,还有一些像呃呃那个strike light,就是我们的结构光,还有一些像呃我们这个啊双目呀。

或者是abeles read,也就是光度立体,这个实际上就是应该算是结构光的一种啊,就是我们彩色的一个结构光,哎,我们这个通过打出一竖一条条的,竖着了一个彩色的条纹,来实现一个呃快速的一个。

三维物体的一个重建啊,当然这个会随着一个距离,这个结构光有大的问题啊,也包括像这种彩色调制的结构光,就是它会随着距离的变化而精度不断变小,唉这个也是呃比较困难的一个点,然后举个例子哈。

这第二个就是之前讲到的,之前我们组有个叫熊俊晖的一个老兄啊,这个他们做了一个叫rap particle image volymi,这个核心思想是什么呢,啊首先给大家讲一下什么叫PRV吧。

就是我们要检测一下流体的运动,流体的运动的时候,我本身我这个比如说水怎么流过这个水管诶,或者是那个嗯火箭啊,或者导弹它周围的一些啊空气啊,到底是怎么流动的,我只是用普通的图像传感器,我没有办法观测到。

比如说导弹周围啊,或者是啊这个水管里面,它这个水流啊,或者是空气是怎么流动的,这个时候我们就应用一些例子来作为标记,就我把这个空气里面或者水里面,插一些跟它密度差不多的粒子诶。

我相机可以观察到这个粒子的运动,然后通过估算这个粒子的运动,来估算我们这个流体到底是怎么动的,这个背景是这样的,这个particle image symmetry,就是为了标记我们流体怎么运动。

当然一些传统的一些呃这个PRV啊,就是我们粒子标记的,这个就是测这个厂的时候,就是他因为我们都是用一个军医的照明光,这个时候我们通常只能不知道,这个粒子的二维运动,因为我们的相机不知道这个粒子是朝远了。

还朝近了,对不对,诶,这个之后用了一个color code information,也就是在我不一样的深度的情况下,就不一样的距离,我用不一样的颜色作为照明,实际上就是为了这个粒子赋予了这个例子啊。

通过颜色赋予了这个例子一些深度信息,这个时候我的相机就不只能观测到我粒子,随XY方向的一个移动,同时也能观测到这个粒子,随深度方向的一个移动,对不对。

唉这就是一个啊经典的一个啊color codillumination,就是我们对波长或者是颜色,进行编码的一个情况,但我们可以看到最后我捕捉到了一帧帧图像,每一帧图像哈。

当时是用了一个4K还是8K的一个red camera,来拍了这么一个东西,我们看到这个中间这个彩色的一个例子,就每一帧XY方向,也就是我这个例子会有它自己的运动方向,诶。

这个我们普通的光流啊去跪下就可以了,Z方向呢就是我用这个颜色的变化来去做一个,估计,我们可以看到这里面不一样的颜色,就代表不一样的距离,这个时候我们就可以把这整个粒子的一个,三维场诶,那就算出来。

这个就变得很有意思了,当然我们会这这里面还会遇到非常多的问题,我们会讲到这个问题是什么,然后又怎么解决的,这是当时的一个PV的一个set up,像传统的一个PV,就就是我们这个粒子测速。

我有一个普通的一个激光啊,我顶多是把它扩数哈,搞成一个light sheet,我照明这么一个呃这么一个切面,这么一个切面,我在这个切面里面,哎我可以观察到这个粒子运动。

这个时候就是我们刚才说到了一个痛点,它只能观测到XY方向的一个运动,对不对,但那个时候对光学系统要求也不是很高,因为诶我用一个,因为我这个例子还有一个问题啊,就是我们这个例子啊,经过照明之后。

它的光线还是非常弱的,所以对我们的摄像头要求来说,就是我们相机也要求更灵敏,而且我们对我们的镜头,我们需要这个镜头有非常大的口径,也就是我们的F数非常小,唉我们知道像之前我们课程里面学到的。

这个F数小的时候,这个景深啊就会变得比较小,对传统的PRV我们这个景深小是没问题啊,我就只拍一个面对焦在这个面上对就好了,对不对,当我们要处理一定深度的时候,就像我们这这个这节课讲的这个。

color code的illumination诶,不一样的颜色有不一样的深度,这个时候我就要求我这个相机,在有一个比较小的一个数的情况下,哎我又能比较啊,保持一个比较大的一个景深范围。

所以说这个哎就变得有点困难了,对不对,右边这个我们可以看到这个,当时哈是用一个白光哈,白光作为一个照明,然后通过一个透镜把这个白光变成一束平平光,然后呢再用一个这个linear future。

也就是我们随着就是这一个方向,线性变化的一个future,来产生这么一个平行的一个彩色照明光,哎这个时候还有非常有意思的故事哈,哎当时就是我们在SRAM开会的时候。

就是当时下面有一个呃不记得是哪个大佬了,当时就质问我们组织,这个为什么要一个linear filter,这个linear future是吸收光啊,本身我这个PRV就已经非常弱了。

这个时候再加个linear filter,把光进一步吸收了,这个时候不就影响了我们这个成像的亮度,当然这个确实是一个问题哈,因为你要想产生一个均匀的这么一个呃,颜色的变化,你要想用其他的方法。

你很难产生这么一个均匀的颜色变化,颜色变化不均匀呢,你这个每一个就整个会有变化的时候,你这个hero变化的时候,这个深度就会变得不准,这个时候一就变得很难受了。

所以说当时选零点future应该也会有这一层原因啊,我没有具体问,应该是有这一层原因,就我们需要像我们整个hill,它的变化是一个连续的,唉当时为了解决这个谨慎问题,那时候是怎么办呢。

当时呃组里的那个几位同学啊,就是应该用的是一个DOE,用一个衍射元件的办法来扩展这个啊,拍摄这个particle的一个景深,最后我们可以看到,通过这么一个due来做一个透镜。

它既可以获得一个比较大的一个口径啊,就是比较小的一个F数,同时呢也可以保证它的一个PSF,在一定范围内就是保持比较好的军性,这个时候对我们后面做一个处理啊,做一个deep乐啊,啥玩意呢啊。

就会更友好一些,更友好一些,我们可以看一下这个是怎么整的,当然除了这个刚才讲到了一个呃color encoding,我们还会讲到一个special encoding。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们在时域里面是怎么调制,就是举个例子哈,这个是一个呃relying with fty inslight field,也就是呃4D的一个广场的一个就是illumination。

就是我们比如说左边的是一个摄像头,唉我们这里有一个投影仪,你通过这个移动这个投影仪,唉,然后也可以移动这个旋转这个物体啊,当时这个实验装置会比较糙啊,当时就用了两个木板,中间打了个洞来去旋转这个物体诶。

这个时候我们就可以获得不同角度,然后不同方向的一个照明诶,这个时候哎就可以合成了一个4D的,一个large field的一个generation啊,这是一个例子,西瓜202003年的一个paper。

但重点来了,这是今天我们要讲到的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第一个重点,就是synthetic aperture nomination,说到这个synthetic app apinformation,我们可能会想到啊,这个长距离的一个合成孔径的一个成像。

就包括我们以前啊,大家用一个摄像头的一个阵列,就我们知道每一个摄像头的口径,每个山上的特殊口径它很难做大,因为我要做大了之后,我整个透镜的一个设计加工,还有这个传感器成本都会变得非常高。

当然为了想要拍到非常远距离的一个嗯,这个我远距离的一个高,提高这个远距离的高分辨率,然后人们呢就想到用一个摄像头的阵列,来做一个合成孔径的一个光学成像,这是一个嗯,就是长距离合成孔径成像的一个例子啊。

当时这个呃这套系统是用了45个摄像头,我们可以看到这是3×15,45个摄像头,然后整个的一个exture size呢,就是我们这个口径的一个呃,等效口径的一个size是六个六,六个feat就是六步哈。

大概是啊3米左右,3米左右哈,那每个每个这个这个摄像头之间的间距,大概是五英寸,五英寸啊,整个摄像头的一个field view是4。5度,这是当时嗯比较古早的一个啊。

synthetic aperture photography一个例子,但国内大家如果对这些方向感兴趣的话,可以关注一下呃,这个清华的丹琼海院士和方璐老师的团队啊,他们对啊,整个合成孔径。

还有摄像头阵列啊,这个光场成像这一块啊,有个比较深的比较前沿的研究啊,大家可以关注一下,有有个好像是tga pixel amazing啊,这个也是可以实现很清晰的。

在远距离的一个呃这个photography啊,这个也就是也是用了这种合成孔径的办法,一个摄像头阵列的一个办法,唉这个我们可以看到,通过这种合成孔径的方式诶,我们可以看到在一个嗯哈110这个fit。

这个情况下,也就是30米左右的一个情况下,诶,我们可以看到这个在125feat这一个target,我们可以还是可以很清晰的拍到这里面,这个细节的还可以非常清晰,当然这个合成孔径大家想一想啊。

就是我先给大家就是讲解一下,这个什么是合成孔径这么一个东西,说到合成孔径,我们想嗯先从一个呃说到合成,可能之前我们先讲一下呃一个background吧,所以在这个这个这个这个paper里面。

涉及了两个技术,一个是comfort的一个技术,一个是合成孔径的技术,这个合成孔径本身啊,啊我们实际上就可以理解为我在我的频域里面,比如说我的一个呃冲击冲击响应啊,冲击响应啊,不是冲击响应不太好。

就一个boss一个box的响应嘛,就是一个box的响应,我经过了一个孔径之后,哎,比如有线的孔径,就相当于在我的相片上做了一个分裂变换,对不对,这个时候我们有一些高频的一些呃情况,会被展开。

这个合成孔径呢,实际上就是呃我在我这个频域里面,它的一个采样面扩展了,对我在我本来是一个地方,一个下面上采样,现在换了多个地方采样,是不是,这个时候就相当于我等效的一个孔径就变大了。

这个时候就说明在我们频率里面,我采样的频率更高了,这个时候就对应着我实际上,空间的分辨率的一个提高,对大家可以理解一下哈,本身我这么小一个孔径诶,我做一个分裂,这个孔径做一个分裂变换。

是不是就到了下面了,这个时候会有一些频率的损失,然后我换成很多个点采样的时候呢,这个时候实际上就是啊在我的频域里面,有多个地方可以采样,这个时候我们整个采样一个频率,频率采样的频率就是频率采样率就高了。

这个时候我们分辨率空间分辨率也就提高了,然后另一个技术要先给大家掰扯一下,子,就是一个CONVOCAL的一个问题啊,这是举个例子,这个最早是在一个呃共聚焦的一个显微镜里面,得到了应用。

这个显微镜拍到了一张图,但像我们这个CFCS,这个map pa本身是是怎么工作的呢,比如说像这个spaceman,我们这有个样本对吧,我这有个D半透半反镜,哎我这也有个detector。

就是我们的啊传感器是吧,我们这这个地方有一个光源,像传统呢,就是我们用一个啊军医的一个范的一个照明,来去照明这个样本,然后然后整个的通过这一个detection,把这个项目直接乘出来,对不对。

但是共聚焦成以上是啥意思呢,就是我在我的这个照明光源前面,先放置这么一个小孔,唉,放着一个小孔呢,然后我通过这个照明系统,这个透镜经过B,然后就照到我这个找到我这个样品的这一个点,这个叫G上。

然后这个被照明的这个点,然后经过唉经过这一个半透半反镜,然后就可以哎,通过给它对应的这一个move的一个拼凑,然后到达detector,是不是,这个就是我们就是最经典的一个。

confocal scanning的一个MICROP,就是共聚焦扫描的一个啊显微镜,但这种情况下就是嗯非常慢哈,就我们每次只能看到一个点,就是这个时候极大了啊,困扰了大家这个观测的一个速度。

那后来呢嗯大家又把这个速度进行提高了,我们可以用很多个口来一起去完成这个事儿,就是叫这个叫correlation microscopy啊,这个就是看focal mascope的升级,这个时候是可以呃。

很大的程度的提高这个样本拍摄的一个清晰度,就是提高我的一个啊极限的一个分辨率,大家很多时候这个超越衍射极限啊,就是这么来的对吧,很多时候超越衍射极限就是这么来的,当然除了这个还有一种方法。

就像那种纳米探针的一种方法,我直接通过一个光纤,然后作为一个捕捉器,我这每次光纤头非常小,每次移动的位置非常小,诶这可以啊,做到这个几纳米或者十几纳米的,这么一个光学分辨率啊。

这也是通过一种扫描的一种方式,今天要讲到的是一个啊synthetic aperture,Illumination and photography。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是一个嗯合成孔径共聚焦照明的一个装置,这是为了干啥呢,这是我们像有很多啊叶子呀,比如说我们这个就拍到,比如说士兵啊或者是坦克呀,我们在这个隐藏在这个丛林丛林里面,这种叶子呢。

就是他会有对这个目的有一部分遮挡,但是有些地方诶他会哎又能看得到,就是我在各个视角里面有立方遮挡,有立方又能看到对吧,而这个时候我们想要呃把这个半遮挡呢,就半遮面的这个士兵啊。

或者是藏在后面的一些坦克啊装置啊,哎拍摄出来这个时候怎么办呢,他从类似的事情还发生在我们水下,就我们做水下成像的时候,有些会有一些非常浑浊的一些情况,哎就因为水下边那有散射嘛。

如果特别是海水经常比较容易脏,容易脏的时候,我就很难拍摄到一个很远距离的,一个清晰的一个图像,这个时候哎,那个时候就Mark ley在2004年的时候,当时还有那个叫美国的那个五,什么海洋研究所啊。

这是呃很战略的一个海洋研究所,这个中国也在啊,像这个海洋大国这个战略向迈进,所以说啊大家搞一搞这个方向,还是挺有意思的哈,这个装置哈是用了啥呢,当时为了当然也是为了便宜啊。

我们这个光源就用了一个镜子阵列,来去做了替代啊,但是我们整个装置是什么样子,我设置有一个单反相机对吧,我在正中央视野的时候有个单反相机诶,我们这里面放一放了一个镜子的一个阵列,镜子的一个阵列。

然后实际上诶,这个我们可以看到,这是一个4K的一个单反相机,然后呢我们用了一个22个透镜,22个透镜,然后这个大概这个整个相机的视野,是刚好能拍到这个唉透镜上的一个反射啊。

然后呢这些透镜每个小透镜上面就没有,这是反射镜哈,每个小反射镜上面都会有一个,我们这个目标的一个子图像对吧,大概总共是22个主子图像,每个子图像对应了一个750×750的。

750×500的这么一个像素的啊,这么一个小块,这是我们的一个实验装置,当然最后这个是target,这就是我们模拟这个丛林的一个情况,我们这里有一个绿植,唉,后面比如说我又放了一个什么东西,诶。

你这个一般的情况下,我们这个直接看到这个东西就被挡住了,对不对,就没有办法观测到诶,这个后面到底是什么东西,然后然后我们看就接着接着来看,这个东西到底是怎么被拍出来的,这本身我们这里面用到的技术啊。

其实啊也就是用一个array of projector。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

也就是我们刚才讲到的一个镜子的阵列,这个镜子又当呃像的一个反射,又当照明的一个反射,同时我们也要要是有钱了,就可以做一个micro project的一个阵列,对不对。

当然我们最便宜的就是一个projector,然后加一堆镜子,这样的话整个成本可以控制到最低,当然我们先说到这个这整个的一个synthetic,合成孔径的一个照明到底是什么样子。

我们实际上嗯是打了一些就是随机的一些班,也有可能是正弦的一些啊,这个这个班哈我们打到这个工具胶面上,我们就你看我们可以看到右边这个装置啊,我这一个projector a对不对。

project a达到这些啊,镜子上就是这个E啊,右边这个这个E是镜子上,唉,我们这些镜我们这些镜子上在这个project pattern,也就是我们现左下角这个随机班啊。

随机班每个镜子都对应了一个project pattern,然后这些Python然后又共同的聚焦在这个样本上面,对吧,这个样本我们就是叫做F就在这个样本上面,也就是说说我们在整个焦点对焦点呢。

把这个各个随机班,也就是左下角这个二维,这个大家可以理解为二维的随机码了,就投影到这个F上对吧,我们可以看到这个F上,这个时候就得到了一个他的一个focal plan,在这个focal plan上。

我们啊每一个就是反射镜反射过来,那个呃,这个反射反射镜反射过来的这个pattern,都是聚焦到了这个复刻plan上,对不对,大家可以看到左边这张图上,我们在这个这一条线上是完美的聚焦了,对不对。

这是整个照明系统到底是怎么做的,大家这个地方可能会有疑问哈,现在这个过程大家理解吗,就是我嗯一个透一个镜子的阵列,把每个镜子对应的一个pattern,然后就打到了我这个物体的表面是吧。

这是一个呃就是整个照明的一个过程,这个地方大家应该理解一下这个这不难理解哈,这个不难理解,实际上我们也可以看到,然后与此同时呢,我们这个相机哎。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以用一个半透半反镜哈,半透半反镜,把这个照明跟那个相机这个光路对齐,这个时候我们就可以通过这个半透半反镜,然后顺着这个整个projector,这个逆的光路来拍摄到哎,我这个投影过后的一个图像。

是不是我们把这个投影过的图像拍摄回来,我们就可以拿到这么一组,每次就可以拍到一张图对吧,这一张图就是对应的,在这个就是呃调制Python的一个情况下的这么一组,比如说你这里面是4×4的。

4×4乘四的一个小阵列对吧,这是我们四层是一个小阵列,当然我们会不断的变换这个投影的pattern,不能变换这个投影的Python,直直到我们捕捉到了N个一个cody trails。

也是最后我们拿到了一个N乘44,这么多张图,当我们对这些图啊,根据这个角点,然后把这个先整成一个长方形,先整成一个长方形,哎我们可以把这个通过整成一个rectify,整成一个长方形。

然后呃再找到给它对应的一个mask,然后再把这个整个sum起来,然后给不一样的位置,唉我们就可以看到一个normalize的一个SAM对吧,然后同时呢,嗯我们本身呃它本身我们这个图像啊。

可以找到一个嗯就是我们不打这个pattern,就是完全的就是啊照明的情况下,这是一个搞到一个floodlit,这个时候我们把这两个相减,就可以得到它的一个CONVOCAL,也是共聚焦的一个情况下。

实际上就是我code的减掉背景对吧,这个code的简单背景就可以达到方,就共聚焦的一个情况下,当然我们呃也可以啊,对这个通过这个convocal image。

然后估算出了一个GREDIENTS的一个correction,然后再给一个threshold,就可以达到这个东西的一个MATT,也就是它的一个呃mt一个mask,这个是过程,大家可以理解一下哈。

我们本质上就是我拍照跟我的照明,共用一个光路啊,共用一个光路,然后呢我这个投影仪,投出来N张图,就是每每个在这个44对应44个pattern,然后再捕捉N次,看这个pattern。

每次拍的时候要换一下啊,这个就拿到了N乘44张图,然后把这个每一张图整形一下,整成长方形,然后再根据这个对应的一个mask,就是对应的一个投的一个pattern,搞一个mask哎。

把这些mask some,把这些东西散不起来,再给个with,就得到一个normalize的一个SMISSION啊,这个是很清晰,那同时呢我们也可以减掉它的一个背景,减掉背景啊。

就可以拿到一个共聚焦的这么这么一张图,工具胶,这个图就可以拿到这个radiance一个correction,同时也可以拿到这个mate,这是呃一个呃另一种玩法哈。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个就是我们可以看到哈,这是我的一个projector对吧,我们这整个叶子后面藏了一个人,我们可以看到中间是我们这这个这个一个叶子,后面藏了一个人,然后再往后面是一个背景,本身呢。

我这是一个projector,然后这是我的一个camera,我整个公路就是我的projector,打到这个半动态环境,唉这个直接就穿过去了,打到这么一个镜子阵列上,这个镜子阵列。

然后把这个每个就是镜子所反射的一个pattern,达到我们这个这个达到这个物体上,达到这个物体上,然后呢整个光入物体反射的光,经过呃这个镜子的阵列,再反射到这个像这个半透半反镜。

再反射到这个camera里,诶这个我们时候就可以的,照明光跟这个成像的一个光路是统一的,然后呢我们就换一个pattern,然后再拍一次,换一个pattern再拍一次来。

直到拿到我们就是足够的一个结果为止啊,当然每一张图我们是看不到这个后面,这个到底是什么样的,但是我的目标啊,目标就是拍到我这个遮挡后面诶,到底是有什么东西,大家可以看到啊这个一个水下的应用。

当我们在比如说传统的我们要拍摄的,对一个水下的一个情况进行照明,我们观测到一个点,在它一个正上方,我们又斜着一个光可以做照明,比如说在这个水下,我们很难的把这个字去拍清楚对吧,这很难拍清楚。

然后呢换一种方式,我们用不一样角度的一个光,对我这个样本进行照明,当然这个会比刚才那一种方法好一些哈,但是我们还是可以看到,虽然它更均匀一些,但是还是有一些非常强的一些反光的地方。

我们没有办法把这些地方的细节来给它拍清楚,对不对,但是呢我们这个用这种共聚焦照明的方式对吧,我们这个每次就就缩小,每次只拍摄了这么一小块对吧,只照明的其中一小块,然后我去扫描的整个面。

我们可以看到每个小块都可以拍得比较清晰,再把这些小块拼起来诶,就可以在一个水下比较远的距离拍出来啊,一个比较清晰的一个图像,我们可以看到右边这个是浑浊的一个水下,我们就可以拍到啊。

在一个比较远的距离可以清晰地拍到这个啊,这个远距离的这个成像结果,当然我们可以看到这个有叶子遮挡的情况,情况下哈,就是我们刚才那个场景的一个。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我从单一的一个viewpoint,是单一的一个观测点来看诶,我们后面那个人就完整的被这个叶子给遮住了,我们并不知道唉这后面这个人的细节是啥,当然我们用一个合成孔径来拍照呢。

我们是可以在各个角度来观测到这个图像,来合成出来,但是这个时候我们很容易受到这个在不同啊,焦平面上的一个成像的,一个这个照明的一个影响啊,有没有看到整个成像,它会受到一个他这个不不再看复合面的。

这个光也进来了,就是我们上人能大概知道这后面这个东西是啥,但是我很难拍清楚啊,很难把这些杂散功啊都干扰掉,都去掉,像本身有的一个convocal image呢,就是我共聚焦成像呢。

我是可以把那个人的一面拍的比较清楚啊,这个叶子就因为他不在那个公交面上,这个就已经成mt了,成mt了,所以说呢我们就把这个合成孔径成像,和这个工具胶成像诶一起利用。

那么在多个视角拍他了一个convocal image,唉最后合成了一个图像,我们可以看到诶,就我们有很多像这种C很多C哈,很多C在不一样的视角,会在不一样的口径上拍到诶,把这个合成起来就可以哎。

看到这个眼鼻子啊,还有这些东西都可以拍的比较清楚,这是一个呃有遮挡的一个情况下啊,这个大家有兴趣的话可以嗯结合着做一做啊,比如说像大家给大家解放军丛林作战呀,或者是这个地方提供一些参考性的一些设备。

大家也可以有兴趣可以搞一下哈,但这是一个呃synthetic,app trillnation的一个microscopy,就是为了实现一个超负面诶。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个跟传统的一个泛光照明不一样的地方是,就我先说一下这个系统吧,这是一套4F系统,我们这个sample这是一个浇面对吧,然后我这个通过物镜,然后就物镜后面的一个焦点,跟我的一个目镜后面的一个焦平面。

两个在一个平面上共用一个焦平面,唉,这就构成了一个cf系统,cf系统,然后通过一个l e d array,就把一个军医的就精一光照明,换成一个l d d array,然后去分时诶去打打到这个样品上,唉。

我们就可以看到它,可以可以看到观测这个分辨率吧哈,在不一样的视角看,拍出来做一个合成孔径的一个麦克斯scope,我们是可以把这个分辨率提到一个,比较清晰的一个状态哈,这是一个比较呃简单快捷。

实现一个超分辨率的一个呃microscopy的一个方法,那就跟会比刚才我们讲的那些问题,稍微简单一些,因为我们拍一个大的一个泛的一个场景。

特别是把这个convocal image跟那个synthetic,TRUMMATION结合在一起的时候啊,这个系统比较大哈,比较大比较困难嗯,大家可以试一试,搞那么一个镜子阵列。

然后搞一个啊成像跟照明一起的一个公路啊,这个大建议大家试一试,有条件的试一试,然后我们讲到第二个重点啊,这今天可能会拖堂,这个是temporal modulation啊。

这节课就不给大家讲那个time on flat mai了,因为后面我开两节专题课啊,就是我们在我们temporary encoding的时候。

会给大家分别讲这个in direct time of flighting image,还有这个direct time of fighting image,今天就讲一个temple modulation。

的一个比较传统的一个应用,当说到一个temporal demoliation,我们还有一项demolily camera,这个是啥,像我们动捕设备,我们很多啊标记了一个点啊,传统的动捕设备啊。

这些光在闪,我们就需要一个camera给他做一个DEMI雷霆,来标记这个点的位置,这是一个啊VZ4000的一个checking system,我通过啊,这个是这个标记物的一个闪。

还有一个啊相机的一个demo,我就可以把这个嗯整个动捕来实现,当然除了像这种呃自带闪的这种装置啊,还有一些像我用一些红外的一些球,就是正常拍摄的时候就是正常了,然后上面加一些小白球,哎。

这个时候拍的就是他一个在红外线下的一个球,的一个位置,这个时候也是可以进行动捕的,当然现在也有啊,呃之前那个由他的,有一位嗯叫叫叫叫陈赫的同学,然后做了一个随机码的一个衣服。

然后通过识别这个每个地方随机码来进行,实现一个高精度的动作啊,这是比较先进的动捕设备,但最传统的时候大家是用一个闪的一个灯,然后结合了一个camera来做一个DEMODI,来实现了这么一个动物。

这是一个嗯face space的一个demolition camera啊,这些装置会比较贵哈,因为我们这个呃灯在闪,所以说对我们这个整个相机的拍摄频率比较高,而且它本身的这个分辨率也比较高。

所以说这个处理压力也是比较大的,比较大的哈,这是一个比较经典的一个temple,encoding的一个应用,唉这是整个啊demodeling camera的一个原理。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就是我们本身我们标记物呃,是在闪的两个灯,比如说这个颜色可能会不一样,闪的两个灯对吧,我这每一个像素,这是我的CMOS像素,每一个像素它就你可以理解为它是一个smart pixel。

他这个pixel又可以拿到他的一个intensity,又可以跟这个闪的这个灯对应,然后一个嗯data LCK,当然我们这个闪这个灯跟这个像素的一个clock,对应的时候,唉。

这个时候我们就检测为这个位置,在这个在这个点,在这个位置是有的是吧,也可以这个也可以把这个时间记录下来啊,把这个时间记录下来,这个时候我们就可以检测到这个整个点的一个,三维的一个位置。

当然我们这个时候想给大家搞一些,贴近大家生活实际的一个应用哈。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个我们就是在我们物流物流领域啊,物流领域,特别是我们这些大型的一些仓储,再比如说京东,我们这有很多仓储,我们通常就是我们有一个呃,按FID叫你就是一个radio。

一个identification的一个tag,就我们是通常用无线电来实现的,就我们每一个这个箱子上面,作为一个IFID的一个标,IFID的一个标,我可以通过我这一个手持的一个。

IFID的一个reader,来去读取我这个标的一个内容,就我一次可以读取这一个墙面的,一整个墙面的内容,当然这个时候再面临一个痛点,比如说我已经读取到这个墙面上,有各种各样的货物。

我已我已经读取到这整个墙面的,一个货物的信息对吧,因为我这个通过电磁波,都可以跟那个tag去进行通信,但是我并不知道这个哪个箱子是什么东西对吧,这个时候不知道哪个箱子是什么东西。

比如说哪个箱子里面东西要过期了,或者是我要把这个东西分解到什么地方,哎,这个时候传统的IFID,就没有办法来完成这个任务,所以说同学们想通过这种光电成像或者,光电编码的一种方式。

来给这一个IFID的一个内容,进行一个定位啊,进行一个定位,这是怎么做的呢,也是我最后想实现的是我这个手持这个设备,往往这个货架上一照,我就知道哪个货物是OK的,哪个货物不是OK的。

这样的话就可以把那些坏的,一些过期的一些东西啊,快速的拿出来,快速拿出来,怎么做的呢,比如说像传统的一个IFID,它是一个radio frequency actification text。

这个可以非常便宜哈,它的一个小线圈诶,加一个小芯片,这个几只要几分钱的一个成本,所以说呃像大家的一个什么就银行卡呀,或者是呃门禁啊,或者或者还有一些箱子上贴了一些嗯,那个比如说像我们机场那个箱子上。

也会贴一个FAD的一个tag,这样的话大家也可以很快识别了这个箱子里面,或者是卡里面的一些信息,而且这个东西啊它是直接靠我来过来的,电磁波就可以供电了,我就不需要啊一个电池再进行供电啊。

也是整个成本可以做到几分钱,所以说这个已经广泛的用在我们生活里面,各行各业,但这种传统的RFID呢有个什么问题,这个用的领域也非常多哈,包括像wire housing,大型的仓储啊,像图书馆呀。

就每本书啊里面都会放一个fid tag和标记,这个书的一些呃书号啊,或者是整个书名啊,作者啊这些信息唉,像我们这种分解呀,就是机场的包裹呀,其实是我们这个牛上面可能都会贴着,还有这些钱。

钱币上面都会贴一个FID的tag是吧,它的几个整个的基本原理就是我的一个线圈,后面有一个就小了一个MCU,小的MCU他有自己的memory啊,记录,还有读取交互,这里面的信息,就是每个商品上面。

我们贴这么一个IFID的一个小标,然后记录他的信息,然后本身呢我要读取的时候,我就发射一个电磁波,这个线圈会响应产生一定的电流来供电,来给后面的小模组供电,哎,小模组就可以通过这个供电。

来把这个信息读取出来,再发射给这个reader啊,发射给这个reader,当然这个时候我们就可以很快速的,把这一定范围内的一个I,这个tag里面的内容都读出来啊,这是嗯阿尔法D本身的一个呃就是性质。

但是呢这个东西有个什么样的一个问题呢,就我们比如说一个图书馆为例,我们可以非常容易的就读取到我在这个嗯,用这个手持的FID设备读取到他们里面的内容,但是我们没有办法对这个内容进行定位对吧。

因为整个电磁波我们那个不太好算,他的一个时间反射,它定位精度会比较低,你比如说这个书是在上面下面左边右边哎,不知道我也没有办法去精确的找到这本书,然后聪明的人类想到一种什么办法呢。

但是实际上就是像这种场景,我们想要读取整个的货物,但是我不知道哪个东西是过期了,要把它挑出来诶,很难这个地方就没办法定位啊,所以说呢聪明的人类就加了一个PHOTOCIN的,一个f f tag。

就与传统的一个FID呢有什么区别呢,它加了一个photo c,这个时候我们就可以通过用一个projector,来达到一个编码到这个PHOTOSENSOR的一个编码照明。

比如说呃一个打的我的一个大projector,这个projector呢,然后我对应这个像素project上,这个像素达到这个full session上诶,我就可以知道这个就project。

是我们这个投影仪XYZ像素的一个编码信息,这个像像素的编码跟这个fid tag,photo生子的相互作用相互读取,我就可以,然后再通过这个就是电磁波再传回到这个reader上。

我们就知道是投影仪上哪个像素对应的啊,这么一个FID的tag,这个时候就可以实现一个定位,比如每个投影的一个闪光,然后跟这个PHOTOSENSOR相匹配,就拿到了这么一个,他一个XY方向一个位置哈。

这个时候就可以很轻松的对这个商品,或者是书本啊,主要就是对这个tag进行定位,它整个的一个流程就是我有一个projector,然后我在每个project就是我这个投影仪,每个像素点都会给他一个编码照明。

这个编码就是这个像素点的一个XY信息,那我这个tag上面呢,这个PHOTOSENSOR,对这个这个点的一个编码信息进行进行解码,解码之后再通过这个RF传给这个reader。

也是这个时候我的位置信息就已经有了,当然为了我们更容易,就是人们在操作或者机器在操作的时候,我可以更容易的就是观测到这个货物到底在哪,我可以把这个编码的位置投出来之后。

我再通过这个project给它做一个标记,唉比如说标一个差,在这个像素点周围,我就可以知道,比如这个货物过期了啊,这个货物过期了,在一个非常有意思的一连串的一个呃成像,叫编码的一个过程。

所以说我们第一步就是,通过这个PHOTOSENSOR,就是RFD上面来获取我投影仪投过来的编码,然后这个时候我们就知道这个啊,编码了一个XY了,就是我们这个编码了一个X2的位置。

然后这个呢我们这个再把这个X的位置,通过这个RF传给这个这个i for reader reader,上面这个投影仪呢再投影一个,这个都OK啊,或者是oration,就一个标记。

在这个XY像素周围投影这么一个标记,就可以证明哎我这个货物过期了啊,我就可以很快速的实现了这个识别和定位哈,但我现在不是很清楚,这个东西有没有得到商业应用,当然这个东西是呃感觉是比较有商业价值的。

比较有商业价值,当然整个的一个区别哈,就是我们多了一个嗯PHOTOSENSOR,来编码了一个几何的信息啊,这是一个计算照明的一个经典案例,经典案例它既可以读取这个啊。

radio frequency的一个id,也可以啊对这个商品实现快速定位啊,同时呢大家又通过这个projector,把这个读取的这个XY信息诶给它显示出来,诶,这个时候就变得非常有实际价值的意义啊。

变得非常有实际价值意义,这是一个当时他们做的一个呃就是圆形嘛,就是当然最上面还有一个i is transmitter。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那这个原型做的比较粗糙,还用了一个电池,然后用了一个PHOTOSENSOR,这个PHOTOSENSOR呢就可以接收到我这个projector,上面的一个编码啊,project上的一个编码。

然后这个PHOTOSENSATION上就可以把这个编码的,SY信息读取出来,再通过IP trans transformer,把这个传回那个我那个reader本身啊,这个就可以形成一个闭环的。

一个信息的一个交互,但这个也很便宜啊,一个PHOTOSENSOR有几分钱几分钱,就我们这个编码的一个东西,投影个啥呢。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就是我们可以投影这一系列的一个,MSB的一个pattern,MS的pattern,这里面编码这个XY的一个信息,我们把这个投影仪跟这个aff reader集成在一起,做成一个一体化的一个东西。

这个时候我们就可以把这个编码投出去哎,每个XY的方向都对应一个MS,EB的一个pattern啊,这个时候我们就可以很轻松的,把这个位置定出来,大家可以看到这整个A我们在随着时间变化。

这个pattern也在一直变化,A,是吧,直到最后我们这个比如说哦,编码的这个情况就是0101啊,这个最后啊,直到我们有一个足够的一个编码对吧,但对我们每个tag来说。

就是我们通过这个light quence,就是随着projector每个像素点的变化,来抵扣的这个XY的一个位置,最后然后再通过把这个XY的位置传给这个reader。

在在production上把这个位置标记出来,诶,这个是整个对project的双重利用啊,双重利用来实现了这个信息的交互与定位,这是当时做了一个呃。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就是vero feedback的一个实验啊,实验我们可以对这个这个好的一个物体,变成一个红的,然后不好的物体标成一个白的,坏的物体变成一个红的,就可以实现唉快速的读取跟定位,这个tag就在这个位置。

那本节课的一个第三个课题是给大家分享一下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个explosion and control,Nature lighting condition,这个nor like condition呢,就是在我们很多日常生活中,特别是很多监控领域啊。

或者是嗯可以用到的这些图像增强的一种办法,就是还是回到我们之前讲到一个day day and night fusion,可当时没给大家讲清楚这个啊,diannine fusion到底是干什么的哈。

这个哎可能上课的时候总马观花听了一下啊,但是并没有给大家交代清楚啊,我这个in that fusion到底是做什么用的,当然可能大家只看到这个拍这个图是怎么回事,但是呃具体里面有什么实际用途。

可能没给大家交代清楚啊,今天再给大家呃重新的啊细细的梳理一遍,就是我们在拍金夜景的时候,我们可以看到像这个dark building啊,还有这个reflection on the building。

还有像这些比较黑的地方,我不知道这个东西到底是什么东西,是不是我们很难判断,我这些暗的地方是什么东西,就拍不清楚,这个时候特别是在监控的地方,我们有一些啊,现在在国内这个监控也越来越多了。

我们很多啊监控摄像头都是固定的,固定的一个角度的一个监控对吧,诶固定的角度的监控诶,这个时候我们想要啊,知道本身我在这个夜景下拍摄的内容,跟我就是通过一个人白白天的一张图像,来对这个夜景的图增强。

哎这个时候我们就可以实现一个deadline fusion来,比如说把这个啊我们刚才这些黑的一些地方啊,把它完美的呈现出来,同时又把这些页里面拍摄到的信息保留住,比如我啊做监控的情况下。

诶我夜里拍的乌漆嘛,黑的只有灯照亮的地方,我才知道,这个时候人们对这些黑的地方很难理解,是一个什么样的场景啊,所以这个时候我们就可以用一个day and night fusion,来实现啊。

这么一个很清晰的一个background,比如说这个时候呢就是我们实现通用一个net image,就是我们夜里面一直在监控着这么一张图啊,页里面一直在监控的一个动态画面,诶。

每一帧我都可以跟我一个daytime的一个image,来进行融合啊,要进行融合,然后呢我们就可以拍到一个背景增强的一个video。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

背景增强了一个video啊,实际上这里面收一个image,实际上它是可以做成一个video,大家可以想想,我们在那个监控室看到这一个背景增强,或者一个a video。

是不是比我们直接观测到这个nt image,可以看到更多的一个信息呢,是不是大家在这个做监控的时候,就可以变得非常清晰,这个时候是怎么做的呢,我们在这个首先我们在这个夜景的图里面,把这些比较亮的地方哦。

通过这个mask哎来把这个搞出来,通过mask来把这些信息搞出来,比如在这些地方我最后融合之后,这些地方的信息要保留啊,然后这个黑的地方呢,就我就用一个daytime的一个信息,来对这些细节进行填充啊。

然后最后通过融合就可以把这个夜间的信息哎,同时也可以得到这些黑的地方,就得到了一个增强,让人们更容易理解,就是在夜里到底发生了一个什么样的情况,这个时候啊。

当然这个以前传统的大家在那就只是用simple,pixel blending啊,这个效果会比较差,所以说给大家也讲过一些啊,抛松不能定的一些办法哈,对这个是左边。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个是pixel blinding,右边这个是这个新的一个method。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就integration with blendy的一个鬼链子,这个是我们在国内那一节已经讲到了,我们可以看到这个一个nt image,然后我们把这个gradient提取出来诶。

X方向的一个GRADIY方向的一个gradient,然后呢我们在嗯对这个daytime image,把它的X方向的gradient,Y方向的一个gradient的分别提取出来,再把这个嗯夜间的一个图像。

像它那个亮度啊,通过这个亮度把这个importance image which,提取出来是吧,这个时候我们可以通过这个gradient的field,两个两组规律的field。

这个夜间和白天呢通过这个important with哎,得到一个mix的gradient field,对我得到一个mix gradient field。

然后在这个通过这个gradient integration的方法,把这个融合起来,就可以实现诶,我们在夜间监控的时候啊,只有一张参考,白天参考图像的时候,也可对夜间的video进行一个很好的一个增强。

啊这是一个本身的一个reconstruction的一个方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们就怎么样从这个规定的field,来进行一个reconstruction,实际上我们最后的一个TOIMAGE,我们要minimize的一个error,就是我最后的一个融合过程。

tag image跟我这个融合的gradient,哎我们要minimize它们之间的一个error,同时呢就是我们这个嗯要保证它的一个破松,一规则,就是我二阶的一个规定的趋势啊,让它让它相同啊。

让他二阶规定的趋势来相同,然后我用这个MASQUARE的一个server,就可以把这个呃这个新的r prime来给他解出来,这个举个例子哈。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对我们这个夜间啊,夜间我们这个original一个video frame,我们可以看到这个走廊啊是非常暗,这个左右大家都不知道是啥对吧,这个时候我们很难观测到,我们这个环境到底是一个什么样的环境。

对不对,但是我们想用这一个嗯白天的一些信息,把这个很暗的地方给它填充出去,让大家更容易理解诶,这个时候我们把白天那个图像,跟这个当前的这个夜晚这一帧融合在一起诶,就可以很清晰的。

大概知道我们这个拍摄这个图像的一个环境,到底是什么哈,到底是什么,这个就变得啊整个对整个监控更容易,大家让大家理解并接受,啊这是一个例子哈。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就我们本身夜间的图像那个contract会很低,然后细节也很低,这个时候呢,我们就可以在白天拍一张静态的一个图,把夜间的video跟白天的这张图去融合,唉最后我们可以就可以啊,把这两个融合之后诶。

就可以得到一个enhance的一个night video,这个举个例子,这是我们夜间监控的一个马路上的一个行车诶。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

右边是我们白天的一个场景哈,这个是场景,是我在白天每隔五秒钟拍拍一张图,然后再把这个平均起来,因为固定场景平均起来拿到一张背景,那在很亮的地方呢,就很照亮的地方,我们知道这个执行度是比较高的。

就产生了一个mask,然后通过这个mask with,把这个两张上面这两张就是video,还跟这个右边这张参考图融合在一起就可以啊,对这个很多安卓的细节进行增强啊,这个最后融合出来的监控图像。

这会变得非常清晰,非常好看,啊这是一个啊对它的一个呃那个,大家可以看到这个最后的结果,是变得非常清晰啊,啊这个原理跟刚才那个是一样的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就是我把嗯就是一两张图的融合变成一张图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

跟每一帧video的一个融合,同样的也是呃两个frame,然后找到他的一个mask,找到它的gradient field,然后daytime gradient field。

然后再这gradient mix在一起,然后再用mesh grade把它融合在一起,对这个是可以看到啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当然我们其实嗯目前还有一些嗯很smart的一个,Lighting equipment,比如像我们dannt fusion,其实上也是啊,用白天的自然光,给一夜间的图像做了一个lighting啊。

这个是嗯你可以这么理解哈,这个是比较有意思的,我们的整个啊也可以我们去不断调制啊,整个图像的一些WAVELENGINTENSITY啊。

还有一些像后面我们要讲到了一个time of flight image,就是整个持续的调制,来算一个它的相位跟它的一个深度,我们也可以像LISTAGE那样啊,来调一些不切不一样光线的一个角度。

同时我们也可以趁着我们这个光线,照明角度来算它的ABELE哎,通过他的ABEL来计算它的一个3D诶,这个是啊非常有意思的一个东西来计算照明哈,整个照明系统是我们计算摄影里面,非常重要的一块啊。

它会有非常非常千奇百怪的应用,可能今天大家听到了今天啊会发现啊,整个计算摄影计算计算成像这一块,这个涵盖的内容啊,这是包罗万象,包罗万象,它整个涵盖的知识也是非常多,就从你的物理啊,光学啊。

你复利大礼包啊,你最后的DISP啊,包括最后解的算法,我们也讲到了一些古典的方向上的算法,ADMM啊,可能后面还会有一些deep learning啊,还有食欲调制,空域调制唉。

各种各样的方法都会出现在我们计算成像里面,说为什么在整个计算成像会变得非常有意思啊,也就是由我们各种各样的自由度,各种各样的解法,各种各样的有意思,跟大家生活接近起来也可以啊,涉及到我们的空间啊。

海洋探测唉,这个它的用处真是非常广大,而且这个时候呃,也是刚刚整个计算摄影也算是一个开端,跟一个上升期啊,这个大家呃这个时候加入计算摄影,计算成像这么一个领域啊,对大家以后的一个发展还是非常有益处的。

对,今天就给大家讲到了整个呃计算照明的第二讲,就包括我们light color wiens的一个条件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们讲到了两个例子,第一个就是color code destructure,light等一个RAINBOPIV啊,我们可以对啊,通过这个呃不一样的一个颜色,就是连续称职了一个Q来标记它的一个games。

或者标记了一个special的一个位置,这个很有意思啊,还有像我们的一个啊special modulation,就是我们讲到了一个synthetic or illumination啊。

当然也会涉及到一个synthetic photography,这个地方可能比较难,这个大家呃没有讲太细哈,这个表大家可以自己稍微下去多去嗯,了解一下这个合成孔径的这么一个知识,这个是比较有意思的。

然后第三个地方呢,就给大家讲一个temple modulation的一个,两个简单的例子哈,就包括像一个motion tracking,还有一个带有光电,三星定位的一个I发G的态度。

最后再给大家讲一个就UNCONTROL,一个nature lighting condition,就是把白天的一个嗯,白天的一个场景当做一个照明去给这个,那就给这个夜晚的场景进行增强,当然下节课啊。

我会想给大家讲一下一个非常热门,非常重要的一个话题,就是tom flat image,就是光飞行时间怎么怎么通过这个连续的波,还有一个脉冲的波来获取我们想要的信息啊。

这个时候我们可以从整个就是从电路到算法,到整个成像的过程,还有到最后的解法,形成一个完整的完整的一刻了,包括我们对三维成像,三维成像的校正,还有最后我们可以用这个多普勒的一个。

Time of flight camera,或者是一个polarization time of flight camera,下节课会给大家讲一下啊,从我们先从这个间接光飞行时间法,来开始讲解吧。

这个是temple modulation的一个呃,照明加上成像一体的一个技术啊,这个会比较有意思,也比较重要,当然现在大家做的研究也慢慢慢慢开始了,所以说啊这个时候大家开始这方面的研究,会比较有意思哈。

嗯好了,今天的课程就到这里,今天给大家讲了计算啊,计算照明的第二课,下面会给大家呃。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分别的讲解,我们整个temporal encoding的一些方法啊,这个special encoding的一些方法,还有就是polarization,camera like you camera啊。

这些啊专题的应用跟一些场景啊,这个后面涉及的技术会越来越有意思,他得到了应用也会越来越有意思啊,这个课程目前为止已经进行了一半多一点了,就是后面的这个每个都是一个非常经典,非常经典的一个案例啊。

大家通过这个案例就可以学习里面啊,到底用了哪些技术啊,这个是啊非常有启发性跟非常有意义的好,今天的课程就到这里,大家有什么问题吗,啊扩充如何让那个位置呢,那是他的一个位置,就是啊,比如说我这个就是。

就是白天跟夜晚做融合的时候,白天做跟夜晚夜晚做融合的时候,这个嗯夜晚比较亮的地方,我就给他搞成这么一个mask,它的位置就比较重要啊,这个时候我们对他,这是他的第一个造成的两个鬼点,进行FING的时候。

你就可以通过这个位置来给它呃,这个把这个鬼点的融合在一起,那么还有别的问题吗,嗯没有问题,我们今天的课程就到这里,再次感谢大家来到games204啊,这个第四次作业嗯,下周应该会放出去。

这个会给大家呃讲一下这一部分的内容啊,这个同学又问了一个IPHD的光如何穿透纸箱,它不穿透纸箱,这个FIDID这个C是放到外头的,就贴在最外层的这个tag能看到就可以了,好嘞,再次感谢大家。

今天的课程就到这里好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

内容概要:本文深入探讨了AMESim仿真平台在电动汽车(EV)热泵空调系统设计与优化中的应用。首先介绍了AMESim的基础建模方法,如构建制冷循环模型中的压缩机、蒸发器和冷凝器等组件,并详细解释了各部件的工作原理及其参数设定。接着重点阐述了EV热泵空调系统的特殊之处,即不仅能够制冷还可以在冬季提供高效的制热功能,这对于提高电动汽车在寒冷条件下的续航里程和乘坐舒适性非常重要。文中给出了几个具体的案例,包括通过改变压缩机运行频率来进行性能优化,以及针对低温环境下热泵系统的控制策略,如四通阀切换逻辑、电子膨胀阀开度调节等。此外,还讨论了热泵系统与其他子系统(如电池温控)之间的协同工作方式,强调了系统集成的重要性。最后分享了一些实用的经验技巧,例如如何避免仿真过程中可能出现的问题,怎样评估系统的整体性能等。 适合人群:从事汽车工程、暖通空调(HVAC)领域的研究人员和技术人员,特别是关注新能源汽车热管理系统的专业人士。 使用场景及目标:适用于希望深入了解电动汽车热泵空调系统特性的工程师们,旨在帮助他们掌握基于AMESim进行系统建模、仿真分析的方法论,以便更好地指导实际产品研发。 阅读建议:由于涉及到较多的专业术语和技术细节,建议读者具备一定的机械工程背景知识,同时配合官方文档或其他参考资料一起研读,以加深理解。
期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目),个人经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为毕业设计、课程设计、期末大作业,代码资料完整,下载可用。 期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值