Unbinding a semantic pointer using involution


I have stored a semantic pointer that is the convolution of two semantic pointers “A*Pos” using a networks.circular convolution . I want to unbind the pointer “A” from Pos using another convolution network using another convolution network.

I tried using another nengo.networks.circularconvolution network with my memory trace as one input and the Pos vector as the other, with the invert_B argument set as True. This does not seem to be working.

I guess I need to get the involution of “Pos” and pass that as the second input to the circular convolution network instead of performing a correlation.

  1. Is there a built-in way to get the involution of a semantic pointer in nengo or should I manually multiply it with the involution matrix? I don’t want to use the action language.

  2. Also, is there a need for normalisation at any stage of the binding/ unbinding operation?



The approach you are describing should be working and it is hard to tell why it is not in your case without the actual code.

You can use the ~ operator to obtain the involution vector of a SemanticPointer instance. But in an actual Nengo network, you have to use the transform matrix on the connection appropriately or if it is the input to a CircularConvolution, set one of the invert_* arguments to True.

In the general case circular convolution will change the length of the vector. I believe that for unit length input vectors the output vector will at least be unit length, but I might be wrong on this one. There a certain unit vectors that have the property of being “unitary”, meaning that when they are convolved with another vector v, the output vector will have the same length as v.


So passing ‘A *Pos’ and ‘Pos’ to a CircularConvolution with invert_b = True, would be sufficient to perform the unbinding? Have been trying to do just that for a while now, guess some other part of the network needs to be debugged.

Thanks for the reply.


Yes, here is some example code:

import nengo
from nengo import spa

d = 64
vocab = spa.Vocabulary(d)

with nengo.Network() as model:
    stimulus_a = nengo.Node(vocab.parse('A * Pos').v)
    stimulus_b = nengo.Node(vocab.parse('Pos').v)
    conv = nengo.networks.CircularConvolution(150, d, invert_b=True)
    nengo.Connection(stimulus_a, conv.A)
    nengo.Connection(stimulus_b, conv.B)
    p = nengo.Probe(conv.output, synapse=0.03)

with nengo.Simulator(model) as sim:

plt.plot(sim.trange(), spa.similarity(sim.data[p], vocab))