Ответ 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.