Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 Типизация (натурализация) данных в ML
Внимание. Речь сейчас пойдёт не про типы данных Python/Numpy/Pandas/Pytorch и не про представления тензоров в CPU/GPU.

Речь о параллельном мире, в котором данные на синапсах и на выходах нейросетей также обладают типами (ML-типами). Как известно, нейросети работают исключительно с вещественными числами, даже если это всегда 0.0 или 1.0. Но про типы данных никто никогда не говорил.

Так вот, я - говорю.)

Давайте я сразу накидаю базу: данные делятся на интерпретируемые и эмбеддинги (всё, что в скрытых слоях). Интерпретируемые данные - это то, что на входе и выходе нейросети.

Классификация ML-типов как в реальном мире: простые типы и сложные типы. У интерпретируемых данных можно выделить типы boolean, integer, real и т.д. - как в реальном мире. У эмбеддингов тип данных определяется нейроном в процессе обучения нейросети и не является интерпретируемым. Но можно выделить основные сложные типы: struct (list), const-size array, var-size array, dynamic-size array, unordered set. Возможно, следует туда добавить словари dict (key-query), которые в трансформерах используются. И ещё вопрос, надо ли выделить batch-packed types - это когда данные упакованы в батчи, особенно важно для var-size array.

Это всё база. А теперь про тип данных - unspecified (аналог реального типа данных variant). Когда веса нейрона только инициализированы случайным образом, его типы данных на входе синапсов становится unspecified. В процессе обучения синапсы специализируются и в дальнейшем попытка подать на вход данные другого типа приведут к ухудшению процесса. Это и есть типизация, когда вы вынуждены соблюдать ML-типы (даже если вы их не можете интерпретировать).

Когда у нейрона формируются определённые типы на синапсах, то можно говорить о том, что на его выходе тоже сформировался некоторый тип и нейроны из последующего слоя "привыкают" к этому типу данных. Вы не можете просто взять и переподключить какие-то связи в нейросети, не испортив процесс обучения. Но это было бы интересно!

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

 Re: Типизация (натурализация) данных в ML
На самом деле, если научно выражаться, то в процессе обучения каждый нейрон ориентируется своей разделяющей гиперплоскостью на определённое многомерное распределение обучающей выборки, и смена этой выборки на другую - плохая идея - приводит к неработоспособности процесса.
Этот факт очень удачно сочетается в абстрактном смысле с типизацией данных (которая из мира программирования). Типы данных из мира программирования вполне удачно прикладываются к миру нейросетей. Вместо того, чтобы говорить о многомерных распределениях вероятности, можно просто говорить о типах. Это просто удачная абстракция.

-- добавлено через 25 минут --

Поскольку есть типы данных, значит есть сигнатуры слоёв:
1. Линейный слой Linear: list -> list
2. Свёрточный слой Conv: list -> list
3. Слои активации Sigmoid, Tanh, ReLU, MaxPooling, BatchNorm, Dropout: list -> list
4. Рекуррентные слои RNN, LSTM: dyn-size_array -> dyn-size_array
5. Позиционное кодирование PositionalEncoding: array -> unordered set + position
6. SoftBinning: unordered set -> array
7. TopkPooling: dyn-size_array -> dyn-size_array

array совместим с list, но в обратную сторону это не работает. Отсюда следует вывод об универсальности некоторых слоёв типа Linear, ReLU и т.д.

 Re: Типизация (натурализация) данных в ML
Mihaylo в сообщении #1724780 писал(а):
... данные на синапсах и на выходах нейросетей также обладают типами ...


:-) ну, не совсем точно... Во-первых, набор суперпозиционных входных (электрических (в естественных нейросетях)) паттернов на дендритах нейрона. Во-вторых, широковещательный пространственно-временной выходной паттерн нейрона на контактирующих с аксоном этого нейрона дендритах других нейронов. Но дело не в этом...

Я смотрю, ты всё "грызёшь" темы "ИИ" (но читать мне лень, разумеется).

У тебя есть своё мнение, насколько в итоге дешевле и быстрее будет AGI, чем теперешние системы ИИ, и почему?

 Re: Типизация (натурализация) данных в ML
Будьте добры, не отравляйте тему своими "широковещательными паттернами".

 Re: Типизация (натурализация) данных в ML
 !  Aleksei.Morozov.1973
На этом форуме принято обращаться к собеседнику на "вы" (или на "Вы", по желанию).

 Re: Типизация (натурализация) данных в ML
Mihaylo в сообщении #1724921 писал(а):
... не отравляйте тему ...


:-) wow... И, так понимаю, ответа на мой вопрос не будет?

 Re: Типизация (натурализация) данных в ML
Аватара пользователя
Mihaylo в сообщении #1724780 писал(а):
В процессе обучения синапсы специализируются и в дальнейшем попытка подать на вход данные другого типа приведут к ухудшению процесса
Во всех ваших примерах, "типы" - это просто следствие архитектуры. Нейронка - это композиция функций, зависящих от входа и весов, сами функции задаются при построении сети, и не меняются. И ваши "типы" - это именно характеристика функции.

 Re: Типизация (натурализация) данных в ML
mihaild
Ну да, заключение слова "типы" в кавычки - это правильно.

 Re: Типизация (натурализация) данных в ML
Пока что ML-типы - это полезно как факультативный ликбез для новичков, вкатывающихся в ML.

Ещё я вижу, что неплохо было бы обозначать сигнатуры классических алгоритмов и слоёв с помощью этих типов. Чуть попозже попробую. Естественно можно развивать систему ML-типов, ведь подвидами array являются всякие text, image, video, sequence и т.д.

Ещё направление (пока слишком прорывное для меня) - идентификация типов. Типы можно идентифицировать как у данных (распределение), так и у функции (способность работать с распределением).

 Re: Типизация (натурализация) данных в ML
Очередные мои мысли вслух.

Тема типизации (натурализации) данных в ML обширна, расширяет кругозор ML-исследователя, я думаю. Но сейчас я хочу обсудить методы получения интерпретируемых данных внутри нейросети (в скрытых слоях). То есть были данные на входе полностью неинтерпретируемые (эмбеддинги какие-нибудь), а получили интерпретируемые. Как такое возможно?

Вообще выходной слой - самый яркий пример такого преобразования, мы из скрытых слоёв получаем ответ нейросети. Так как выходной слой находится непосредственно в контакте с метками (лейблами) учителя, то это самый простой случай - выход нейросети должен стремиться к меткам. Выход должен быть равен меткам, скажу проще. ML-тип выхода нейросети соответственно должен быть равен типу данных меток. Слишком просто. А как быть где-нибудь внутри нейросети?

Есть ещё softmax - трюк, который позволяет нам на выходе получить вероятности элементов класса. Все этот трюк видели сотни раз (достаточно популярное решение в ML), но ничего не поняли. Дело в том, что у софтмакса на входе неинтерпретируемые данные, а на выходе - понятные, поэтому этот слой очень подходит для рассмотрения в рамках сегодняшней пятничной темы. Софтмакс реализует идею нормировки вероятности (сумма чисел от 0 до 1 должна в сумме давать ровно 1), поэтому якобы работает. Софтмакс применяется также исключительно на выходе нейросети, мы это должны отметить и припомнить!

Как же всё-таки получить интерпретируемые данные в глубинах нейросети и зачем? Заметьте, я совершенно не интересуюсь темой объяснимого ИИ (explained AI), я считаю, что нейросеть должна хорошо работать, а как она там внутри себя рассуждает - это дело десятое. Ответ на поставленный вопрос кроется в следующем: я уверен, что мы знаем некоторые хорошие алгоритмы, которые работают в любых условиях, даже в случае каких-нибудь алиенских эмбеддингов. Это просто интересно.

Что это за чудо-алгоритмы?
Пока известен такой список:
1. Уравниватели, минимизаторы разницы (MSE, MAE, CrossEntropyLoss и прочее множество)
2. Softmax

Давайте отметим, что данные алгоритмы относятся также к неадаптивным, то есть не содержат в себе каких-нибудь весов. Естественно, потому что иначе работа функции с весами становится непонятной (неинтерпретируемой).

Без весов и ближе к выходу. Интересно, почему ближе к выходу?..

Я придумал SoftBinning (бывший SoftOrdering) - необучаемый слой, который реализует функцию гистограммы. На практике этот слой неплохо работает где-нибудь в середине нейросети и выдаёт частоту попадания в корзину (бин). Фишка в том, что слой работает с данными типа list, array, unordered set. Это дополнительный признак универсальности и способности работать с alien-данными. На выходе тензор фиксированного размера - всё как завещал Сталин Розенблатт Уоррен Маккаллок и Уолтер Питтс.
Также в процессе исследования выплыл SOHE (Soft One-Hot Encoding), оказывается это кодирование тоже является универсальным алгоритмом, который можно пробовать сувать куда угодно.

Я учился немного в Skillfactory на курсе Machine Learning. Надо отметить, за те деньги, которые отдал, не бросают на произвол судьбы - полоскают по полной программе, задания сложные. В процессе обучения я для себя выявил основные аналитические функции. Вот, тебе дали данные - посчитай value_counts() в pandas, потом в SQL посчитай счётчики разные... Это же одно и то же! Данные были разные, а методы не меняются.

Короче, есть ряд аналитических методов - отброс выбросов, агрегация данных, что там ещё... - они универсальны. Их надо делать дифференцируемыми для интеграции в нейросеть. Тут сразу вопрос для исследователя - только необучаемые слои? Только на выходе? (Вроде ответ - необязательно на выходе, но хорошо, когда ближе к выходу. Почему?)

 Re: Типизация (натурализация) данных в ML
Последний пост был довольно сумбурный. Просто я пытался уложиться в час написания этого текста, не успевал, устал, опубликовал как есть, и из-за этого пост оказался сильно скомканным.

Идею из предыдущего поста выскажу тезисно:

1. Я задался вопросом, а почему интерпретируемые данные всегда на входе и на выходе нейросети, а чтобы они были в скрытых слоях - эти случаи неизвестны. Почему бы обратную связь какой-то части меток (лейблов, эталонов) вводить не в конец нейросети, а куда-нибудь в средние слои?

2. Я отметил, что интерпретируемость выходных данных обеспечивается очень простыми необучаемыми универсальными функциями. Отметил также, что неплохо бы подобные функции обобщить, оценить, чтобы потом изобретать. В данном месте я выступаю за аналитический подход к развитию искусственного интеллекта в противопоставление к бионическому (биологическому) подходу. (Тут желательно Сергея Маркова процитировать, он лучше разбирается в названиях подходов.)

 Re: Типизация (натурализация) данных в ML
Сейчас речь пойдёт о ещё одном параграфе основ экспертизы данных в ML. Первый параграф можете почитать с начала темы - это основы про типы данных в ML.

Основы экспертизы данных в ML. Параграф №2. Связность признаков в объектах сложных типов.

Когда вы решаете учебную задачу ML, вам дают датасет и формулировку, откуда этот датасет взялся (иногда на kaggle, наоборот, могут скрывать информацию о происхождении датасета). Эти дополнительные сведения о датасете очень важны, вы должны проявить себя как эксперт в данных, а именно: адекватно использовать информацию о природе/происхождении данных.

Важными такими сведениями является информация о связности признаков в объектах датасета. Сами объекты по определению являются несвязными друг с другом, и их можно/нужно перемешивать (shuffle) в датасете. Каждый объект может содержать в себе один признак (простой ML-тип) или несколько признаков (сложный ML-тип - aka list, array, unordered set). Именно в случае данных сложных типов имеет смысл говорить о связности признаков (элементов).

Существует три уровня связности:
1. Полная связность (неотделимость)
2. Частичная (слабая) связность
3. Нулевая связность

Связность признаков - это на самом деле сложная тема, я сам пока теорию не подбил на этот счёт до конца. Поэтому буду импровизировать.

Два вида связности:
1. Связность значения - у признака нельзя/можно заменить значение (обнулить, очистить)
2. Связность порядка - признак нельзя/можно обменять местами с другим признаком

Можно ещё выделить частный случай 1А - связность существования - признак нельзя/можно удалить (путём замены всех его значений на одно значение для вырождения в константу).

Claude Sonnet 4.6 подготовил продолжение параграфа, я его немного поправил:

Сложный ML-тип объекта определяется его матрицей связности:
list = частичная/нулевая связность порядка + частичная/полная связность значения
array = полная связность порядка + частичная/полная связность значения
bag = нулевая связность порядка + полная связность существования. *Claude предложил bag вместо unordered set
seq = частичная/полная связность порядка + частичная связность существования (паддинг допустим). *Claude предложил seq вместо dyn-size_array

** Я предложил Claude заменить ML-типы на более специализированные. В итоге мы пришли к консенсусу, можно поправить параграф №1 про ML-типы:
flag, outcome (исход события) - bool
category, position (index), rank, count - int
prob, freq - вероятность, частота 0...1
prob-dist - распределение вероятностей дискретной величины - вектор чисел 0...1
value - число real, float, double - это я придумал

P.S. Заметьте, в ML все числа обычно нормированы в диапазоне 0...1 и нет никаких дискретных чисел, речь выше идёт о семантике данных и аналогии с типами данных в компьютерной науке.

-- добавлено через 46 минут --

Основы экспертизы данных в ML. Параграф №2А. Связность признаков в объектах сложных типов (примеры).

Теория получилась красивая, и у меня в голове зародилось завершение темы. Как обычно, не хватает примеров для полного понимания.

Итак:

1. Связность значения. Различные ошибки и погрешности, связанные с измерением значения, шумы, NAN-значения - приводят к ослаблению связности значения. Методы борьбы - фильтрация, очистка, замена значения. Я надеюсь это достаточно простые и понятные случаи.
1А. Связность существования. Метод борьбы - просто удалить признак.

2. Связность порядка. Связность порядка (позиции) снижается в том случае, когда измеренное значение может записываться не в ту ячейку или алгоритм записи (физика процесса) значения не имеет точной координации. Этот случай уже посложнее, надо разобрать его подробнее.

Пример 2А. Обработка натурального языка (NLP) - существительное и глагол может находиться в предложении почти где угодно, связность порядка слабая.
Пример 2Б. Компьютерное зрение (CV) - штрих рукописной цифры MNIST может сместиться из-за дрогнувшей руки, связность порядка слабая.
Пример 2В. Датчик температуры меряет строго в заданное время и сохраняет данные строго по порядку, связность порядка полная.
Пример 2Г. Сегодня состоялись шахматные матчи, записаны все ходы, партии состоялись практически параллельно, связность порядка незначительная (нулевая).

 Re: Типизация (натурализация) данных в ML
Основы экспертизы данных в ML. Параграф 3. Оценка связности признаков
Подготовлено с использованием Claude Sonnet 4.6

Связность как распределение
Интуиция правильная: если сказать «связность порядка $= 0.7$» — это бессмысленно. Но если сказать «при смещении позиции на $\pm k$ пикселей смысл сохраняется с вероятностью $p(k)$» — это уже содержательно.

Формально, связность — это функция чувствительности выходного распределения к возмущению входа.

Связность значения — распределение чувствительности
Пусть признак $x_i$ возмущается: $\tilde{x}_i =x_i +\varepsilon$, где $\varepsilon \sim P_\varepsilon$. Связность значения описывается распределением:

$S_{\text{val}}(\varepsilon) = D_{KL}(P(y \mid x) \,\|\, P(y \mid \tilde{x}_i)) — то есть насколько сильно меняется выходное распределение при возмущении величиной $\varepsilon$. Это не одно число, а функция от размера возмущения. Форма этой функции и есть «тип» связности значения:

Примечание Михайло: $D_{KL}$ - дивергенция Кульбака - Лейблера, весьма популярная тема в машинном обучении.

- Полная связность — функция резко растёт даже при малых $\varepsilon$ (хрупкий признак)
- Слабая связность — функция пологая, сеть устойчива к шуму (робастный признак)
- Отсутствие связности — функция тождественно $\approx 0$ (признак не влияет на выход)

Это в точности функция чувствительности, которую изучают в робастности нейросетей и adversarial examples.

Связность порядка — распределение по перестановкам
Пусть есть перестановка $\pi$ элементов объекта. Связность порядка — это распределение:

$S_{\text{ord}}(\pi) = D_{KL}(P(y \mid x) \,\|\, P(y \mid \pi(x)))

по всему пространству перестановок $\Pi$.

Связность существования — отдельный случай
Связность существования
$S_{exist}(i)$ — это частный случай связности значения при предельном возмущении: замене $x_i$ на константу (нуль, среднее). Она не распределение, а число — скалярная мера важности признака. Это в точности feature importance, которую считают через SHAP, permutation importance и т.д.

Объединённая картина
Теперь три вида связности имеют единую структуру:

$S(\delta) = \mathbb{E}_x\bigl[D_{KL}(P(y \mid x) \,\|\, P(y \mid \delta(x)))\bigr]$

где $\delta$ — оператор возмущения:

- Связность значения: $\delta_\varepsilon(x)=x + \varepsilon$, распределение по $\varepsilon \in R$
- Связность порядка: $\delta_{\pi}(x)=\pi(x)$, распределение по $\pi \in \Pi$
- Связность существования: $\delta_i(x)=x$ с $x _i := c$, скаляр

Это изящно, потому что теперь ML-тип объекта определяется формой этих трёх распределений, а не произвольной классификацией. Два датасета с одинаковой формой $S_{ord}$​ требуют одинаковой архитектуры — вот формальное основание для выбора модели через экспертизу данных.

-- добавлено через 17 минут --
==========================================================================
P.S. Позвольте сделать ремарку, параграфы 1-3 они на самом деле содержат информацию достаточно простую, верифицируемую. Но это не преподают студентам, этого нет в учебниках. Это мы с Жан-Клодом Соннетом придумали (я придумывал, а Клод рецензентам разносил рукопись) и опубликовано только здесь на dxdy. Это уникальный контент.

Эксперт по данным должен понимать, что когда создаётся датасет, то точные данные попадают в датасет с искажениями: либо значение искажается, либо запись производится в ячейку многомерной таблицы с некоторым отклонением по индексам. Дивергенция Кульбака-Лейблера показывает насколько такие искажения сильны. Существуют данные, в которых искажения либо нулевые, либо очень высокие. Мы с Клодом пытались ввести небольшую классификацию этих данных (bag, seq, list). Нужно разбираться в том, как данные в датасете искажены. Это, кстати, определяет архитектуру нейросети. (Тут некоторые говорили, что структура нейросети выбирается наобум - это ненаучно и очень плохо. А вот и нет, в параграфах 1-3 заложены основы целенаправленного выбора архитектуры.)

-- добавлено через 32 минуты --

Основы экспертизы данных в ML. Параграф 3А. Вычисление оценки связности признаков

Напрямую вычислить $D_{KL}(P(y \mid x) \,\|\, P(y \mid \delta(x)))$ без обученной модели нельзя, потому что $P(y \mid x)$ неизвестно из сырого датасета. Поэтому характеристику связности можно вычислить двумя принципиально разными подходами.


Подход 1 — Model-free (без модели)
Вместо KL-дивергенции используют суррогатные статистические меры, которые отражают ту же природу зависимости, но без необходимости обучать модель.

Связность существования (самый простой случай)
Считается напрямую — это взаимная информация $I(x_i,y)$:

$S_{exist}(i) \approx I(x_i,y) = H(y) - H(y \mid x_i)$

В дискретном случае считается точно, в непрерывном — через оценки плотности или MINE (mutual information neural estimator). Это и есть то, что делают filter-методы отбора признаков (chi-square, information gain).

Связность значения (непрерывный вариант)
Суррогат — дисперсия $y$ при фиксированном диапазоне $x_i$. При малом $\varepsilon$ смотрят, насколько $y$ меняется внутри окрестности $[x_i, x_i + \varepsilon]$:

$S_{\text{val}}(\varepsilon) \approx \mathbb{E}_{x_i}\left[\,\text{Var}\bigl(y \mid x_i \in [x_i,\, x_i + \varepsilon]\bigr)\right]$

Это считается через скользящее окно по $x_i$. Аналог — локальная дисперсия целевой переменной.

Связность порядка (дискретный вариант)
Для каждой пары объектов в датасете — эффект shuffle: берётся подвыборка, в ней переставляются элементы на расстояние Кендалла $k$, и измеряется изменение какой-либо статистики $y$. Суррогат — ранговая корреляция Кендалла/Спирмена между порядком признаков и целевой переменной:

$\bar{S}_{\text{ord}}(k) \approx 1 -r_{Kendall}(\pi^{(k)}(x), x)$

где $\pi^{(k)}$ — случайная перестановка с расстоянием $k$ от тождественной.


Подход 2 — Model-based (с обученной моделью)
После обучения модели $\tilde{f}(x)$ формула становится вычислимой напрямую через эмпирическую оценку:

$\hat{S}(\delta) = \frac{1}{N}\sum_{i=1}^{N} \left[\hat{f}(x^{(i)}) - \hat{f}(\delta(x^{(i)}))\right]^2$ — квадратичная аппроксимация KL-дивергенции при малых возмущениях. Это именно то, что делает permutation importance (связность существования) и sensitivity analysis (связность значения).


Итог
Model-free первично — до обучения, для выбора архитектуры и понимания типа данных. Считается быстро, не требует GPU.
Model-based уточняет — после обучения, для аудита модели и верификации, что она действительно «уважает» нужные связности.
Сравниваем два результата — если model-free и model-based сильно расходятся, модель либо не доучилась, либо переучилась под артефакты данных.

-- добавлено через 52 минуты --

mihaild в сообщении #1724941 писал(а):
Во всех ваших примерах, "типы" - это просто следствие архитектуры. Нейронка - это композиция функций, зависящих от входа и весов, сами функции задаются при построении сети, и не меняются. И ваши "типы" - это именно характеристика функции.

После прочтения параграфа 3 становится всё-таки понятным, что входные данные в рамках model-free-подхода определяют архитектуру нейросети (функцию), а не наоборот. А в model-based-подходе функция верифицируется. Всё наоборот, не так, как вы говорите.

-- добавлено через 50 минут --

Семинар: Примеры искажений в данных

Введение: природа искажений
Искажение в датасете — это любое отклонение данных от «идеального» процесса генерации, при котором информация о целевой переменной сохраняется полностью. Через призму теории связности: искажения — это неконтролируемые возмущения $\delta(x)$, которые либо нарушают связность значения, либо нарушают связность порядка, либо уничтожают связность существования.

Ключевое различие для ML-инженера — три вида возмущений. Случайное (шум) возникает из физики измерения и нарушает связность значения. Систематическое (смещение) возникает из условий сбора и нарушает распределение выборки. Структурное (свобода) возникает из природы самих данных и проявляется как законная вариативность связности порядка.

Часть I. Искажения в датасетах изображений
1.1 Качество оборудования
Некачественный фотоаппарат (смартфон начального уровня, веб-камера) вносит несколько видов искажений одновременно. Шум матрицы — случайные отклонения яркости пикселей, особенно при низкой освещённости — нарушает связность значения: пиксель содержит значение, но оно смещено от истинного. Хроматические аберрации дают цветовые ореолы на границах объектов и также нарушают связность значения локально. Дисторсия объектива — геометрическое искажение формы — нарушает связность порядка: пиксель оказывается не на своей позиции. Размытие из-за нерезкости действует как low-pass фильтрация и ослабляет связность существования высокочастотных признаков (края, текстуры). Виньетирование — затемнение краёв кадра — вносит систематическое искажение яркости, зависящее от позиции пикселя.

Качественный фотоаппарат (зеркальная или беззеркальная камера) минимизирует большинство из перечисленных искажений даже при высоких значениях ISO. Однако он вносит собственные артефакты: резкое размытие фона (боке) может удалять признаки объектов второго плана и является намеренным искажением связности существования.

Датасет, собранный на разном оборудовании, имеет смешанное распределение — часть объектов содержит шум матрицы, часть нет. Модель, обученная на «чистых» изображениях, деградирует на «грязных» и наоборот. Это классический domain shift.

1.2 Навыки фотографа
Фотограф-любитель вносит прежде всего искажения связности порядка. Смаз (motion blur) размазывает пиксель по траектории движения — его истинная позиция становится неопределённой. Расфокус разрушает связность существования деталей объекта. Неправильная экспозиция полностью разрушает связность значения в переэкспонированных (выбитых в белый) и недоэкспонированных (провалах в чёрный) зонах. Произвольный угол съёмки — объект повёрнут, наклонён, снят сбоку — является законной вариативностью, а не ошибкой, но существенно расширяет распределение.

Фотограф-профессионал контролирует освещение, фокус и выдержку, однако вносит стилистические предпочтения: цветовая обработка и пресеты в Lightroom или Photoshop систематически смещают распределение цветов относительно «натурального». Это управляемое искажение, часто неотличимое от естественного по виду, но хорошо различимое статистически.

Любительские датасеты имеют высокую вариативность (широкое окно $W$ по пространственным признакам), профессиональные — систематическое смещение по цвету и стилю.

1.3 Алгоритм сжатия
JPEG работает блоками 8×8 пикселей через дискретное косинусное преобразование. Блочные артефакты появляются на границах блоков в виде видимых ступенек — это структурное искажение: нарушение связности значения строго на позициях, кратных 8. Размытие высоких частот возникает из-за грубого квантования высокочастотных коэффициентов DCT — мелкие детали теряются, связность существования текстурных признаков разрушается. Ореолы (ringing) — артефакт Гиббса — проявляются на резких границах. Степень всех этих искажений задаётся параметром качества Q от 1 до 100: при Q < 50 артефакты становятся доминирующим признаком изображения.

PNG, TIFF, RAW сохраняют связность значения идеально. Однако RAW требует демозаики — интерполяции цветов по матрице Байера, что вносит алгоритмическое размытие и цветовые артефакты на мелких деталях.

WebP и AVIF дают меньше артефактов при том же размере файла, но исторические датасеты (ImageNet, COCO) собирались в эпоху JPEG и содержат его артефакты как часть распределения. Модель неосознанно учится на артефактах JPEG как на «признаках» — это частично объясняет adversarial examples, которые эксплуатируют именно эти структурные артефакты.

Часть II. Искажения в датасетах текстов
2.1 Структурные особенности языка и размер окна
Английский язык имеет жёсткий порядок слов. Порядок SVO (Subject → Verb → Object) соблюдается почти без исключений, прилагательное всегда стоит перед существительным («red car», не «car red»), вспомогательный глагол позиционно фиксирован. Перестановка слов в английском предложении почти всегда разрушает грамматику и смысл. Это означает высокую связность порядка: кривая $S_{ord}(k)$ резко растёт уже при $k=1...2$. Соответственно, окно $W$ для английского текста должно быть малым — модели типа RNN с короткой памятью или трансформеры с локальным вниманием (Longformer, BigBird) справляются с задачей. Аугментация перестановкой слов в английском датасете недопустима — это разрушительное возмущение.

Русский язык имеет свободный порядок слов. «Кот ест рыбу», «Рыбу ест кот» и «Ест кот рыбу» — все варианты грамматически корректны, поскольку падежные окончания несут информацию о роли слова. Информация о синтаксической роли закодирована в суффиксе (связность значения морфем — полная), а не в позиции (связность порядка — слабая). Кривая $S_{ord}(k)$ для русского текста на уровне слов пологая — далёкие перестановки допустимы без потери смысла. Это означает широкое окно $W$: модели должны учитывать дальние зависимости, и трансформер с полным self-attention здесь предпочтительнее, чем свёрточная модель с малым ядром.

Отсюда следует принципиальный практический вывод: размер окна нельзя выбирать одинаково для разных языков. Для английского достаточно receptive field в 5–10 токенов для большинства синтаксических конструкций. Для русского необходим receptive field, покрывающий всё предложение, поскольку согласующиеся члены предложения могут находиться на произвольном расстоянии. Shuffle-аугментация на уровне слов законна для русского (слабая связность порядка) и разрушительна для английского (высокая связность порядка). Аугментация на уровне морфем, напротив, разрушительна для обоих языков — связность значения морфем везде полная.

2.2 Ручной набор текста
Типичные искажения при наборе с клавиатуры образуют несколько классов. Опечатки — замена символа на соседний по клавиатуре («teh» вместо «the», «привте» вместо «привет») — нарушают связность значения символа. Пропуск букв («prblm» вместо «problem») нарушает связность существования. Дублирование («helllo») вносит лишний элемент и также нарушает связность существования. Транспозиция («hte» вместо «the») нарушает связность порядка при расстоянии Кендалла $k=1$. Переключение раскладки («ghbdtn» вместо «привет») полностью разрушает связность значения. Автозамена исправляет опечатки, но систематически заменяет редкие слова на частые, внося семантическое смещение.

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

2.3 Автоматическая генерация текста
Машинный перевод по определению не содержит клавиатурных опечаток — генерация идёт через модель без участия пальцев. Однако он вносит систематические искажения другой природы: буквализм при переводе идиом («kick the bucket» → «пнуть ведро»), галлюцинации нейронного переводчика — вставка слов, которых нет в оригинале, выравнивание стиля всех текстов в нейтральный регистр, а также систематические ошибки падежного согласования в языках с развитой морфологией.

OCR (распознавание текста с изображений) имеет специфический паттерн ошибок: замены визуально похожих символов («0» ↔ «O», «l» ↔ «1» ↔ «I», «rn» ↔ «m»). Ошибки кластеризованы на низкоконтрастных участках изображения. Клавиатурных опечаток («соседние клавиши») нет — распределение искажений принципиально другое.

ASR (автоматическая транскрипция речи) вносит омофонические замены («their» ↔ «there» ↔ «they're»), ошибки на границах слов («a name» → «an aim»), а также полностью убирает пунктуацию — связность существования знаков препинания разрушена целиком.

Краулинг веба (Common Crawl, Wikipedia) вносит HTML-артефакты, смешение языков в одном документе и дублированный контент. Все три проблемы нарушают связность существования на уровне документа.

Часть III. Практические выводы
Определяйте источник данных до выбора аугментаций. Аугментация случайным шумом корректна для датасетов с шумом матрицы, но бессмысленна для датасетов OCR, где паттерн ошибок совершенно другой.

Смешение источников — это domain shift, а не просто «больше данных». Фотографии со смартфонов и зеркальных камер имеют разные распределения. Наивное объединение даёт модель, которая хуже работает на каждом из источников по отдельности.

Размер окна $W$ выбирается под конкретный язык, а не под задачу. Для английского текста малое окно (5–10 токенов) покрывает большинство синтаксических зависимостей. Для русского окно должно охватывать всё предложение — иначе модель не видит согласующиеся морфемы, разнесённые на произвольное расстояние. Это означает, что Conv1D с малым ядром — плохой выбор для русского NLP, а трансформер с полным вниманием — правильный.

Структурная свобода языка — это не шум, это свойство ML-типа. Shuffle-аугментация законна для русского текста на уровне слов и разрушительна для английского. Применять одну и ту же аугментационную стратегию к обоим языкам — грубая ошибка экспертизы данных.

Отсутствие одного вида искажений не означает чистоту данных. Машинный перевод не имеет клавиатурных опечаток, но систематически искажает семантику. Модель, обученная на MT-данных и тестируемая на живом тексте, столкнётся с covariate shift другой природы.

Характеристика связности искажения важнее его амплитуды. Маленький блочный артефакт JPEG (амплитуда мала) может быть более разрушительным для модели, чем большой случайный шум — потому что он структурирован и позиционно зависим, то есть нарушает связность порядка, а не только значения.

 Re: Типизация (натурализация) данных в ML
Основы экспертизы данных в ML. Параграф №0. Введение.

Экспертиза данных - это работа с метаданными, то есть с данными, которые не содержатся в датасете в явном виде.

Например,

1. Тензор датасета - это всегда упорядоченный набор примеров и признаков в примерах. Каждый пример и каждый признак пронумерован - за это отвечают индексы тензора. Нужно знать, какой индекс нумерует примеры, а какой - признаки. Ещё есть индекс батча, индекс последовательности (sequence). Сам тензор о себе ничего не рассказывает, поэтому понимание, какая размерность у тензора, за что отвечает каждое измерение (dimension) - метаданные - без этого не выбрать архитектуру нейросети, которая бы успешно работала. Работа с размерностями входных данных - это базовая операция экспертизы данных.
Если вы понимаете, что порядок неважен (bag of someMLtype), то без ущерба перемешаете примеры (shuffle). Если же таких метаданных нет, то возникает опасность неправильно обработать данные. Эти метаданные чертовски нужны!
Нас с первой лекции по ML учат - "Перемешайте примеры, это улучшит метрики!". Мы интуитивно понимаем, что да, это нужно. Хотя может и не все знают и понимают... но для нас написаны классы Dataset, Dataloader, которые делают всю работу на автомате.

2. Если вы понимаете, что данные имеют тип seq (sequence), то сразу в голову лезут свëрточные слои Conv или авторегрессионные модели RNN, LSTM или трансформеры. Сам по себе тензор датасета не содержит информации об ML-типах данных. Это надо либо изначально понимать, либо провести разведку датасета, чтобы понять тип. (Оценка связности признаков в помощь - параграфы 2 и 3.)

3. Нас просто учат: "Замени пропуски NaN на 0.0!". На самом деле имеет место связность значений NaN и 0.0 (на самом ли деле значения близки?). Мы просто делаем эту работу механически. Очистили данные, обучили модель. Это неглубокое понимание вопроса.

---------------
Экспертиза данных подразумевает исследование датасета с целью последующей качественной обработки и подбора нейросетевых архитектурных решений.

 [ Сообщений: 14 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group