Pull to refresh
6
0
Send message
я думаю, многим было бы интересно посмотреть даже на промежуточный вариант, тут или на гитхабе
на словах все выглядит логично, но как-то организовать это все в реализуемую вычислительную модель без ваших знаний и соображений кажется невозможным
судя по гуглогруппе, желающих помочь было достаточно много, что-то из этого получилось?
хотелось бы услышать, каким образом в рамках вашей теории можно объяснить шизофрению или другие психические заболевания
а второй день лекции на ютубе есть?
В том месте getSegmentActiveSynapses и прочие связанные с активностью сегментов функции, как вы могли заметить, вызываются от предыдущего шага времени.
Активность синапса = подключенность синапса + активность клетки, на которую он указывает.
Строка кода из функции segmentActive.
>ГДЕ происходит само задание этого состояния
В перовой фазе темпорального группировщика.
>This routine returns true if the number of connected synapses on segment 's' that are active due to the given state at time 't' is greater than activationThreshold.
Т.е. функция возвращает true, если количество соединенных синапсов (permanence > connectedPerm), аткивных вследствие заданного состояния (active/learn state) больше параметра activationThreshold.
В реализации функции нужно еще добавить условие, чтобы было:
>if(list.get(syn.c).get(syn.i) && syn.permanence > connectedPerm) {
Список learningCells окажется пустым только при неверных начальных параметрах или полностью нулевом входе, при котором количество активных колонок будет равно нулю, что так же некорректно. Однако, на первом временном шаге для первой активной колонки список действительно пуст, так как нет данных о предыдущем шаге. Выход из ситуации можно придумать разный, например пропустить на первом шаге добавление сегментов.
Обновил код в репозитории.
Все верно, это отсебятина.
Для проверки вашего предположения я подставил условие k < 0, тем самым пропустив этот кусок кода — приложение действительно работает без этой части инициализации, а картина добавления новых сегментов практически идентична той, что получается с инициализацией. Можно эту часть кода удалить, спасибо.
На первой фазе создается только структура segmentUpdate, фактический сегмент появляется только в конце третье фазы. Хотя, я не отрицаю, что можно попробовать не создавать начальные дистальные сегменты.
Синапсы на проксимальных дендритах образуются между аксонами клеток-входов и дендритными сегментами колонок.
Синапсы на дистальных образуются между аксонами клеток внутри региона и дендритами других клеток внутри региона.
Еще кусок из того же абзаца той же страницы, прочтите её, там все изложено подробно и складно:
The implementation of potential synapses is different from the implementation in the spatial pooler. In the spatial pooler, the complete list of potential synapses is represented as an explicit list. In the temporal pooler, each egment can have its own (possibly large) list of potential synapses.
И насчет выбора:
These synapses are randomly chosen from the set of cells that have learnState output = 1 at time step t.
Ваш вариант больше подходит под глагол taken, да и в общем не имеет практического смысла. Весь этот механизм по добавлению/созданию новых синапсов направлен всего лишь на увеличение быстродействия, что видно из цитаты комментарием выше.
Суть действия в том, что при недостаточной степени латеральной (внутрирегиональной, межклеточной) активности сегментов клетки не входят в предсказательное состояние, ввиду чего им добавляются новые синапсы-латеральные связи. В документе, в описании второй фазы темпорального группировщика, можно посмотреть подробнее.
Все так, да. С двойными индексами, с одной стороны, действительно удобнее, я же стремился к соответствию документу в описании функций, да и точные координаты колонки окромя пространственного группировщика дальше не используются и навигации по номеру колонки в списке/номеру клетки в колонке достаточно.
Вы все правильно понимаете. Только в некоторых моментах неточно.
>В начальном состоянии, еще нет даже дендритных сегментов
Сомнительно. Если у нас в начальном состоянии вообще не будет сегментов, то как минимум две начальные фазы темпорального группировщика бесполезны на первом временном шаге и вся система алгоритмов может загнуться. Хотя проще проэкспериментировать и посмотреть на результат.
Насчет создания синапсов, вот отрывок с 43 страницы:

In the temporal pooler, each segment can have its own (possibly large) list of potential synapses. In practice maintaining a long list for each segment is computationally expensive and memory intensive. Therefore in the
temporal pooler, we randomly add active synapses to each segment during learning (controlled by the parameter newSynapseCount). This optimization has a similar effect to maintaining the full list of potential synapses, but the list per segment is far smaller while still maintaining the possibility of learning new temporal patterns.
в классе Synapse два поля:
>public Integer c;
>public Integer i;
Класс используется как для синапсов на проксимальных дендритах (которые ко входу подключены), так и на дистальных, с той разницей, что для проксимальных 'c' и 'i' это на самом деле ваши же X и Y, а для дистальных это c — номер колонки и i — номер клетки, как в пдфе. Неочевидное место, конечно.
Таким образом, idx[0] и idx[1], так как берутся из списка learnState (аналогично определению в пдфе: learnState(c, i, t) — A boolean indicating whether cell i in column c is chosen as the cell to learn on, с разницей в написании: learnState.get(t).get(j).get(k), где t — время, j — колонка, k — клетка), представляют собой номер колонки и номер клетки соотетственно.
Интересный вопрос. Опишу, как это видится мне.
Это не ошибка, это суть оптимизации.
idx[0], idx[1] — индексы рандомной клетки с learnState = true в текущий момент времени.
Синапсы добавляются по мере необходимости. Каждый дендритный сегмент имеет свой набор потенциальных синапсов, который может пересекаться с наборами других дендритных сегментов.
На вопрос, почему он может пересекаться, приведу цитату о проксимальных сегментах:
>Each column in a region is connected to a unique subset of the input bits (usually overlapping with other columns but never exactly the same subset of input bits) (Страница 21)
Если же смотреть логически, то вы правы. Каждая клетка имеет лишь один аксон, следовательно и сформировать она может лишь один синапс.
Что мы получим таким образом? Ровно то же, что имеем сейчас — каждый дендритный сегмент по-прежнему имеет возможность сформировать с каждым аксоном каждой клетки синапс и мы опять вернемся к механизму потенциальных синапсов. С той лишь разницей, что придется отслеживать одну вещь — если данный аксон уже сформировал рабочий синапс, то он не может сформировать его с другой клеткой. Подобного механизма, насколько я помню, в документе нет.
В данном виде эти сети интересны скорее с исследовательской точки зрения, чем с практической. В теории, можно попробовать применить их к распознаванию речи, визуальных образов, навигации. К любому свойственному человеку виду деятельности.
Нумента в данный момент продвигает платформу Grok, например. Тут можно прочитать об отличии алгоритмов grok от приведенных в статье и схожести с скрытой марковской моделью.

Information

Rating
Does not participate
Registered
Activity