一个是叫剪枝,大家知道,神经网络主要是由一层一层的节点通过边连接,每个边上有些权重。剪枝的意思很简单,如果我们发现某些边上的权重很小,这样的边可能不重要,这些边就可以去掉。我们在把大模型训练完之后,看看哪些边的权重比较小,把这些边去掉,然后在保留的边上重新训练模型; 模型压缩的另外一种做法就是通过权值共享。假设相邻两层之间是全连接,每层有一千个节点,那么这两层之间有一千乘一千也就是一百万个权值(参数)。我们可以对一百万个权值做个聚类,看看哪些权值很接近,我们可以用每个类的均值来代替这些属于这一类的权值,这样很多边(如果他们聚在同一类)共享相同的权值。如果我们把一百万个数聚成一千类,就可以把参数的个数从一百万降到一千个,这也是一个非常重要的一个压缩模型大小的技术。 还有一个技术可以认为是权值共享的更进一步,叫量化。深度神经网络模型的参数都是用的浮点型的数表达,32bit长度的浮点型数。实际上没必要保留那么高的精度,我们可以通过量化,比如说就用0到255表达原来32个bit所表达的精度,通过牺牲精度来降低每一个权值所需要占用的空间。 这种量化的更极致的做法就是第四类的技术,叫二制神经网络。所谓二制神经网络,就是所有的权值不用浮点数表达了,就是一个二进制的数,要么是+1要么是-1,用二进制的方式来表达,这样原来一个32 bit权值现在只需要一个bit来表达,从而大大降低这个模型的尺寸。
上面这张图显示了多种模型压缩的技术在不同卷积神经网络上的结果。我们可以看到,随着原始网络大小的不同,得到的压缩比是不一样的,特别是VGGNet,一个非常重要的卷积神经网络,能够把大小从原来的550M压缩到11M,并且让人惊奇的是,压缩后分类的准确率没有下降,反而略微有一点提高,这是非常了不起的。 通过设计更精巧的算法来降低模型大小 下面简单提一下我们组是如何对一些序列模型进行压缩,也就是对循环神经网络RNN做压缩,我们提了一种新的循环神经网络叫做LightRNN,它不是通过模型压缩的方式降低模型的大小,而是通过设计一种更精巧的算法来达到降低模型大小。 自然语言相关的应用中,模型之所以大,是因为我们需要把每一个词要做词嵌入(word embedding),把每一个单词表达成向量空间的一个向量。词嵌入的基本思想是,语义相似或相近的词在向量空间里面的向量也比较接近,这样就可以通过向量空间表达词之间的语义信息或者是相似性。因为通常我们的词表会很大,比如说在输入法里面,可能词表需要说上百万。如果我们词表有上百万的词,每个词如果是用一千维的一个向量来表达,这个大小就是差不多是一百万乘以一千再乘以4 Byte(用32位的浮点数来表达),词嵌入向量的总体大小差不多就有4G左右,所以整个RNN模型是非常大的。搜索引擎的词表有上千万的词,仅仅词嵌入向量这部分大小就有40G左右,考虑到输入的词嵌入和输出的词嵌入,整个词嵌入的大小有80G左右了,这么大的模型很难加载到GPU上训练模型和使用,更不用说放在移动设备上使用。
我们的算法的基本思想是:不是用一个向量来表达一个词,而是用两个向量表达一个词,一个行向量+一个列向量,不同的词之间共享行或列向量。我们用一个二维的表格来表达整个词表,假设这个二维的表格有一千行一千列,这个表格可以表达一百万个词;这个表格的每一行有一个行向量,每一列有一个列向量,这样整个二维表格只需要两千个向量。如果一个词(January)在第一行第一列的话,它就由行向量X1和列向量Y1来联合表达。考虑一个有一百万个词的词表,原来需要一百万个嵌入向量,通过这样一个二维或者是两个component的表格词嵌入,现在我们只需要一千个行向量和一千个列向量来进行表达,这样大大降低词嵌入向量模型的大小。 (责任编辑:本港台直播) |