Подтвердить что ты не робот

Большие базы данных в функциональном программировании

Я новичок в функциональном программировании.

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

Является ли FP здесь применимым? Я имею в виду, что в fp мы не можем изменять переменные и можем только возвращать новые переменные, не изменяя прежние значения. Означает ли это, что мне нужно воссоздать всю сеть при каждом обновлении веса?

4b9b3361

Ответ 1

Здесь все еще применим FP?

Вы можете, конечно, написать это в функциональном стиле с достойной асимптотической алгоритмической эффективностью, но вряд ли вы получите 10 × производительность достойного императивного решения, потому что чисто функциональное программирование затрудняет эффективное использование кэшей CPU.

Я имею в виду, что в fp мы не можем изменять переменные и можем только возвращать новые переменные, не изменяя прежние значения. Означает ли это, что мне нужно воссоздать всю сеть при каждом обновлении веса?

Нет, по двум причинам:

  • Совершенно функциональные структуры данных могут быть эффективно обновлены, поскольку они разлагают большие структуры (например, хэш-таблицу) во множество небольших рекурсивно определенных структур (например, сбалансированное двоичное дерево). Когда вы обновляете одиночный node в неизменяемом дереве, вы копируете данные из каждого node в пути от корня до места назначения, но возвращаетесь ко всем другим ветвям по ссылке безопасно, зная, что они не могут быть изменены под вас потому что они неизменны. Таким образом, вы работаете только O (log n) вместо O (n).

  • Чисто функциональные структуры данных обычно предлагают такие функции, как map, которые позволяют каждый элемент обновляться таким же образом и избегать перебалансировки путем копирования структуры исходного дерева. Таким образом, время для n обновлений - O (n) вместо O (n log n).

Таким образом, вы должны иметь возможность достичь аналогичной или даже равномерной асимптотической сложности времени, но в абсолютном выражении вы будете использовать в несколько раз больше пространства и времени, чем императивное решение. Я подробно описал эти основы в своей книге Visual F # 2010 для технических вычислений, и я написал статью Искусственный интеллект: Neural Networks (8 мая 2010 г.) для OCaml Journal.

Ответ 2

Посмотрите массивы Haskell, которые включают изменяемые варианты в монаде.

Ответ 3

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

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

Ответ 4

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

Если это еще не достаточно быстро, ваш язык может позволить другим методам (таким как тщательное использование мутации) ускорить его; например, если вы использовали Clojure, вы могли бы использовать переходные процессы для некоторой дополнительной скорости.