Минимизировать количество ненулевых элементов в весовой матрице Кераса - PullRequest
0 голосов
/ 26 апреля 2018

Я хотел бы найти минимальное количество вложений с наименьшим количеством ненулевых элементов, чтобы ограничить количество ненулевых весов в модели.

Моя архитектура теперь:

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 голосов
/ 26 апреля 2018

Два варианта:

  1. Можно создать неперерабатываемую двоичную переменную маски M (того же размера, что и исходная весовая матрица, где 1 указывает те места, которые разрешеныобновлять).Вам нужно написать собственный слой для поддержки этой функции.Обратите внимание, что в этом слое есть две матрицы параметров, одна из которых не обучаема M, а другая - обучаемая W, а их поэлементное произведение W'=M*W - используемая матрица фактического веса.

  2. Рассмотрите возможность использования правила L1 для поощрения разреженности в весовой матрице.

Обновление:

Я поделюсь с вами записной книжкой Google Colab, чтобы продемонстрировать, как обнулять малые веса во время тренировок.Поскольку мы делаем это для обучения, вы не увидите значительного снижения производительности во время тестирования.Подробности см. В этой записной книжке .

Примечание:

  • ограничение, которое я добавил, является очень простой версией варианта 1. Это означает, что вы можетеувидеть лучшую производительность, если вы напишите свои слои с дополнительными ограничениями.

  • с увеличением разреженности модели производительность модели падает.И я считаю, что это утверждение в целом верно (т. Е. Вам трудно найти модель с высокой разреженностью и точностью).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...