При работе с мультимодальностями, состоящими из изображений, видео, категориальных и числовых входных данных, одной из основных проблем является то, как объединить данные из нескольких потоков в одно вложение, которое можно использовать для последующих задач.

Один из подходов состоит в том, чтобы объединить вложения (полученные путем передачи каждого из входных данных через отдельные кодировщики) вместе последовательно и пройти через ряд линейных слоев (фрагмент ниже), надеясь, что изученные параметры веса будут фиксировать релевантные отношения между различными переменными.

embeddings = [img_embd, video_embd, ....]
stacked_embds = tf.stack(embeddings, axis=1)
x = tf.keras.layers.Flatten()(stacked_embds)
x = tf.keras.layers.Dense(1024)(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.Dense(256)(x)
encoded = tf.keras.layers.Dense(64)(x)

Несколько основных проблем с этим подходом:

  • изучение лишних отношений для нулевого входа (отсутствующие данные)
  • огромное увеличение количества параметров для каждой дополнительной входной переменной (при условии, что emb_dim = 64, для дополнительной входной переменной потребуется 1024*64 дополнительных параметра).

Чтобы противостоять вышеуказанным ограничениям, я придумал следующий подход.

  • фиктивный токен (с изученным вектором встраивания, вдохновленным токеном ‹CLS› задачи классификации BERT)
  • используйте многоголовое внимание (MHA), чтобы обобщить контекст из всех различных модальностей.
# Global token embed to store the condensed info from all the embeddings
sample_token_embed = GlobalTokenEmbedding(key_dim)(stacked_embds)
layer = MultiHeadAttention(num_heads, key_dim)
attention, _ = layer(source=stacked_embds, 
                   target=sample_token_embed)
attention = Dropout(0.1)(attention, training=training)
encoded = LayerNormalization()(sample_token_embed + attention)
ffn_output = point_wise_feed_forward_network()(encoded)
ffn_output = Dropout(0.1)(ffn_output, training=training)
encoded = LayerNormalization()(encoded + ffn_output)

Преимущества:

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

Как показано в эксперименте (рисунки ниже), суммирование контекста на основе MHA приводит к более стабильной производительности с более быстрой конвергенцией.

Если вы считаете подобные истории ценными и хотели бы поддержать меня как автора, рассмотрите возможность подписаться на меня или зарегистрироваться для членства в Medium.