Изучите ценную комбинацию различных вложений

Многие решения НЛП используют предварительно обученные вложения слов. Выбор того, какой из них использовать, часто связан с конечными характеристиками и достигается после множества испытаний и ручной настройки. В Facebook AI Lab пришли к выводу, что лучший способ сделать такой выбор - позволить нейронным сетям разобраться самостоятельно.

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

Как уже упоминалось, авторы доказали правильность своего решения на различных задачах в области НЛП. Мы ограничились применением этих методов в задаче классификации текста, где у нас есть 2 предварительно обученных вложения и мы хотим разумно объединить их для повышения конечной производительности.

ДАННЫЕ

Я нашел ценный набор данных на Kaggle, содержащий полные тексты статей (всего 2225) из архива BBC. Новости делятся на 5 тематических областей:

Наша цель - правильно их классифицировать, и для этого мы хотим обучить наши различные типы встраиваний, разумно комбинировать их и строить на этом слиянии наш классификатор. Вначале к необработанному корпусу применяется стандартная процедура очистки. В качестве модели встраивания я выбрал наиболее распространенные типы: Word2Vec и FastText. Мы можем легко обучить их с помощью Gensim, чтобы они «перетаскивали» их в архитектуру Keras (не забывайте поддерживать одинаковый размер встраивания для каждой выбранной платформы встраивания). Я тщательно вычисляю эту процедуру вручную, чтобы при необходимости контролировать процесс заполнения: объект Tokenizer и функция pad_sequence из Keras упрощают все.

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

МОДЕЛИ

В исходной статье представлены два разных вида техники:

  • Динамические мета-вложения (DME): исходные вложения проецируются в новое пространство, добавляя дополнительные обучаемые веса с помощью кодировщика LSTM, следуя механизму внимания. Затем они линейно комбинируются с исходным форматом. На языке Керас:
def DME(maxlen):
    inp = Input(shape=(maxlen, 100, 2))
    x = Reshape((maxlen, -1))(inp)
    x = LSTM(2, return_sequences=True)(x)
    x = Activation('sigmoid')(x)
    x = Reshape((maxlen, 1, 2))(x)
    x = multiply([inp, x])
    out = Lambda(lambda t: K.sum(t, axis=-1))(x)
    return Model(inp, out)
  • Контекстные динамические мета-вложения (CDME): как указано выше, исходные вложения проецируются в новое пространство, добавляя дополнительные обучаемые веса; но теперь контекстно-зависимая система применяется через кодировщик BiLSTM-Max. В конце концов, используются механизм самовнимания и взвешенная комбинация с исходным форматом. На языке Keras (слияние MaxPooling в двунаправленном слое Keras не предоставляется, поэтому мы должны кодировать его самостоятельно):
def CDME(maxlen, latent_dim=2):
    inp = Input(shape=(maxlen, 100, 2))
    x = Reshape((maxlen, -1))(inp)
    x = Bidirectional(LSTM(latent_dim, return_sequences=True))(x)
    x = Lambda(lambda t: [t[:,:,:int(latent_dim/2+1)],  
                          t[:,:,int(latent_dim/2+1):]])(x)
    x = Maximum()(x)
    x = Activation('sigmoid')(x)
    x = Reshape((maxlen, 1, 2))(x)
    x = multiply([inp, x])
    out = Lambda(lambda t: K.sum(t, axis=-1))(x)
    return Model(inp, out)

Мы воссоздаем два общих блока кода, которые выполняют комбинацию вложений посредством динамической процедуры. Оба решения могут быть размещены в начале сети сразу после чтения и объединения наших вложений. На них мы можем складывать обычные слои для разных целей. В нашем случае мы добавляем несколько повторяющихся слоев, чтобы правильно классифицировать наши новостные статьи. Мы закончили с этими двумя архитектурами:

Для DME:

concat_inp = Concat_Emb([embedding_matrix_w2v, embedding_matrix_ft], maxlen=max_len)
dme = DME(max_len)
x = dme(concat_inp.output)
x = GRU(128, dropout=0.2, return_sequences=True)(x)
x = GRU(32, dropout=0.2)(x)
out = Dense(y.shape[1], activation='softmax')(x)
dme_model = Model(concat_inp.input, out)
dme_model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

Для CDME:

concat_inp = Concat_Emb([embedding_matrix_w2v, embedding_matrix_ft], maxlen=max_len)
cdme = CDME(max_len)
x = cdme(concat_inp.output)
x = GRU(128, dropout=0.2, return_sequences=True)(x)
x = GRU(32, dropout=0.2)(x)
out = Dense(y.shape[1], activation='softmax')(x)
cdme_model = Model(concat_inp.input, out)
cdme_model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

Теперь мы готовы провести обучение и увидеть некоторые результаты. Обе модели способны обеспечить общую точность около 93% на тестовых данных с отличным показателем запоминания для каждого класса.

РЕЗЮМЕ

Предоставляя доступ к нескольким типам встраиваний (неважно, предварительно обучены они или созданы специально), мы позволяем NN узнавать, какие вложения она предпочитает, прогнозируя вес для каждого типа встраивания (DME ), необязательно в зависимости от контекста (CDME). Мы делаем это в задаче НЛП для классификации текста, просто комбинируя эту процедуру с обычным подходом для такого рода проблем.

ПРОВЕРИТЬ РЕПО НА GITHUB

Оставайтесь на связи: Linkedin

ССЫЛКИ

Динамические мета-вложения для улучшенного представления предложений: Доуве Кила, Чанган Ван и Кёнхён Чо; Facebook AI Research; Нью-Йоркский университет; CIFAR Global Scholar.