Нейросетевые модели для определения перефразировок вопросов (4)

Jun 29, 2017 09:41

[начало тут http://kelijah.livejournal.com/212124.html, скрипты моделей тут https://github.com/Koziev/QuoraQuestionPairs]
Удвоение датасета
400 тысяч пар вопросов в обучающей выборке - это неплохо, но нейросетки очень любят много данных. Чем больше свободных параметров у модели, тем больше требуется обучающих примеров для их настройки. Поэтому вопрос искуственного наращивания обучающего датасета (a.k.a data augmentation - https://www.google.ru/search?q=what+is+datra+augmentation) вполне уместен. Для многих (не всех!) моделей эффективен простой, практически бесплатный, подход с удвоением обучающего датасета. Достаточно подавать не только исходные пары вопросов, но и пары с перестановкой, поскольку семантическая релевантность предложений не зависит от порядка сопоставляемых предложений. Это почти удваивает размер датасета, если учесть пары идентичных вопросов.

Однако удвоение обучающего набора через перестановку недопустимо для моделей, в которых объединяющая часть сетки (в скриптах это слои с именами на тему merge) исключает влияние зеркального отражения в паре. В частности, если объединяющая часть сетки берет абсолютное значение разности и/или произведение результатов расчета для каждого из вопросов, то перестановка вопросов не влияет на результат расчета (перемена мест слагаемых и т.д.). Данный вариант вычисления метрики реализуется таким кодом:

diff = Lambda(lambda x: K.abs(x[0] - x[1]), output_shape=(seq_out_size,))([left_seq, right_seq])
mul = Lambda(lambda x: x[0] * x[1], output_shape=(seq_out_size,))([left_seq, right_seq])
merged = keras.layers.concatenate([diff, mul])

Как видите, abs(x[0] - x[1]) и x[0] * x[1], то есть модуль разности репрезентаций и произведение, инвариантны к порядку аргументов. Удвоение допустимо для такой реализации вычисления метрики:

merged = keras.layers.concatenate( [left_seq, right_seq] )

Этот вариант используется в самой примитивной char-level модели, описанной в разделе “1.1 Простейший multilayer perceptron”.

Хуже того, удвоение обучающего датасета сильно увеличивает шанс получить переобучение, так как по факту в таком режиме в одну эпоху мы прогоняем 2 одинаковых набора данных. В нижеописываемых моделях кривая обучения крайне неплавная, соседние эпохи могут давать сначала сильное улучшение качества (log-loss по validation data subset), а следом давать большой вынос в сторону ухудшения. В общем, с удвоением датасата надо быть внимательным и учитывать математический аспект архитектуры сетки.

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

В скриптах для char-level моделей удвоение датасета управляется параметром swap_questions в такой строке кода:

training_dataset = vectorizer.get_train_char_vectorization(swap_questions=True, re_weight=RE_WEIGHT)

нейросети, соревнования, kaggle, language model, neuronet, machine learning

Previous post Next post
Up