Хроники ботки
622 subscribers
45 photos
1 video
5 files
55 links
Пишу интересные вещи, с которыми сталкиваюсь по работе над диссером (обобщение keypoints detection с помощью дифференциальной геометрии) и работой над работой (ML и матстат в основном)
Вопросы и т.п. писать в чат или @shpacman
Download Telegram
Хроники ботки
Прошлым летом основательно изучил книгу The Elements of Statistical Learning (скачать можно здесь https://hastie.su.domains/ElemStatLearn/) Моё мнение - лучшая (одна из лучших) книга по классическому ML, несмотря на год выпуска. Системное и математичное…
Таблица про то, какие функции минимизируют разные лоссы, если минимизировать лосс по всему распределению данных. Видно что, лосс как в SVM - hinge LOSS - "задаёт" разделяющую границу между классами, в отличие от остальных лоссов, которые "задают" функции от вероятностей классов. Поэтому, если цель именно двухклассовая классификация, и вероятности классов не нужны, то hinge loss может быть оптимален
Всегда казалась путанной и непонятной формулировка SGD с моментом Нестерова. Сделал простой вывод альтернативной формулировки, в которой, как мне кажется, и сам алгоритм нагляднее, и лучше видна его разница с обычным SGD с моментом.
Сам вывод:
Forwarded from DLStories
В MIT исследовали феномен гроккинга (grokking) и, кажется, нашли этому эффекту правдоводобное объяснение
#paper

Grokking — это эффект, при котором уже после стадии переобучения модели (при возрастающем test лоссе и падаюшем train) при дальнейшем обучении test loss вдруг начинает падать, и сеть лучше генерализуется. Такой эффект наблюдали уже давно (например, вот тут), но, чаще всего, на малых, “игрушечных” датасетах (например, на такой простой задаче как сложение чисел). Никакого сильно убедительного объяснения эффекту не было (насколько я знаю), а также не удавалось повторить эффект на реальных, не игрушечных данных.

Ребята из MIT подошли ближе к пониманию природы grokking’а и даже смогли воспроизвести эффект на разных больших датасетах.

Авторы связывают эффект гроккинга с устройством поверхности лосс-функции. В недавней работе из Стенфорда было показано, что у этой поверхности существует сферическая область, в которой достигается оптимальная генерализация модели: то есть, для модели с параметрами из этой области train и test loss малы, переобучения при этом не наблюдается. Эту сферическую область ребята из Стенфорда назвали Goldilocks zone (“зона Златовласки”, показана на картинке зеленым). Так как область сферическая, она соответствует параметрам модели с определенной нормой. Внутренность это сферической области соответствует параметрам с меньшем нормой, область вне сферы — параметрам с большей нормой.

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

Далее происходит следующее: если у модели нет никакой регуляризации (weight decay, к примеру), то на этом обучение модели заканчивается. Лосс не выходит из точки минимума, grokking не наблюдается, переобучение остается. Но если к модели применяется регуляризация, это выталкивает веса модели из локального минимума, и они начинают стремиться к зоне Златовласки. Обычно регуляризация применяется не очень сильная, поэтому проходит довольно много эпох обучения, прежде чем веса модели достигают точки внутри зоны Goldilocks и модель начинает генерализоваться. Это и объясняет эффект гроккинга: когда через достаточно долгое время после переобучения лосс на тесте вдруг падает и модель начинает лучше обобщаться.

Кстати, если у модели регуляризация довольно сильная, grokking’а тоже не будет: веса модели будут сразу быстро приходить внутрь зоны Златовласки, не задерживаясь в локальном минимуме вне сферы. Модель просто сразу достаточно хорошо генерализуется.

Теперь, почему grokking часто наблюдают на “игрушечных” датасетах, и почти никогда — на реальных. Во-первых, обычно веса любых нейросетей инициализируют значениями с довольно малой нормой, т.е. лежащими внутри зоны Златовласки. Однако на суперпростых датасетах при обучении модели наблюдается более быстрое увеличение нормы весов, потому что градиентный спуск быстрее выталкивает веса модели в локальную точку минимума трейн лосса сильно за пределами сферы. При обучении больших моделей этот эффект не такой сильный, и веса нечасто выходят за пределы зоны Златовласки вообще, и grokking не наблюдается.

Чтобы подтвердить гипотезу об описанном происхождении гроккина, исследователи обучили несколько моделей для разных задач CV и NLP с разными нормами весов. Оказалось, что увеличение нормы весов действительно приводит к возникновению эффекта grokking’а, пусть все же и не настолько выраженно, как на более простых датасетах.

Подробнее читайте в статье
Изначально новость нашла тут
Forwarded from DLStories
Мысли про Adam как аппроксимацию методов оптимизации второго порядка

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

Посмотрим на вектор сдвига в Адаме. Его можно представить как градиент лосса, умноженный на обращенную диагональную матрицу, по диагонали которой стоят накопленные вторые моменты производной лосса по каждому параметру.

Накопленные вторые моменты производных от параметров нейросетки - это диагональные элементы матрицы Фишера https://www.statlect.com/glossary/information-matrix (ну или их некоторая аппроксимация, тк интеграл посчитать не можем) - потому что лосс - это функция правдоподобия. Поэтому эту диагональную матрицу можно считать диагональной аппроксимацией матрицы Фишера.

Получается, что мы двигаемся по градиенту, умноженному на диагональную аппроксимацию обратной матрицы Фишера

А матрица Фишера возле максимумов правдоподобия близка к Гессиану правдоподобия, т.е. к Гессиану лосса. Получается, что сама матрица Фишера, в свою очередь, является аппроксимацией Гессиана лосса.

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

Есть ещё моментики с тем, что в Адаме в знаменателе стоит квадратный корень, а в методе Ньютона его нет. Но наверно это можно как то объяснить с точки зрения аппроксимации матриц.

Более подробно (но все ещё популярно) про методы второго порядка и связь Адама с ними - https://physicsbaseddeeplearning.org/overview-optconv.html

Очень подробно про использование матрицы Фишера вместо Гессиана с оптимизаторах (и в том числе про связь с Адамом) - https://arxiv.org/abs/1412.1193

Про квадратный корень в знаменателе - подробно разбирает статья про Adagrad https://jmlr.org/papers/v12/duchi11a.html
Иллюстрация, зачем вообще нужен метод второго порядка, и чем плох обычный градиентный спуск. Метод Ньютона двигался бы все время по вектору, направленному к минимуму. Как видно, градиент даёт довольно плохое приближение нужного вектора сдвига, а Адам уже ближе к истине.
Трансформеры - это (почти) сверточная сеть с адаптивными весами.

Я тут понял, как трансформеры связаны со сверточными сетями, как можно посмотреть на архитектуру трансформеров через призму сверточных сетей.. От меня это всегда как то ускользало за тем, как обычно записывается механизм attention.

Если проводить аналогии, то позиция слова в последовательности - это координата пикселя. Эмбединг слова - это цвет/фича пикселя.

Self-attention - это свертка с ядром, веса которого задаются "сходством" (скалярным произведением) фичи пикселя (эмбединга слова) с соседними пикселями (словами). Веса ядра одинаковые для каждой координаты фичи (эмбединга), и ядро применяется независимо к каждой координате фичи (эмбедингов). Получается, что self-attention - это depthwise spatial свертка (https://paperswithcode.com/method/depthwise-convolution) с адаптивными весами.

Дальше feedforward network, состоящая из нескольких полносвязных слоев, применяется независимо к фиче каждого пикселя (эмбедингу каждого слова). Если бы полносвязный слой был один, то что такое применение одного полносязного слоя независимо каждой spatial позиции? Это то же самое, что и применение N 1х1 сверток, где N - размерность выхода слоя, pointwise convolution (https://paperswithcode.com/method/pointwise-convolution)

В итоге применение self-attention + feedforward network можно (примерно) представить как композицию depthwise spatial  фильтра с адаптивными весами и чисто 1х1 фильтра с неадаптивными весами. А это separable свертка (https://github.com/christianversloot/machine-learning-articles/blob/main/understanding-separable-convolutions.md), которая давно используется в сверточных сетях для ускорения вычислений и регуляризации.

В чем отличие? 1) в сверточных сетях веса не адаптивные 2) feedforward network состоит больше, чем из одного полносвязного слоя, что превращает 1х1 фильтры в нелинейные - но не сильно не линейные,тк слоев обычно всего 2. 3) в сверточных сетях batch norm обычно внутри residual ветки, а в трансформерах layer norm стоит после residual связи.

Фильтры с адаптивными весами, кстати, активно применялись в обработке изображений до нейросеток - если кто помнит, была такая билатеральная фильтрация изображений, где вес элемента ядра свертки умножался дополнительно на exp(-norm(f(x) - f(y)) ^2/sigma^2). В self-attention же веса exp(<f(x), f(y) >) - для нормализованных эмбедингов разница несильная.
👨‍🔬 Александр Червов "МЛ/РЛ подходы к задачам теории групп/графов"
⌚️ Пятница, 1 марта, 19.00 (по Москве)

По любой группе (набору матриц или перестановок) легко строится граф (Кэли) - вершины вектора, между v,w есть ребро, если существует "M" из нашего набора, такое что v = Mw . Такие графы краеугольный камень современной математики - известная теорема Громова - о том, что если "рост" (то есть набор чисел $g_i$ - количество вершин на расстоянии "i") - растет экспоненциально по i - то группа далека от коммутативной, а если полиномиально - то группа близка к коммутативной, то есть граф близок к решетке.

Возможно, это имеет прямое отношение к эмбедингам графов - графы с экпоненциальным ростом лучше вкладывать в гиперболические пространства, а с полиномиальным ростом - в обычное R^n. Но правда ли это ? и что значит "лучше" ?

Но, Громов - бесконечные группы, нужны конечные. В ситуации "попроще" (там где рост НЕ экспоненциален) - "рост" иногда хорошо приближается нормальным гауссовым "колокольчиком" (см. мои гипотезы на матоферлоу). "Хороший" эмбединг - должен "уважать" метрики - метрика на графе - длина кратчайшего пути - метрика в эмбединге - расстояние евликдово или гиперболическое. "Хороший" эмбединг должен не сильно искажать эти метрики. А значит гауссово распределение должно сохраняться и после эмбедингов. А сохраняют ли его современные пакеты эмбедингов - node2vec, DeepWalk ... ? Науке не известно, но мы можем это поизучать - сделать бенчмарк эмебедингов графов. А как правильно думать об эмбедингах графов с экспоенциальным ростом - вот вопрос - пока не понятно - но что-ть придумаем.

Другая тема - всем интересна оценка диаметров ("числа Бога") - где крайняя точка на графике роста - или какое самое большое расстояние на графе , или на языке кубиков - за сколько шагов можно точно собрать кубик из любого положения ? Науке тут тоже многое не известно.

О докладчике: к.ф.-м.н А.Червов, Институт Кюри, Париж. Scholar, Kaggle, попутно создатель Сберлог)

Zoom link in @sberlogabig before start.
Базированная модель, часть 1
или почему RWKV/Mamba/RetNet не работали, но заработают.

Есть такая группа в Стэнфорде, HazyResearch. Это они сделали первые SSM (state space models) моделии их современные версии (H3, Hyena). Ну и всякие мелочи вроде FlashAttention.

На этот раз ребята начали с того, что обучили трансформеры / H3 / Hyena / RWKV не очень больших одинаковых размеров на 10B токенах из The Pile. Трансформеры выиграли! 🤔

Возникает два вопроса: "кто виноват?" и "что делать?". На первый вопрос отвечает Zoology, на второй вопрос отвечает Based.

Кто виноват?
Zoology: Measuring and Improving Recall in Efficient Language Models, статья, пост 1, пост 2.

А виноваты оказались... повторяющиеся N-граммы 🤨
То есть словосочетания, которые уже встречались в контексте. Ну, не все, только достаточно редкие, потому что частотные N-граммы любая модель хорошо запоминает. Пример такого редкого словосочетания: фамилия и имя какого-то человека, которые несколько раз встречаются в одном документе, и никогда больше не встречаются в обучающем корпусе.

Предсказание последнего токена такой повторяющейся N-граммы и вызывает трудности у моделей без внимания. В статье такие токены называют associatve recall hits, AR hits, и по ним отдельно считают перплексию. Для Гиены и RWKV разница перплексии на этих токенах полностью покрывает разницу в общей перплексии.

Самое забавное, что мы уже такое видели несколькими постами ранее, тут. Хронологически "Repeat After Me" вышла двумя месяцами позже, но эту статью они явно не читали, иначе бы их статья скорее всего не вышла бы 😂

Теперь можно сформулировать, какая задача мешает не-трансформерам захватить мир. Задача называется multi-query associative recall (MQAR), и заключается она в поиске нескольких "иголок". Упрощенно она выглядит так:

Вход:
A 4 B 3 C 6 F 1 E 2

Запрос:
A ? C ? F ? E ? B ?

Ожидаемый выход:
4 6 1 2 3


В предыдущих работах показывали, что "одноиголочная" версия задачи вполне решается всеми моделями, но вот случае языкового моделирования этого недостаточно. В реальных текстах повторяющиеся N-граммы встречаются часто, и обычно больше одной за раз: вот например только что "повторяющиеся N-граммы" повторились. И ещё раз 🤣

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

Есть и намёки, как это исправить! Нужно всего лишь добавить капельку внимания, то есть делать гибриды 😂
Однако ж нам не нужна полная маска внимания, и мы можем либо точечно влиять на AR hits ("programmatic selection" метод в статье), либо на основе входов предсказывать, для каких k токенов нужно включить внимание. Втыкают 3 слоя внимания на 6% параметров, и этого достаточно, чтобы добить бОльшую часть перплексии.

И наконец, 30 страниц доказательств! 😱
Что вообще доказывают:
- Обзывают все используемые в статье не-трансформерные модели вентильными свёртками (gated convolutions).
- Вводят архитектурный блок BaseConv: y = linear(x) ⊙ conv(h, x), где x - вход, y - выход, ⊙ - покомпонентное произведение, h - обучаемый фильтр.
- Доказывают эквивалентность между Гиеной и BaseConv в смысле симуляции за константное количество слоёв.
- Доказывают, что BaseConv может симулировать арифметические схемы, то есть вычислять многочлены.
- Доказывают эквивалентность между RetNet и BaseConv, в которой BaseConv нужно в log(d) раз больше слоёв.
- Выводят теоретическую оценку сложности для BaseConv на нашей задаче, MQAR, через построение алгоритма с параллельным бинпоиском и оценку его сложности.

К сожалению, я не слишком хорош в математике, чтобы всё это нормально осознать.

Вывод
RWKV не работает, совсем без внимания никак, гибриды победят, синтетические бенчмарки рулят.

Второй пост будет, и будет про непосредственно Based.
Please open Telegram to view this post
VIEW IN TELEGRAM
Сопроводительные материалы к посту ниже.

Картинка 1: финальные результаты: проклятые трансформеры опять победили по качеству, но проиграли по скорости

Картинка 2: размер памяти на точность вспоминания (картинка с нормальными осями есть в самой статье)

Картинка 3: иллюстрация про совмещение нескольких типов слоёв

Картинка 4: скорость наше всё
Базированная модель, часть 2

Первая часть: ссылка. В ней мы определили основную проблему не-трансформерных моделей: запоминание повторяющихся N-грамм. Остался второй вопрос...

Что делать?
Simple linear attention language models balance the recall-throughput tradeoff, статья, пост 1, пост 2, твиттер, репо.

В этой статье авторы представляют новую архитектуру под названием Based, которая (как обычно) должна заменить трансформеры.

Для начала, напомню: основная цель большинства не-трансформеров сделать быстрее при том же качестве. В этой и прошлой статье у трансформеров лучше перплексия. Единственное место, где это не так — первый пост про Based. Кажется, они замерили там некорректные числа, но к выпуску основной статьи исправились 💀
Ещё раз: за исключением первого старого поста со старыми числами, здесь нигде не заявляется превосходство по перплексии над трансформерами. Зато заявляется превосходство по пропускной способности и скорости генерации, даже против FlashAttention-2 😳

У Based есть 3 типа слоёв, смешивающих эмеддинги токенов:
- BaseConv из предыдущего поста
- Линейное внимание
- Полное внимание на маленьком скользящем окне
В одном слое только один конкретный смеситель, например в первом слое линейное внимание, во втором скользящее окно, в третьем BaseConv, и так далее.
Кроме смесителей по токенам есть и стандартные MLP для смешивания каналов, одинаковые для каждого типа слоёв.

Что за линейное внимание? Сама концепция не нова: убираем софтмакс и получаем рекуррентную форму. Софтмакс убираем через аппроксимацию exp(qk) через ряд Тейлора до второго порядка малости: 1 + qk + (qk)^2 / 2. Подробнее об этом написано в другой статье, но тут всё равно показывают, что другие варианты аппроксимаций хуже.

Псевдокод вычисления:
qk0 = [1]

# Считаем слагаемые от q
q_first = [q1, ..., qd] # q
q_second = [q1 * q1, ..., q1 * qd, ..., qd * q1, ... qd * qd] # qq^T
q_new = cat(qk0, q_first, q_second / sqrt(2))

# Считаем слагаемые от k
k_first = [k1, ..., kd] # k
k_second = [k1 * k1, ..., k1 * kd, ..., kd * k1, ... kd * kd] # kk^T
k_new = cat(qk0, k_first, k_second / sqrt(2))

# Разложение экспоненты до второго порядка малости: 1 + qk + (qk)^2 / 2
y = (q_new * k_new).sum()
Мотивация добавления чего-либо к BaseConv всё та же: улучшить вспоминание информации, добавив входозависимые смесители. При этом, в отличие от трансформеров, у которых KV-кэш растёт линейно от длины последовательности, мы можем варьировать объём доступной нам памяти через размер скрытого состояния в линейном внимании. И таким образом можем разменивать точность вспоминания на скорость.

В статье есть фундаментальная теорема: решение MQAR (а значит и языкового моделирования на реальных текстах) требует размер скрытого состояния, линейный от длины последовательности. Для внимания таким скрытым состоянием является KV-кэш, который имеет размер O(Nd). Для Based это KV-состояние для числителя и K-сотояние для знаменателя в симуляции софтмакса, с общей размерностью O(d^3), но в статье эту размерность несколько уменьшают проекциями. Это всё означает, что чем длиннее последовательность мы хотим корректно обрабатывать, тем жирнее нам нужно делать размерность модели 😭

Для того, чтобы конкурировать с эффективными реализациями внимания, ребята написали кастомные ядра, которые стараются выполнять операции в SRAM, быстрой памяти GPU, по аналогии с FlashAttention. Получилось и правда быстро 😘

В итоге имеем модель, которая по качеству на уровне трансформеров, но работает в 25 раз быстрее.

Что мне кажется сомнительным во всей этой истории:
- А что произошло с перплексией в первом посте? Что авторы изначально сделали не так?
- Нафига было разрабатывать BaseConv, чтобы потом вернуться к линейному вниманию? Зачем нам теперь вообще BaseConv нужен? Нет, в статье конечно есть секция C, в которой добавление BaseConv обосновывается выигрышем в перплексии, но это ничего не объясняет.
- Почему только 1b параметров? Спонсоров вроде много, люди богатые.

P.S. Немного покринжевал со слова "смеситель" в этом контексте, но решил оставить. Тоже смешивает же.
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Такие себе мысли
В продолжение ранее написанного. Вот хорошая, годная статья про трансформеры https://arxiv.org/abs/2312.10794 На вопросы, скорее, не отвечает, но зато там по человечески определен self-attention - как дин.система на пространстве вероятностных мер на сфере, являющаяся далеким обобщением модели Курамото. Да и много с чем еще хорошим связанная. Читаешь, и душа радуется, рекомендую.

Спасибо Герману за наводку.
Хроники ботки
В продолжение ранее написанного. Вот хорошая, годная статья про трансформеры https://arxiv.org/abs/2312.10794 На вопросы, скорее, не отвечает, но зато там по человечески определен self-attention - как дин.система на пространстве вероятностных мер на сфере…
Здесь beta = 1/(температура в attention), t - "непрерывный аналог" номера слоя. В статье действие attention слоев приближают непрерывный уравнением и смотрят динамику.

На левой картинке - вероятность, что точки (эмбединги токенов) сольются в один кластер в зависимости от beta и t для размерности 2.

На правой - пример динамики на плоскости
Вероятности, что точки сольются в один кластер, для других beta, t и d