2010-05-22 3 views
12

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

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

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

ответ

18

Является ли FP применимым здесь?

Вы можете, конечно, написать в функциональном стиле с достойной асимптотической алгоритмической эффективностью, но вы вряд ли получат 10 × ПРЕДСТАВЛЕНИЯ достойного императивном решения, так как чисто функциональное программирование делает его трудно эффективно использовать кэш-память процессора.

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

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

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

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

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

2

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

1

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

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

+0

Предположим, у меня есть простое дерево: Корень | \ Node1 Node2 Так что, если я создам Node3 и заменим Node1 на Node3, разве это не означает, что я меняю все дерево? –

+0

В вашем примере есть две вещи. Во-первых, ваш пост спрашивает, нужно ли воссоздать всю сеть для каждого обновления веса, а не «изменяться». Я ответил на этот вопрос в своем ответе. Во-вторых, вы сделали его достаточно маленьким, чтобы на каждом узле произошли некоторые изменения. Представьте себе, что у вас есть сеть из 1000 узлов, и только одна из них нуждается в замене. Вы все еще меняете все дерево? – danben

+0

Не слова «Тогда этот нейрон будет вставлен в сеть вместо старого» означает, что нейронная сеть действительно меняется? Я имею в виду замену части целого - разве это не изменение переменной (нейронная сеть в этом случае)? –

1

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

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

Смежные вопросы