Классификатор плох? Поиграйся с порогами. Пример с детектором от OpenAI

#ml #tips



Очень вроде простой совет, но может спасти немало мыслетоплива. В одном из проектов я начал довольно сильно париться, поскольку сроки уже поджимали, а ML-классификатор как-то так себе заходил. Так вот если проект позволяет пожертвовать полнотой ради повышения точности (на жаргоне – подрезать полноту), то почему бы не повысить порог классификации. Если предсказанная вероятность выше некоторого порога (например 0.8), то только тогда делаем прогноз. Чтоб подобрать порог, полезно строить PR-curve, как точность и полнота зависят от порога. Про проект еще расскажу #todo, он бодрый – определение научного вклада в достижение Sustainable Development Goals https://sdgs.un.org/goals. Но что касается ML-части решения, для классификатора статей я выставил порог в 0.95, то есть ML-модель срабатывает только тогда, когда прям очень уверена в прогнозе.



Проиллюстрирую мысль недавно выпущенным классификатором AI-генерированного текста от OpenAI https://openai.com/blog/new-ai-classifier-for-indicating-ai-written-text. Классификатор довольно дряной, ни в какое сравнение не идет с космическим уровнем chatGPT. Но я-то знаю, насколько это сложная задача – отличить человеческий текст от машинного. Делал COLING трек c этой задачей (подробности – тут https://yorko.github.io/2022/detecting-generated-content), победитель Domenic Rosati расчихвостил в пух и прах сореву, он сгенерировал похожий датасет и показал, что детекторы, обученные на данных соревнования, вообще не обобщаются на новые данные. Я уже по ходу соревнования сам к тому же пришел. Благо, Доменик не токсик, а наоборот, согласился помогать в организации подобного же соревнования для COLING 2023.



Так вот. Конечно, я захотел потестить классификатор OpenAI на данных своего соревнования. Взял из обучающей выборки по 30 примеров каждого класса и ручками повставлял в демку https://platform.openai.com/ai-text-classifier. После получаса умеренно интенсивных физиопроцедур получил разметку (кстати, если кто подскажет, как это демку забросать запросами, чтоб использовать как API – буду благодарен, на это моих знаний вебдева не хватает. Хотя догадываюсь, что это может делаеться через браузерную сессию, примерно как неофициальный chatGPT API https://github.com/transitive-bullshit/chatgpt-api).



И что получилось? Вроде довольно паршиво – см. картинку ниже. Формально по метрикам – 67% F1 да к тому же измеренное на 70% примеров, в 30% случаев классификатор сказал “не знаю” (”unclear if it is AI-generated”).



Но если присмотреться, то точность для класса “AI-generated” (на картинке – “fake”) – 91%. В 10 из 11 случаев, когда детектор сказал “possibly AI-generated” или “likely AI-generated”, он оказался прав. Что сделал OpenAI? Учитывая, что классификатор довольно плох, они повысили порог для класса “AI-generated”, то есть детектор говорит “possibly AI-generated” или “likely AI-generated” только когда соответствующая предсказанная вероятность превышает какой-то высокий порог (upd: надо лучше читать model card, в комментариях подсказывают, что порог для “likely AI-generated” – 0.98, "possibly" - от 0.9 до 0.98).



В итоге, OpenAI подрезал полноту, детектор найдет далеко не весь AI-генерированный контент, на зато (возможно) с неплохой точностью (говорю “возможно”, так как пой эксперимент всего на 60 примерах).



Предлагаю использовать этот трюк. И раньше времени не ругать детектор OpenAI. Хотя хочется. Я совсем не луддит и мне нравится chatGPT, но можно порассуждать, как OpenAI создал кучу проблем с AI-генерированными текстами, которым нельзя верить, а вдогонку выкатил детектор очень далекий от 100% точности с плашкой “It should not be used as a primary decision-making tool”.