Как стать автором
Обновить

Комментарии 49

Я создам класс нейросети и нейрона, а потом уже буду с этим работать.


Пожалуйста, не надо. Не нужны там эти классы. Там всё отлично и просто описывается обычными матрицами.

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

Матричная запись очень естественна в данном случае. И очень наглядна. Вместо всех этих циклов с достаточным объёмом текста вы пишете просто умножение матриц.

а потом уже, с полным пониманием, делать общепринятыми и рациональными методами.


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

Проблема когда ты вообще не осознаёшь математику а в описании мат матриц видишь проблески сатанинского письма. (до сих пор вижу там каракули а не алгоритмы. Хотя если написать это всё в виде листа с шагами действий то сразу доходит )
Я сам тоже делал в начале всё на классах, но когда захотелось "увеличить кусок изображения в 2 раза" увидел насколько медленно оно работает, а там и пошло поехало... Благо я нашёл непонятного деда в ютубе с 5К просмотров, который в формате презентации пояснил за каждый нюанс при настройки нейронок на человеческом.
Да, все эти правила очень простые и понятные, и их можно перевести на "понятный язык", но в "надёжных источниках" столько страшного матана и непонятных слов что мозги текут. ,,Приходится говнокодить из того шо есть чтоб понять что ты делаешь,,

но в «надёжных источниках» столько страшного матана и непонятных слов что мозги текут. ,, Приходится говнокодить из того шо есть чтоб понять что ты делаешь,,


Так можно взять любую другую статью. Их дофига, где математики почти и нет.

Ага, но объясняют её ужасно. В лучшем случае тебе дадут реально работающий код со словами "оно работает не трож". И дальше уже на основе этого пилишь свои приблуды. Работало ктож спорит, но объяснить так и не объяснили. (И там нету матриц, все так же классами объясняют, в основном)
Самое интересное, что некоторые всё же пытаются объяснить как оно то работает, но делают это просто ужасно. Вот по сути очень лёгкая мысль которую легко объяснить графиками и рисунками - 1 нейрон с 2 связями обучается быть похожей на функцию которой его обучают (картиночки+примеры). Но почему-то её объяснить могут дай бог 1\5 чуваков кто статьи пишет. Не говорить умными словами с терминами матана которые "должны же в школе проходить", не пилить "мега абстракции" из образов и псевдонаучных объяснений, а именно на человеческом показать и объяснить почему тут математика эта и почему она работает.
***
Может сейчас с "горы" накопленного опыта и знаний о матане мне даются такие статьи уже легко, но тогда это было настоящей пыткой. Единственное что мне могли "порекомендовать" так это "пойти в школе поучиться", вздор. Тема то элементарная. (по началу, естественно)
Просто нету нормальных обучалок в лёгком гуглении, которые бы сразу на всё тебе давали ответ. (Боги, та даже тема о многомерности, вроде её элементарно объяснить на примере одного нейрона, но сколько обучалок не смотри, не поймёшь при чём тут это и как вообще оно выглядит. А термины уже вводят, без объяснения, ага)

ЗЫ Конечно, ты можешь напрягать извилины и пытаться всё понять сам, но у меня подход в обучении просто "кушоть дохрена информации и встраивай в своё понимание", и чем понятнее инфа тем быстрее до меня доходит.
***Пока писал подгорало слегка, решил не исправлять.
***Это всё лично мой опыт, может быть я просто гуглом не умею пользоваться)
***И ещё я тогда не так хорошо английский знал, а читал в основном топики гугла, если искал на англ. (хотя там тоже мусора по первой выдаче полно, глубоко только CNN гуглил и нашёл собственно, спустя седой волос)
***Почитал что ты скинул ниже, тоже самое - Статья с кодом но без объяснений, работает не трогай. ("Тогда читайте такое.")

Статья с кодом но без объяснений, работает не трогай


У меня для вас плохие новости… ;)

Я подозреваю, что выбранный метод обучения (https://ru.wikipedia.org/wiki/Альфа-система_подкрепления ) не так хорошо описывается матрицами как обратное распространение ошибки. Если же всё так просто, приведите формулы или код (если где-то есть готовый).

Прямой проход легко описывается матрицами? Описывается. Что мешает модифицировать матрицу коэффициентов путём либо непосредственного изменения конкретного коэффициента или свести к сложению матриц?

Почему-то из статьи по вашей ссылке нет ссылки на то место, из которого эти алгоритмы выросли: https://ru.wikipedia.org/wiki/Метод_коррекции_ошибки, а выросли они из алгоритмя придуманного ещё розенблаттом, и у него много интересных особенностей о которых люди не в курсе. Я свою первую нейросеть тоже на этом алгоритме делал. Например для алгоритма коррекции ошибки доказана теоретическая сходимость, в отличии от обратного распространения.

Я вам больше скажу в моих первых сетях был ещё и класс синапса, Здесь на хабре есть мои статьи 2014-215-ого годов. И знаете что? Благодаря этому я мог делать такие вещи с сетями, которые в матрицу хоть и можно запихать, но они туда так плохо лезут, что никому тупо в голову такая мысль не приходит.

Например я красиво визуализировал сетки и их состояния и когда столкнулся с проблемой затухания градиента я просто прокинул несколько синапсов с нескольких последних слоёв в несколько первых. Оказалось, что всего 3-5 синапсов (а не матриц) достаточно чтобы проблему полностью преодолеть.

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

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

Переносить на GPU всё это всё равно придётся на тензорах, ибо только они работают чрезвычайно быстро на мультипроцессоре. А без GPU обучать это слишком долго. Так что нет, никаких классов не должно быть, должны быть тензоры и только тензоры.


В результате теперь я знаю про затухание градиентов больше, чем 95% людей занимающихся нейросетями.

В этом нет ничего удивительного. На всём хабре нет ни единой полной статьи про обучение тех же CNN обратным распространением (и на заданный вопрос об этом ноль внятных ответов). Есть куски забитые математикой без практического подхода, по которым вы не сможете понять, как с нуля сделать всё это обучение. Про нюансы я вообще промолчу.

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

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

>> Так что нет, никаких классов не должно быть
Вас же не смущают классы модуля в том же пайторче. Если бы не было инкапсуляции внутри этого класса всего функционала автограда куча людей стучалось бы лбом о дифференциирование того что они напридумывали и больше половины этого столкновения с реальностью бы не вывезли. а те кто вывезли, делали свои сети на много дольше. Класса нейрона не должно быть в инференсе, до поры до времени, тут я согласен, но если человек умеет думать в терминах классов, он сможет сделать с сетями такие вещи, о которых он бы даже не подумал если думает о происходящем только как о матричных операторах не вникая в то, какие более мелкие сущности были представлены в виде матриц.

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

Вас же не смущают классы модуля в том же пайторче.

Я не использую pytorch и с питоном не знаком. Я работаю только с С++.


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

>> Понимание происходящего и правильная реализация — разные вещи. Из того, что вы поняли, как работает нейрон или свёртка, вовсе не следует, что делать их надо нативно и писать про это статью

Как вы собираетесь что-то исследовать не реализуя это в коде? :\ Чтобы что-то понять, нужно с ним поиграться, а чтобы с ним поиграться нужно иметь реализацию, в которой эти игры делаются просто. Уровень абстракций подбирается под задачу. Для кого-то понимания минимальный уровень - всё дерево вычислений, для каких-то пониманий нужно ковыряться в терминах слоёв, а для каких-то пониманий приходится опускаться в более мелкие абстракции, иначе каждый эксперимент будет занимать сутки кодинга.

А если не написать статью, так никто и не поддержит и идеями своими не поделится.

>> Я не использую pytorch и с питоном не знаком. Я работаю только с С++.
Торч под капотом уже почти весь на плюсы переписан, кстати. При желании вы можете насладится всеми прелестями автограда, в том числе для очень необычных функций, типа topk. Попробуйте, вам может понравиться. :)

>> в противном случае вы не дождётесь обучения хоть сколько-нибудь большой модели за приемлемое время.

Вопрос с какого размера моделями и датасетами вы хотите работать. Например для многих моих экспериментов я использую cifar100 - задача уже приближённая к реальным, но обучить сеть на её на домашнем 3060 можно за считанные минуты и большинство выводов полученных на нем распространяются и на imagenet. А уже потом, когда эксперименты проделаны и выводы понятны, можно брать сети потолще и какой нибудь COCO. Но при этом свои первые работы и первые выводы я делал вообще на синтетическом датасете на основе одной единственной картинки x - координаты точки, y - rgb этой точки. Очень простая задача, с которой справляется даже сетка написанная на CPU и при этом посмотрев что нарисовала вам сеть и сравнив с исходной картинкой можно многое понять о том как и почему сеть работает. Там на картинке разделяющие плоскости прямо буквально видны - роскошь, которую не могут себе позволить люди изучающие реальные задачи.

Он же вам тут не трансформеры на классах делает миллиардные, а просто учебную сетку. Какова исследовательская задача, такие и инструменты.



Как вы собираетесь что-то исследовать не реализуя это в коде? :\

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


Чтобы что-то понять, нужно с ним поиграться, а чтобы с ним поиграться нужно иметь реализацию, в которой эти игры делаются просто.

Тензоры тоже очень просто. И при этом очень быстро.


А если не написать статью, так никто и не поддержит и идеями своими не поделится.

Тем, кто этим занимается, детский уровень не интересен. А те, кто только начинает играться, уже видели все эти классы нейронов много раз.


Торч под капотом уже почти весь на плюсы переписан, кстати.

Да кто бы сомневался.


cifar100

32x32 — это только поиграться с мутными картинками. Как только от 32x32 вы перейдёте на 224x224 и выше, вы выбросите свои классы нейронов на помойку и будете задаваться вопросом, что помешало их выбросить изначально.


Он же вам тут не трансформеры на классах делает миллиардные, а просто учебную сетку. Какова исследовательская задача, такие и инструменты.

Знаете, какая основная претензия к таким статьям? Они бы были бы вполне ничего, если бы их авторы шли бы дальше. Но они не идут. Поэтому таких вот статей с классами нейронов воз и маленькая тележка, но вот статей с реализациями уровнем выше нет.

>> Знаете, какая основная претензия к таким статьям? Они бы были бы вполне ничего, если бы их авторы шли бы дальше.
Я вот пошёл. В моей первой статье на хабре были классы нейронов, и даже хуже того, для всяких циклических операций использовался Linq - это такой объектный движок над итераторами на C#. Я конечно, не самый типичный любитель нейросетей по ряду причин, ну так и этот парень может оказаться нетипичным. Не подождём - не узнаем.

>>32x32 — это только поиграться с мутными картинками.
Вернее даже с мутными текстурками, но тем не менее именно играясь с ними я придумал neck для компьютервижена, который из фичеэкстрактора вынимает информацию в такой форме, что ему пофигу на размеры картинки вообще. То-есть картинка 1024x320 и маленький её кусочек 256x256 на котором расположен интересующий объект, с точностью до простого линейного преобразования дают одинаковый эмбединг.

Чуть больше веры в людей, изобретающих велосипеды, и они смогут вас удивить. :))

>> Тензоры тоже очень просто. И при этом очень быстро.
Существует адская пропасть между "быстро считается" и "быстро запрограммировать". Для второго нужны классы абстракций - первое в процессе исследования вообще мало кого интересует, до тех пор пока код работает приемлемое время никто даже и не парится его оптимизацией.
Попробуйте безо всяких абстракций на голых матричных умножения запрогать какой-нибудь ленет или йоло, зрелище будет презабавненькое, но очень долгое. Говоря о быстроте экспериментов я имел в виду конечно же время на то чтобы написать экспериментальный код, а не то с какой скоростью он учится. До тех пор, пока он учится быстрее, чем я сделал и съел бутерброд меня его скорость не интересует.

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

ну так и этот парень может оказаться нетипичным. Не подождём — не узнаем.

Подождём, подождём.


Существует адская пропасть между "быстро считается" и "быстро запрограммировать".

А вот тут сюрприз. :) Как ни странно, но тензоры/матрицы как раз легко понимаются (там же всё очевидно!) и очень просто программируются. Ну правда, неужели так сложно для обычной полносвязной нейронной сети сделать одну-единственную операцию — умножение матрицы на матрицу? И мгновенно вместо класса остаётся просто пара матриц. В том-то и дело, что матричная форма не просто даёт быстродействие, но ещё и сильно упрощает операции с сетью. Что такое проход по сети? Последовательное умножение матриц. Вот и всё.


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

Почему? Все эти сети тоже сводятся к простому умножению матриц внутри. Смотрите:
ЛеНет-5:
Слой C1: слой свертки (num_kernels=6, kernel_size=5×5, padding=0, step=1)
Слой S2: Средний слой пула (kernel_size=2×2, padding=0, шаг=2)
Слой C3: слой свертки (num_kernels=16, kernel_size=5×5, padding=0, шаг=1)
Слой S4: Средний слой пула (kernel_size=2×2, padding=0, шаг=2)
Слой F5: Полностью связанный слой (out_features=140)
Слой F6: Полностью связанный слой (out_features=84)
Слой F7: Полностью связанный слой (out_features=10)


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


До тех пор, пока он учится быстрее, чем я сделал и съел бутерброд меня его скорость не интересует.

А вот тут к вам вопросы: "но обучить сеть на её на домашнем 3060 можно за считанные минуты" — обучаете вы на GPU и обучаете как раз на основе последовательности умножения тензоров. Не ваших классов, которые на GPU не кладутся.


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

Это очень просто. :) Вот тут.
Продавец Валерий — владелец Ярославльской студии голографии. У него этих голограмм на плёнке (не на стекле! Со стеклом он не работает уже давно) дофига и больше. Все эти голограммы видны в свете точечной лампы/светодиода. Единственное, сейчас он делает голограммы мультиплексные (из набора отрендеренных ракурсов, а не с натуры). Поэтому углы обзора не очень большие. Впрочем, возможно, у него есть и не мультиплексные.

За ссылку спасибо. Я конечно же спутал и имел в виду гугленет, а не обычный ленет, но это не важно. Дело только в размере, ну и максимум вам ещё конкатинация матриц потребуется. Очевидно, что в виде матричных операций записывается всё что популярно, потому что большинство людей искали ответ именно в такой форме, петля положительной обратной связи или же замкнутый круг. Мне просто неприятно, что новые и новые поколения людей продолжаю копаться там же, на месте, где уже всё выкопано, и автомл давно лучше людей справляется.

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

потому что большинство людей искали ответ именно в такой форме

Гугленет тоже 100% внутри тензорный.
Люди просто оптимизировали сложность представления сети. И пришли к матричной форме, как самой простой и очень скоростной.

И то, что я тут с пол десятка примеров привёл, которые к матричным операциям не сводятся,

К матричным операциям можно свести вообще все типы сетей.


чтобы новые люди имели в своем арсенале мысленных внутренние представления, позволяющие им не пропустить что-то необычное, если оно промелькнёт мимо них.

Матричное описание никак на это не влияет. Они лишь упрощает написание и ускоряет работу сети.

В одной из моих сетей используется операция topk, и возвращаемые ей индексы, её вы тоже к матричному умножению сведете? :)))))

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

В одной из моих сетей используется операция topk,
её вы тоже к матричной умножению сведете? :)))))

Вот эта что ли?
Ну так тут прямо написано что входит тензор и выходит кортеж тензоров.
Боюсь, всё уже сделано до меня. :)
Совершенно не обязательно операцию делать только лишь умножением матриц. AveragePooling или MaxPooling тоже к умножению не сводятся, но сводятся к операциями над входными матрицами (и очень хорошо распараллеливаются). Матрица (тензор) — это элемент хранения.


но полезно знать, что некоторые люди считают его неправильным, и работающим кодом это демонстрируют,

Ну а с чего бы этому коду не работать? Он просто медленный и местами путаный.

А без GPU обучать это слишком долго.

ИМХО, коллега @kraidikyпро обучать человеков. А есть люди, которым дискретка ближе чем линал (я был), есть те, которым никакое чтиво не заменит метод тыка (я есьм, вы разве нет? С такими то профилями на Хабре и Гитхабе). И для многих пользователей Торча тензор это почти чёрный ящик, увы.

нет ни единой полной статьи про обучение

Мало чего нет на Хабре. Вон, в Википедии есть, там же ссылки на исходники.

Что мешает модифицировать матрицу коэффициентов путём либо непосредственного изменения конкретного коэффициента или свести к сложению матриц?

О, два года прошло. Видно, что-то мешает, раз ссылок нет.

И для многих пользователей Торча тензор это почти чёрный ящик, увы.

Так вот об этом и нужно рассказать в статье. :) Вот тут вот у человека прекрасно получилось.


Мало чего нет на Хабре. Вон, в Википедии есть, там же ссылки на исходники.

Удачи тому, кто разберётся, например, в обратном проходе в batch normalization по статье из Википедии. :)


я есьм, вы разве нет?

Я -скорее нет, чем да. Прежде чем тыкнуть, лучше посмотреть, как тыкнуть правильно. А то я тыкаюсь уже пол-года в симмер с резонансным LLC-преобразователем и что-то оно методом тыка нихрена не работает. Оно и с расчётами тоже не работает, как надо. Есть нюансы. Надо только понять, какие.


О, два года прошло. Видно, что-то мешает, раз ссылок нет.

Вы же не думали, что я буду этим заниматься? :O

>> Удачи тому, кто разберётся, например, в обратном проходе в batch normalization по статье из Википедии. :)

Справедливости ради в батчнорме не разбираются даже те, кто его придумал. :))

Вы, например, знали, что примерно половина эффекта от батчнорма в том, что там есть свой bias, и когда люди batchnorm добавляют, то обычно убирают bias у обычного слоя перед ним, а поскольку в батчнорм встроено своё экспоненциальное сглаживание, по умолчанию 0.9, обычно, то bias обучается с в десять раз меньшей дисперсией чем нормальные веса. Если убрать батчнорм, и учить bias обычных слоёв с моментом в десять раз сильнее, половину всей прибавки от батчнорма вы получите на одном этом.

Такого вы ни в какой википедии не прочитаете, тут нужно велосипеды изобретать. :)))

а поскольку в батчнорм встроено своё экспоненциальное сглаживание,

Сглаживание? Где? Там нормализация, а потом сдвиг и сжатие. Или это в pytorch добавлено?


то bias обучается с в десять раз меньшей дисперсией чем нормальные веса.

Если убрать батчнорм, и учить bias обычных слоёв с моментом в десять раз сильнее, половину всей прибавки от батчнорма вы получите на одном этом.

А вторую половину (стабилизацию обучения) не получите.

>> Сглаживание? Где? Там нормализация, а потом сдвиг и сжатие. Или это в pytorch добавлено?

Это везде добавлено и из коробки просто по умолчанию включено.

Keras/TF: https://keras.io/api/layers/normalization_layers/batch_normalization/ , https://www.tensorflow.org/api_docs/python/tf/keras/layers/BatchNormalization переменная momentum = 0.99
Pytorch: https://pytorch.org/docs/stable/generated/torch.nn.BatchNorm2d.html переменная  momentum=0.1 (это обратная величина, соответствует 0.9)
Theano https://docs.huihoo.com/theano/0.9/library/tensor/nnet/bn.html переменная  running_average_factor=0.1

А вы хоть какую-нибудь библиотеку используете или всё сами? Как вы могли этого не знать, это же половина самого важного, что есть в батчнорме.



А вы хоть какую-нибудь библиотеку используете или всё сами?

Всё самодельное.


Как вы могли этого не знать, это же половина самого важного, что есть в батчнорме.

Ну во-первых, я не использую нормализацию — я так и не сделал обратный проход — мне лень разбираться в той ерунде, что обычно пишут, мне нужен готовый рецепт, что нужно сделать. Да и польза от неё далеко не всегда есть (для WGAN она вообще не нужна даром).
Кроме того, вот из книги Фостера Д:



Тут нет никаких сглаживаний.
И в алгоритме обучения я их тоже не вижу.

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

Смотрите, вот у вас получается два числа: среднее и сигма, то есть сдвиг и 1/(множитель+e). Очевидно, что применять их непосредственно нельзя, потому что их слишком сильно будет колбасить при сколько-нибудь маленьком размере батча, например при батчах по два семпла их вообще будет носить из стороны в сторону.

Чтобы такой фигни не было к ним применяетс я экспоненциальное сглаживание, в торче с импульсом по умолчанию (1-1/10), а в тензорфлоу (1-1/100) После этого среднее и сигма оказываются средними уже не по конкретному батчу, а по большому куску учебной последовательности, в случае TF даже очень большому более ста батчей.

И вот теперь уже эти сглаженные множитель и сдвиг применяются. Собственно обучение параметров происходит не при обратном проходе, а при прямом. Отсюда сложность, нужно ручками в градиент записать такие числа, чтобы они отражали изменение, вычисленное при прямом проходе. Но поскольку вы пишете руками, то можете вместо того чтобы подгадывать числа, просто учить их при прямом проходе. Возникает неоднородность в коде, конечно.

Более подробно о роли дисперсии градиентов при обучении и сглаживании могу посоветовать мой собственный доклад на ODSFest: https://www.youtube.com/watch?v=Npm-awHtfeM

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

У меня не времени завались, у меня скорость разработки высокая. Но проектов много одновременно.


Чтобы такой фигни не было к ним применяетс я экспоненциальное сглаживание,

Я кажется, понял, откуда у вас это сглаживание появилось. Ваш PyTorch, вероятно, использует вариацию Adam для обучения настройки нормализации. А в статьях указаны формулы для постоянной скорости.

Могли бы и по ссылке пройти, которую я вам прислал. Там английским по белому написано:

Этот momentum не относится к пакетной нормализации, а относится к способу оптимизации обучения пакетной нормализации. Вот и всё. Потому-то его и нет в формулах пакетной нормализации.

Вам шашечки или ехать? :)
Ну и кроме того, в форвард пассе же вы не из формул возмёте числа, а уже сглаженные, обученные, так что все это влияет не только на обучение.

Если бы мне было бы нужно ехать, я бы взял бы tensorflow. :) Но мне нужны шашечки. :)

Ну если шашечки, то можете подумать вот какую мысль: Если у вас batchnorm идёт до функции активации или если функция активация линейная во всех точках кроме 0 (relu, leakyrelu), то вы можете обучать батчнорм как обычно, а когда дело доходит до инференса умножить все веса составляющие логит на множитель из батчнорма и сделать биас как биас батчнорма. А батчнорм вообще выкинуть. Математически это будет строго тождественно батчнорму, но при этом у вас будет на одно матричное умножение меньше. :))

Спасибо, подумаю.

Отлично! Это как раз то, чего мне не хватало, чтобы разобраться.

Класс, хорошая статья, было интересно читать.

Наверно, есть смысл прочитать книгу Тарика Рашида "Создаём нейронную сеть".
Там всё очень просто, подробно и с примерами кода.

Чтоб и в тему вникнуть, и велосипед не изобретать...

Моя статья "Давайте изобретать велосипеды": https://habr.com/ru/articles/249657/
Там в качестве пример показана визуализация, которую я придумал изобретая велосипеды в далёком 2014-ом году. Этой весной выступал на ODS фесте и показывал там в частности кое какие вещи, которые видны из этой визуализации и в частности упоминавшиесмя в той далёкой статье 2015-ого года, и люди такие "Ого чувак! Ты открыл мне целый мир!". А всё потому что в самом начале своих занятий нейросетями я изобретал велосипеды, а многие люди просто берут готовое не пробуя его на прочность в свободное от работы время.

Смысл создавать отдельную функцию, а не просто использовать math.tanh(), в том, чтобы удобнее было ее заменить, в случае, если я решу, что другая будет эффективней.

self.act = math.tanh

Оу, спасибо, действительно не знал об этом.

Очень круто, что с таких основ происходит вход в тему - а то все лепят фит-предикт и типа датасайентисты)

Спасибо, но уже начитался - своим комментарием я просто выражал одобрение автору :)

Из этой статьи новичок не поймёт вообще, что такое нейросеть.
Но учитывая возраст автора, было бы странно требовать от него хорошей статьи.

Да, сама статья не особо полезна - новичку сложно, остальные и так наверное уже разобрались, тут скорее просто порадоваться за подход автора :)

Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации