剪枝是什么?剪掉多余的分支或参数,让模型更简洁
剪枝(Pruning)是指去掉模型中不必要或不重要的部分,让模型变得更加简洁。这个名字来自园艺:修剪掉树木多余的枝条,能让树长得更健康。在机器学习中,剪枝主要出现在三个场合:决策树、神经网络和搜索算法。
决策树的剪枝
决策树在生长的过程中,会不断地根据特征把数据划分得越来越细。如果任由它一直生长下去,它会把训练数据划分到极细的程度,甚至每个叶子节点只包含一个样本,把训练数据中的噪声和偶然的规律也都学了进去,这就是过拟合。剪枝是决策树对付过拟合的主要手段,分为两种。预剪枝:在树生长的过程中,每次准备划分一个节点之前,先判断这次划分能否提升模型在验证集上的表现,如果不能,就停止划分,把这个节点作为叶子节点。也可以设定一些停止条件,比如树的最大深度、每个节点的最少样本数。预剪枝的优点是训练速度快,缺点是可能过早地停止,错过一些当下看起来没用、但继续划分下去却很有用的分支。后剪枝:先让决策树完整地生长,然后自底向上地考察每一个非叶子节点,如果把这个节点下面的子树替换成一个叶子节点能够提升验证集上的表现,就进行替换。后剪枝通常能保留更多有用的分支,效果更好,但计算开销更大。CART 决策树使用的代价复杂度剪枝就是一种经典的后剪枝方法。
神经网络的剪枝
大型的神经网络往往包含大量的冗余:很多权重的值非常接近零,对输出几乎没有影响。神经网络剪枝就是删除这些不重要的部分,从而减小模型的大小、加快运行的速度,便于部署到手机等计算资源有限的设备上。早在 1989 年,杨立昆等人就提出了“最优脑损伤”方法,根据删除每个权重对误差的影响来决定剪掉哪些权重。2015 年,韩松等人提出的深度压缩方法,把剪枝、量化和编码结合起来,能把一些图像识别模型压缩到原来的几十分之一,而准确率几乎不变。
剪枝可以分为两类:非结构化剪枝,删除单个的权重,压缩率高,但得到的稀疏矩阵在普通硬件上不一定能加速;结构化剪枝,删除整个神经元、卷积通道、注意力头甚至整个层,更容易在实际的硬件上获得加速。剪枝之后通常还需要对模型进行微调,恢复损失的精度。2019 年,Jonathan Frankle 和 Michael Carbin 提出了“彩票假设”:一个大型的随机初始化的神经网络中,包含着一些小的子网络,如果单独训练它们,能达到与原网络相当的效果,就像中了彩票一样。近年来,剪枝也被用于压缩大语言模型,比如 SparseGPT、Wanda 等方法。
搜索算法中的剪枝
在博弈和搜索问题中,剪枝指的是跳过那些不可能产生更好结果的搜索分支,从而节省计算。最著名的是下棋程序中的 Alpha-Beta 剪枝:在搜索棋局的博弈树时,如果某个分支已经确定不会比已经找到的走法更好,就不再继续搜索它,大大减少了需要考察的局面数量。