?

Log in

No account? Create an account

Компьютерная лингвистика

Новостная лента www.solarix.ru

Previous Entry Share Next Entry
Неудачные эксперименты с triple и contrastive loss архитектурами для определения перефразировок
kelijah

1. Постановка задачи

Нужна модель, которая определяет, эквивалентны ли два фрагмента текста (предложения) семантически.Правила синтаксиса и морфологии допускают очень большую свободу выражения латентной семантики, поэтому простая похожесть цепочек символов недостаточно хороша для некоторых случаев:

Автора денно и нощно охраняют усиленные полицейские наряды.
Автор находится под круглосуточной охраной усиленных полицейских нарядов

Актер потерял сознание прямо на сцене.
Прямо на сцене у актера случился обморок


2. Материалы на тему того, что такое triple loss и distance metric learning.

"Distance Metric Learning for Large Margin Nearest Neighbor Classification" http://jmlr.csail.mit.edu/papers/volume10/weinberger09a/weinberger09a.pdf

Суть подхода выражается в следующей цитате оттуда:

"The algorithm attempts to increase the number of training examples with this property by learning a linear transformation of the input space that precedes kNN classification using Euclidean distances. The linear transformation is derived by minimizing a loss function that consists of two terms. The first term penalizes large distances between examples in the same class that are desired ask-nearest neighbors, while the second term penalizes small distances between examples with non-matching labels."

Таким образом, имея датасет с примерами синонимичных и несинонимичных пар, можно выводить такую метрику, чтобы синонимичные пары давали меньшее растояние между элементами пары, чем несинонимичные. У меня есть примерно 100,000 отобранных вручную пар синонимичных предложений. Для получения несинонимичных сэмплов задействуется простая процедура подбора случайных примеров - см. исходный текст подготовки датасета. Для заданного предложения ищем случайные предложения, содержащие некоторое количество таких же слов. Это по задумке заставляет модель опираться не только на буквальную похожесть сравниваемых предложений, например как в негативном примере:

Верный ответ узнай у учителя.
Должен ли учитель сообщить правильный ответ?


Еще ссылки по теме:

https://stackoverflow.com/questions/38260113/implementing-contrastive-loss-and-triplet-loss-in-tensorflow

https://towardsdatascience.com/lossless-triplet-loss-7e932f990b24

https://stackoverflow.com/questions/47551447/keras-triplet-loss-with-positive-and-negative-sample-within-batch

https://github.com/adambielski/siamese-triplet

3. Реализация и результаты

Базовая модель, с которой сравнивается triplet loss модель, представляет из себя нейросетку с сиамской архитектурой, в которой сверточно-рекуррентная часть строит эмбеддинг предложения, а классифицирующая часть беред два эмбеддинга предложений из пары и учится классифицировать их как "синонимичны/не синонимичны". Исходный текст здесь.


Она дает при валидации величину f1 около 0.95.

Исходник нейросетка с triplet loss лежит тут. На входе эта модель получает тройки предложений, в которых есть опорное предложение (anchor), синонимичное предложение (positive) и несинонимичное предложений (negative). Схема сетки выглядит совершенно примитивно, так как вся основная работа происходит в реализации функции triplet_loss:


Особенность модели в том, что она сама по себе не умеет выдавать никаких показателей близости для двух заданных предложений. После обучения надо взять те слои модели, которые строят эмбеддинги (это LSTM слой). Чтобы оценить синонимичность двух предложений, прогоняем их через эту усеченную модельку, получаем два эмбеддинга. Затем для этих двух векторов рассчитываем евклидово расстояние. Более ничего модель делать не умеет. В результате мы можем, например, ранжировать список предложений по степени их синонимичности заданному. Для валидации мы берем тройку предложений из сэмпла, делаем расчет расстояний anchor-positive и anchor-negative, и если первое расстояние меньше - значит предложения более похожи, чем непохожи, и наоборот.

Эта модель при валидации дает точность примерно 0.89.

Модель с contrastive loss в целом похожа на triplet loss, но на входе у нее задаются пары предложений и метки "синонимичны/нет". К сожалению, моя реализация стабильно выдает  NaN в качестве значения loss'ов при обучении, поэтому оценить ее качество не могу.