Когда модель обязана выбрать ответ из готового списка, она не может сказать, что не знает. Так обычно объясняют, почему жёсткий формат ответа заставляет модель выдумывать. Я с этим соглашался, особо не задумываясь. Обычное лекарство это ещё один вариант, “none of the above”. Для меня вопрос на этом был закрыт. Сколько честности этот вариант возвращает, я ни разу не мерил, поэтому померил.
Стенд
Для честного сравнения нужна модель, которая умеет отказываться в своём собственном формате. Подходит UnifiedQA от AI2: это T5, обученная на многих наборах вопросов и ответов в разных форматах, среди них SQuAD 2.0. В SQuAD 2.0 есть вопросы, на которые абзац не отвечает. На них модель обучена писать no answer>. Скобка стоит только с одной стороны, потому что в словаре T5 нет <.
Я взял UnifiedQA T5 large, около 740 млн параметров. Из валидационной части (dev) SQuAD 2.0 выбрал 300 вопросов с ответом и 300 без ответа, с seed 2022. Каждый вопрос уходит в модель 4 раза с одним и тем же абзацем:
- свободно: вопрос и абзац, формат, в котором модель видела SQuAD при обучении;
- список из 3 вариантов без выхода, то есть без варианта для отказа;
- те же 3 варианта плюс “(d) none of the above”;
- те же 3 варианта плюс “(d) no answer>”, тот же текст, который модель пишет, когда отказывается.
Варианты взяты из разметки SQuAD. У вопроса с ответом это правильный ответ и 2 ответа на другие вопросы к тому же абзацу. У вопроса без ответа SQuAD 2.0 хранит правдоподобный ответ (plausible answer), кусок абзаца, похожий на ответ. Он встаёт на место правильного, так что в каждом списке к вопросу без ответа лежит приманка.
Всё считалось на 4 ядрах процессора виртуальной машины: Python 3.9, torch 1.11, transformers 4.18, жадное декодирование, около 3 секунд на вопрос. Веса занимают 3 ГБ во float32, а transformers 4.18 держит в памяти весь файл рядом с моделью. Вместе это больше, чем позволяет мой лимит в 5 ГиБ. Поэтому я разрезал веса на 16 частей и собираю модель из конфига.
До прогона я записал, чего жду. Свободный формат отказывается больше чем на половине вопросов без ответа. Список с “none of the above” даст меньше половины отказов свободного формата.
Без выхода
Список без выхода сделал то, что я ждал. На 300 вопросах без ответа модель 177 раз выбрала приманку и 112 раз что-то другое. 11 раз она написала no answer>, хотя такого варианта в списке не было. Эти 11 мне нравятся больше всего. Модель сломала мой формат, чтобы сказать правду.
С выходом
Свободный формат отказался 133 раза из 300. Это 44%. Моё первое ожидание уже не сбылось. Даже в формате, на котором её учили, модель выдумывает ответ больше чем на половине вопросов, где должна отказаться. 101 такой ответ близок к приманке.
Список с “none of the above” отказался 134 раза, на один больше свободного формата. Именно этот исход я записал заранее как тот, что опровергнет мою идею. Значит, с выходом список отказывается так же часто, как свободный текст. 177 приманок дал список без выхода.
С “no answer>” в варианте (d) модель отказалась 152 раза. Это больше, чем с “none of the above”. На парных ответах разница держится (McNemar, p = 0,013). Против свободного формата это 152 к 133 при p = 0,059. Результатом я бы это не назвал.
Что прячут итоги
Потом я сравнил ответы вопрос за вопросом и равные итоги рассыпались. Свободный формат и список с “none of the above” оба отказываются на 82 вопросах и оба выдумывают ответ на 115. На 51 вопросе отказывается только свободный формат, на 52 только список. Выходит, 103 вопроса из 300 переходят из отказа в выдуманный ответ или обратно. Итоги равны только потому, что 51 уходит в одну сторону, а 52 в другую.
Вот 2 примера из прогона. “In what country does the Danube empty?” Абзац про Рейн, который впадает в Северное море в Нидерландах. Дунай там упомянут только как более длинная река. Свободный формат отвечает no answer>, все 3 списка отвечают “the netherlands”. “When did the Archduke Sigismund of Austria die?” В абзаце сказано, что он продал Эльзас Бургундии в 1469 году. Свободный формат и список без выхода отвечают “1469”, оба списка с выходом отказываются.
Я не был уверен, говорит ли число 103 что-то о формате или только показывает, как жадное декодирование скачет при любой правке входа. Поэтому я сравнил 2 списка с выходом, которые отличаются одной фразой в варианте (d). Они расходятся на 48 вопросах. Это не чистая мера шума, потому что эти 2 списка ещё и отказываются с разной частотой. А переход от свободного текста к списку это правка крупнее одной фразы. И всё же 103 против 48 говорит мне, что формат двигает больше, чем шум.
Чего стоит выход
На 300 вопросах с ответом свободный формат прав 281 раз, список без выхода 282. С выходом модель права 273 раза при “none of the above” и 275 при “no answer>”. С “none of the above” модель отказалась на 13 вопросах, на которые свободный формат ответил. Обратное случилось один раз.
По всем 600 вопросам 23 ответа в списке без выхода не совпали ни с одним вариантом, а в каждом списке с выходом таких по 15. В основном это правильный вариант или приманка без куска. Либо их обрезал мой лимит в 24 выходных токена, либо в словаре не нашлось символа вроде ł. Я считаю их ответами. На отказы они не влияют и немного занижают число верных в каждом списке.
Что я из этого вынес
Если считать только итоги, “none of the above” вернул здесь всю честность. Но доля отказов, измеренная в одном формате, мало что говорит мне о другом. Если я проверю выборку ответов в одном формате, а в работу выпущу другой, треть вопросов без ответа может повести себя иначе. Моя проверка этого не увидит.
Здесь “no answer>” сработал лучше, чем “none of the above”. Почему, я могу только гадать. Он похож на собственный отказ модели, но модель выучила его из <no answer>, а эта строка режется на токены иначе, чем мой вариант. Какую формулировку брать, я бы проверял на своих данных.
Чего я не проверял
- Одна модель. UnifiedQA училась отказываться на SQuAD 2.0, так что ей есть чем отказаться. Модель без такого обучения, например GPT-3, я не вызывал.
- Один порядок вариантов на вопрос. Перемешать варианты это тоже правка входа. Сколько вопросов она сдвинет, я не знаю.
- В каждом списке к вопросу без ответа была приманка. Без правдоподобного ответа среди вариантов отказаться может быть легче.
- Жадное декодирование и один полный прогон. Повтор 8 вопросов во всех 4 форматах дал те же 32 ответа, так что неопределённость сидит в выборе 300 вопросов.
- Лимит входа в 512 токенов. От 6 до 12 вопросов в каждом формате получили абзац с обрезанным концом.
- Вопросы, которые разметчики писали так, чтобы казалось, что ответ в абзаце есть. Живые пользователи спрашивают иначе.