Great questions and ideas surfacing here! Generally, Monty is designed in a way that all learning modules can be updated in parallel. There is no requirement to update them in any particular order (like for feed-forward hierarchical processing). The idea is that if a lower-level LM produces an output, it will become the input to the higher-level LM at the next step (or in a more asynchronous system, the next time that higher-LM receives/processes input).
We designed it that way since, analogous to the brain, we don’t only have feed-forward processing of input. As the attached diagram shows, there are many types of connections:
- Classical feed-forward processing
- Skip connections where direct sensory input arrived at LMs that are higher in the hierarchy
- Top-down feedback to bias which object and pose are recognized in the lower LM
- Top-down goal states decompose goals into subgoals
- Lateral voting (which can also happen across LMs at different levels in the hierarchy)
- Motor output to sub-cortical regions/the motor system from every LM/cortical column
These types of connections are derived from long-range connections found in the neocortex. We are currently writing on a paper about this which I am pretty excited about!
Interesting side point: Given all this connectivity, it is hard to think of the system as a hierarchical system. In LM may be getting direct sensory input but also input that has been processed by other LMs before. It is therefore hard to even define which level of the hierarchy an LM is part of. We’ve started to use the term “Heterarchy” instead since there are clearly hierarchical connections in Monty and in the neocortex, but also many non-hierarchical connections. We have a page in our documentation on this: Connecting LMs into a Heterarchy
To get back to the main question: All LMs could be updated in parallel (currently, we update them using a for loop, but there is no prescribed order in which they need to be updated tbp.monty/src/tbp/monty/frameworks/models/graph_matching.py at f2e58fdbfd72e6012d7cafe8ea086c9b0c70a5e9 · thousandbrainsproject/tbp.monty · GitHub ) In our Monty step method we currently have a series of things that happen (tbp.monty/src/tbp/monty/frameworks/models/abstract_monty_classes.py at f2e58fdbfd72e6012d7cafe8ea086c9b0c70a5e9 · thousandbrainsproject/tbp.monty · GitHub ):
- Collect sensory inputs (getting outputs from sensor and learning modules from the previous step)
- Step learning modules (process the input in each learning module & update hypotheses)
- Vote (each LM can send and receive votes. Like @mthiboust mentioned, LMs don’t request votes, they just process whatever arrives)
- Pass goal states (passing goal states from higher LM to lower LMs)
- Pass infos to motor system (each LM produces a motor output in the form of a goal state which is sent to the motor system)
- Check if done (this is more an experimental detail if we work with episodes that have a termination condition)
Not every LM needs to receive input at every step (in fact they often don’t, for instance, if the sensor module didn’t detect a significant change in features it won’t send a new observation to the LM and therefore the LM doesn’t need to update).
All of this could be made even more asynchronous (more like we would imagine it happens in the brain), but it would require some more serious refactoring of the code. However, an important point to note is that even if LMs are not updated, they would still need to model passing time somehow (like decaying their evidence for an object even when not receiving any input). Otherwise, they may be “perceiving” different things at different points in time. E.g. if you saccade, some LMs might receive new sensory input about something, while they receive votes from a “past” representation in another LM. Even without considering LMs that don’t receive input, if we have asynchronous updates, they should happen on a significantly faster time scale than movements are happening in the world (which I think is a fair assumption, i.e. muscular contraction speeds vs. neural conduction speeds).
Hope this helps! Happy to answer more questions