我已经有两年 ML 经历,这系列课主要用来查缺补漏,会记录一些细节的、自己不知道的东西。
已经有人记了笔记(很用心,强烈推荐):https://github.com/Sakura-gh/ML-notes
本节内容综述
小细节
Networks are typically over-parameterized (there is significant redundant weights or neurons).
Prune them!
在生物学,在90年代就有《Optimal Brain Damage》这样的文章,相关研究。
对于一个神经网络,可以通过衡量并去除其不重要的weight或者neuron,得到新网络。
之后,再用数据训练。
注意,不要一次 remove 太多东西,否则网络可能不会 recover 。一般来讲,都是多次做几次 fine-tune 。
How about simply train a smaller network?
It is widely known that smaller network is more difficult to learn successfully.
Larger network is easier to optimize?https://www.youtube.com/watch?v=_VuWvQUMQVk
有一篇论文提出了“大乐透假设”:Lottery Ticket Hypothesis。
如上,对完整的网络初始化、训练、压缩,之后:
作者由此提出:可能神经元会不会被训练起来,与初始值有很大关系,是一种大乐透现象。
但是这篇文章,正好得出了与“大乐透假设”相反的结论。
如上,做完了 Pruning 的网络,难以组成矩阵,用 GPU 加速了…因此,实际操作上,可能直接把 Pruning 掉的量直接设为 0 。
但是,这样又不会让网络占有的空间变小。因此,实际应用中,运行 Pruning 后的网络是一件比较复杂的事。
如上,发现如果使用取消了连接的 Pruning 后的网络,使用 GPU 的加速并快不到哪里去。
因此,如上,直接去掉某一个神经元是一个比较好的 Pruning 方向。这不会增加计算负担,不会妨碍构成矩阵运算。
训练一个大网络,用小网络(Student Net)学习大网络。
为什么这样有用?因为小网络学的是一个基于大网络的 distillation 。不仅仅学到一个输出神经元的价值,而是多个神经元的输出。
此外,实际上可以用 Student Net 学习集成模型。这样大大起到了压缩空间的效果,又能较好地进行学习。
如上,在输出层,我们为Target Network在做 softmax 除以一个“温度”(通常大于1),以此,让这些值变得相近,方便 Student Network 的学习。
李老师:作业证明,加了温度也不会有什么额外的效果...
如图,只要保存各个参数的类别,以及类别对应的数值表就可以。
此外,还可以进行哈夫曼编码等压缩。
如图,对神经网络进行梯度下降,进行优化;最后把参数都元整为1或-1,则参数就可以用一个位来表示了。记录这个模型。
如图,发现在不少问题上,有了 Binary Connect 效果更好。这可能因为 Binary Weights 本身就是一种正则。
如图,加了一层,是有可能让参数变小的。
如图,标准的CNN架构,其中两个通道,4个filter,一共有72个参数。
首先,在 Depthwise Convolution 中,我们的 filter 不是立体的,不需要多通道高,每个 filter 只处理自己的 channel 。
接下来,用 Pointwise Convolution 中,用 1×1 的filter 进行多通道卷积。
这样,其 input 与 output 与标准的卷积层相比,参数少了许多,只有18+8=26个。
具体解释一下,如上图,Depthwise Separable Convolution进行了“参数共享”。
如上,因为一般来输出的通道数 O O O 可能很大, 1 O ≈ 0 \frac{1}{O} \approx 0 O1≈0;可见,Depthwise Separable Convolution能优化的大小与卷积核尺寸有关。
其应用有很多:
如图,根据目前情况,选择不同的计算方案(强力的耗费资源的,或弱小的但不费资源的)。
有几个解决方案:
但是,如上图两个表,这也会面临两个问题:
李老师提及了 Multi-Scale Dense Networks,让大家可以参考。