Реальные данные беспорядочные. При исследовании, преобразовании, визуализации или моделировании выбросы часто вызывают головную боль. Один из наиболее распространенных способов справиться с выбросами - это обрезать значения (также известные как «ограничение» или «обрезка») в определенном диапазоне. Например, усечение значений цен в диапазоне от 0 до 1000 долларов означает, что любая отрицательная цена заменяется на 0 долларов, а слишком большие цены устанавливаются на 1000 долларов. (Альтернативные подходы включают полное отбрасывание записи, применение преобразования или биннирование.) Традиционное отсечение - это нормально, но имеет тенденцию вызывать всплески на концах диапазона отсечения, поскольку все значения за пределами диапазона устанавливаются на значение конечной точки. В рамках некоторой работы по визуализации авиабилетов, о которой я расскажу в будущей статье, я изучил идею «мягкого отсечения», чтобы избежать визуальных артефактов, которые создают эти всплески, и хотел поделиться некоторыми выводами, которые я нашел в процессе.

Для мотивации мы рассмотрим небольшую выборку данных о ценах на авиабилеты Hopper, которые использовались для создания изображения выше. Полная визуализация отображает точку для каждой из ~ 50 миллиардов ценовых котировок, которые Хоппер собирает в течение одного дня, тогда как это изображение основано только на 1% наших ценовых котировок для одного маршрута: около миллиона цен для Нью-Йорка- Лондон туда и обратно.

Наша первая задача - как представить цены. Глядя на гистограмму необработанных данных о ценах (внизу слева), мы видим, что необработанное распределение сильно искажено (внизу слева), в пределах от 301 до 58 121 доллара. Хотя преобразование журнала помогает (внизу справа), оно не решает проблему.

В визуализации (вверху) мы фактически наносим точку для каждой ценовой котировки с координатой, определяемой особенностями соответствующей поездки, так что несколько точек часто перекрываются в одном пикселе. Мы думаем о каждой точке как об источнике света, цвет которого зависит от цены, и каждый пиксель получает цвет, соответствующий средневзвешенному значению сгруппированных цен. Группировка дает гистограмму взвешенных цен журнала (внизу слева), которая все еще сильно искажена: фактически, перекос ухудшается, потому что выбросы цен с меньшей вероятностью будут сгруппированы, чем «обычные». Один из вариантов - применить традиционное отсечение, показанное (ниже в центре) для диапазона [6, 8], но это создает резкие выбросы в конечных точках. Применяя вместо этого мягкое отсечение (внизу справа), мы значительно уменьшаем эти артефакты.

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

Так что же это за магия мягкого отсечения? Математически мы можем представить себе традиционное «жесткое» отсечение между a и b как функцию f (x) который заменяет значения x вне диапазона [a, b] на соответствующую конечную точку (внизу слева, оранжевый). Чтобы сделать отсечение «мягким», мы просто сглаживаем углы этой функции (внизу слева, зеленые). Это «сжимает» все значения за пределами диапазона отсечения внутрь, а также слегка сжимает внутренние значения ближе к концам. Какой в ​​этом смысл, спросите вы? Как и жесткое отсечение, мы ограничиваем диапазон данных, чтобы избежать проблем с выбросами, но мы также сохраняем наш исходный порядок данных (удобно для моделирования) и уменьшаем эти характерные всплески на концах интервала (удобно для визуализации). Использование плавной (дифференцируемой) функции также упрощает оптимизацию самих параметров отсечения.

Функция мягкого отсечения на [a, b] должна быть гладкой сигмовидной кривой с f (x)a для x a, f (x)b для bx , и уклон около единицы в пределах [a, b]. Канонический пример - f (x) = tanh x, который фиксируется до [-1, 1] и представляет собой простое преобразование логистической функции, обычно используемой как активация нейронной сети. функция. Мы можем изменить tanh, чтобы обрезать до [a, b], изменив масштаб x до соответствующего диапазона и y, чтобы сохранить единичный наклон, давая

Это замечательно, но было бы неплохо контролировать резкость углов. Это непросто с tanh x - предложения приветствуются! - но мы можем использовать связанную функцию, также вдохновленную искусственными нейронными сетями. Нейронные сети старой школы иногда использовали функцию активации, называемую выпрямителем (вверху по центру, оранжевый), которая представляет собой одностороннее отсечение на [0 , ∞), а в настоящее время используют плавное приближение, называемое soft plus , log (1 + eˣ), который легко (и бесконечно) дифференцируем для обучения с обратным распространением (вверху в центре, зеленый). При линейном изменении масштаба мы получаем функцию f (x) = x - c ⁻¹ log (1 + exp (c (xb))), которая сжимает клипы ниже b, с большей c заострением углов. Точно так же мы можем преобразовать функцию мягкий минус, чтобы обрезать над a. Сочетание этого дает гибкую функцию мягкого отсечения:

Мы просто устанавливаем [a, b] на желаемый диапазон обрезки и контролируем резкость углов с помощью c (вверху справа). Для одностороннего клипа мы просто отбрасываем соответствующий термин (действительно, отбрасывая оба, мы возвращаемся к функции идентичности f (x) = x). Nb . пожалуйста не кодируйте функцию таким образом - это не численно стабильно - вместо этого ознакомьтесь с сутью.

Другой компонент нашей визуализации, помимо выбора цветов, - это установка уровней интенсивности пикселей. Мы думаем о каждой точке как о стандартном источнике света с интенсивностью, основанной на давности котировок, так что пиксели с большим количеством и недавними ценовыми котировками становятся ярче, а пиксели с меньшим количеством и более старыми котировками имеют тенденцию тускнеть. Построение гистограммы необработанных уровней интенсивности для непустых пикселей (внизу слева) снова показывает огромный перекос, при этом некоторые пиксели перенасыщены до 80 раз!

Простое изменение масштаба необработанного распределения до [0, 1] приводит к почти черному изображению (внизу слева), в то время как традиционное обрезание до [0, 1] генерирует огромный всплеск неотличимых белых пикселей (над центром), создавая перенасыщенное изображение (ниже центра), при котором теряется информация об относительной интенсивности для ярких пикселей. Мягкое отсечение (вверху справа) сжимает выбросы и ослабляет некоторые из почти белых пикселей, создавая слегка нелинейную шкалу интенсивности, но сохраняя гораздо больше визуальной информации (внизу справа). Комбинация мягко обрезанных данных интенсивности с мягко обрезанными цветовыми данными создает визуально приятное изображение, показанное в начале этой статьи.

Вот и все: мягкая обрезка, это весело, попробуйте! Сообщите мне, какие приложения вы придумываете.

Бонусный контент

Если вы зашли так далеко и все еще читаете, я впечатлен. Вот несколько связанных идей для изучения.

Еще машинки для стрижки? Есть ли другие интересные семейства функций мягкого отсечения? Численно стабильный способ реализации мягкого плюса в вычислительном отношении (внизу слева, зеленый) - это добавить функцию «сглаживания углов» к исходному выпрямителю (внизу слева, оранжевый), то есть переписать журнал (1 + eˣ ) как max (x, 0) + log (1 + exp (- | x |)) , где второй член сглаживает угол (внизу слева, красный). Можем ли мы создать другие функции сглаживания углов s (x)? Нам может потребоваться симметрия (которой, вероятно, не хватает tanh x!), Чтобы s (x) = s (- x), и нам также потребуется s (x) → 0 как | x | → ∞. Для симметрии мы также должны иметь s ' (0⁺) = - s' (0⁻) = ½, чтобы смешать увеличивайте уклон с 0 до 1 при x = 0.

Одна простая идея, удовлетворяющая этим условиям, - экспоненциальный спад: s (x) = exp (- c | x |) / 2 c. Это дает немного более «мягкий» угол, чем мягкий плюс / минус обрезки (ниже центра), но визуально похож (внизу справа). Его нечетные производные, кроме первой, также прерываются при 0, но, может быть, это не имеет большого значения? Есть ли другие бесконечно дифференцируемые решения?

Интересный факт: производной функции soft plus, которую мы использовали для создания нашей гибкой функции soft clipping, является логистическая функция, которая сама по себе является простым преобразованием нашего канонического tanh x функция мягкого отсечения:

Мягкие прямоугольные импульсы: любая функция, которая ограничивает [0, 1], дает приблизительную кумулятивную функцию распределения для единичного равномерного распределения, поэтому ее производная аппроксимирует плотность вероятности для простого прямоугольного импульса (который становится точно для функции жесткого отсечения):

Хотите помочь нам решить сложные проблемы? Хоппер нанимает! Ознакомьтесь с нашими списками вакансий здесь: www.hopper.com/careers