Глава 4. Имплементация темпорального группировщика и ее псевдокод
В данной главе содержится детальный псевдокод первой имплементации функций алгоритма темпорального группировщика. Входом для него является результат вычислений activeColumns(t), полученный в результате работы пространственного группировщика. Данный код вычисляет состояния активности и предсказания для всех клеток в данный момент времени t. Логическая операция ИЛИ для указанных состояний по всем клеткам формирует вектор результата работы темпорального группировщика для передачи его на вход следующему уровню. Данный псевдокод разбивается на три отдельные фазы, которые выполняются последовательно: Фаза 1: вычисление активных состояний activeState(t) для каждой клетки. Фаза 2: вычисление состояний предчувствия (предсказания) predictiveState(t) для каждой клетки. Фаза 3: обновление синапсов. Фаза 3 необходима только для обучения. Тем не менее, в отличии от работы пространственного группировщика, здесь фазы 1 и 2 включают в себя несколько операций специфических именно для обучения, если оно задействовано. Поскольку темпоральный группировщик гораздо более сложен в своей работе, чем пространственный группировщик, мы рассмотрим сначала его версию предназначенную только для распознавания, а потом версию, где будут и распознавание и обучение. Описание некоторых деталей имплементации, терминологии и вспомогательных процедур приводится в конце этой главы, после обсуждения псевдокода. Псевдокод темпорального группировщика: только распознавание Фаза 1 На первой фазе вычисляются активные состояния для каждой клетки. То есть для каждой победившей активной колонки мы должны определить какие из ее клеток должны стать активными. Если прямой вход был предсказан какой-либо из ее клеток (т.е. ее параметр predictiveState был равен 1 благодаря ее сегменту последовательностей (латеральному), на предыдущем временном шаге), тогда такие клетки становятся активными (строки 4-9). А если данный прямой вход был неожиданным для колонки (т.е. в ней не было клеток с predictiveState равным 1), тогда каждая клетка в этой колонке становится активной (строки 11-13).
1. for c in activeColumns(t) 2. 3. buPredicted = false 4. for i = 0 to cellsPerColumn - 1 5. if predictiveState(c, i, t-1) == true then 6. s = getActiveSegment(c, i, t-1, activeState) 7. if s.sequenceSegment == true then 8. buPredicted = true 9. activeState(c, i, t) = 1 10. 11. if buPredicted == false then 12. for i = 0 to cellsPerColumn - 1 13. activeState(c, i, t) = 1
Фаза 2 Вторая фаза вычисляет состояния предсказания (предчувствия активации) для каждой клетки. Каждая клетка включает свое состояние предчувствия (параметр predictiveState становится 1) если хоть один из ее латеральных сегментов становится активным, т.е. достаточное число его горизонтальных (боковых, латеральных) соединений сейчас активно благодаря прямому входу.
14. for c, i in cells 15. for s in segments(c, i) 16. if segmentActive(c, i, s, t) then 17. predictiveState(c, i, t) = 1 Псевдокод темпорального группировщика: комбинация распознавания и обучения Фаза 1 На первой фазе вычисляются активные состояния (значения activeState) для каждой клетки из победивших колонок. Из этих колонок далее выбирается одна клетка на колонку для обучения (learnState). Логика здесь следующая: если текущий прямой вход снизу был предсказан какой-либо из клеток (т.е. ее параметр predictiveState был равен 1 благодаря какому-то ее латеральному сегменту), тогда эти клетки становятся активными (строки 23-27). Если этот сегмент стал активным из-за клеток выбранных для обучения (learnState ==1), тогда такая клетка также выбирается для обучения (строки 28-30 [исправлена опечатка]). Если же текущий прямой вход снизу не был предсказан, тогда все клетки становятся активными (строки 32-34) и кроме того, клетка лучше всего соответствующая входным данным выбирается для обучения (строки 36-41), причем ей добавляется новый латеральный сегмент.
18. for c in activeColumns(t) 19. 20. buPredicted = false 21. lcChosen = false 22. for i = 0 to cellsPerColumn - 1 23. if predictiveState(c, i, t-1) == true then 24. s = getActiveSegment(c, i, t-1, activeState) 25. if s.sequenceSegment == true then 26. buPredicted = true 27. activeState(c, i, t) = 1 28. if segmentActive(s, t-1, learnState) then 29. lcChosen = true 30. learnState(c, i, t) = 1 31. 32. if buPredicted == false then 33. for i = 0 to cellsPerColumn - 1 34. activeState(c, i, t) = 1 35. 36. if lcChosen == false then 37. i = getBestMatchingCell(c, t-1) 38. learnState(c, i, t) = 1 39. sUpdate = getSegmentActiveSynapses (c, i, -1, t-1, true) 40. sUpdate.sequenceSegment = true 41. segmentUpdateList.add(sUpdate) Фаза 2 Вторая фаза вычисляет состояния предсказания (предчувствия активации) для каждой клетки. Каждая клетка включает свое состояние предчувствия (параметр predictiveState) если любой из ее латеральных сегментов становится активным, т.е. достаточное число его горизонтальных (боковых, латеральных) соединений становятся активными благодаря прямому входу. В этом случае клетка ставит в очередь на отложенное исполнение ряд следующих своих изменений: а) усиление активных сейчас латеральных сегментов (строки 47-48)) и б) усиление сегментов которые могли бы предсказать данную активацию, т.е. сегментов которые соответствуют (возможно пока слабо) активности на предыдущем временном шаге (строки 50-53)).
42. for c, i in cells 43. for s in segments(c, i) 44. if segmentActive(s, t, activeState) then 45. predictiveState(c, i, t) = 1 46. 47. activeUpdate = getSegmentActiveSynapses (c, i, s, t, false) 48. segmentUpdateList.add(activeUpdate) 49. 50. predSegment = getBestMatchingSegment(c, i, t-1) 51. predUpdate = getSegmentActiveSynapses( 52. c, i, predSegment, t-1, true) 53. segmentUpdateList.add(predUpdate)
Фаза 3 Третья и последняя фаза занимается обучением. В этой фазе происходит реальное обновление сегментов (которое было поставлено в очередь на исполнение) в том случае если колонка клетки активирована прямым входом и эта клетка выбрана в качестве кандидатки для обучения (строки 55-57). В противном случае, если клетка по каким-либо причинам перестала предсказывать, мы ослабляем ее латеральные сегменты (строки 58-60)
54. for c, i in cells 55. if learnState(s, i, t) == 1 then 56. adaptSegments (segmentUpdateList(c, i), true) 57. segmentUpdateList(c, i).delete() 58. else if predictiveState(c, i, t) == 0 and predictiveState(c, i, t-1)==1 then 59. adaptSegments (segmentUpdateList(c,i), false) 60. segmentUpdateList(c, i).delete() 61.
|