🔴 Сложный ⏱️ 55 минут

t-SNE

📋 Содержание урока

t-SNE

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

t-SNE (t-distributed Stochastic Neighbor Embedding, «стохастическое вложение соседей с t-распределением») — один из самых узнаваемых инструментов современного машинного обучения именно потому, что он даёт немедленный, интуитивно понятный ответ на вопрос «что вообще происходит внутри модели». Открой почти любую статью о новой архитектуре для эмбеддингов слов, изображений или пользовательских профилей — и там почти наверняка найдётся картинка: разноцветные облака точек, где каждый цвет — свой класс, а сама модель «сама», без единой подписанной метки, аккуратно развела эти классы по разным частям плоскости. Такая картинка — не украшение статьи, а быстрая визуальная проверка: если модель выучила осмысленное представление данных, похожие объекты должны оказаться рядом и на этой двумерной проекции, а непохожие — врозь.

В прошлом уроке (323) ты разобрал PCA — метод, который ищет направления максимальной дисперсии данных и проецирует их на эти направления линейным преобразованием. PCA прекрасно справляется со сжатием и удалением шума, но у него есть системное ограничение: он видит только линейные зависимости и глобальную форму облака точек, а тонкую, изогнутую, локальную структуру данных — например, спиральное многообразие или несколько отдельных сгустков, вложенных друг в друга в исходном пространстве, — часто безнадёжно «расплющивает» в неразличимое пятно. t-SNE — принципиально другой инструмент: нелинейный метод, придуманный не для сжатия и не для подготовки признаков к дальнейшему обучению модели, а специально для визуализации, обычно в 2D или 3D, где вместо глобальной геометрии в центре внимания оказывается локальное соседство точек.

Сегодняшний урок разберёт, чем именно фокус на соседстве отличается от фокуса PCA на дисперсии, почему t-SNE описывает сходство точек не расстояниями, а вероятностями, откуда в названии взялась буква «t», что делает параметр perplexity и почему опытные специалисты по данным никогда не делают выводов о размере кластера или расстоянии между кластерами по одной-единственной картинке t-SNE.

История

Идею описывать сходство точек через вероятности, а не напрямую через расстояния, предложили Джеффри Хинтон (Geoffrey Hinton) и Сэм Ройс (Sam Roweis) в 2002 году в методе под названием SNE (Stochastic Neighbor Embedding, «стохастическое вложение соседей»). Идея была элегантной: для каждой точки в исходном многомерном пространстве строится распределение вероятностей — «насколько вероятно, что вот эта конкретная другая точка является соседом текущей» — а затем в низкоразмерном пространстве подбираются координаты так, чтобы аналогичное распределение вероятностей совпадало с исходным как можно точнее. У SNE, однако, было слабое место: он использовал гауссово распределение и в исходном, и в целевом низкоразмерном пространстве, и из-за этого страдал от так называемой «проблемы скученности» (crowding problem) — в низкой размерности умеренно удалённым друг от друга точкам физически не хватало места, и алгоритм был вынужден стягивать их ближе друг к другу, чем следовало бы, превращая разные кластеры в одну слипшуюся кляксу.

Решение предложили Лоренс ван дер Маатен (Laurens van der Maaten), тогда ещё аспирант, и тот же Джеффри Хинтон в статье 2008 года «Visualizing Data using t-SNE» — одной из самых цитируемых работ в истории машинного обучения. Ключевая модификация была на первый взгляд небольшой, но решала проблему скученности почти полностью: в низкоразмерном пространстве вместо гауссова распределения стало использоваться t-распределение Стьюдента с одной степенью свободы — распределение с заметно более «тяжёлыми хвостами», чем у гауссианы. Именно эта буква «t» и попала в название метода — t-SNE. Ван дер Маатен изначально тестировал алгоритм на классическом датасете MNIST (рукописные цифры 0–9, каждая — изображение 28×28 пикселей, то есть точка в 784-мерном пространстве) — и результат оказался поразительным: на плоской 2D-картинке десять цифр аккуратно разошлись по десяти хорошо различимым облакам, при том что ни один линейный метод вроде PCA не давал настолько чистого разделения.

С 2008 года t-SNE стал фактическим стандартом визуализации многомерных эмбеддингов практически во всех областях, где применяется машинное обучение: в обработке естественного языка — для картинок «облака слов со схожим смыслом рядом», в биоинформатике — для визуализации данных секвенирования отдельных клеток (single-cell RNA-seq, где счёт объектов идёт на десятки тысяч, а признаков — на тысячи генов), в компьютерном зрении — для проверки, действительно ли нейросеть выучила разделять классы изображений во внутреннем представлении. Ван дер Маатен продолжил развивать идею и позже, уже вместе с другими соавторами, участвовал в разработке более быстрых и масштабируемых версий алгоритма (Barnes-Hut t-SNE), а в 2018 году появился UMAP — метод, вдохновлённый той же идеей сохранения локального соседства, но опирающийся на другую математическую базу и постепенно ставший конкурентом t-SNE там, где важны скорость и масштабируемость на очень больших датасетах.

Локальное соседство против глобальной дисперсии: чем t-SNE отличается от PCA

Интуиция

Представь, что тебе нужно составить карту дружеских компаний в большом университете, где тысячи студентов. PCA в этой аналогии — человек, который встаёт на смотровую вышку и пытается одной прямой линией уловить самое заметное различие между всеми студентами сразу, скажем, «технари против гуманитариев» — это единственное глобальное направление, вдоль которого разброс мнений и интересов максимален. Такая линия действительно ухватывает что-то важное, но она безнадёжно грубая: два студента, входящие в одну и ту же дружескую компанию по интересу к настольным играм, могут оказаться на разных концах этой единственной оси просто потому, что один из них технарь, а другой гуманитарий, — хотя внутри своей маленькой компании они гораздо ближе друг к другу, чем к кому бы то ни было ещё.

t-SNE в этой же аналогии — человек, который спускается вниз и спрашивает у каждого студента: «а кто твои пять ближайших приятелей?» Он не пытается оценить глобальное расстояние между технарём с одного конца кампуса и гуманитарием с другого — вместо этого он тщательно восстанавливает локальную структуру: кто с кем реально проводит время рядом. Когда затем нужно расставить всех студентов на плоском листе бумаги, единственная цель — сохранить именно эти локальные компании нетронутыми, а то, окажется ли компания программистов слева или справа от компании поэтов на итоговом листе, и насколько далеко эти две компании будут друг от друга, — вопрос второстепенный, почти случайный.

Формальное определение

Различие в целевой функции. PCA ищет линейное преобразование, максимизирующее сохранённую дисперсию исходных данных, — его цель полностью описывается собственными векторами ковариационной матрицы (урок 323) и не зависит от локальной структуры соседства отдельных точек. t-SNE, напротив, строит нелинейное отображение $x_i \mapsto y_i$ из исходного пространства в низкоразмерное так, чтобы минимизировать расхождение между двумя распределениями вероятностей соседства — распределением $P$, вычисленным по исходным данным $x_i$, и распределением $Q$, вычисленным по координатам проекции $y_i$. Формально, t-SNE не гарантирует сохранение расстояний вообще — он гарантирует лишь, что точки, которые были близкими соседями в исходном пространстве, с высокой вероятностью останутся близкими соседями и в проекции; про далёкие пары точек метод не даёт никаких пропорциональных гарантий.

Разбор примеров

Пример 1 (спиральное многообразие, где PCA бессилен). Представь данные, лежащие на двумерной спирали, свёрнутой в трёхмерном пространстве, — как серпантин, скрученный в рулет. Точки, которые находятся рядом друг с другом вдоль спирали (например, соседние витки развёрнутого серпантина), в исходных трёхмерных координатах могут оказаться физически близко друг к другу просто потому, что рулет плотно скручен, — хотя вдоль самой поверхности спирали между ними может быть очень большое расстояние. PCA, ищущий направления максимальной дисперсии во всём трёхмерном объёме, спроецирует эту спираль на плоскость почти как тень от рулета — сплющит витки друг на друга, полностью смешав точки из разных, изначально далёких участков серпантина. t-SNE в этой ситуации строит распределение сходства не по прямому евклидову расстоянию во всём объёме, а фактически восстанавливает структуру локальных окрестностей вдоль поверхности спирали — и на итоговой 2D-карте разворачивает спираль в почти прямую линию, где порядок точек вдоль серпантина сохраняется.

Пример 2 (эмбеддинги изображений одежды). Пусть нейросеть для классификации товаров интернет-магазина построила 512-мерные эмбеддинги для десяти тысяч фотографий одежды: кроссовки, туфли, футболки, свитера, платья. PCA, применённый к этим эмбеддингам, найдёт направления максимальной дисперсии — например, «светлая одежда против тёмной» или «крупный объект в кадре против мелкого» — глобальные фотографические характеристики, которые слабо связаны с типом товара. t-SNE, восстанавливающий локальное соседство, с большой вероятностью покажет отдельные, хорошо разделённые облака: кроссовки рядом с кроссовками, потому что нейросеть выучила похожие эмбеддинги именно для похожих товаров, а не потому что у них похожая яркость фотографии. Это ровно то практическое применение, ради которого t-SNE и используется чаще всего в индустрии: не для «сжатия» данных, а для быстрой визуальной проверки, действительно ли обученная модель выучила семантически осмысленное представление.

Пример 3 (числовой пример на трёх кластерах). Возьмём игрушечный набор из девяти двумерных точек, образующих три плотных группы: группа A около $(0,0)$, группа B около $(10,0)$, группа C около $(5,20)$ — то есть A и B находятся заметно ближе друг к другу, чем к C. PCA, максимизируя сохранённую дисперсию, сохранит это отношение расстояний примерно пропорционально — картина после PCA останется похожей по пропорциям на исходную. t-SNE же в первую очередь заботится о том, чтобы внутри каждой группы точки остались рядом друг с другом на итоговой карте, но никак не гарантирует, что расстояние «A – B» на итоговой картинке будет заметно меньше расстояния «A – C»: алгоритм с равным успехом может нарисовать все три группы примерно на одинаковом удалении друг от друга, хотя в исходных данных это было не так. Это ключевое наблюдение мы разберём подробнее в разделе про интерпретацию t-SNE.

Почему это важно

Понимание того, что t-SNE решает принципиально другую задачу, чем PCA, определяет, для чего вообще стоит применять каждый из методов. Если цель — сжать признаки перед обучением следующей модели, удалить шум или получить интерпретируемые линейные компоненты, правильный инструмент — PCA (или его нелинейные аналоги вроде автоэнкодеров). Если же цель — получить наглядную картинку для человека, которая покажет, есть ли в многомерных данных кластерная структура, и если да, то сколько примерно кластеров и насколько они хорошо разделены, — правильный инструмент почти всегда t-SNE (или его более новая альтернатива UMAP, о которой пойдёт речь ниже). Путать эти две задачи — источник значительной части практических ошибок при работе с t-SNE, и мы вернёмся к этому в разделе про частые ошибки.

Вероятностная трактовка сходства и роль t-распределения

Интуиция

Вместо того чтобы напрямую сравнивать расстояния между точками до и после проекции, t-SNE задаёт куда более гибкий вопрос: «если бы я случайно выбирал соседей для точки $i$ пропорционально их близости, какова была бы вероятность выбрать именно точку $j$?» В исходном многомерном пространстве это вероятность, построенная на основе гауссова (нормального) распределения, центрированного в точке $i$: чем ближе точка $j$, тем выше плотность гауссианы в этой точке и тем выше вероятность. В целевом низкоразмерном пространстве вместо гауссианы используется t-распределение Стьюдента с одной степенью свободы — распределение той же общей формы «колокола», но с гораздо более медленно убывающими, «тяжёлыми» хвостами.

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

Формальное определение

Сходство в исходном пространстве. Для каждой упорядоченной пары точек $i,j$ условная вероятность того, что $x_j$ — сосед $x_i$, задаётся гауссовым ядром с индивидуальной дисперсией $\sigma_i^2$ для каждой точки:

$$p_{j\mid i} = \frac{\exp\!\left(-\|x_i-x_j\|^2 / 2\sigma_i^2\right)}{\sum_{k\ne i}\exp\!\left(-\|x_i-x_k\|^2/2\sigma_i^2\right)}$$

Итоговая (симметризованная) вероятность пары: $p_{ij} = \dfrac{p_{j\mid i}+p_{i\mid j}}{2N}$, где $N$ — число точек.

Сходство в проекции. В низкоразмерном пространстве вероятность пары точек $y_i, y_j$ строится через t-распределение Стьюдента с одной степенью свободы:

$$q_{ij} = \frac{\left(1+\|y_i-y_j\|^2\right)^{-1}}{\sum_{k\ne l}\left(1+\|y_k-y_l\|^2\right)^{-1}}$$

Целевая функция. Координаты $y_i$ подбираются так, чтобы минимизировать расхождение Кульбака-Лейблера между распределениями $P$ и $Q$:

$$C = \mathrm{KL}(P\|Q) = \sum_{i\ne j} p_{ij}\log\frac{p_{ij}}{q_{ij}}$$

Минимизация выполняется градиентным спуском (урок 285) по координатам $y_i$ — сама проекция и есть результат этой оптимизации, а не аналитическая формула, как в PCA.

Разбор примеров

Пример 1 (почему KL-дивергенция асимметрично наказывает ошибки). Расхождение Кульбака-Лейблера $\sum p_{ij}\log(p_{ij}/q_{ij})$ устроено несимметрично: если в исходных данных $p_{ij}$ большое (точки были близкими соседями), а в проекции $q_{ij}$ оказалось маленьким (алгоритм ошибочно развёл их далеко), слагаемое $p_{ij}\log(p_{ij}/q_{ij})$ становится большим и сильно штрафует такую ошибку. А вот обратная ситуация — исходное $p_{ij}$ маленькое (точки были далёкими), а $q_{ij}$ в проекции получилось не таким уж маленьким (алгоритм случайно поставил их не слишком далеко друг от друга) — почти не штрафуется, потому что множитель $p_{ij}$ перед логарифмом сам близок к нулю. Отсюда прямое следствие: t-SNE «болезненно» относится к разрыву настоящих соседей, но почти равнодушен к тому, насколько далеко друг от друга окажутся объекты, которые и так не были соседями, — это математическое объяснение того самого фокуса на локальной структуре, о котором шла речь в предыдущем разделе.

Пример 2 (числовой расчёт $q_{ij}$ для трёх точек). Пусть в 2D-проекции получены координаты трёх точек: $y_1=(0,0)$, $y_2=(1,0)$, $y_3=(5,0)$. Квадраты расстояний: $\|y_1-y_2\|^2=1$, $\|y_1-y_3\|^2=25$, $\|y_2-y_3\|^2=16$. Ненормированные веса по формуле t-распределения: $(1+1)^{-1}=0{,}5$ для пары $(1,2)$; $(1+25)^{-1}\approx0{,}0385$ для пары $(1,3)$; $(1+16)^{-1}\approx0{,}0588$ для пары $(2,3)$. Сумма ненормированных весов по всем упорядоченным парам (с учётом того, что каждая неупорядоченная пара считается дважды) равна $2\cdot(0{,}5+0{,}0385+0{,}0588)=1{,}1946$. Отсюда $q_{12}=\dfrac{2\cdot0{,}5}{1{,}1946}\approx0{,}8371$ — заметно доминирующая вероятность соседства для самой близкой пары. Для сравнения, если бы вместо t-распределения использовалось гауссово ядро с той же дисперсией, разрыв между весами близкой и далёких пар оказался бы ещё резче (экспонента убывает быстрее, чем $1/(1+d^2)$) — то есть t-распределение действительно «сглаживает» разницу между умеренно и очень далёкими точками по сравнению с гауссианой.

Пример 3 (crowding problem на игрушечном примере). Представь десять точек, равномерно и умеренно удалённых друг от друга внутри сферы в 10-мерном пространстве — расстояния между всеми парами похожи, ни одна пара не выделяется как «более соседняя». Если бы алгоритм пытался воспроизвести это распределение сходства с гауссовым ядром и в проекции тоже (как в исходном SNE 2002 года), у него физически не хватило бы «места» на плоскости, чтобы разместить десять точек на сопоставимо больших взаимных расстояниях при экспоненциально резко убывающей гауссовой вероятности, — алгоритм неизбежно стянул бы часть точек ближе друг к другу, создавая ложное впечатление подкластеров там, где их не было. С тяжёлыми хвостами t-распределения умеренное расстояние в проекции даёт заметно более высокую вероятность сходства, чем такое же умеренное расстояние по гауссиане, поэтому алгоритму не приходится искусственно стягивать точки, чтобы удержать нужный уровень сходства, — именно это спасает от crowding problem.

Почему это важно

Замена гауссианы на t-распределение в проекции — не косметическое улучшение, а причина, по которой t-SNE вообще даёт визуально чистые, хорошо разделённые кластеры вместо слипшейся кляксы точек. Понимание вероятностной, а не геометрической природы сходства в t-SNE также объясняет, почему метод настолько устойчив к выбросам по сравнению с чисто дистанционными методами: вероятность $p_{ij}$ всегда лежит между нулём и единицей и нормируется, поэтому один аномально удалённый объект не может «растянуть» всю картину произвольно сильно, как это могло бы произойти при прямой работе с ненормированными расстояниями.

Perplexity: сколько соседей должен учитывать алгоритм

Интуиция

Индивидуальная дисперсия $\sigma_i^2$ в формуле гауссовой вероятности сходства для каждой точки $i$ не выбирается произвольно — она автоматически подбирается алгоритмом так, чтобы удовлетворить заданному пользователем параметру perplexity (в русскоязычной литературе часто оставляют без перевода или называют «перплексией»). Perplexity — это приблизительное число «эффективных соседей», которых алгоритм пытается учесть вокруг каждой точки, прямой аналог параметра $k$ в методе k ближайших соседей (урок 314): чем больше perplexity, тем более широкую, размытую гауссиану алгоритм подбирает вокруг каждой точки, тем больше соседей учитывается при построении $p_{ij}$, и тем больше в итоговой визуализации будет заметна глобальная, а не только самая мелкая локальная структура.

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

Формальное определение

Perplexity через энтропию Шеннона. Для распределения $P_i = \{p_{j\mid i}\}_j$ вокруг точки $i$ перплексия определяется как

$$\mathrm{Perp}(P_i) = 2^{H(P_i)}, \qquad H(P_i) = -\sum_j p_{j\mid i}\log_2 p_{j\mid i}$$

где $H(P_i)$ — энтропия Шеннона распределения соседства вокруг точки $i$. Алгоритм подбирает дисперсию $\sigma_i^2$ для каждой точки индивидуально (обычно бинарным поиском) так, чтобы $\mathrm{Perp}(P_i)$ было как можно ближе к заданному пользователем значению — типичный диапазон на практике $5$–$50$, значение по умолчанию в большинстве библиотек — $30$.

Разбор примеров

Пример 1 (интуитивная проверка формулы на равномерном распределении). Если распределение $p_{j\mid i}$ равномерно распределено ровно между $k$ ближайшими соседями (каждому — вероятность $1/k$) и нулевое для всех остальных, энтропия $H(P_i) = -\sum_{j=1}^k \frac1k\log_2\frac1k = \log_2 k$, а значит $\mathrm{Perp}(P_i)=2^{\log_2 k}=k$ — perplexity в точности равна числу равновероятных соседей. Это подтверждает интуицию: perplexity действительно ведёт себя как «эффективное число ближайших соседей», а не абстрактная техническая величина без наглядного смысла.

Пример 2 (одна и та же выборка при трёх разных perplexity). Возьмём датасет из 300 точек, где на самом деле присутствует 15 отдельных плотных микрокластеров по 20 точек в каждом, а сами микрокластеры образуют три более крупные группы по пять микрокластеров. При perplexity $= 5$ визуализация, скорее всего, покажет 15 отдельных крошечных облачков — алгоритм честно улавливает каждый микрокластер по отдельности, но полностью теряет связь между ними и три более крупные группы становятся неразличимы. При perplexity $= 30$ картина, вероятнее всего, покажет три ясно различимых крупных облака, каждое из которых состоит из чуть более мелких, но уже не изолированных подгрупп, — баланс между локальной и промежуточной структурой. При perplexity $= 200$ (близко к трети всего датасета) три группы, скорее всего, сольются в одно почти однородное облако — алгоритму приходится учитывать настолько широкий круг «соседей», что даже реально далёкие друг от друга объекты начинают считаться похожими.

Пример 3 (perplexity должна быть меньше числа точек). Датасет содержит всего $N=50$ объектов. Указание perplexity $=100$ математически бессмысленно и на практике приводит либо к ошибке, либо к автоматическому ограничению значения библиотекой: у гауссова распределения вокруг конкретной точки просто физически не может быть эффективно больше соседей, чем всего точек в датасете минус одна. Общее практическое правило — держать perplexity заметно меньше $N$, обычно не больше $N/3$, а для совсем маленьких датасетов (в районе полусотни точек и меньше) начинать с небольших значений perplexity в диапазоне $5$–$15$.

Почему это важно

Perplexity — единственный по-настоящему содержательный, требующий сознательного выбора гиперпараметр t-SNE (не считая технических вроде числа итераций и learning rate (скорости обучения) самого градиентного спуска), и от него сильнее всего зависит, какая именно структура данных станет видна на итоговой картинке — мелкая и локальная или более крупная и промежуточная. Понимание perplexity как аналога числа соседей в kNN снимает ощущение «магии» вокруг этого параметра и превращает его подбор в осмысленный процесс: если картинка выглядит раздробленной на множество мелких кусочков, стоит увеличить perplexity; если картинка выглядит как одно аморфное пятно без структуры, стоит её уменьшить.

Как правильно (и как неправильно) читать картинку t-SNE

Интуиция

Самая опасная ловушка t-SNE — это то, насколько убедительно и «научно» выглядит итоговая картинка. Разноцветные, чётко разделённые облака точек создают ощущение точной географической карты, где расстояние между городами что-то значит, — но, как разобрано в разделе про вероятностную трактовку сходства, KL-дивергенция почти не штрафует ошибки в расстояниях между объектами, которые изначально не были соседями. Это значит, что t-SNE, по сути, честно рисует только одно: какие точки принадлежат к одной локальной группе, а какие — нет. Всё остальное — насколько далеко группы друг от друга, насколько велика группа, насколько «вытянута» её форма — во многом артефакт конкретного запуска алгоритма, а не свойство исходных данных.

Вторая существенная особенность — недетерминированность. t-SNE начинает оптимизацию со случайной инициализации координат $y_i$ и затем итеративно двигает их градиентным спуском по несимметричной, немонотонной целевой функции с множеством локальных минимумов. Два запуска с разными случайными зёрнами (seed) на одних и тех же данных с одним и тем же значением perplexity вполне могут дать заметно разные картинки: кластеры сохранят свой состав (какие точки в них входят), но их взаимное расположение, ориентация, а иногда и относительные размеры на плоскости изменятся.

Формальное определение

Что t-SNE гарантирует, а что нет. Метод гарантированно (с точностью до качества сходимости оптимизации) сохраняет отношение «точка $j$ была одним из наиболее вероятных соседей точки $i$ в исходном пространстве» — то есть принадлежность к локальной группе. Метод не гарантирует ни пропорциональность расстояний между кластерами в проекции их расстояниям в исходном пространстве, ни сохранение относительного размера кластеров, ни устойчивость взаимного расположения кластеров при повторном запуске со случайной инициализацией — вариативность результата при разных случайных зёрнах и разных значениях perplexity является ожидаемым, а не аномальным поведением алгоритма.

Разбор примеров

Пример 1 (одинаковые данные, четыре запуска с разными зёрнами). Возьмём один и тот же датасет эмбеддингов из 5000 отзывов на товары, размеченных на «позитивные», «нейтральные» и «негативные», и построим t-SNE четыре раза подряд с одинаковым perplexity, но разными случайными зёрнами инициализации. Во всех четырёх запусках практически один и тот же набор отзывов окажется в «позитивном» облаке, а какой именно отзыв туда попадает — почти не меняется от запуска к запуску (это устойчивая локальная структура). Но вот то, окажется ли «позитивное» облако сверху или снизу картинки, будет ли оно близко к «нейтральному» облаку или на противоположном краю картинки, и насколько вытянутой или круглой окажется его форма — во всех четырёх запусках может выглядеть заметно по-разному. Практический вывод: одного запуска t-SNE недостаточно для уверенных выводов, особенно если картинка используется для принятия важного решения, а не только для беглого визуального осмотра.

Пример 2 (ложное впечатление о «дистанции» между классами). Допустим, на t-SNE-картинке эмбеддингов изображений из десяти классов класс «кошка» оказался далеко от класса «собака», а класс «автомобиль» оказался рядом с классом «грузовик». Естественное (и в этом случае действительно нередко верное) искушение — сказать «модель считает кошек и собак очень разными, а машины и грузовики — очень похожими». Но строго говоря, единственное, что можно уверенно утверждать по одной картинке t-SNE, — это то, что внутри каждого класса объекты образуют плотную, хорошо отделённую от других классов локальную группу; то, что «автомобиль» и «грузовик» оказались физически близко на плоскости, а не «кошка» и «собака», могло получиться и из-за случайной инициализации оптимизации, и было бы неосторожно делать по этому одному наблюдению количественные выводы о степени похожести классов внутри модели без дополнительной проверки — например, через прямое измерение расстояний в исходном пространстве эмбеддингов или через несколько независимых запусков.

Пример 3 (артефакт «размера» кластера не отражает плотности в исходных данных). На t-SNE-картинке эмбеддингов покупателей интернет-магазина группа «постоянные крупные клиенты» визуально занимает заметно меньшую площадь на плоскости, чем группа «случайные разовые покупатели», хотя в исходных данных их численность сопоставима, а разброс поведения внутри каждой группы был примерно одинаков. Из этого нельзя делать вывод «модель считает постоянных клиентов более однородной, тесно сгруппированной аудиторией» — площадь, занимаемая кластером на итоговой картинке t-SNE, определяется прежде всего оптимизацией целевой функции $C$ и параметром perplexity, а не напрямую отражает плотность или разброс точек в исходном многомерном пространстве; при другой perplexity или другом случайном зерне то же самое облако вполне может занять заметно другую площадь.

Почему это важно

Неправильная интерпретация t-SNE — не редкое исключение, а одна из самых распространённых ошибок именно потому, что картинка выглядит настолько наглядной и «самоочевидной». Специалист по данным, который делает количественные выводы («класс А вдвое ближе к классу B, чем к классу C», «этот кластер вдвое компактнее того») напрямую по одной t-SNE-картинке, рискует принять артефакт оптимизации за свойство реальных данных. Правильная практика — использовать t-SNE как быстрый качественный инструмент разведочного анализа («есть ли вообще заметная кластерная структура, разделяет ли модель классы») и всегда перепроверять количественные утверждения о структуре данных другими способами — прямыми метриками расстояния в исходном пространстве, несколькими независимыми запусками с разными зёрнами и разными значениями perplexity, а при необходимости — количественной кластеризацией вроде k-means (урок 320) или DBSCAN (урок 322) поверх исходных, а не спроецированных данных.

UMAP: более новая альтернатива

Интуиция

В 2018 году Лиланд Макиннес (Leland McInnes) с соавторами предложили UMAP (Uniform Manifold Approximation and Projection, «единообразная аппроксимация и проекция многообразия») — метод, вдохновлённый той же идеей, что и t-SNE (сохранение локального соседства через вероятностную модель), но опирающийся на другую математическую базу — топологию и риманову геометрию вместо чистой теории информации — и, что важнее для практика, устроенный так, что его удаётся считать заметно быстрее на больших датасетах и применять не только к готовым данным, но и переиспользовать обученное отображение для новых, ранее не виденных точек, чего классический t-SNE делать не умеет.

Формальное определение

Ключевые практические различия UMAP и t-SNE. UMAP обычно значительно быстрее t-SNE на больших датасетах (десятки и сотни тысяч точек) и, в отличие от t-SNE, умеет проецировать новые точки на уже построенную карту без переобучения с нуля. При этом UMAP, как правило, лучше сохраняет отдельные элементы глобальной структуры данных (относительное взаимное расположение кластеров), хотя строгих теоретических гарантий на этот счёт по-прежнему нет — предостережение про недетерминированность и осторожную интерпретацию расстояний между кластерами, разобранное выше для t-SNE, остаётся в силе и для UMAP.

Разбор примеров

Пример 1 (масштаб данных как практический критерий выбора). На датасете из 5000 эмбеддингов отзывов оба метода, скорее всего, отработают за разумное время и дадут сопоставимо качественную визуализацию. На датасете из полутора миллионов эмбеддингов пользовательских сессий классический t-SNE может считаться часами или вовсе не поместиться по памяти в разумной конфигурации, тогда как UMAP на том же объёме данных часто отрабатывает за минуты — при выборе инструмента для очень большого датасета размер данных нередко становится решающим практическим аргументом в пользу UMAP.

Пример 2 (проекция новых точек без переобучения). Представь пайплайн мониторинга: раз в неделю в интернет-магазин приходит партия новых товаров, и хочется быстро увидеть, куда их эмбеддинги ложатся относительно уже привычной карты существующего каталога. С t-SNE для этого пришлось бы каждый раз пересчитывать всю визуализацию заново на объединённом датасете (старые товары плюс новые), потому что алгоритм не умеет добавлять точки к уже готовой проекции. UMAP, обучив однажды отображение на исходном каталоге, умеет отдельным вызовом transform спроецировать новые товары на ту же самую, уже существующую карту без пересчёта всей визуализации с нуля.

Почему это важно

UMAP не отменяет t-SNE и не делает его устаревшим — оба метода по-прежнему широко используются, и выбор между ними на практике определяется масштабом данных, требованиями к скорости и тем, нужно ли впоследствии проецировать новые точки. Но важно чётко понимать: и все предостережения этого урока про интерпретацию t-SNE — прежде всего про то, что расстояния между кластерами и их размеры на картинке нельзя читать буквально, а результат зависит от случайной инициализации, — в равной мере применимы и к UMAP. Смена инструмента не отменяет необходимости критически относиться к любой картинке снижения размерности.

Практика: 30 заданий

Базовые задания (1–10)

Задание 1: Датасет содержит 70 000 изображений цифр MNIST, каждое размером 28×28 пикселей. В скольких измерениях живёт каждая точка исходного пространства?


Задание 2: Верно ли утверждение «t-SNE, в отличие от PCA, — линейный метод снижения размерности»?


Задание 3 (машинное обучение): Специалист по данным хочет сжать 512-мерные эмбеддинги изображений до 20 измерений, чтобы затем подать их на вход классификатору. Подходит ли для этого t-SNE?


Задание 4: Что означает буква "t" в названии t-SNE?


Задание 5: Датасет из $N=40$ точек. Можно ли задать perplexity $=100$?


Задание 6 (машинное обучение): После обучения нейросети для классификации отзывов специалист строит t-SNE эмбеддингов последнего слоя и видит два чётко разделённых облака точек, соответствующих позитивным и негативным отзывам. О чём это говорит?


Задание 7: Верно ли, что при повторном запуске t-SNE на тех же данных с тем же perplexity, но другим случайным зерном, кластеры на картинке гарантированно окажутся в тех же самых местах плоскости?


Задание 8: Что в первую очередь показывает perplexity, равная 5, по сравнению с perplexity, равной 50, на одном и том же датасете?


Задание 9 (машинное обучение): Аналитик утверждает: «На t-SNE-картинке кластер A занимает вдвое большую площадь, чем кластер B, значит в исходных данных точки кластера A имеют вдвое больший разброс». Верно ли это рассуждение?


Задание 10: Кто предложил t-SNE и в каком году?

Средние задания (11–20)

Задание 11: Для трёх точек в 2D-проекции $y_1=(0,0)$, $y_2=(2,0)$, $y_3=(0,2)$ найти ненормированный вес пары $(1,2)$ по формуле t-распределения $(1+\|y_i-y_j\|^2)^{-1}$.


Задание 12: Для того же датасета, что в задании 11, найти ненормированный вес пары $(1,3)$ и пары $(2,3)$.


Задание 13: Используя результаты заданий 11–12, найти нормированную вероятность $q_{12}$ (сумму ненормированных весов брать по всем трём неупорядоченным парам, удвоенную).


Задание 14: Распределение $p_{j\mid i}$ равномерно распределено между 10 ближайшими соседями точки $i$ (вероятность $1/10$ у каждого) и нулевое для остальных. Найти perplexity этого распределения.


Задание 15 (машинное обучение): Специалист по данным строит t-SNE-визуализацию эмбеддингов текстов новостей и видит одно большое аморфное пятно без явных границ между темами, хотя ожидал увидеть отдельные кластеры по темам. Perplexity была установлена в 300 при датасете из 400 новостей. Что стоит попробовать в первую очередь?


Задание 16: Чем принципиально отличается целевая функция, которую минимизирует t-SNE, от целевой функции PCA?


Задание 17: Объясни своими словами, почему KL-дивергенция $\sum p_{ij}\log(p_{ij}/q_{ij})$ сильнее штрафует ситуацию «были соседями, но в проекции оказались далеко», чем ситуацию «не были соседями, но в проекции оказались близко».


Задание 18 (машинное обучение): На t-SNE-картинке эмбеддингов покупателей интернет-магазина видно, что кластер «постоянные клиенты» находится далеко от кластера «разовые покупатели», а внутри самого кластера «постоянные клиенты» видны две небольшие плотные подгруппы. Какие из этих наблюдений можно интерпретировать напрямую, а какие нет?


Задание 19: Число точек в датасете $N=1000$. Какое из значений perplexity — 3, 30 или 950 — наиболее типично используется по умолчанию в большинстве библиотек, и почему остальные два скорее плохие идеи?


Задание 20: Сформулируй, почему t-SNE особенно часто используют именно для визуализации эмбеддингов из нейросетей (например, эмбеддингов слов или изображений), а не для визуализации произвольных табличных данных с 5–6 признаками.

Продвинутые задания (21–30)

Задание 21 (машинное обучение): Специалист по данным обучил модель для эмбеддингов товаров и построил t-SNE-визуализацию всего один раз с perplexity по умолчанию. На картинке видно четыре кластера, и он делает вывод: «в данных ровно четыре типа товаров». Оцени этот вывод и предложи, как его проверить надёжнее.


Задание 22: Для пяти точек в исходном пространстве известны попарные квадраты евклидовых расстояний до точки $i$: до соседей 1, 2, 3, 4 они равны $1, 4, 9, 100$ соответственно, при $\sigma_i^2=2$. Найти ненормированные веса $\exp(-d^2/2\sigma_i^2)$ для каждой из четырёх пар.


Задание 23: Используя результат задания 22, найди нормированные вероятности $p_{j\mid i}$ для всех четырёх соседей (сумму ненормированных весов округли до четырёх значащих цифр).


Задание 24 (машинное обучение): Объясни, почему для датасета из миллиона строк специалисты по данным чаще выбирают UMAP, а не классический t-SNE, и какую именно практическую проблему это решает.


Задание 25: Датасет содержит явно выраженное спиральное многообразие, вложенное в трёхмерное пространство. Объясни, почему PCA даёт плохой результат на таких данных, а t-SNE — хороший.


Задание 26: Верно ли утверждение «t-SNE подходит для визуализации данных с 2 признаками, потому что тогда картинка будет ещё более наглядной»?


Задание 27 (машинное обучение): На собеседовании кандидата просят объяснить, почему t-SNE не стоит использовать как этап предобработки признаков перед обучением модели классификации. Сформулируй правильный ответ.


Задание 28: Perplexity датасета из 5000 точек установили равной 2. Опиши, какую именно картинку вероятнее всего увидит специалист по данным, и почему.


Задание 29 (машинное обучение): Специалист по биоинформатике анализирует данные секвенирования отдельных клеток (тысячи генов на каждую из десятков тысяч клеток) и строит t-SNE-визуализацию, надеясь увидеть типы клеток. Какие два предостережения из этого урока особенно важны в этом сценарии перед тем, как делать биологические выводы?


Задание 30 (машинное обучение, синтез): Сформулируй одним связным ответом три главных отличия t-SNE от PCA (урок 323): в чём разница целей применения, в чём разница математического механизма и в чём разница в правилах интерпретации итогового результата.

Частые ошибки

Разберём ошибки, которые чаще всего встречаются у тех, кто впервые применяет t-SNE на практике.

  • Интерпретируют расстояния между кластерами на картинке t-SNE как содержательную меру сходства. Как показано в разделе про интерпретацию и в задании 18, KL-дивергенция почти не штрафует ошибки в расстояниях между объектами, которые изначально не были соседями, — поэтому два кластера, оказавшиеся далеко друг от друга на плоскости, не обязательно были далеки друг от друга в исходном многомерном пространстве. Единственное, что t-SNE действительно надёжно сохраняет, — принадлежность точки к своей локальной группе.

  • Делают выводы по одному-единственному запуску алгоритма. t-SNE стартует со случайной инициализации и оптимизирует немонотонную целевую функцию с множеством локальных минимумов (раздел про интерпретацию, задание 7 и задание 21) — расположение и относительный размер кластеров могут заметно отличаться от запуска к запуску даже на тех же данных с той же perplexity. Надёжные выводы требуют нескольких запусков с разными случайными зёрнами.

  • Подбирают perplexity наугад, не понимая её смысла, либо оставляют значение по умолчанию без проверки. Как показано в разделе про perplexity, слишком маленькое значение раздробит картинку на мелкие фрагменты, слишком большое — сотрёт структуру в одно аморфное пятно; правильный подход — пробовать несколько значений perplexity (обычно в диапазоне 5–50) и сравнивать устойчивость наблюдаемых кластеров.

  • Используют t-SNE как этап подготовки признаков перед обучением следующей модели. Как разобрано в задании 3 и задании 27, t-SNE спроектирован для визуального восприятия человеком, а не для сохранения информации, важной для последующего алгоритма, недетерминирован и не умеет проецировать новые точки без полного переобучения — для сжатия признаков перед обучением модели правильный инструмент PCA (урок 323) или автоэнкодеры.

  • Судят о размере и «плотности» кластера напрямую по площади, которую он занимает на картинке. Как показано в задании 9 и примере 3 раздела про интерпретацию, площадь кластера на t-SNE-визуализации определяется оптимизацией и параметром perplexity, а не напрямую отражает разброс точек в исходном пространстве.

  • Применяют t-SNE к низкоразмерным данным (2–3 признака), где он не нужен. Как отмечено в задании 26, для данных, которые и так можно визуализировать напрямую, нелинейная проекция t-SNE ничего не добавляет и лишь усложняет анализ артефактами недетерминированности.

Главное запомнить

  • t-SNE — нелинейный метод снижения размерности, специализированный именно для визуализации (обычно в 2D или 3D), в отличие от PCA (урок 323), который линеен и универсален для сжатия признаков.

  • Идея метода — сохранить локальную структуру соседства: точки, близкие в исходном многомерном пространстве, должны остаться близкими и в проекции; далёкие точки не обязаны сохранять пропорциональную удалённость.

  • Сходство точек описывается вероятностно: в исходном пространстве — через гауссово распределение $p_{j\mid i}$, в проекции — через t-распределение Стьюдента $q_{ij}\propto(1+\|y_i-y_j\|^2)^{-1}$ с тяжёлыми хвостами, что решает проблему скученности (crowding problem) предшествовавшего метода SNE.

  • Координаты проекции подбираются минимизацией KL-дивергенции $C=\sum p_{ij}\log(p_{ij}/q_{ij})$ между распределениями сходства градиентным спуском (урок 285), а не аналитической формулой, как в PCA.

  • Perplexity — примерное эффективное число соседей вокруг каждой точки, аналог параметра $k$ в kNN (урок 314); типичный диапазон 5–50, значение сильно влияет на то, какая структура (мелкая или крупная) станет видна на картинке.

  • Расстояния между кластерами и их размер на итоговой t-SNE-картинке не несут количественного смысла — надёжна только принадлежность точки к своей локальной группе.

  • Результат t-SNE недетерминирован и зависит от случайной инициализации и от perplexity — для надёжных выводов нужны несколько запусков с разными зёрнами и разными значениями perplexity.

  • t-SNE — стандартный инструмент для визуализации эмбеддингов из нейросетей (слов, изображений, пользовательских профилей) и быстрой разведочной проверки, действительно ли модель выучила разделимое представление данных.

  • UMAP (2018) — более новая альтернатива, обычно быстрее на больших датасетах и умеющая проецировать новые точки без переобучения, но подверженная тем же самым предостережениям при интерпретации расстояний.

Связь с темами курса

Этот урок напрямую продолжает урок 323 (Principal Component Analysis): оба метода решают задачу снижения размерности, но принципиально по-разному. PCA линейно проецирует данные на направления максимальной дисперсии и хорошо сохраняет глобальную геометрию облака точек, тогда как t-SNE нелинейно восстанавливает локальное соседство ценой почти полной потери количественного смысла глобальных расстояний. На практике оба метода нередко используют последовательно: сначала PCA снижает размерность данных с сотен до нескольких десятков измерений (для ускорения и удаления шума), а затем t-SNE строит финальную 2D- или 3D-визуализацию уже на этом сжатом представлении.

Оптимизация координат проекции в t-SNE выполняется градиентным спуском — той же самой идеей, что была подробно разобрана в уроке 285, только целевая функция здесь не среднеквадратичная ошибка модели, а KL-дивергенция между распределениями сходства. Понимание perplexity как аналога числа соседей напрямую перекликается с методом k ближайших соседей из урока 314, а предостережение о недостаточности одного запуска и необходимости кросс-проверки результата — тот же самый принцип, что лежит в основе кросс-валидации (урок 306): не делать выводов по единственному, потенциально нерепрезентативному результату.

Следующий урок курса (325, feature engineering) возвращается от визуализации к практической подготовке признаков для обучения моделей — теме, для которой, как подчёркивалось выше, t-SNE не подходит: там задача снижения размерности вновь решается через PCA, отбор признаков и другие техники, сохраняющие информацию для последующего алгоритма, а не для человеческого глаза.

Интересные факты

  • Статья Лоренса ван дер Маатена и Джеффри Хинтона 2008 года «Visualizing Data using t-SNE» стала одной из самых цитируемых работ в истории машинного обучения — счёт цитирований идёт на десятки тысяч, что необычно много даже для очень влиятельных статей в этой области.

  • Ван дер Маатен тестировал t-SNE на классическом датасете MNIST ещё будучи аспирантом, и именно та самая картинка с десятью аккуратно разделёнными облаками цифр 0–9 стала одной из самых узнаваемых иллюстраций во всём машинном обучении — её и сегодня можно встретить почти в каждом вводном курсе или статье про снижение размерности.

  • t-SNE стал одним из ключевых инструментов в биоинформатике для анализа данных секвенирования отдельных клеток (single-cell RNA-seq) — с его помощью учёные визуально находят ранее неизвестные типы клеток среди десятков тысяч клеток, каждая из которых описана экспрессией тысяч генов.

  • Быстрая версия алгоритма, Barnes-Hut t-SNE (в честь алгоритма Барнса-Хата из вычислительной астрофизики, ускоряющего расчёт гравитационных взаимодействий множества тел), позволила применять t-SNE к датасетам с сотнями тысяч точек вместо нескольких тысяч, для которых был практичен исходный вариант алгоритма 2008 года.

Лайфхаки

  • Никогда не ограничивайся одним запуском t-SNE при принятии важных решений — запусти алгоритм минимум 3–4 раза с разными случайными зёрнами и сравни, сохраняется ли состав кластеров: если да, доверяй общей картине, если кластеры распадаются или меняются местами, картина менее устойчива, чем кажется.

  • Пробуй несколько значений perplexity (например, 5, 15, 30, 50) на одних и тех же данных и сравнивай картинки рядом — так быстро становится видно, какая структура устойчива при разных значениях, а какая появляется только при конкретном узком диапазоне параметра.

  • Если исходная размерность данных очень высока (сотни-тысячи признаков), сначала прогони PCA до 30–50 компонент, а уже затем t-SNE поверх результата — это заметно ускоряет вычисления и часто снижает шум, не теряя важной для t-SNE структуры соседства.

  • Никогда не подписывай итоговую картинку t-SNE фразами вроде «кластер А вдвое больше кластера B» или «кластер А ближе к C, чем к D» без дополнительной количественной проверки — такие утверждения не следуют напрямую из самой визуализации.

  • Для очень больших датасетов (от сотен тысяч точек) начинай сразу с UMAP или Barnes-Hut t-SNE — классический t-SNE на таких объёмах может оказаться непрактично медленным.

  • Используй t-SNE как первый, разведочный шаг при проверке качества обученных эмбеддингов, но всегда подкрепляй визуальное впечатление количественными метриками — например, точностью классификатора, обученного прямо на эмбеддингах, или метриками кластеризации (урок 320, урок 322) на исходных, неспроецированных данных.

Освоив t-SNE, ты получаешь в свой арсенал именно тот инструмент, которым специалисты по данным ежедневно проверяют, «действительно ли модель что-то поняла» — быстрый способ заглянуть внутрь абстрактных представлений, которые строят современные нейросети, и увидеть их кластерную структуру своими глазами. Ровно так же важно унести из этого урока обратную сторону этой силы: чем убедительнее выглядит картинка, тем осторожнее стоит быть с выводами, которые она как будто бы подсказывает сама собой, — и эта привычка критически проверять то, что кажется наглядным и самоочевидным, пригодится далеко за пределами одного конкретного алгоритма визуализации.

Понял тему? Закрепи в боте! 🚀

Попрактикуйся на задачах и получи персональные рекомендации от AI

💪 Начать тренировку
💬 Есть вопрос? Спроси бота!