Нейронные чат-боты глупы

«Разговор должен касаться всего, но не должен ни на чем сосредотачиваться».
- Оскар Уайльд

📄 Бумага
🚀 Демонстрация фильтрации

💻 Код обучения
Код фильтрации
📊 Оценочный код
🌈 Плакат

Почему они тупые? Нейронные сети - это аппроксиматоры функций, и они отлично подходят для обработки изображения и вывода категории объекта 🚗 или обработки предложения и перевода его в другой язык. Но моделирование диалогов? Вот простая иллюстрация того, почему обучение наивной нейронной сети контролируемым способом (однооборотным) никогда не приведет к созданию достойного чат-бота 👾:

Я называю это проблемой один-ко-многим, многие-к-одному. Обратите внимание, что при моделировании диалогов есть много вводных данных, таких как Что вы делали сегодня?. Они настолько неограниченны, что после них может последовать практически бесконечное количество разных ответов. Итак, почему это проблема? Что ж, когда мы оптимизируем модель диалога, обычно это происходит из-за потери кросс-энтропии, что не является лучшей целью оптимизации для чат-ботов. Он пытается заставить модель изучить распределение ответов, которое имеет очень высокую энтропию (много различных возможных ответов). Поскольку обычно наборы данных диалоговых окон довольно маленькие, нет возможности моделировать это распределение, и наш маленький Трансформер запутывается 👾. Можно сказать, что это происходит постоянно и в других задачах, но я сомневаюсь, что есть еще одна задача, где проблема проявляется на этом уровне (Wei et al., 2017).

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

Теперь, глядя на мой отточенный пример, насколько эти данные вам похожи?

Собственно, они не имеют ничего общего друг с другом. При генерации ответа мы не хотим классифицировать эти входные данные как класс «я не знаю»; мы хотим генерировать интересные и актуальные ответы. Но если модель видит один и тот же ответ после множества полностью семантически разных входных данных, то ее уверенность в этом ответе возрастает ⬆️. В крайнем случае можно было бы просто сказать, что независимо от ввода я могу вывести «я не знаю». И дело в том, что это было бы отчасти правильно, потому что этот ответ подходит для многих контекстов, но это как раз проблема. Я уверен, что вам не захочется болтать с человеком, который все время отвечает вот так:

Хорошо, так кто-нибудь раньше занимался этой проблемой? Хм, я не знаю, может быть, сотни статей за последние годы 😃. Просто зайдите в мои бумажные заметки о чат-боте, и, наверное, как минимум половина из них связана с этим. Я думаю, что эти подходы можно разделить на 3 основные категории:

  1. 💉 Добавление дополнительной информации: если мы предоставим дополнительную информацию на стороне ввода, например, историю диалогов (Serban et al., 2016), категории тем / людей / эмоций (Xing et al., 2017 ; Li et al., 2016 ; Zhou et al., 2018 ) или фрагменты знаний ( Dinan et al., 2019 ), то будет менее вероятно, что конкретный ввод будет иметь несколько возможных ответов . Однако общий ответ, такой как Я не знаю, может быть полезен во многих случаях, поэтому с помощью этих подходов можно решить только проблему один ко многим. Обратной стороной является то, что для них требуются аннотированные наборы данных, которые не всегда доступны или могут быть меньше по размеру 💰.
  2. 🔨 Дополнение модели или процесса декодирования: мы можем внедрить модель для решения этих проблем, например, с помощью вариационных подходов (Serban et al., 2017). Однако эти модели обычно дают более нетрадиционные или нерелевантные ответы.
  3. 🔧 Изменение функции потери: что ж, это самая простая идея, потому что, если функция потерь плохая, почему бы просто не использовать другую. Проблема в том, что сложно придумать цель оптимизации, которая отражала бы разговорные цели, но люди пытались с некоторым успехом (Li et al., 2016; Li et al., 2017).

Что, если я скажу вам, что есть 4-я категория? Конечно, этого не может быть. Что ж, наша идея 💡 заключалась в том, что, поскольку существует несоответствие между данными и функцией потерь, мы должны изменить данные. На первый взгляд это не кажется хорошей идеей, поскольку данные взяты из реального мира 🌍. Однако, если мы хотим упростить задачу для модели, мы можем сделать данные более согласованными с функцией потерь, и по этому поводу проводятся минимальные исследования (Xu et al., 2018 ).

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

Как мы можем найти эти высказывания? Что ж, есть достаточно простой метод. Если мы посмотрим на условные вероятности пар высказываний, мы можем получить распределение ответов на заданный ввод (вероятности обозначены числами в строках на рисунке выше). Если это распределение равномерное, это означает, что все ответы различны, и это именно то, что мы хотим найти ✔️. Мы можем зафиксировать это, измерив энтропию распределения. Помните, что энтропия распределения что-то говорит о неопределенности примеров. Итак, на приведенном выше рисунке два приведенных выше примера имеют высокую энтропию ☝️, а два нижних - нулевую энтропию 👇. До сих пор я говорил только о стороне ввода, потому что ее легче понять, но мы можем сделать то же самое для целевой стороны. На целевой стороне распределение основано на входных высказываниях, которые сопряжены с целью.

Итак, вот шаги:

  1. Постройте распределение для каждого высказывания на основе его пар.
  2. Рассчитайте энтропию высказывания по этому распределению.
  3. Отфильтруйте пары высказываний, в которых одно из высказываний имеет высокую энтропию.

Следующая демонстрация взята из записной книжки jupyter, содержащей весь код, где вы можете быстро его опробовать.

💻 Давайте сделаем это с помощью простой демонстрации

0. Импорт

Для запуска этого кода в вашем каталоге должны быть файлы «sources.txt» и «targets.txt».

1. Соберите дистрибутивы

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

2. Вычислить энтропию.

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

3. Сохраните отфильтрованные данные.

Менее чем за 4️⃣0️⃣ строк кода мы отфильтровали наш набор данных и реализовали основную идею документа ACL.

📊 Визуализация

Поскольку мы уже вычислили всю эту информацию о наших данных, почему бы не сделать несколько красивых визуализаций?
Я опущу для них код, но вы можете найти все в блокноте jupyter. Я использовал набор данных DailyDialog.

Источники и цели наивысшей энтропии

Это верхний 🔟 исходный и целевой высказывания. Это именно то, что мы хотели, очень открытые предложения с низким содержанием информации / с высокой энтропией (а иногда и только слова). Почему исходная и целевая стороны так похожи? При моделировании однооборотного диалога высказывание может быть примером с обеих сторон (если это не первое или последнее высказывание диалога). Таким образом, существует существенное перекрытие между исходным и целевым высказываниями.

Распределение энтропии

Это распределение энтропии по высказываниям; опять же, исходная и целевая стороны очень похожи (левый и правый графики). Я исключил высказывания с нулевой энтропией, потому что тогда мы бы ничего не увидели (а таких высказываний 70000). Тем не менее, есть большой скачок энтропии в 1, потому что есть много высказываний с двумя разными парами. В остальном график выглядит довольно нормально, он экспоненциально убывает, поэтому данные имеют высокий энтропийный хвост, который мы можем удалить.

Энтропия и частота

Синие точки - это частота и энтропия всех высказываний, а красная кривая - средняя энтропия среди высказываний с той же частотой. Я немного увеличил масштаб и исключил некоторые выбросы. Существует некоторая корреляция между энтропией и частотой, но мы изучили это подробнее и обнаружили, что: 1️. Энтропия предлагает более точную меру для фильтрации. 2. Самые частые высказывания не всегда являются теми, которые мы хотим удалить.

Энтропия и длина

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

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

3D

🔥 Результаты

Итак, бумага - это нечто большее, чем эта простая идея, но, как ни странно, она дает лучшие результаты 💯, и вы можете найти другие варианты в бумаге или плакате.

Оценивать модели диалога в открытой области сложно, и я мог бы придумать десятки статей, в которых говорится об этом (Liu et al., 2016). Проблема в том, что почти невозможно построить легко вычисляемую метрику, которая показывает, является ли ответ хорошим или нет. Мы, люди, легко можем это сделать, но автоматизация немедленно решит всю область моделирования диалогов, так что это своего рода парадокс 💥. Тем не менее, за прошедшие годы в исследовательских работах появилось несколько показателей для количественной оценки различных аспектов качества ответа. Большинство из них плохо коррелируют с человеческим суждением (Liu et al., 2016), но у нас нет ничего лучше 😢. Проблема с такими метриками, как BLEU, аналогична кросс-энтропийной потере. Мы не можем сказать, что ответ адекватен только тогда, когда он похож на цель в данных, поскольку существует много потенциально хороших ответов. И если мы попытаемся просмотреть все ответы в данных, то столкнемся с проблемой многие к одному. Поскольку среди них обязательно должен быть хотя бы один Я не знаю, модель, которая выводит это все время, будет иметь высокие показатели, поскольку Играет безопасно.

В любом случае, вот несколько тщательно отобранных показателей из литературы. Кстати, все эти метрики реализованы в этом репо. Вы можете легко вычислить все показатели, предоставив файл с одним ответом на строку или каталог, полный файлов ответов одновременно. Кроме того, метрики сохраняются в файл (вместе со стандартным отклонением и доверительным интервалом для каждой метрики). Цель этого репо - стать полезным инструментом 🔧 для сообщества для оценки моделей диалогов, поэтому не стесняйтесь вносить свой вклад и добавлять новые показатели ❤️

  • 1️⃣ Длина ответа: количество слов в ответе.
  • 2️⃣ Энтропия на слово: вероятности слов вычисляются на основе частот, наблюдаемых в данных обучения. Также вычисляется энтропия на уровне биграмм.
  • 3️⃣ Энтропия высказывания: произведение энтропии на слово и длины ответа. Также вычисляется на уровне биграмм.
  • 4️⃣ Дивергенция KL: измеряет, насколько хорошо распределение слов в модельных ответах приближается к основному истинному распределению. Также вычисляется на уровне биграмм (с распределениями биграмм).
  • 5️⃣ Встраивание: измеряются среднее, экстремальное и жадное. средний измеряет косинусное сходство между средними значениями векторов слов ответа и целевых высказываний. extrema создает представление, беря наибольшее абсолютное значение для каждого измерения среди векторов слов в ответе и целевых высказываниях, и измеряет косинусное сходство между ними. жадный сопоставляет каждый токен ответа с целевым токеном (и наоборот) на основе косинусного сходства между их вложениями и усредняет общий балл по всем словам.
  • 6️⃣ Согласованность: косинусное сходство представлений ввода и ответа (построенное с помощью метода встраивания среднего слова).
  • 7️⃣ Различный: Различный-1 и Различный-2 измеряют отношение уникальных униграмм / биграмм к общему количеству униграмм / биграмм в наборе ответов.
  • 8️⃣ BLEU: измеряет n-граммовое перекрытие между ответом и целью (n = [1,2,3,4]).

В следующих результатах 👇 мы обучили модель Transformer с нуля для каждого отдельного отфильтрованного набора данных. Мы оценили минимальную потерю валидации на тестовой выборке.

Первая строка - это трансформатор, обученный на нефильтрованных данных (наша базовая линия). Идентификатор означает наш метод фильтрации, тогда как RT - это случайно выбранные ответы из обучающих данных, а GT - это наземные истинные ответы. B, T, S (не kpop band) означают разные способы установки порога. При фильтрации пары высказываний мы можем фильтровать только на основе энтропии С или только на основе энтропии T аргумента, или глядя на B другие энтропии. . 17 показателей - это то, что я описал ранее в том же порядке: длина отклика, энтропия униграмм и биграмм, энтропия высказываний в униграммах и биграммах, расхождение KL в униграммах и биграммах, среднее значение встраивания, экстремумы и жадность, когерентность, различающиеся-1 и отдельные. -2, и, наконец, BLEU-1, BLEU-2, BLEU-3 и BLEU-4.

Полужирным шрифтом выделены лучшие результаты, наш метод улучшение по сравнению с базовым уровнем по большинству показателей, а фильтрация, основанная только на целевой энтропии, является наилучшей, поэтому удаление целей с высокой энтропией . Это хорошо, потому что это устраняет проблему многие-к-одному. Таким образом, этот метод можно комбинировать с другими, которые решают проблему один ко многим, например, с добавлением истории диалогов. Интересно взглянуть на строку RT, потому что для показателей, которые учитывают только ответ, RT близок по характеристикам к реальной действительности. Но по крайней мере по встраиванию и BLEU они хуже, поэтому эти метрики не совсем бесполезны. Но, опять же, очень важно смотреть на показатели вместе, потому что по отдельности случайные ответы для показателей энтропии являются лучшими 😅

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

Так почему это?

Что ж, поскольку у нас есть довольно большой набор данных, даже если мы удалим какую-то форму высказывания, в которой может остаться другое, например, «да» без знака препинания. Таким образом, модель все еще видит примеры этих входов 👀 и может научиться реагировать на них. Кроме того, он видит сами слова в разных контекстах; таким образом, он может кое-что узнать об их значении 🔤.

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

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

Многие вещи не были освещены из бумаги, если вам интересно:

  • ✨ Кластеризация высказываний и фильтрация по кластерам
  • 🔀 Интересная разница между поведением функции потерь и автоматических показателей во время обучения.
  • 🚧 Предварительные эксперименты с 2️⃣ другими наборами данных диалогов
  • 📚 Может быть, больше информации и подробностей / объяснений?

Так какой вердикт? Вердикт - это название 🎉.
Прочитал тонну публикаций, написал две статьи (это и это), постепенно осознавая тщетность всего 💫.

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

(Я все еще люблю моделирование диалогов ❤)

Мой твиттер