通过架构设计压缩神经网络

内容纲要

架构设计(Architecture Design)方法指调整网络的架构设计,让它变得只需要比较少的参数。是比较实用且有效的深度学习模型压缩方法。

低秩近似

Hung-yi-Lee-Low-rank-Approximation

对于全连接层,一种减少参数量的方法是参考矩阵分解,将一个大的权重矩阵分解为两个小的权重矩阵相乘。这种方法被称为低秩近似(Low-rank Approximation)。大名鼎鼎的 ALBERT实现中就使用了这个技巧。

Depthwise Separable Convolution

第一次看到这个技巧是在 QANet ,个人认为QANet论文上的图片解释或许更直观一些,推荐阅读一下。
Hung-yi-Lee-Standard-Convolution

对于普通的卷积层,我们有很多组滤波器(filter),每组滤波器的数量等同于输入数据的 channel 数。

Hung-yi-Lee-Depthwise-Separable-Convolution

而在 Depthwise Separable Convolution 中,卷积的过程分为两步。第一步叫做 Depthwise Convolution,滤波器的数量等同于输入数据的 channel 数,即每个滤波器只考虑一个 channel。这样,在这一步中 channel 相互之间没有影响。第二步叫做 Pointwise Convolution,使用固定大小为 1x1 的滤波器组做普通的卷积操作即可。由于我们降低了 size 较大的滤波器组中的滤波器数量,因此在输入输出不变的前提下,参数量得以降低。

Hung-yi-Lee-DSConv-Analysis

从上图可以看到,Depthwise Separable Convolution 能够降低参数量的原因在于,普通的滤波器被拆解为两层,第一层的参数是共用的,第二层才使用独立的参数。

Hung-yi-Lee-Convs-Parameters

上图计算了普通卷积和 Depthwise Separable Convolution 具体需要的参数数量。Depthwise Separable Convolution 被广泛用于各种将体积小作为宣传点的模型中,包括:

膨胀卷积(Dilate Convolution)/空洞卷积(Atrous Convolution)

这里的压缩是相对而言的,本来要更大的 kernel(==参数) 才能获取的信息,通过空洞卷积在不增加参数的情况下做到了。

图片和讲解引用苏神的 基于CNN的阅读理解式问答模型:DGCNN
Atrous_cnn

同样是三层的卷积神经网络(第一层是输入层),窗口大小为3。普通卷积在第三层时,每个节点只能捕捉到前后3个输入,而跟其他输入完全不沾边。

而膨胀卷积在第三层时则能够捕捉到前后7个输入,但参数量和速度都没有变化。这是因为在第二层卷积时,膨胀卷积跳过与中心直接相邻的输入,直接捕捉中心和次相邻的输入(膨胀率为2),也可以看成是一个“窗口大小为5的、但被挖空了两个格的卷积”,所以膨胀卷积也叫空洞卷积(Atrous Convolution)。在第三层卷积时,则连续跳过了三个输入(膨胀率为4),也可以看成一个“窗口大小为9、但被挖空了6个格的卷积”。而如果在相关的输入输出连一条线,就会发现第三层的任意一个节点,跟前后7个原始输入都有联系。

按照“尽量不重不漏”的原则,膨胀卷积的膨胀率一般是按照1、2、4、8、...这样的几何级数增长。当然,这里指明了是“尽量”,因为还是有些重复的。这个比例参考了Google的wavenet模型。
同样是三层的卷积神经网络(第一层是输入层),窗口大小为3。普通卷积在第三层时,每个节点只能捕捉到前后3个输入,而跟其他输入完全不沾边。

而膨胀卷积在第三层时则能够捕捉到前后7个输入,但参数量和速度都没有变化。这是因为在第二层卷积时,膨胀卷积跳过与中心直接相邻的输入,直接捕捉中心和次相邻的输入(膨胀率为2),也可以看成是一个“窗口大小为5的、但被挖空了两个格的卷积”,所以膨胀卷积也叫空洞卷积(Atrous Convolution)。在第三层卷积时,则连续跳过了三个输入(膨胀率为4),也可以看成一个“窗口大小为9、但被挖空了6个格的卷积”。而如果在相关的输入输出连一条线,就会发现第三层的任意一个节点,跟前后7个原始输入都有联系。

按照“尽量不重不漏”的原则,膨胀卷积的膨胀率一般是按照1、2、4、8、...这样的几何级数增长。当然,这里指明了是“尽量”,因为还是有些重复的。这个比例参考了Google的wavenet模型。

发表评论

电子邮件地址不会被公开。 必填项已用*标注