ИСКУССТВЕННЫЙ ИНТЕЛЛЕКТ

Как спам-фильтр ловит письма и почему он иногда промахивается

Девяносто из ста писем — мусор, но в почте их почти не видно. Невидимый сортировщик читает каждое письмо и за миллисекунды решает его судьбу. Разберём, как он научился отличать спам и почему этой войне не видно конца.

Спам-фильтр не знает, что такое спам, — он лишь считает вероятность того, что письмо окажется мусором.
Фильтр не понимает писем. Он взвешивает улики и ставит на более вероятный исход.

Задача: разложить всё на две стопки

По сути фильтр решает задачу классификации: для каждого письма ответить «спам» или «не спам». Объёмы огромны, решение нужно мгновенно, а ошибка дорога в обе стороны. Поэтому почта давно отдала эту работу машинному обучению.

Учиться на примерах, а не на правилах

Жёсткие правила («есть слово выигрыш — в спам») быстро ломаются: спамеры обходят их за день, а заодно туда улетают честные письма про лотерею от друзей. Поэтому фильтр учат иначе — показывают миллионы писем, размеченных как «спам» и «не спам». Алгоритм сам подмечает, какие признаки чаще встречаются в мусоре. Огромную помощь оказывают сами люди: каждый клик «Это спам» или «Не спам» — свежий размеченный пример, на котором фильтр доучивается прямо в бою.

Байес: арифметика подозрительности

Классика жанра — наивный байесовский фильтр. Идея почти бытовая. Из обучающих писем фильтр запоминает, как часто каждое слово встречается в спаме, а как часто — в нормальной почте. Слово «виагра» почти всегда в спаме, «отчёт» — почти всегда в рабочей переписке.

Приходит новое письмо. Фильтр смотрит на все слова и спрашивает: что вероятнее — что такой набор слов принадлежит спаму или нормальному письму? Формально он опирается на теорему Байеса:

$$ P(\text{спам} \mid \text{слова}) \propto P(\text{слова} \mid \text{спам}) \cdot P(\text{спам}) $$

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

На что ещё смотрит фильтр

Современный фильтр взвешивает не только слова:

  • Репутация отправителя. С этого адреса и сервера уже сыпался спам?
  • Ссылки. Куда ведут? Адрес в тексте и реальный адрес ссылки не совпадают?
  • Массовость. Одинаковое письмо разом улетело миллионам — верный признак рассылки.
  • Подделка трюков. «Vi@gr@», текст картинкой вместо букв, невидимый шрифт — попытки обмануть, которые сами себя выдают.
  • Жалобы людей. Многие уже нажали «Спам» на это письмо.

Почему промахи неизбежны

Спам-фильтр — вечная гонка вооружений. Фильтр учится на старом спаме, спамеры придумывают новый, фильтр догоняет — и так без конца. Отсюда два типа осечек. Ложноположительная: важное письмо улетело в спам — самая болезненная, можно пропустить нужное. Ложноотрицательная: мусор пролез во «Входящие» — досадно, но терпимо. Настройки нарочно смещают в сторону «лучше пропустить немного спама, чем потерять важное», поэтому абсолютной чистоты не бывает.

Итог

За тишиной в почте — постоянно доучивающийся классификатор, который не понимает смысла писем, а считает вероятности по тысячам признаков. Он не идеален и не может быть идеальным: на том конце живой и изобретательный противник. Но именно машинное обучение превратило потоп из мусора в редкие капли — и продолжает учиться с каждым твоим кликом «Это спам».

#классификация#машинное обучение#почта#спам-фильтр