Вне догадок Применение байесовой статистики для эффективного выбора заголовков статей.

Используем байесовскую статистику для создания привлекательных заголовков статей

Введение

Наличие хорошего заголовка критично для успеха статьи. Люди тратят всего одну секунду (если мы верим книге Райана Холидея “Поверь мне, я врал”) на решение, стоит ли нажать на заголовок, чтобы открыть всю статью. СМИ одержимы оптимизацией процента кликов (CTR), который представляет собой число кликов на заголовок, деленное на число показов заголовка. Заголовок, который притягивает внимание и звучит как призыв к действию, повышает CTR. СМИ, вероятно, выберут заголовок с более высоким CTR, так как это принесет больше дохода.

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

Как мне выбрать правильный заголовок для моей следующей статьи? Конечно, мне нужен набор вариантов для выбора. Надеюсь, я могу сгенерировать их самостоятельно или спросить ChatGPT. Но что я делаю дальше? Как дата-сайентист, я предлагаю провести тестирование A/B/N, чтобы понять, какой вариант является лучшим на основе данных. Но есть проблема. Во-первых, мне нужно принять решение быстро, потому что контент устаревает быстро. Во-вторых, может не быть достаточно наблюдений, чтобы определить статистически значимую разницу в CTR, так как эти значения относительно низки. Поэтому есть и другие варианты, кроме ожидания пары недель, чтобы принять решение.

К счастью, есть решение! Я могу использовать алгоритм машинного обучения “многорукий бандит”, который адаптируется к данным о поведении зрителей, которые мы наблюдаем. Чем больше людей нажимают на определенный вариант, тем больше трафика мы можем направить на этот вариант. В этой статье я кратко объясню, что такое “байесовский многорукий бандит” и покажу, как он работает на практике с использованием Python.

Что такое байесовский многорукий бандит?

Многорукие бандиты – это алгоритмы машинного обучения. Байесовский тип использует темплетон выборки, чтобы выбрать опцию на основе наших предварительных представлений о распределениях вероятностей CTR, которые обновляются в соответствии с новыми данными. Все эти слова, связанные с вероятностью и математической статистикой, могут звучать сложно. Позвольте мне объяснить эту концепцию, используя как можно меньше формул.

Предположим, что есть только два заголовка для выбора. У нас нет представления о их CTR. Но мы хотим выбрать заголовок с наибольшей эффективностью. У нас есть несколько вариантов. Первый заключается в выборе заголовка, в который мы больше верим. Таким образом работали долгие годы в индустрии. Второй вариант распределяет 50% входящего трафика на первый заголовок и 50% на второй. Это стало возможным с появлением цифровых медиа, где вы можете решить, какой текст показывать именно тогда, когда зритель запрашивает список статей для чтения. С помощью этого подхода вы можете быть уверены, что 50% трафика было направлено на наиболее эффективный вариант. Есть ли это ограничение? Конечно нет!

Некоторые люди прочитают статью через пару минут после публикации. Некоторые сделают это через пару часов или дней. Это значит, что мы можем наблюдать, как “ранние” читатели отреагировали на разные заголовки и сдвинуть распределение трафика с 50/50, направив немного больше на наиболее эффективный вариант. Со временем мы можем снова рассчитать CTR и корректировать разделение. В конечном итоге мы хотим корректировать распределение трафика после каждого нового нажатия зрителя на заголовок или его пропуска. Нам нужна система адаптации распределения трафика научным и автоматическим способом.

Вот тут на помощь приходят теорема Байеса, бета-распределение и темплетон выборки.

Давайте предположим, что CTR статьи – случайная величина “theta”. По определению, она находится где-то между 0 и 1. Если у нас нет предварительных представлений, она может быть любым числом между 0 и 1 с равной вероятностью. После наблюдения некоторых данных “x”, мы можем скорректировать наши представления и получить новое распределение для “theta”, которое будет смещено ближе к 0 или 1 с помощью теоремы Байеса.

Число людей, которые нажимают на заголовок, можно моделировать как Binomial distribution , где «n» – это количество посетителей, которые видят заголовок, а «p» – это CTR заголовка. Вот наш шанс! Если мы моделируем априорную вероятность (наши убеждения о распределении CTR) как Бета-распределение и принимаем биномиальную вероятность, то апостериорное распределение также будет Бета-распределением с разными параметрами! В таких случаях Бета-распределение называется сопряженным априорным к вероятности.

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

Бета-распределение ограничено значениями от 0 до 1, что делает его идеальным кандидатом для моделирования распределения CTR. Мы можем начать с “a = 1” и “b = 1” в качестве параметров Бета-распределения, моделирующих CTR. В этом случае у нас не будет убеждений о распределении, что делает любую CTR одинаково вероятной. Затем мы можем добавлять наблюдаемые данные. Как видите, каждый «успех» или «щелчок» увеличивает «а» на 1. Каждый «неудачный» или «пропуск» увеличивает «b» на 1. Это искажает распределение CTR, но не меняет семейство распределения. Это все равно бета-распределение!

Мы предполагаем, что CTR можно моделировать как Бета-распределение. Тогда у нас есть два варианта заголовка и два распределения. Как выбрать, что показать зрителю? Вот почему алгоритм называется «многорукий бандит». Когда зритель запрашивает заголовок, вы «дергаете оба рычага» и выбираете CTRы. После этого вы сравниваете значения и показываете заголовок с наивысшим выбранным CTR. Затем зритель либо щелкает, либо пропускает. Если заголовок был нажат, вы бы увеличили параметр Бета-распределения этого варианта «a», представляющий «успехи». В противном случае вы увеличиваете параметр Бета-распределения этого варианта «b», что означает «неудачи». Это искажает распределение, и для следующего зрителя появится разная вероятность выбора этого варианта (или «руки») по сравнению с другими вариантами.

После нескольких итераций у алгоритма будет оценка распределений CTR. Отбор из этого распределения в основном запустит в работу руку с наибольшим CTR, но все же позволит новым пользователям исследовать другие варианты и корректировать распределение.

Ну вот, это все работает в теории. Действительно ли это лучше 50/50 деления, о котором мы говорили раньше?

Создание симуляции с использованием Python

Все код для создания симуляции и построения графиков можно найти в моем GitHub Repo.

Как уже упоминалось ранее, у нас всего два заголовка на выбор. У нас нет предварительной информации о CTR этих заголовков. Поэтому мы начинаем с a = 1 и b = 1 для обоих Бета-распределений. Я смоделирую простой входящий трафик, предполагая очередь зрителей. Мы точно знаем, нажимал ли предыдущий зритель или пропускал, прежде чем показать заголовок новому зрителю. Чтобы смоделировать действия «нажать» и «пропустить», мне нужно определить некоторые реальные CTRs. Пусть они будут 5% и 7%. Важно отметить, что алгоритм не знает ничего об этих значениях. Они мне нужны, чтобы смоделировать нажатие; в реальном мире у вас были бы реальные клики. Я переверну чрезмерно смещенную монету для каждого заголовка, которая выпадает головами с вероятностью 5% или 7%. Если выпадает голова, то происходит нажатие.

Затем алгоритм прост:

  1. На основе наблюдаемых данных получаем бета-распределение для каждого заголовка
  2. Выбираем значения CTR из обоих распределений
  3. Определяем, который CTR выше и подбрасываем соответствующую монетку
  4. Понимаем, было ли нажатие или нет
  5. Увеличиваем параметр “a” на 1, если было нажатие; увеличиваем параметр “b” на 1, если было пропущено
  6. Повторяем до тех пор, пока в очереди есть пользователи.

Для оценки качества алгоритма мы также сохраняем значение, представляющее долю зрителей, которые видят второй вариант, так как у него выше “реальный” CTR. Давайте использовать стратегию 50/50 разделения в качестве контрольной точки базового качества.

Код Автором

После 1000 пользователей в очереди наш “многорукий бандит” уже хорошо понимает, какие CTR.

  

А вот график, который показывает, что такая стратегия дает лучшие результаты. После 100 зрителей “многорукий бандит” превзошел 50% долю зрителей, увидевших второй вариант. Поскольку все больше и больше доказательств поддерживали второй заголовок, алгоритм распределял все больше трафика на второй заголовок. Почти 80% всех зрителей видели наиболее эффективный вариант! В то время как при 50/50 разделении только 50% людей видели наиболее эффективный вариант.

  

Байесовский многорукий бандит позволил 25% зрителей увидеть более эффективный вариант! С поступлением новых данных разница между этими двумя стратегиями будет только увеличиваться.

 

Заключение

 

Конечно, “многорукие бандиты” несовершенны. Временная выборка и представление вариантов в реальном времени требуют затрат. Желательно иметь хорошую инфраструктуру для реализации всего этого с желаемой задержкой. Кроме того, вы можете не хотеть смутить своих зрителей, меняя заголовки. Если у вас достаточно трафика для проведения быстрого A/B-тестирования, сделайте это! Затем один раз вручную измените заголовок. Однако этот алгоритм может быть использован во многих других областях помимо медиа.

Я надеюсь, теперь вы понимаете, что такое “многорукий бандит” и как его можно использовать для выбора между двумя вариантами, адаптированными к новым данным. Я специально не сосредотачивался на математике и формулах, так как учебники лучше объяснят это. Я намерен представить новую технологию и вызвать интерес к ней!

Если у вас есть какие-либо вопросы, не стесняйтесь обращаться на LinkedIn.

Блокнот со всем кодом можно найти в моем репозитории на GitHub.  

[Игорь Хомянин](https://www.linkedin.com/in/igorkhomyanin/) — специалист по обработке данных (Data Scientist) в компании Salmon, ранее занимал должности сфере данных в Yandex и McKinsey. Я специализируюсь на извлечении ценности из данных с использованием статистики и визуализации данных.