动态计算希望网络可以自由 地调整它需要的计算量。为什么期待网络可以自由地调整它需要的计算量呢? 因为有时候我 们可能同样的模型会想要跑在不同的设备上面,而不同的设备上面的计算资源是不太一样的。所以期待训练好一个网络以后,放到新的设备上面,不需要再重训练这个网络。因为这个训练 一个神奇的模型,这个神奇的模型本来就可以自由调整所需要的计算资源。计算资源少的时 候只需要少的计算资源,就可以计算。计算资源大的时候,它就可以充分利用充足的计算资源 来进行计算。那另外一个可能是就算是在同一个设备上面,也会需要不同的计算。举个例子, 假设手机非常有电,可能就会有比较多的计算资源。假设手机没电,可能就需要把计算资源 留着做其他的事情,网络可能可以分到的计算资源就比较少,所以就算是在同一个设备上面。 我们也希望一个网络可以根据现有的计算资源,比如说手机现在的电量还有多少来自由地调 整它对计算量的需求。
假设我们是在同一台手机上,需要根据不同的情况做不同的因应,可能就需要训练 一大堆的网络。而手机上的储存空间有限,就是要减少计算量。但是如果我们需要训练 一大堆的网络,就需要一大堆的储存空间。这可能不是我们要的,其实期待可以做到一 个网络可以自由地调整其对计算资源的需求。
怎么让网络自由地调整其对计算资源的需求呢?一个可能的方向是让网络自由地调整它 的深度。比如图像分类,如图1 所示,它就是输入一张图片,输出是图片分类的结果,可 以在这个层和层中间再加上一个额外的层。这个额外的层的工作是根据每一个隐藏层的输出 决定现在分类的结果。当计算资源比较充足的时候,可以让这张图片去跑过所有的层,得到最 终的分类结果。当计算资源不充足的时候,可以让网络决定它要在哪一个层自行做输出。比如 说计算资源比较不充足的时候,通过第一个层,就直接丢到这个额外的第1层,就得到最终 的结果了。怎么训练这样一个网络呢?其实概念比我们想像的还要简单,训练的时候都有标签 的数据。一般在训练的时候,只需要在意最后一层网络的输出,希望它的输出跟标准答案越接 近越好。但也可以让标准答案跟每一个额外层的输出越接近越好。把所有的输出跟标准答案 的距离通通加起来,把所有的输出跟标准答案的交叉熵通通加起来得到L。
图1 动态深度
再去最小化这个L,然后就结束了,这个训练方法是可以用的。确实可以用我刚才讲的训 练方法,就是每一层接出来做训练,然后把所有接出来的结果去跟标准答案算距离,最小化所 有接出来的结果跟标准答案的距离,确实可以用这个方法达到动态的深度,但是其实它不是 一个最好的方法。
比较好的方法可以参考MSDNet(Multi-scale dense networks for resource efficient image classification[C]//ICLR. 2018.)。另外还可以让网络自由地决定它的宽度,怎么让网 络自由决定它的宽度。设定好几个不同的宽度,同一张图片丢进去。在训练的时候,同一张图 片丢进去,每个不同宽度的网络会有不同的输出。我们在希望每一个输出都跟正确答案越接 近越好就结束了,把所有的输出跟标准答案的距离加起来得到一个损失,最小化这个损失就 结束了。
图2 中的三个网络并不是三个不同的网络,它们是同一个网络可以选择不同的宽度。相同颜色是同一个权重。只是在最左边情况的时候,整个网络所有的神经元都会被用到。但是 在中间情况的时候,可能会决定有25%的神经元不需要用。或者在最右边的情况,50%的神 经元不要用它。在训练的时候,就把所有的情况一起考虑,然后所有的情况都得到一个输出, 所有的输出都去跟标准答案计算距离,要让所有的距离都越小越好就结束了。但是实际上这 样训练也是有问题的。所以需要一些特别的想法来解决这个问题。
图 2 动态宽度
有关深度(depthwise)动态的宽度的网络,怎么训练这件事?大家可以参考论文“Slimmable Neural Networks” (Slimmable neural networks[C]//ICLR. 2019.)。那刚才讲的是可以训练一个网络,可以自由去决定它的深度跟宽度。但 是还需要我们去决定,今天电池电量少于多少的时候,就用多少层或者是多宽的网络。但是有 没有办法让网络自行决定,根据情况决定它的宽度或者是深度呢。
因为有时候,就算是同样是图像分类的问题,图像的难易程度不同,有些图像可能 特别难,有些图像可能特别简单。对那些比较简单的图像,也许只要通过一层网络就已 经可以知道答案了,对于一些比较难的问题,需要多层网络才能知道答案。
举例来说,如图3所示,同样是猫,但有只猫是被做成一个墨西哥卷饼,所以这是一 个特别困难的问题。也许这张图片只通过一个层的时候,网络会觉得它是一个卷饼;在通过第二个层的时候,还是一个卷饼。要通过很多个层的时候,网络才能够判断它是一只猫。这 种比较难的问题就不应该在中间停下来。可以让网络自己决定这是一张简单的图片,所以通 过第一层就停下来。这是一个比较困难的图片,要跑到最后一层才停下来。具体怎么做可参 考论文“SkipNet: Learning Dynamic Routing in Convolutional Networks”(Skipnet: Learning dynamic routing in convolutional networks[C]//Proceedings of the European Conference on Computer Vision (ECCV). 2018: 409-424.)、Runtime Neural Pruning(Runtime neural pruning[J]. Advances in neural information processing systems, 2017, 30) 和“BlockDrop: Dynamic Inference Paths in Residual Networks”(Blockdrop: Dynamic inference paths in residual networks[C]//Proceedings of the IEEE conference on computer vision and pat tern recognition. 2018: 8817-8826)。
图3 计算量取决于采样难度
所以像这种方法不一定限制在计算资源比较有限的情况。有时候就算计算资源比较很充 足,但是对一些简单的图片,如果可以用比较少的层,得到需要的结果,其实也就够了,这样 就可以省下一些计算资源去做其他的事情。