【问题标题】:Minimize number of non-zero elements in weights matrix Keras最小化权重矩阵 Keras 中非零元素的数量
【发布时间】:2018-04-26 04:17:01
【问题描述】:

我想找到具有最少非零元素数量的嵌入的最小数量,以限制模型中非零权重的数量。

我现在的架构是:

def build_model(max_len, num_words, num_classes):
    I = layers.Input(shape=(max_len, ), name='Input')
    E = layers.Embedding(input_dim=num_words, 
                         output_dim=num_classes, 
                         embeddings_initializer='he_uniform',
                         name='Embeddings')(I)
    P = layers.GlobalAvgPool1D(name='Pool')(E)
    O = layers.Softmax(name='Softmax')(P)
    return models.Model(inputs=[I], outputs=[O])

模型看起来像:

Layer (type)                 Output Shape              Param #   
=================================================================
Input (InputLayer)           (None, 271)               0         
_________________________________________________________________
Embeddings (Embedding)       (None, 271, 26)           1358786   
_________________________________________________________________
Pool (GlobalAveragePooling1D (None, 26)                0         
_________________________________________________________________
Softmax (Softmax)            (None, 26)                0         
=================================================================

我试图在一些迭代后将一些权重归零,以便只保留最大的权重

model = build_model(MAX_LEN, NUM_TOKENS, NUM_CLASSES)
model.summary()
model.compile(optimizers.Adam(lr=0.1), 'sparse_categorical_crossentropy', metrics=['accuracy'])

total_params = NUM_TOKENS * NUM_CLASSES
need_params = 200
num_iterations = 16
decay = (total_params / need_params) ** (1 / num_iterations)

for i in range(num_iterations):
    wipe_out = int(total_params * (1 - 1 / decay ** (i + 1)))
    model.fit(X, y, batch_size=512, epochs=i * 16, verbose=False)
    weights = model.layers[1].get_weights()[0]
    idx = np.argpartition(np.abs(weights), k, axis=None)
    weights.flat[idx[:wipe_out]] = 0
    model.layers[1].set_weights([weights])

但是在训练时,模型会不断将这个零权重更新为非零值。 有没有办法限制更新零值或某种只允许更改非零值(值方式,而不是嵌入方式)的掩码?

您能否帮助我使用嵌入或优化器或正则化器来构建一个嵌入矩阵中最多包含 200 个非零元素的模型,该模型具有相对较高的准确性?

问题是: 我有一个“原始职位”和“分类工作角色”的列表,我试图为每个单词分配一个与每个类别的距离,然后对它们进行平均并选择一个权重最高的类别。主要问题是最小化嵌入矩阵中非零元素的数量

【问题讨论】:

    标签: python keras


    【解决方案1】:

    两个选项:

    1. 可以创建一个不可训练的二进制掩码变量M(与原始权重矩阵大小相同,1 表示允许更新的位置)。您需要编写一个自定义层来支持此功能。注意,这一层有两个参数矩阵,一个是不可训练的M,另一个是可训练的W,它们的元素乘积W'=M*W是实际使用的权重矩阵。

    2. 考虑使用L1 规则来鼓励权重矩阵中的稀疏性。

    更新:

    我与您分享一个 google colab 笔记本,以演示如何在训练期间将小权重归零。因为我们这样做是为了训练,所以在测试期间您不会看到性能显着下降。请参阅此notebook 中的详细信息。

    注意:

    • 我添加的约束只是选项 1 的一个非常简单的版本。这意味着如果您编写带有额外约束的层,您可能会看到更好的性能。

    • 随着模型稀疏度的增加,模型性能下降。而且我相信这句话总体上是正确的(即,您很难找到具有高稀疏性和准确性的模型)。

    【讨论】:

    • 我尝试了第二个选项,但这不起作用。它为重要的值分配了一些巨大的权重,但即使其他值接近 0,它们中的很多并且它们累积到一些重要的数量。正如我所说,我尝试在每次操作中将它们归零,但模型仍然为它们分配了一些权重。
    • 你应该做的是在训练期间将小权重归零。请参阅我的更新答案。
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2023-04-09
    • 2012-06-29
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多