В 1906 Нобелевскую премию по физике получил Дж. Томсон за эксперименты, доказавшие, что электроны являются частицами. В 1937 Нобелевскую премию получил его сын за доказательство того, что электроны являются волнами. Возможность быть то волной, то частицей объясняется принципом неопределённости Гейзенберга: ΔxΔp≥ħ/2. Это фундаментальный кирпичик квантовой физики, но математический смысл неравенства просто в том, что любые две величины, связанные преобразованием Фурье не могут быть одновременно измерены с бесконечной точностью. Некоторые исследователи полагают что аналог принципа неопределённости существует и в ML. Тут считают что это, проявляется в балансе обобщения и интерпретируемости: чем лучше модель обобщает зависимости в данных, тем менее она интерпретируема. Но в статье 2022 года интересно показывается соответствие между терминами ML и квантовой физики на примере атаки на сети. Так нормированный по X лосс обученной модели становится волновой функцией (в квантовой физике волновая функция описывает все что происходит с системой), сам X - становится координатой, а градиент лосса по X - импульсом (по аналогии с квантовым оператором импульса). В атаке на сети мы просто обновляем X вдоль градиента лосса по X, но оказывается что между дисперсиями этих величин (X и dLoss(f(X),Y)/dX) возникает ограничение идентичное принципу неопределённости. Допускаю что если вместо X взять веса модели и градиент по ним, то принцип неопределённости также выполнится. Интересно, найдет ли кто-нибудь аналог кота Шредингера, запутанных частиц или квантового туннелирования в ML.
🔥6
This media is not supported in your browser
VIEW IN TELEGRAM
Свернул салфетку Серпинского. Базовую версию этого фрактала легко отрисовать с помощью клеточного автомата Правило 90 (он же просто XOR), а далее обычное преобразование в полярные координаты.
Градиентный спуск стоит в центре всего машинного обучения, но кроме взятия производной порядка 1,2,3,... можно взять производную любой не целой степени. Есть множество способов как это сделать, и каждый для целых порядков дает одинаковый результат, но для дробных может отличаться (я считал через преобразование Фурье). Как при этом меняется градиентный спуск?
Градиентный спуск нулевого порядка - это классический метод простой итерации, который ищет корень функции (производная нулевой степени оставляет саму функцию как есть). Градиентный спуск первого порядка ищет локальный минимум, а градиентный спуск дробного порядка должен сходиться где-то между ними (так и есть, но чаще он жутко не устойчив). Ниже показаны три итерационных процесса из одной точки, заданных производными степени 0, 1 и 1/2.
Регуляризация — верный способ борьбы с переобучением модели, и чаще всего используем L1, L2 или их комбинацию. Почему именно их, а не L0, L1.5 или L4? Если коротко, то L1 и L2 это превосходный баланс между простотой и результатом. L2-регуляризация добавляет к функции ошибки (лоссу) штраф, который зависит от суммы квадратов параметров модели. Это делает функцию выпуклой с линейными градиентами и простой в оптимизации. В случае с L4 градиенты для больших параметров очень велики, а около нуля почти затухают, что сильно замедляет градиентный спуск. L1-регуляризация штрафует за сумму модулей коэффициентов модели, которые обновляются довольно быстро с помощью покоординатного спуска, по пути зануляя "неважные" параметры. Вырожденные формы регуляризация вроде L0 или L∞ на практике мало полезны, так как L0 штрафует просто за количество ненулевых параметров, а L∞ — только за самый большой параметр модели. Что касается L1.5, то выигрыш от него примерно такой же, как просто от часто применяемой линейной комбинации L1 и L2.
А может быть степень регуляризации комплексной - L(p+j*q)? Да, но в общем случае это ведет к комплексным коэффициентам модели X*a = y. Что бы этого избежать и оставить коэффициенты и лосс только вещественными, можно их проквантовать: т.к. |a[i]|^(p+jq) = |a[i]|^p * (cos(q*log(|a[i]|)) + j*sin(q*log(|a[i]|)), то при q*log(|a[i]|) = 2*pi*n (n - целое число), получаем: |a[i]|^(p+j*q) = |a[i]|^p. С одной стороны можно также использовать градиентный спуск для указания направления уменьшения ошибки, с другой все коэффициенты модели квантуются и a∊{±exp(2*pi*n/q)}.
Я использовал датасет для предсказания популярности (измеряется от 0 до 100) англоязычных песен на spotify за последние 5 лет по их музыкальным характеристикам. Перебирая различные p и q для L(p+j*q) на графике показана ошибка линейной регрессии. Тут видно, что при должном усердии для любых p можно получить схожие результаты, но качество резко меняется при росте мнимой части - q, за счет того, что ±exp(2*pi*n/q) лежат чаще друг к другу при росте q.
Выбросы — это точки, которые не следуют общей тенденции, какой бы она ни была. Что считать тенденцией зависит от задачи, но поиск таких точек в многомерном пространстве часто сводится к применению Isolation Forest, Local Outlier Factor, KNN или DBSCAN. Сюда же можно добавить дешевый и эффективный PCA, смысл использования которого, в том, что чем больше требуется компонент для восстановления точки из сжатого представления в исходное с заданной точностью, тем более аномальной является точка (классический PCA чувствителен к выбросам, поэтому лучше взять его устойчивые аналоги - robust PCA). В предыдущем посте я брал датасет англоязычных песен на Spotify за 5 лет, тут воспользовался им снова. По музыкальным характеристикам треков оценил минимально количество компонент PCA для реконструкции фичей каждого трека с фиксированной погрешностью, и усреднил их количество по каждому исполнителю. Также усреднил популярность.
🔥4
На вершине популярности Adele, Black Eyed Peas (хотя последние пару лет про них не слышно) и конечно Taylor Swift. Композиции Adele по своим музыкальным характеристикам гораздо аномальнее и заметнее чем у Black Eyed Peas или Taylor Swift, которые расположены левее. В правой части графика диджеи и композиторы (например Ramin Djawadi: «Железный человек», «Игра престолов», «Проблема трёх тел» и т.д.), чьи треки заметно отличаются от популярной музыки. Среди известных артистов заметна небольшая тенденция - чем популярнее исполнитель, тем сложнее отличить его треки от всех остальных (что из этого причина, а что следствие не известно).
👍2
Если нужна корреляция между бинарной и непрерывной переменными, часто используют Point Biserial коэффициент (то же, что корреляция Пирсона), но на stackexchange кто-то предложил попробовать для этого ROCAUC, я попробовал и это выглядит круто. Суть: последовательно перебираем пороговые значения непрерывной переменной (размечая 0/1 для меньше/больше порога), сравниваем бинарную переменную с полученными выше 0/1, строим ROC и считаем AUC. В качестве наглядного примера для этого метода я взял ответы из опроса stackoverflow для бинарной переменной, и количество лет опыта кодинга для непрерывной. При этом, если ROCAUC > 0.5, то опыт положительно коррелирует с выбранным пунктом, и преимущественно относится к опытным/возрастным разработчикам. Если ROCAUC < 0.5, то опыт отрицательно коррелирует с выбранным пунктом, и чаще замечен среди начинающих/молодых разработчиков.
✍2🔥1
Тут много картинок, но коротко отличия между этими группами такие: начинающие только учат код, либо для них это хобби, опытные работают/работали разработчиками. Образование начинающих - школа, опытных - некоторая степень. Начинающие предпочитают учиться кодингу на онлайн курсах/буткемпах, опытные - у коллег, на работе или по книгам. Также среди разработчиков с опытом в ответах на вопросы об их роли чаще фигурируют Embedded/devices, R&D, Desktop/enterprise, Manager и Senior Executive, а среди начинающих - Student, Front-end, Data/business analyst, DS/ML, Mobile. Также из интересного: AI-tools почти все отрицательно коррелируют с количеством лет опыта кодинга.
🔥1