Hi Gil san,

Thank you for the information.  I like it very much; especially a lot of
comments in the code and the part that it's written in a single file.
 synPermConnected is connectedPerm in the white paper, right? ;)

I'm thinking that it might be interesting for some people if we can run it
on silverlight + IronPython.

Best Regards,
    Hideaki Suzuki.



2013/8/22 Gil Shotan <[email protected]>

>  Hi Tim and Hideaki,
>
>  My name is Gil, and I'm currently an intern at Grok Solutions working on
> revamping the Spatial Pooler. I've written a new implementation for the
> spatial pooler in Python, and currently working on converting it to C++.
> You are welcome to check out the new spatial pooler implementation on my
> fork (There's an open pull request to that branch on the NuPIC repo):
>
>
> https://github.com/gilsho/nupic/blob/newsp/py/nupic/research/spatial_pooler.py
>
>   In designing the new spatial pooler implementation we tried to make it
> as easy as possible for people to understand the code and experiment with
> it. As such we took out some functionality such as input borders (although
> as Scott mentioned it is pretty simple to add and I can show guide you into
> how to add it) , but we did include support for topology. I actually
> implemented exactly what Tim suggested, namely that topology is
> conceptually separate. It is easy to override a function or two
> (mapPotential and initPermanence) and implement any arbitrary topology and
> neighboring relationships between columns as you'd like. If you get a
> chance – please take a look. I'd appreciate feedback!
>
>  And to address your concern Tim, the algorithms in its current state is
> used in production, but that doesn't mean it can't be improved, or make
> modifications to it to apply it to other domains.
>
>  Gil.
>
>
>   From: Scott Purdy <[email protected]>
> Reply-To: "NuPIC general mailing list." <[email protected]>
> Date: Wednesday, August 21, 2013 1:43 PM
> To: "NuPIC general mailing list." <[email protected]>
> Subject: Re: [nupic-dev] A few questions about NuPIC
>
>   Also, Gil is finishing up work on a new Python implementation of the
> spatial pooler that includes support for wrapping input (Left of 0,0 is
> 5,5).  And we were going to leave the "input border" out of the
> implementation for simplicity but it is only a single line to add back in.
>  The input border would leave space around the edges that you don't center
> columns in -- the bits would still be covered but it would reduce or
> eliminate the overhang of a column's input space outside the image.
>
>
> On Wed, Aug 21, 2013 at 1:19 PM, Scott Purdy <[email protected]> wrote:
>
>> Haven't had time to thoroughly read through this but just want to mention
>> that topology already exists in the codebase.  By default, the CLA uses a
>> spatial pooler that has global inhibition (every column is a neighbor of
>> every other column) but you can specify in the constructor something else,
>> including a 2D topology that might make sense for vision.
>>
>>  You can take a look at the "inputShape" parameter in the spatial pooler
>> constructor.
>>
>>
>>  On Wed, Aug 21, 2013 at 12:02 PM, Tim Boudreau <[email protected]>wrote:
>>
>>>   Hi, Hideaki-san,
>>>
>>>  Thanks for your response!  Some comments inline:
>>>
>>>  On Wed, Aug 21, 2013 at 1:55 PM, Hideaki Suzuki <[email protected]>wrote:
>>>
>>>>  If you say "I have to solve it at least once myself" to mean
>>>> implementing by yourself,
>>>> I have the same feeling and have been working for three months of my
>>>> part time.
>>>>
>>>
>>>  :-)
>>>
>>>
>>>>  As you can see it in the mail archive (http://nupic.markmail.org/),
>>>> the current implementation of
>>>>  Nupic focuses on 1D topology for the proof of concept in production
>>>> level, which means a set
>>>> of values are put to CLA, and CLA predicts for future values.  Not much
>>>> "neighbors" and
>>>> "hierarchies" exist yet.
>>>>
>>>
>>>  I figure that topology really should be conceptually separate - if
>>> you've got an array of stuff, you can represent that as any number of
>>> dimensions;  it helps if n is an n-root of the number of elements, but if
>>> you control the number of elements, that's easy.  So I'd think you'd have
>>> an abstraction for "topology" and when you want to find neighbors of a
>>> cell/column, you'd "ask the topology".  Otherwise you'd end up hard-coding
>>> assumptions that might be difficult to rip out later.  I find it easier to
>>> think regions in terms of 2D layers, but that's what makes sense for a
>>> human, not necessarily a computer.
>>>
>>>  "proof of concept in production level" worries me a bit - I thought
>>> this thing was already in production use;  did I misunderstand and most of
>>> this is untested theory?
>>>
>>>      1. In some places, the white paper implies that input bits are
>>>>> wired directly to columns;  elsewhere it suggests that there is a network
>>>>> of synapses between input bits and columns in the layer that directly
>>>>> receives input.
>>>>>
>>>>
>>>>  Yes.
>>>> Those synapses are the links between input bits and your columns.
>>>> Each column will have some number of synapses.  Say, 256 or 1024.
>>>> Each synapse is either connected or disconnected to its input bit
>>>> location according to its permanence value.
>>>>
>>>
>>>  So, I guess my question is:  Does a *proximal* dendrite connect to
>>> more than one bit?
>>>
>>>
>>>>   If you have 1024 columns with 1024 synapses in your region, and all
>>>> synapses are connected, you need to
>>>>  check 1 million links to see how strong each column is activated in
>>>> SP.
>>>>
>>>
>>>  Yeah, this seems to be where the combinatorics go through the roof,
>>> and where hardware could help;  probably some clever optimizations are
>>> possible to pre-determine a set that you don't need to check.
>>>
>>>
>>>>    3. It's mentioned several times that "strongly activated" columns
>>>>> inhibit nearby columns, to achieve sparseness.  But it's also implied that
>>>>> the input to a cell is a single bit, which has no concept of strong or
>>>>> not-so-strong.  Is "strongly activated" the count of cells in a column
>>>>> which are active due to feed-forward input, or is the input actually 
>>>>> scalar
>>>>> and I just misunderstood that?
>>>>>
>>>>
>>>>  As mentioned above, one column has many synapses.
>>>>
>>>
>>>  This is the sort of statement that makes me wonder if I'm
>>> understanding things right.  One *column* has many syapses, or one cell's
>>> dendrite has many synapses?  Or we are summing
>>> column.cells.activeSynapseCount?
>>>
>>>
>>>>    4. I may be misunderstanding the nature of distal dendrite
>>>>> segments;  I'm also trying to model the data efficiently.  Is it sane to
>>>>> model a distal dendrite segment as
>>>>>   - A column coordinate in a 2D topology - x,y coordinates
>>>>>   - A list of path-traversal instructions - (i.e. up-left, down, down,
>>>>> right) in which no coordinate is traversed more than once
>>>>>   - Permanence values mapped to instructions, to model synapses
>>>>>
>>>>
>>>>  I may be misunderstanding your query..., but yes a column can be
>>>> arranged in 2D.
>>>>
>>>
>>>  I was thinking of a 2D topology of columns, so you could refer to them
>>> as 0,0 ... 0,1 ... 0,2 ... 1,0 ... etc.  In that case, say with 4 cells per
>>> column, the coordinates of one cell would be something like 0,1:3.
>>>
>>>
>>>>   Distal dendrite segment is used for TP.
>>>> Cardinality is like...
>>>>
>>>>      [Region] 1 --- 1..n [Column]
>>>>     [Column] 1 --- 1 [Proximal Segment]
>>>>     [Column] 1 --- 1..n [Cell]
>>>>      [Cell] 1 --- 1..n [Distal Segment]
>>>>
>>>>      [Proximal Segment] 1 --- 1..n [Proximal Synapse]
>>>>      [Distal Segment] 1 --- 1..n [Distal Synapse]
>>>>
>>>
>>>  That helps, thanks!
>>>
>>>
>>>>   Potential synapses of a distal segment are setup virtually.
>>>> You will pickup any cell at random to make literal connections.
>>>>
>>>
>>>  So basically, when creating a new distal segment, just randomly pick
>>> some cells "near" (in whatever topology) the cell it connects to?
>>>
>>>  It seems like the choice of connections should profoundly effect the
>>> behavior of the system to the point of determining all of its future
>>> behavior.
>>>
>>>
>>>>
>>>>>         7. It's not clear how the initial state of the system (before
>>>>> any input) is established - i.e. you have to have some distal dendrite
>>>>> segments and potential synapses
>>>>>
>>>>
>>>>  I believe distal segments and their potential synapses can be setup
>>>> on the fly.
>>>>
>>>
>>>  Yes;  the question is, what should be the algorithm to decide what
>>> cells/columns the distal segments connect to.  Say that we have a grid of
>>> columns with 4-cells-per-column like
>>>
>>>  ooooo
>>> ooxoo
>>> ooooo
>>>
>>>  and we need to define the distal segment for x.  Should we:
>>>  - Pick a random path among the columns?  Or some sort of gaussian
>>> distribution of neighboring columns?  Or something else?
>>>  - Have synapses with *every* cell in the columns intersected?  Or just
>>> some?  Or just one?
>>>
>>>
>>>>   For edge and corner detection, I'm not so sure how well SP can
>>>> handle.
>>>> At least, SP seems to work well for the roll of feature detection (V1)
>>>> in the video above.
>>>>
>>>
>>>  I wasn't clear - I wasn't talking about edge and corner detection.
>>>  Rather, say we have a grid of cells:
>>>  xooox
>>> ooooo
>>> xooox
>>>
>>>  The white paper states that columns are inhibited by other columns
>>> near them.  In this grid, most cells have 8 neighbors which could inhibit
>>> or be inhibited by them.  But the corner columns have only 3 neighbors and
>>> the edge cells have 5 neighbors.  Which means a corner column will be less
>>> inhibited.  So even if the signal activating it is less relevant, it has a
>>> higher probability of being active.  This seems like it ought to be a
>>> problem;  you could solve it by:
>>>  - Ignoring predictions from perimeter columns
>>>  - Wrapping around, so that above and to the left of 0,0 is 5,5
>>>  - Having such a large number of columns that erroneous values from
>>> (literally!) edge-cases have minimal effect
>>>
>>>  Thanks,
>>>
>>>  -Tim
>>>
>>>  --
>>> http://timboudreau.com
>>>
>>>  _______________________________________________
>>> nupic mailing list
>>> [email protected]
>>> http://lists.numenta.org/mailman/listinfo/nupic_lists.numenta.org
>>>
>>>
>>
>
> _______________________________________________
> nupic mailing list
> [email protected]
> http://lists.numenta.org/mailman/listinfo/nupic_lists.numenta.org
>
>
_______________________________________________
nupic mailing list
[email protected]
http://lists.numenta.org/mailman/listinfo/nupic_lists.numenta.org

Reply via email to