好,我们在这边再说, 再讲一些跟deep learning领域有趣的事情。
Training Stuck Because……?
第一个有趣的事情就是:我们在training的时候,你看到的learning curve通常就是长这个样子的:一开始下降很快,慢慢的就趋缓了。过去我们们认为这是卡在了local minima,但是后来呢,比较多人知道卡在local minima其实是一个迷失,可能是卡在saddle point,而不是local mimima。
有一个很简单的说法,就是我们非常直观的想解释说为什么卡在saddle point,而不是local mimima;即:假设要是一个local minima,那么每一个dimension都必须是这样凹的,对不对?那我们假设说在error surface上这样凹的几是,而你的dimension是,参数量有,那么你今天要找到一个点,概率是的次方,其实是非常低的,通常多数的点,他的微分是0,它通常是有的地方向上凹,有的地方向下凸,那他其实是一个saddle point,现在多数人都已经相信了这个说法;其实也有人验证过这件事情:验证这件事情其实也不难,你就train一个network,他卡住的时候你就分析一下卡的地方是saddle point,还是local mimima、你会发现,多数的时候你其实是卡在saddle point上面,也有人做实验验证过了;其实这件事情在吴恩达新开的deep learning课程里,也有提到这件事;他讲到saddle point的时候,他还特别强调,saddle就是马鞍的意思,因为长得像马鞍。
但是,某某说过,前面这个想法也可能是一个迷失。有可能事实的真相是当你面临train卡住的时候,未必代表你真的卡在saddle point了,为什么?因为卡在saddle point或者local mimima代表那个区域他的gradient非常小,但是他举了一个例子,放在他的教科书里面,他train了一个network,error rate开始不断下降,很快就卡住了,他把卡住的gradient 弄出来,发现gradient很大。这就代表说现在虽然你的error rate不断下降,并不代表你卡在某一个saddle point,而有可能的状况是你走到一个山谷里面,然后再山谷里面来回震荡,所以的gradient仍然很大,但是你的loss已经不会下降了,你光看到loss不会下降,你就以为你卡住了,卡在了saddle point,其实不是,因为你的gradient仍然很大。显然不是卡住了,他是在一个山谷中可能来回弹跳,这是一个可能性。
综上,如果发现你卡住了,要检查你的gradient,如果你的gradient值真的很小,那才是卡在了 saddle point;不然的话,可能是遇到了在山谷震荡的情况。
Brute-force Memorization?
接下来另外一个较近的新闻是有一篇paper告诉我们说,他train一个network,network值可能只是用于暴力记住他所学到的东西,他这个实验是这样子的:他说,我们先拿一个正常的training set去train,然后loss跟training的epoch之间的关系是蓝色线,接下来,我们把input做一下shuffle,得到绿色线,接下来,input是random,label就是random的,network学不到任何东西,那么loss还是可降低到0的;那大家看到这是不是吓到吃手了?
我觉得这个实验并不是显示deep learning不work的,我们的network是如此巨大,大到他可以应对是可以应对corpus的,但是为什么没有选择应对呢?虽然现在没有很好的答案,但是它告诉了我们这样一个问题。
那在这篇icar的paper以后,马上就有人写paper反驳这件事:network不是只有做memory,这个实验如下:这个设计跟前一个paper是类似的,他说他把他的data做random置换,左边的是:代表label全对,代表的label换掉……
那如果你看这个training(实线)和testing(虚线)的这个curve的Accuracy变化的话,这里加了一堆的niose,代表数据里有一定量的数据是没有意义的,不管有多少random都可以有的正确率到最后,那么在testing set上,你random越多,performance就越差。你看curve的话,其实testing的performance是先增后降,这就是说network其实一开始是学了一些有道理的东西,之后才崩溃的;这个paper给我们的启发式:network在training的时候,可能就是说他先学了一些简单的pattern,有道理的pattern,然后再把奇怪的东西另外强行记下来;
再看看右边的这张图,纵轴讲的是:ratio of Critical Samples; ratio of Critical Samples即:把training data里面的一个point拿出来,在这point的某一个距离之内,有没有其他point跟这个point是不一样的,如果有就代表这个function在这个point附近特别崎岖,因为label变了嘛。ratio of Critical Samples想要衡量的是,我们这个network learn完以后,他的model所得到的function有多复杂,ratio of Critical Samples值越大越复杂。随着training epoch的进行,你会发现function越来越复杂,而如果你今天label的noise越大(如图颜色越深越大),noise越大,就越代表network要记录很多的奇奇怪怪的例外,所以他的function是特别复杂。但你会发现这些function’并不是一开始就那么复杂的,一开始是比较简单的;这就说明一开始network只想记住有特征有规律的东西,到后来才记那些奇奇怪怪的数据。再看左边这个图,一开始network只记住简单有规律的东西,所以performance会先变好,后来记了奇奇怪怪的例外以后,performance变差了;
Knowledge Distillation
那还有另外一个有趣的东西,这个是旧闻,也许大家知道Knowledge Distillation,Knowledge Distillation这个词来源于15年的paper。在Knowledge Distillation里面,一开始我们有一个Teacher Network,是一个比较深的network,然后我们拿它去做training,我们train好一个Teacher Network;接下来,我们把training data丢进去Teacher Network里面,这个Teacher Network的正确率其实也不是,我们network的output是一个distribution,output里面通过了softmax,所以得到了一个distribution;
举例来说,如图:
input一个 ,通过network得到是的概率是,的概率是,的概率是;接下来你有一个Student Network,是一个又宽又浅的network,这个矮胖的network要做的事情就是学习Teacher Network的output,照理说network是按照training data正确的label学,但是今天矮胖的network他不管正确的data,他就看Teacher Network的output;然后minimize与Teacher Network的交叉熵,照理来说,输入一个图片,network应该是让output是的几率越大越好,但是这个Student Network并非如此,他是希望的概率是Student Network就完全是去学习这个Teacher Network;Student Network本身performance不好,但是学Teacher Network以后performance就变好了,这是一个很神奇的事情;
下图是这篇paper的实验结果:纵轴是正确率,横轴是参数量,实验是在TIMIT上面进行的。
如上图所示:红色的线是一个 shallow 的network,随着参数量越来越多,其实performance你也进步不了多少。
绿色的线是deep 的network,也没有很deep,也只是三层而已;不过不要忘了这是13年的paper,在那时候算是deep了。接下来,让矮胖的红色network去学另外一个network,学习的对象是 Convolutional Network(粉红色的直线),很强;还有一个Ensemble的network(蓝色的直线),他更强;蓝色的对象是学 Convolutional Network的performance,红色线和蓝色线的network是一样的,但是直接train的结果没有去学的结果好。
大家可以看一下paper……