Выложили записи моих докладов. Галопом, конечно, как обычно, зато много и от души.
https://www.youtube.com/watch?v=pmHkDKPg0WM
https://www.youtube.com/watch?v=Q8H5ijMxhlA
Если хотите лайкнуть, лучше репостните, а потом уже лайкайте. Если хотите сказать, что это полезно - лучше сначала попробуйте воспользоваться, и потом расскажите что получилось. Польза будет и вам и мне.
https://www.youtube.com/watch?v=pmHkDKPg0WM
https://www.youtube.com/watch?v=Q8H5ijMxhlA
Если хотите лайкнуть, лучше репостните, а потом уже лайкайте. Если хотите сказать, что это полезно - лучше сначала попробуйте воспользоваться, и потом расскажите что получилось. Польза будет и вам и мне.
YouTube
Голощапов Влад | Чем не является гроккинг
Спикер: Голощапов Влад
Название: Чем не является гроккинг - демонстрация опенсорсной библиотечки визуализации in sight
Data Fest Siberia 5: https://ods.ai/events/datafestsiberia5
Трек Прикладной МЛ: https://ods.ai/tracks/sibfest5-ml-applied
_____
Наши соц.сети:…
Название: Чем не является гроккинг - демонстрация опенсорсной библиотечки визуализации in sight
Data Fest Siberia 5: https://ods.ai/events/datafestsiberia5
Трек Прикладной МЛ: https://ods.ai/tracks/sibfest5-ml-applied
_____
Наши соц.сети:…
🔥10👍1🙏1
Встретившись с несколькими подписчиками своего канала на выходных, я с удивлением узнал, что свежевыложенных докладов они ещё не посмотрели.
Первый из двух докладов вы можете прямо буквально применять в своей работе прямо с сегодняшнего дня, скачав готовый код, или за максимум день воспроизвестми его по показанным там идеям. Не откладывйте апгрейд своих рабочих инструментов до когда-нибудь, начните прямо сейчас!
Первый из двух докладов вы можете прямо буквально применять в своей работе прямо с сегодняшнего дня, скачав готовый код, или за максимум день воспроизвестми его по показанным там идеям. Не откладывйте апгрейд своих рабочих инструментов до когда-нибудь, начните прямо сейчас!
😁5👍1🔥1
Выступил про градиентный спуск, моменты и ландшаф функции тпотерь на семинаре донецкого университета. Одному из учёных участвующих в семинаре подготовить следующиее выступление не помешает даже то, что он из Горловки и у них всю прошлую неделю не было света. От края города до последних украинских войск 17 километров. Я из дома на работу в два раза дальше еду.
Такие ситуации полезны чтобы встряхнуть мозги и напомнить о реальности.
P.S. На семинаре встретил математика, который мне объяснил, что теорема об останове машины Тьюринга и теорема Гедёля о неполноте не сводятся друг к другу, а одно может быть доказано через другое, но не в обратную сторону.
Такие ситуации полезны чтобы встряхнуть мозги и напомнить о реальности.
P.S. На семинаре встретил математика, который мне объяснил, что теорема об останове машины Тьюринга и теорема Гедёля о неполноте не сводятся друг к другу, а одно может быть доказано через другое, но не в обратную сторону.
🔥9❤3😢1💩1🤡1
Хо-хо-хо! Кажется есть понятная корреляция между дисперсией градиента и максимально доступным weight_decay который как известно чем выше тем ближе гроккинг. Если завтра на мой дом упадёт самолёт - знайте, рептилойды сделали это чтобы скрыть истину. Ж))))
P.S. Кроме шуток, увеличение дисперсии примерно в sqrt(2) раза примерно в 2 же раз требует снижать weight_decay. По крfйней мере в том случае на котором я экспериментирую.
P.S. Кроме шуток, увеличение дисперсии примерно в sqrt(2) раза примерно в 2 же раз требует снижать weight_decay. По крfйней мере в том случае на котором я экспериментирую.
👍1🤔1
Выкатил трёхкопеечное обновление Траектории, чтобы удобно отрезать для рисования часть траектории или прореживать чтобы отрисовка траекторий в много десятков тысяч шагов меньше тормозила. Если кто из подписчиков реально использует что-то из библиотеки поставьте ✍️
👍3
И хотфикс выложил, потому что тестами нужно покрывать всё, а не как это обычно в петпроджектах делается. Это, кстати, ответ на вопрос почему люди не выкладывают в опенсорс то что они делают. 😢
😢1
# This class exists solely to avoid triggering an obscure error when noscripting
# an improperly quantized attention layer. See this issue for details:
# https://github.com/pytorch/pytorch/issues/58969
# TODO: fail fast on quantization API usage error, then remove this class
# and replace uses of it with plain Linear
Шёл третий год... :)
# an improperly quantized attention layer. See this issue for details:
# https://github.com/pytorch/pytorch/issues/58969
# TODO: fail fast on quantization API usage error, then remove this class
# and replace uses of it with plain Linear
Шёл третий год... :)
GitHub
Improper use of quantization API for MHA should fail fast · Issue #58969 · pytorch/pytorch
Currently, direct quantization of a torch.nn.MultiheadAttention module is not supported via torch.quantization.quantize_dynamic() - a conversion must be performed first (reference). However, an err...
😁1
"Особенностей начинального машинлёрнинга"
Открытый конкурс на лучшее русскоязычное определение гроккинга.
Все знают, что глагол "грок" от которого происходит так многих интересующий "гроккинг" в прямом переводе с марсианского на русский озщначает всего лишь "выпить". И в русском языке и уходящей уже культуре выпивки содержатся многие аспекты и глубокого понимания, и сопереживания, и осознания с обобщением, которые являются нюансами и смысловой нагрузкой этого термина на марсианском языке. В связи с чем я предлагаю конкурс на русскоязычный перевод этого термина, и типичных содержащих его оборотов. Чтобы задорно и правильно при этом звучали всякие "мы изучали гроккинг", "мы воспросизвели гроккинг", "мы придумали меру гроккинга", "наша нейросеть продемонстрировала гроккинг на задачах целочисленного деления" и так далее.
Осталось приз придумать. Какие будут предложения на счёт приза? :)))
Открытый конкурс на лучшее русскоязычное определение гроккинга.
Все знают, что глагол "грок" от которого происходит так многих интересующий "гроккинг" в прямом переводе с марсианского на русский озщначает всего лишь "выпить". И в русском языке и уходящей уже культуре выпивки содержатся многие аспекты и глубокого понимания, и сопереживания, и осознания с обобщением, которые являются нюансами и смысловой нагрузкой этого термина на марсианском языке. В связи с чем я предлагаю конкурс на русскоязычный перевод этого термина, и типичных содержащих его оборотов. Чтобы задорно и правильно при этом звучали всякие "мы изучали гроккинг", "мы воспросизвели гроккинг", "мы придумали меру гроккинга", "наша нейросеть продемонстрировала гроккинг на задачах целочисленного деления" и так далее.
Осталось приз придумать. Какие будут предложения на счёт приза? :)))
Придумал тему для доклада на митап весной: "Прунинг это такая дистилляция". Или вот, например: "Гроккинг это такая антиэнтропия".
Написал тут в комментариях так, что аж самому понравилось. Скопирую сюда:
На мой взгляд нет.
К чему все эти пляски со сложным миром, состоящим из простых подзадач и сложных задач одновременно и пляски с балансом неофобия/неофилия, к тому, что реальный датасет на столько сложны, что на нём невозможно обучиться равномерно. Можно постепенно сначала научиться чему-то одному, игнорируя все остальные отличия, потом чему-то другому, и так по нарастающей. Отсюда же ноги растут, если помнишь мой доклад, у LossBySamples, когда мы выидим какие Loss-ы у каких картинок и просто игнорируем в учебной выборке те семплы Loss которых слишком велик.
Но на имиджнете это не даёт большого преимущества если ты сначала учишься разделять "рыба не рыба" и только потом начинаешь учится отличать тигровую акулу от белой, что для меня до сих пор нетривиальная задача, особенно если морда в кадр не попала. Почему? По двум причинам. Во-первых, датасет искуственно выровнен. Все классы плюс-минус одинаково равны по сложности и нет отдельной награды за высокоуровневое угаыдвание. А во вторых, потому что у сетки нет никаких органов влиять на датасет, она вынуждена тратить время на картинки в которых она и близко не понимает нифига. Вот если бы она получала награду и за угадывание метаклассов, и если бы могла помечать картинки в датасете как "А это мне вообще не показывайте ближайше пол дня". В случае телесности или симуляторства робот может просто не ходить в ту область, в которой у него ничего не получается пока его туда не толкнет любознательность, и это примерно соответствет, но тебе ничего дополнительного не надо ему приделывать кроме движителей и разделения его среды обитания на более сложные и более простые области.
Причём, почему это ещё важно: Мои коннектомные сети могут расти и усложняться, на них легко реализовать чтобы сеть сначала научилась различать рыбов вообще, и только потом пошла различать сорта акул докинув себе ещё несколько слоёв, а с сетями фиксированной арзитектуры эта задача становится ещё более сложной, и нужно больше выделываться чтобы сеть её не зафейлила.
То есть то типичный порочный круг датасетов:
Датасеты создаются такими чтобы даже тупые сети могли с ними справиться, и поэтому именно тупые сети в них и лидируют, что мешет экспериментам с сетями менее тупыми.
Это, конечно, движение обратно к датасетам, но зато малой кровью можно многое разведать...
На мой взгляд нет.
К чему все эти пляски со сложным миром, состоящим из простых подзадач и сложных задач одновременно и пляски с балансом неофобия/неофилия, к тому, что реальный датасет на столько сложны, что на нём невозможно обучиться равномерно. Можно постепенно сначала научиться чему-то одному, игнорируя все остальные отличия, потом чему-то другому, и так по нарастающей. Отсюда же ноги растут, если помнишь мой доклад, у LossBySamples, когда мы выидим какие Loss-ы у каких картинок и просто игнорируем в учебной выборке те семплы Loss которых слишком велик.
Но на имиджнете это не даёт большого преимущества если ты сначала учишься разделять "рыба не рыба" и только потом начинаешь учится отличать тигровую акулу от белой, что для меня до сих пор нетривиальная задача, особенно если морда в кадр не попала. Почему? По двум причинам. Во-первых, датасет искуственно выровнен. Все классы плюс-минус одинаково равны по сложности и нет отдельной награды за высокоуровневое угаыдвание. А во вторых, потому что у сетки нет никаких органов влиять на датасет, она вынуждена тратить время на картинки в которых она и близко не понимает нифига. Вот если бы она получала награду и за угадывание метаклассов, и если бы могла помечать картинки в датасете как "А это мне вообще не показывайте ближайше пол дня". В случае телесности или симуляторства робот может просто не ходить в ту область, в которой у него ничего не получается пока его туда не толкнет любознательность, и это примерно соответствет, но тебе ничего дополнительного не надо ему приделывать кроме движителей и разделения его среды обитания на более сложные и более простые области.
Причём, почему это ещё важно: Мои коннектомные сети могут расти и усложняться, на них легко реализовать чтобы сеть сначала научилась различать рыбов вообще, и только потом пошла различать сорта акул докинув себе ещё несколько слоёв, а с сетями фиксированной арзитектуры эта задача становится ещё более сложной, и нужно больше выделываться чтобы сеть её не зафейлила.
То есть то типичный порочный круг датасетов:
Датасеты создаются такими чтобы даже тупые сети могли с ними справиться, и поэтому именно тупые сети в них и лидируют, что мешет экспериментам с сетями менее тупыми.
🤔1
Свидетели Градиента
Написал тут в комментариях так, что аж самому понравилось. Скопирую сюда: Это, конечно, движение обратно к датасетам, но зато малой кровью можно многое разведать... На мой взгляд нет. К чему все эти пляски со сложным миром, состоящим из простых подзадач…
Мотивации псто.
Хотел тут послушать о гроккинге что-нибудь новое для себя и на русском, пока еду с работы. Первая ссылка в ютубе была на мой собственный доклад, видимо он уже запомнил, что я, когда мне надо ссылку на свои доклады, ищу их через поиск. :) А вторая была на лекцию Дани Меркулова(@bratishk), которую прослушал с нескрываемым удовольствием, у со всё более возрастающим удивлением, пока не понял, что мне некоторые места напоминают.
Во-первых, конечно, немного жаль, что нигде нет ссылки на мои доклады в которых студенты бы могли посмотреть больше подробностей упоминаемого.
Во-вторых, очень приятно, что то что я рассказываю реально идёт в дело, и новое поколение студентов будет вылупляться из ВУЗ-ов уже с некоторыми намётками, на идеи, которые мне кажутся на столько важными чтобы тратить время на их превращение в доклады.
В-третьих, когда ты будешь читать эти лекции следующему семестру студентов, надеюсь, уже учтёшь, доклады, вышедших в октябре и скажешь, что гроккинг это не случайное блуждание, а очень затяжной однонаправленый процесс, что получить его можно на за 10е5 эпох, а за 4 минуты, если сильно выкрутить weight_decay, и что теперь любой может с ним экспериментировать и, если повезёт, поймёт что с этим делать, потому что это, считай, философский камень ML-я.
По ходу прослушивания лекции родилось несколько замечаний. Вообще если вы вдруг захотите кому-то что-то преподавать с использованием идей близких к моим докладам - напишите и я постараюсь в личной переписке или созвоном всё дообъяснить что интересно, потому что в тайминг докладов датафеста подробности не помещаются никак. Но с вас тогда, конечно, упоминание в ходе обучения. :))) Впрочем Даня в своих бедных студентов намёки и зацепки укладывает ещё в четыре раза плотнее, чем я в ни в чём неповинных слушателей на фестах, тут уж не до тонкостей. :))) И так комментарии:
24:43 Если определять генерализацию только как разницу в loss или accuracy, то тогда может показаться, что во время гроккинга генерализация не меняется, потому что одно на 100% лежит, а другое на 1%, в то время как она, генерализация в процессе непрерывно сильно растёт. Я отдельным постом иллюстрирующую картинку потом выложу. И, вполне возможно, где-нибудь весной доклад на этот счёт сделаю - "угловая метрика генерализации". Но просто для самого себя стоит держать в голове мысль что генерализация это наличие в сети сильных информативных обобщений, а разница в лоссах - всего лишь один и не самый удачный способ её померять. С 2015-ого года я за людьми с этой мыслью гоняюсь, ещё со своей одной из первых статей о подсетях отвечающих за отдельные признаки внутри сети. :))
37:50 Хотя два случайных очень больших вектора почти наверняка ортогональны, мы знаем что все векторы внутри нейросети не случайны и не независимы. Об этом я говорил в докладе про затухание градиентов. Как только градиенты перестали затухать - так вектора уже не независимы, и не ведут себя как случайные. То-есть примерно после первой части первой эпохи. По этому предполагая на подкорке, что все вектора тут ортогональны ты теряешь огромное количество инсайтов о нейросети. Каждый раз нужно проверять ортогональны ли, и задаваться вопросом - а которые из них не ортогональны. В частности:
Хотел тут послушать о гроккинге что-нибудь новое для себя и на русском, пока еду с работы. Первая ссылка в ютубе была на мой собственный доклад, видимо он уже запомнил, что я, когда мне надо ссылку на свои доклады, ищу их через поиск. :) А вторая была на лекцию Дани Меркулова(@bratishk), которую прослушал с нескрываемым удовольствием, у со всё более возрастающим удивлением, пока не понял, что мне некоторые места напоминают.
Во-первых, конечно, немного жаль, что нигде нет ссылки на мои доклады в которых студенты бы могли посмотреть больше подробностей упоминаемого.
Во-вторых, очень приятно, что то что я рассказываю реально идёт в дело, и новое поколение студентов будет вылупляться из ВУЗ-ов уже с некоторыми намётками, на идеи, которые мне кажутся на столько важными чтобы тратить время на их превращение в доклады.
В-третьих, когда ты будешь читать эти лекции следующему семестру студентов, надеюсь, уже учтёшь, доклады, вышедших в октябре и скажешь, что гроккинг это не случайное блуждание, а очень затяжной однонаправленый процесс, что получить его можно на за 10е5 эпох, а за 4 минуты, если сильно выкрутить weight_decay, и что теперь любой может с ним экспериментировать и, если повезёт, поймёт что с этим делать, потому что это, считай, философский камень ML-я.
По ходу прослушивания лекции родилось несколько замечаний. Вообще если вы вдруг захотите кому-то что-то преподавать с использованием идей близких к моим докладам - напишите и я постараюсь в личной переписке или созвоном всё дообъяснить что интересно, потому что в тайминг докладов датафеста подробности не помещаются никак. Но с вас тогда, конечно, упоминание в ходе обучения. :))) Впрочем Даня в своих бедных студентов намёки и зацепки укладывает ещё в четыре раза плотнее, чем я в ни в чём неповинных слушателей на фестах, тут уж не до тонкостей. :))) И так комментарии:
24:43 Если определять генерализацию только как разницу в loss или accuracy, то тогда может показаться, что во время гроккинга генерализация не меняется, потому что одно на 100% лежит, а другое на 1%, в то время как она, генерализация в процессе непрерывно сильно растёт. Я отдельным постом иллюстрирующую картинку потом выложу. И, вполне возможно, где-нибудь весной доклад на этот счёт сделаю - "угловая метрика генерализации". Но просто для самого себя стоит держать в голове мысль что генерализация это наличие в сети сильных информативных обобщений, а разница в лоссах - всего лишь один и не самый удачный способ её померять. С 2015-ого года я за людьми с этой мыслью гоняюсь, ещё со своей одной из первых статей о подсетях отвечающих за отдельные признаки внутри сети. :))
37:50 Хотя два случайных очень больших вектора почти наверняка ортогональны, мы знаем что все векторы внутри нейросети не случайны и не независимы. Об этом я говорил в докладе про затухание градиентов. Как только градиенты перестали затухать - так вектора уже не независимы, и не ведут себя как случайные. То-есть примерно после первой части первой эпохи. По этому предполагая на подкорке, что все вектора тут ортогональны ты теряешь огромное количество инсайтов о нейросети. Каждый раз нужно проверять ортогональны ли, и задаваться вопросом - а которые из них не ортогональны. В частности:
😁2
Свидетели Градиента
Написал тут в комментариях так, что аж самому понравилось. Скопирую сюда: Это, конечно, движение обратно к датасетам, но зато малой кровью можно многое разведать... На мой взгляд нет. К чему все эти пляски со сложным миром, состоящим из простых подзадач…
44:39 В частности вот здесь если смотреть на правую картинку то вот так выглядит поверхность для всех случайных векторов кроме одного, и только он один и несёт полезную информацию. Для сетей достаточной размерности это, создает ошибочное мнение, что у поверхности loss функции существуют локальные минимумы. Подробнее об этом я рассказывал осенью вот тут. Но если ты попробуешь идти вдоль этого пространства по, грубо говоря, геодезической, то есть точно вдоль градиента, то обнаружишь, что вторая производная в течении всего пути почти точно 0 Это значит, что поверхность имеет характерный вид каньона с почти плоским дном, а не локального минимума. Собственно именно это показали авторы картинки на 39:29, выбрав в качестве одного из векторов вектор соединяющий два решения, а в качестве второго как раз вектор градиеинтв. Только нужно понимать, что ситуация так выглядит не только вблизи решений, а вообще почти всегда если у сети достаточно параметров.
Для чуть большего понимания отдельным постом приложу картинку из твоей же лекции как так получается, что кажется, что минимумы есть, а на самом деле их нету.
В принципе я сказал достаточно для меленького исследования и даже для большого, но если захочешь написать об этом статью, возьмёшь меня соавтором с равным вкладом и возьмёшь на себя весь процесс оформления, библиографической работы и всего вот этого, что обычно занимает больше всего времени - покажу как конкретно это красиво нарисовать. Для имиджнета такое вычисление займёт многовато времени, если только у тебя личный кластер не завалялся, но на каком-нибудь CIFAR10-100 очень шустро.
58:22 Ну про гроккинг я целый доклад новый сделал, дай бог не последний.
1:06:14 Картинка так выглядит только при наличии мощной регуляризации, то есть за счёт того же процесса, что приводит к гроккингу. Просто до этой точки он не справляется, а после неё начинает отчасти справляться. А точка перелома это как раз и есть та вместимость сети до которой у сети локальные минимумы есть, а после которой - уже нет. Впрочем строго математически это доказать, что точка перелома, точка перепараметризации (где трейновая выборка может быть выучена на 100%) и точка где исчезают локальные минимумы, это примерно одна и та же точка, представляется мне проблематичным при нынешнем уровне развития математики. Максимум показать это вычислительно. Пусть это в будущем навзывается Гипотезой имени меня, и ждёт своего Перельмана. :)
1:09:22 Как я показывал в своём докладе про затухание градиентов, это происходит не только из-за умножения большого количества малых, но и за счёт усреднения большого количества значений, и отсюда берётся квадратичное затухание от корня размера эмбединга за слой даже если функции активации вообще нет. Интересно, что некоторые решения этой проблемы, такие как большая начальная активация умноженная как раз на степень затухания, о которой я говорил в докладе, одновременно и приближает гроккинг, который как мы теперь знаем, проще достичь если иметь большую начальную активацию. Статья, правда, только осенью вышла, то есть уже после этой лекции. Конечно это тема для отдельной часовой лекции, если во все нюансы вдаваться, но в общем случае студенты с большей вероятностью потом копнут глубже если им с самого начала рассказать, что объяснение с умножением большого количества малых и неизбежностью затухания из-за этого очень старая и более того устаревшая.
Для чуть большего понимания отдельным постом приложу картинку из твоей же лекции как так получается, что кажется, что минимумы есть, а на самом деле их нету.
В принципе я сказал достаточно для меленького исследования и даже для большого, но если захочешь написать об этом статью, возьмёшь меня соавтором с равным вкладом и возьмёшь на себя весь процесс оформления, библиографической работы и всего вот этого, что обычно занимает больше всего времени - покажу как конкретно это красиво нарисовать. Для имиджнета такое вычисление займёт многовато времени, если только у тебя личный кластер не завалялся, но на каком-нибудь CIFAR10-100 очень шустро.
58:22 Ну про гроккинг я целый доклад новый сделал, дай бог не последний.
1:06:14 Картинка так выглядит только при наличии мощной регуляризации, то есть за счёт того же процесса, что приводит к гроккингу. Просто до этой точки он не справляется, а после неё начинает отчасти справляться. А точка перелома это как раз и есть та вместимость сети до которой у сети локальные минимумы есть, а после которой - уже нет. Впрочем строго математически это доказать, что точка перелома, точка перепараметризации (где трейновая выборка может быть выучена на 100%) и точка где исчезают локальные минимумы, это примерно одна и та же точка, представляется мне проблематичным при нынешнем уровне развития математики. Максимум показать это вычислительно. Пусть это в будущем навзывается Гипотезой имени меня, и ждёт своего Перельмана. :)
1:09:22 Как я показывал в своём докладе про затухание градиентов, это происходит не только из-за умножения большого количества малых, но и за счёт усреднения большого количества значений, и отсюда берётся квадратичное затухание от корня размера эмбединга за слой даже если функции активации вообще нет. Интересно, что некоторые решения этой проблемы, такие как большая начальная активация умноженная как раз на степень затухания, о которой я говорил в докладе, одновременно и приближает гроккинг, который как мы теперь знаем, проще достичь если иметь большую начальную активацию. Статья, правда, только осенью вышла, то есть уже после этой лекции. Конечно это тема для отдельной часовой лекции, если во все нюансы вдаваться, но в общем случае студенты с большей вероятностью потом копнут глубже если им с самого начала рассказать, что объяснение с умножением большого количества малых и неизбежностью затухания из-за этого очень старая и более того устаревшая.
Свидетели Градиента
Написал тут в комментариях так, что аж самому понравилось. Скопирую сюда: Это, конечно, движение обратно к датасетам, но зато малой кровью можно многое разведать... На мой взгляд нет. К чему все эти пляски со сложным миром, состоящим из простых подзадач…
1:13:11 Как увеличивать размер батча я долго и нудно рассказывал ещё в своем первом докладе на ODS-е, и ту ошибку в SGD with momentum в торче так и не исправили до сих пор, только предупреждение в документацию вписали. :) Но большинство то пользуется Adam-ом, где этой ошибки нет, а значит самым дешёвым способом увеличения размера батча можно пользоваться прямо из коробки, а ты его не упомянул. А самый дешёвый способ - выкрутить ему momentum, в случае Адама - это betas. по умолчанию там betas=(0.9, 0.99) но при первом же подозрении, что дисперсия градиента великовата можно ставить, например (0.99, 0.9975) - значит предположение, что проблема с дисперсией правильное и можно начинать возиться с масштабированием батчей, накоплением градиентов и тому подобным. По сути, на пратике, это часто оказывается даже быстрее и проще, чем рисовать траекторию, на которой всё это видно.
Кстати, интересное наблюдение Adam от RMSProp как раз и отличается тем, что в него прям из коробки встроен некоторый некоторый прогрев, но оказалось, что для больших батчей его недостаточно. Просто потому что betas=(0.9, 0.99), а большой батч, значит - редкие вызовы, значит второй момент, который и так идёт со сглаживанием с окном 100 очень медленно копится. Вместо долгого прогрева можно один раз посчитать пакетный градиент даже не от всей, а от части учебной выборки и положить адаму напрямую в те переменные где он накапливает моменты. Проверено - работает.
1:14:40 "Тут, к сожалению математика закончилась", что сразу закончилась то? :) Просто нужно вспомнить, что если для SDG lr это скорость обучения, то для Adam lr это не скорость, а ожидаемая дисперсия изменения веса, А дисперсия градиента с ростом размера батча увеличивается как раз как корень от количества усредняемых значений, просто из законов матстатистики. Я об этом говорил в первом докладе, и я уверен, что и студентам нужно это говорить, чтобы они лучше понимали как работает оптимизатор по умолчанию, потому что именно его они больше всего и будут пользовать.
1:15:30 LARS это конечно, прекрасно, но если не объяснять на формулах, а просто нарисовать диаграмму как градиенты распределяются в сети слой за слоем, то это станет очевидно, и что с этим делать тоже. любому человеку, который имеет сложности со своей сетью следует её нарисовать, тем более, что я осенью выложил в опенсорс инструмент, который делает это в один вызов.
1:16:30 Я, кстати, не исключаю, что в LAMB-е нормировать нужно не на градиент, а на его дисперсию, по вышеупомянутой причине. Если у тебя есть бейзлайн можешь проверить. Держим в голове, что чем более сеть обучена тем больше у неё разница между градиентогм и дисперсией, и если в начале она может быть, напрмер в 10 раз и вообще не отличаться, то к концу запросто достигает 3 порядков.
Слишком рано отправил, сейчас ещё комментариев допишу.
Кстати, интересное наблюдение Adam от RMSProp как раз и отличается тем, что в него прям из коробки встроен некоторый некоторый прогрев, но оказалось, что для больших батчей его недостаточно. Просто потому что betas=(0.9, 0.99), а большой батч, значит - редкие вызовы, значит второй момент, который и так идёт со сглаживанием с окном 100 очень медленно копится. Вместо долгого прогрева можно один раз посчитать пакетный градиент даже не от всей, а от части учебной выборки и положить адаму напрямую в те переменные где он накапливает моменты. Проверено - работает.
1:14:40 "Тут, к сожалению математика закончилась", что сразу закончилась то? :) Просто нужно вспомнить, что если для SDG lr это скорость обучения, то для Adam lr это не скорость, а ожидаемая дисперсия изменения веса, А дисперсия градиента с ростом размера батча увеличивается как раз как корень от количества усредняемых значений, просто из законов матстатистики. Я об этом говорил в первом докладе, и я уверен, что и студентам нужно это говорить, чтобы они лучше понимали как работает оптимизатор по умолчанию, потому что именно его они больше всего и будут пользовать.
1:15:30 LARS это конечно, прекрасно, но если не объяснять на формулах, а просто нарисовать диаграмму как градиенты распределяются в сети слой за слоем, то это станет очевидно, и что с этим делать тоже. любому человеку, который имеет сложности со своей сетью следует её нарисовать, тем более, что я осенью выложил в опенсорс инструмент, который делает это в один вызов.
1:16:30 Я, кстати, не исключаю, что в LAMB-е нормировать нужно не на градиент, а на его дисперсию, по вышеупомянутой причине. Если у тебя есть бейзлайн можешь проверить. Держим в голове, что чем более сеть обучена тем больше у неё разница между градиентогм и дисперсией, и если в начале она может быть, напрмер в 10 раз и вообще не отличаться, то к концу запросто достигает 3 порядков.
Слишком рано отправил, сейчас ещё комментариев допишу.
YouTube
24. Методы оптимизации в непрерывном времени. Gradient Flow. Стох. и ускоренная версии. МФТИ 2024
Лекция курса "Методы оптимизации". МФТИ 2023 - 2024 уч. год.
Сайт с материалами курса mipt23.fmin.xyz
Сайт с материалами курса mipt23.fmin.xyz
1:21:26 Тут, по-моему, очень важно упомянуть размерность хранимых данных, чтобы сформировалось интуитивное понимание сколько и каких данных хранится, и соответственно где и сколько можно съэкономить. Потому что руками многие уже ничего в этой жизни не дифференциировали и как оно под капотом работает не помнят или уже и не знают. Если у нас матрица n x n, сами веса весят n^2, их градиенты - столько же, а вот для автодифференциирования достаточно сохранить данные об активациях, пришедших из предыдущего слоя. то есть n*batch_size. И ещё два раза по n^2 хранит у себя в состоянии Adam. А данные о градиенте используются только при обратном проходе имеют размерность n*batch_size и уже не хранятся вообще, а только в ходе прохода используются. Если об этом помнить, то можно сделать несколько важных выводов:
1) При первом проходе для первых нод вообще не сохранять активации, тоесть выключать им grad_requiredдо тех пор пока с обратной стороны не подъедет градиент, экономим n*batch_size, но это возможно и так из коробки делается, я под капот конкретным реализация не заглядывал.
2) Если в много проходов строить градиент, и только потом выхзывать оптимизатор, то градиент придётся хранить для тех нод, которые уже посчитаны. Лишние расходы. Посчитали активации для одного последнего слоя, посчитали обратное распространение для одного слоя, посчитали градиенты, сразу сделали шаг оптимизатора, но не для всей модели, а для одного последнего слоя, очистили место для хранения градиентов, только теперь начингаем считать градинты следующего с конца слоя, а градиенты размером n*batch_size для одного слоя, а не всей модели, всё это время в памяти лежали. Итоговая экономия - один размер модели.
3) Если помнить, что через эмбединг туда и сюда ходит матрица размерами всего n*batch_size джля одного слоя можно разбивать модель на две карты по этому узкому месту. Делаешь первый проход на первой карте без автодифференциирования для первой половины модели, передаёшь матрицу на вторую карту, прогоняешь через вторую половину модели уже с автодифом, назад получаешь градиент, который перехватил в бакварде, передал обратно не первую карту, ещё раз прогнал прямой проход, на этот раз с автодифом, и беквард по первой половине модели. Причём если ты аккумуляируешь градиент, то можно через первую карту прогнать пол батча, а пока вторая карта разбирается с градиентами прогрнать forward для другой половины батча.
Как не трудно догадаться 4 карты по 16 гигов стоят сильно дешевле, чем одна на 64. :))))
1) При первом проходе для первых нод вообще не сохранять активации, тоесть выключать им grad_requiredдо тех пор пока с обратной стороны не подъедет градиент, экономим n*batch_size, но это возможно и так из коробки делается, я под капот конкретным реализация не заглядывал.
2) Если в много проходов строить градиент, и только потом выхзывать оптимизатор, то градиент придётся хранить для тех нод, которые уже посчитаны. Лишние расходы. Посчитали активации для одного последнего слоя, посчитали обратное распространение для одного слоя, посчитали градиенты, сразу сделали шаг оптимизатора, но не для всей модели, а для одного последнего слоя, очистили место для хранения градиентов, только теперь начингаем считать градинты следующего с конца слоя, а градиенты размером n*batch_size для одного слоя, а не всей модели, всё это время в памяти лежали. Итоговая экономия - один размер модели.
3) Если помнить, что через эмбединг туда и сюда ходит матрица размерами всего n*batch_size джля одного слоя можно разбивать модель на две карты по этому узкому месту. Делаешь первый проход на первой карте без автодифференциирования для первой половины модели, передаёшь матрицу на вторую карту, прогоняешь через вторую половину модели уже с автодифом, назад получаешь градиент, который перехватил в бакварде, передал обратно не первую карту, ещё раз прогнал прямой проход, на этот раз с автодифом, и беквард по первой половине модели. Причём если ты аккумуляируешь градиент, то можно через первую карту прогнать пол батча, а пока вторая карта разбирается с градиентами прогрнать forward для другой половины батча.
Как не трудно догадаться 4 карты по 16 гигов стоят сильно дешевле, чем одна на 64. :))))
YouTube
23. Обучение больших нейросетей. Loss surface. Grokking. double Descent. Large batch. МФТИ 2024
Лекция курса "Методы оптимизации". МФТИ 2023 - 2024 уч. год.
Сайт с материалами курса mipt23.fmin.xyz
Сайт с материалами курса mipt23.fmin.xyz
А ещё я обещал картинки. Первая картинка как раз мера генерализации. Здесь хорошо видно, как и на траектории, что гроккинг это непрерывный процесс, и loss скачком меняется только в самом его конце.
🤔1
Если ландшафт Loss-а носит характер каньона, заворачивающегося с относительно небольшой скоростью, то в проекции на прямую градиента, обозначенную на рисунке красным, он будет выглядеть как парабола, что создаёт иллюзию локального минимума, потому что эта проекция вылезает на стенки, но вдоль дня каньона это будет прямая с почти нулевой второй производной.
А как мы знаем из моего осеннего доклада, направление каньона в некоторых случаях меняется совсем медленно, всего на несколько градусов за шаг, а по мере обучения кривизна каньона стремительно растёт доходя до поворотов чуть ли не под прямым углом на каждом шаге той же скорости пока оптимизатор не начинает тупо прошивать стенки за счёт инерции попадая в соседние каньоны или приводя к частичному разрушению сети, которые на графике гроккинга выглядят как спайки вниз.
P.S. Обрати внимание, на спайках генерализация улучшается, потому что частично разрушенная сеть возвращается в плохо обученное состояние, когда изучение трейна одинаково полезно и для валидейшена.
P.P.S. Обрати внимание, после спайка сеть очень быстро восстанавливается, потому что у неё во многих слоях уже есть эффективные и несущие много информации обобщения, и задача только в том, чтобы по новой к ним присосаться. Это гвоорит о том, как вожно помнить о роли генерализации - как полезных обобщений даже если loss-ы почему-то показывают погоду в тьмутаракани.
А как мы знаем из моего осеннего доклада, направление каньона в некоторых случаях меняется совсем медленно, всего на несколько градусов за шаг, а по мере обучения кривизна каньона стремительно растёт доходя до поворотов чуть ли не под прямым углом на каждом шаге той же скорости пока оптимизатор не начинает тупо прошивать стенки за счёт инерции попадая в соседние каньоны или приводя к частичному разрушению сети, которые на графике гроккинга выглядят как спайки вниз.
P.S. Обрати внимание, на спайках генерализация улучшается, потому что частично разрушенная сеть возвращается в плохо обученное состояние, когда изучение трейна одинаково полезно и для валидейшена.
P.P.S. Обрати внимание, после спайка сеть очень быстро восстанавливается, потому что у неё во многих слоях уже есть эффективные и несущие много информации обобщения, и задача только в том, чтобы по новой к ним присосаться. Это гвоорит о том, как вожно помнить о роли генерализации - как полезных обобщений даже если loss-ы почему-то показывают погоду в тьмутаракани.
👍3🤔1
step000599_angles_by_modules.png
466.9 KB
Ну, можно констатировать, что генерализация при гроккинге очень неравномерно распределяется по слоям модели... Хотя и не так, как я думал... Интересно было бы посмотреть, как это будет менятся при прунинге, конечно, но шибко долго все эти экзотические меры считаются...
👍2🤔1