Pull to refresh

Comments 12

Show me the code!


Или хотя бы результаты решения стандартной задачи посложнее XOR

Немного «причешу» код и выложу проект на C# в общий доступ.
Очень интересная концепция и статья выделяется на фоне других однотипных статей в стиле «нейросети для чайников» которых сейчас слишком много на ресурсе.
Но это все теория и ее сложно понять без каких-либо практических (а еще лучше — графических) примеров.
Правильно ли я понял, что автор предлагает обучать свою сеть брутфорсом?
Наоборот, брутфорса стараемся всячески избегать.
Последовательное, построчное построение функции матрицы позволяет эффективно оптимизировать процесс обучения за счет замены полного перебора комбинаций бинарных функций всех нейронов матрицы полным перебором комбинаций функций нейронов строк.
Согласитесь, что, например, восемь полных переборов восьми нейронов каждой из строк по отдельности быстрее чем полный перебор всей матрицы 8x8.
Нейронные сети обычно позволяют параллельно выполнять умножение, суммирование, вычисление функции для каждого из нейрона на уровне одного слоя. Как в Вашем случае с учетом перегородок и распространение данных осуществляются параллельные вычисления?
Если кратко, то в текущей программной реализации пришлось идти на уловки которые позволяют достичь эффекта параллельности при фактически последовательном алгоритме. Но в принципе, в требованиях к функции нейрона указано, что последовательность применения входных значений не меняет выход нейрона, что позволяет распаралелить процесс.
Тогда такой вопрос, как эффективно распараллелить такую сеть с учетом того, что сеть необходимо тактировать (ведь при получении элементом сети сигнала справа и снизу её выход можно будет рассчитать только после того, как сигнал справа и снизу будет получен)? Иными словами, в слое появляются зависимости между нейронами, которые накладывают ограничения на параллельное выполнение кода.
Затронули интересный вопрос. В процессе его решения лично я пришел к довольно неожиданному, двоякому результату. Во-первых, действительно, возбуждение нейрона означает, что все входы у него актуальны на данный момент. И тогда передача данных по сети должна представляться как передача некой волны сигнала, на фронте которой возбуждаются нейроны. На практике для этого нужно запрограммировать специальный механизм, который находит все нейроны на фронте (можно назвать это уровнем) этой волны, независимо подставляет в них данные, выполняет нейронные функции и находит нейроны реципиенты, которые будут возбуждены на следующем шаге волны, и т.д.
Однако, после создания такого механизма на практике, получилось, что для вычисления функции метрики в процессе обучения нужно было прогонять обучающие входы через всю матрицу от первой строки до текущей последней и получать выходы. Теоретически так и надо делать, но для отладки это долго. Ведь изменяются только параметры нейронов последней (одной) строки, а прогонять тестовые значения приходится через всю матрицу. Если структура матрицы такова, что выходы на предыдущей строке на заданных входах остаются известными, то эти выходы и будут входами следующей обучаемой строки. Эта модификация, на мой взгляд, не сильно меняет концепцию одновременной обработки данных нейронами. Просто в этом случае мы ограничиваем «фронт волны» одной единственной строкой. То есть принимаем что одновременно могут возбуждаться только нейроны одной строки, затем данные передаются на следующую строку и т.д.
В вашем варианте нейронной сети количество нейронов должно быть сильно больше чем в традиционной, для решения аналогичной задачи. Не сведет ли увеличение количества нейронов в вашей сети (по сравнению с традиционной сетью) на нет преимущество простоты расчета? Ну т.е. процесс обучения у вас вроде бы вычислительно проще, но и сеть сильно больше получается из-за того что нейрон не «аналоговый», а «цифровой».
Вопрос закономерный. Тесты на сложных данных в программной реализации даже в несколько потоков сейчас вряд ли возможны за приемлемое время. Впрочем, так же как и задачи быстрой визуализации в 3D графике, например. Поэтому для них делают аппаратные ускорители ).
Sign up to leave a comment.

Articles