无需注册和SMS即可减少ML模型的大小



任何遇到机器学习的人都知道,这需要强大的计算能力。在本文中,我们将尝试应用由MIT开发的算法来压缩神经网络,这将减少训练后模型的权重维,并导致更快的学习和更快的模型发布。

事实证明,神经网络是解决各种各样任务的出色工具,但不幸的是,神经网络的使用需要强大的计算能力,而这在小型企业中可能还不是很大。神经网络的压缩类型很多,可以分为硬件,底层和数学两种,但本文将讨论麻省理工学院在2019年开发的,直接与神经网络本身一起工作的方法。

这种方法称为“中奖彩票假说”。一般而言,这听起来像是:任何具有随机初始化权重的完全连接的神经网络都包含一个具有相同权重的子网,并且这种经过单独训练的子网的准确性可以与原始网络相同。

正式的证明和全文可以在这里找到我们对实际应用的可能性感兴趣。简而言之,算法如下:

  1. 我们创建一个模型,随机初始化其参数
  2. 学习迭代网络j
  3. 我们切断那些具有最小值的网络参数(最简单的任务是设置一些阈值)
  4. 我们将其余参数重置为其初始值,得到所需的子网。


从理论上讲,此算法需要重复第n步,但作为示例,我们将仅执行一次迭代。使用tensorflow和Keras创建一个简单的完全连接的网络:

import tensorflow as tf
from tensorflow import keras

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(300, activation='relu'),
    keras.layers.Dense(150, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='SGD',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

我们将获得以下网络体系结构:



并将其在包含60,000张图像的MNIST时尚数据集上进行训练。其在验证数据上的准确性将等于0.8594。我们将此算法应用于网络1迭代的参数。在代码中,它看起来像这样:

#  
threshold = 0.001

#       np.array
weights = model.weights
weights = np.asarray(weights)

#    
first_h_layer_weights = weights[1]
second_h_layer_weights = weights[3]

def delete_from_layers(one_d_array, threshold):
    index = []
    for i in range(one_d_array.shape[0]):
        #   ,       
        if abs(one_d_array[i]) <= threshold:
            index.append(i)
    #    ,   
    new_layer = np.delete(one_d_array, index)
    return new_layer

new_layer_weights = delete_from_layers(second_h_layer_weights, threshold)

因此,执行此代码后,我们将摆脱几乎未使用的权重。有两点值得注意:在此示例中,阈值是根据经验选择的,并且该算法无法应用于输入层和输出层的权重。

收到新的权重后,有必要重新定义原始模型,消除多余的模型。结果,我们得到:



您会注意到,参数总数减少了将近2倍,这意味着在训练第一个网络时,根本不需要一半以上的参数。同时,子网的精度为0.8554,这比主网络要低很多。当然,该示例是指示性的,通常网络可以减少初始参数数量的10-20%。在这里,即使不应用此算法,也很明显,选择原始体系结构太麻烦了。

总而言之,我们可以说该技术目前尚不完善,在实际任务中,以这种方式优化模型权重的尝试只会延长学习过程,但算法本身具有很大的潜力。

All Articles