Большие структуры данных в функциональном программировании - PullRequest
12 голосов
/ 22 мая 2010

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

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

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

Ответы [ 4 ]

18 голосов
/ 29 ноября 2010

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

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

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

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

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

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

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

2 голосов
/ 22 мая 2010

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

1 голос
/ 22 мая 2010

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

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

1 голос
/ 22 мая 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...