@VladimirFarshatov

Нейросети, пакеты, библиотеки, откуда такая сложность?

Понемногу вкуриваю работу с нейросетями, нашел несколько вариантов пакетов/библиотек, в т.ч. tenzorFlow как самый объемный и поддерживаемый. Возник нубский вопрос:

Персептон - по сути это "фиксатор" результата вычисления - он или включен или выключен. Можно организовать больший диапазон "итогов". Соответственно, ключевое понятие - "связь": от кого, к кому, с каким коэффициентом. Т.е. перестраиваемый двусвязный список изменяемых (обучением) коэффициентов и применяемой функцией к интегрированию входных значений (ступенчатая, сигмовидная и т.д.). Остальное зависит от "примененных структур данных" - часто массивов коэффициентов.
Собственно вопрос: "что тут сложного" и зачем такой обьем кода на гитхабе ТензорФлоу? и зачем там float? Кмк десимал на базе int32 должно быть "за глаза", не? ;)

походу чего-то ещё не понял, требуются разьяснения..
  • Вопрос задан
  • 304 просмотра
Пригласить эксперта
Ответы на вопрос 4
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
В общем-то, все просто, если у вас нейронов штук 100. Ну 1000 - тогда решение с помощью массивов и сработает, хоть и тормозить будет.

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

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

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

Именно поэтому все эти универсальные библиотеки такие страшные.

А decimal не работает, потому что у него не хватает точности. Плюс float работает быстрее ибо реализован аппаратно.
Ответ написан
@AlexSku
не буду отвечать из-за модератора
он или включен или выключен

Активацию ступеньку (sign) заменили на сигмоиду, т.к. нужно по частным производным считать градиент от конца к началу.
Потом перешли на ReLU для повышения скорости вычисления.
Полносвязные слои имели много параметров, поэтому нашли свёрточные фильтры (в основном, для изображений).
Было развитие систем с обратной связью (как в мозге), они же рекуррентные: LSTM, GRU. Там вместо нейрона несколько вентилей. Но обучение шло на последовательных данных.
Для параллельной обработки запроса внедрили корреляционные матрицы (внимание), так что современные сети делают на трансформерах. Но там миллиарды параметров, обычным компьютерам они не по зубам, поэтому пользователи делают только запросы через облако.
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Насколько я понимаю TensorFlow - это коробочное решение от Гугла которое также поддерживает специальное железо TPU (Tensor Processing Unig) которое работает лучше чем вычисления на видеокартах.

А персептрон - это просто математическая абстракция. Причем самого начального уровня. Для многих алгоритмов обучения пороговая функция не годится (там есть требования дифференцируемости) и поэтому нейрон с гладкой функцией активации обычно используется как следующий шаг от персептрона. Хотя у теоретиков НС там были большие теоретические споры про скрытые слои и про учет слоев (как считать).
Ответ написан
@dmshar
Ну, во-первых, раз вы уже побывали на GitHub - то и загляните в код TensorFlow, посмотрите чего там есть. Думаю, это логичнее чем спрашивать об этом на форуме. Да и объяснение, полученное таким образом будет более точным, чем фантазии неизвестно кого на форуме.
Во-вторых, float работает быстрее Decimal. Потому как float - это аппаратная реализация, а Decimal - программная надстройка. При расчетах, которые и на float длятся неделями и месяцами, 'представьте, сколько бы оно работало на Decimal.
В-третьих. "перестраиваемый двусвязный список изменяемых коэффициентов" - рекомендую освоить начальный курс по "структурам данных и алгоритмам", для того, что-бы понять когда можно применять любые списочные структуры, а когда необходимо использовать линейные структуры типа массивов. Нейросеть - это в подавляющем большинстве случаев фиксированная структура с необходимостью прямого доступа к каждому элементу. Отсюда и выбор наиболее подходящих структур представления данных. Ну, а когда дело дойдет до всяких backpropagation и прочих gradient descent - вот тогда вопросы такого рода окончательно и отпадут.
В-четвертых. Персептрон - это малюсенькая часть того, что составляет любой пакет для работы со взрослыми нейросетями. И нейросети не сводятся к "связям" и картинкам нейронов, взятых из учебников биологии. Все прелести там начинаются, когда надо делать что-то, что хоть на чуть-чуть сложнее одинокого персептрона.
Поэтому пока рекомендую все-таки разобраться в теории нейросетей. Потом посмотреть на реализации. Подсказка - сейчас вышло довольно много учебников по этой теме, где скорее всего будут готовые ответы на 99% вопросов, которые у вас будут возникать по ходу. Их можно легко найти в сети, в том числе и на этом форуме такие списки уже появлялись несколько десятков раз, поэтому тут приводить их не буду, А судя по вопросам - не мешает вспомнить и основные, базовые концепции программирования. Вот тогда картинка в голове сложиться полная. И если после этого что-то действительно останется неясным, недопонятым - вот тогда приходите с такими конкретными вопросами на форум, попробуем разобраться вместе.
А отвечать на вопрос - "что тут сложного" не получиться. Сложного там действительно ничего, если предварительно разобраться во всем этом хозяйстве, выделив на это часов 500-1000 времени.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы