最小化权重矩阵Keras

时间:2018-04-26 04:17:02

标签: python keras

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

我的架构现在是:

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个非零元素的模型,它具有相对较高的精度吗?

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

1 个答案:

答案 0 :(得分:0)

两个选项:

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

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

  3. 更新

    我与大家分享一个谷歌colab笔记本,以演示如何在训练期间将小重量归零。因为我们这样做是为了培训,所以在测试过程中不会出现明显的性能下降。请参阅此notebook

    中的详细信息

    注意:

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

    • 随着模型稀疏度的增加,模型性能下降。我相信这种说法一般都是正确的(即你很难找到具有高稀疏性和准确性的模型)。