Суперпозиция также представляет из себя ассоциативную память, из которой можно читать по запросу.
Если суперпозиция содержит в себе пары концепций: [ac, ad, bc, bd], то умножив её на вектор запроса q = a, получим суперпозицию значений [c, d], где запрос является частью пары.
(ac + ad + bc + bd) * a = c + d
import torch
import torch.nn.functional as F
D = 1024
# Векторы концепций
a, b, c, d = F.normalize(torch.randn(4, D))
# Суперпозиция из попарных взаимодействий концепций
S = (a + b) * (c + d)
S = F.normalize(S.unsqueeze(0)).squeeze(0)
# Читаем из памяти по запросу a
Sv = S * a
Sv = F.normalize(Sv.unsqueeze(0)).squeeze(0)
# Смотрим что прочиталось
z = torch.vstack([a, b, c, d])
z = F.normalize(z)
r = Sv @ z.T
print(r)
# [-0.06, -0.03, 0.37, 0.39]
Если суперпозиция содержит в себе пары концепций: [ac, ad, bc, bd], то умножив её на вектор запроса q = a, получим суперпозицию значений [c, d], где запрос является частью пары.
(ac + ad + bc + bd) * a = c + d
import torch
import torch.nn.functional as F
D = 1024
# Векторы концепций
a, b, c, d = F.normalize(torch.randn(4, D))
# Суперпозиция из попарных взаимодействий концепций
S = (a + b) * (c + d)
S = F.normalize(S.unsqueeze(0)).squeeze(0)
# Читаем из памяти по запросу a
Sv = S * a
Sv = F.normalize(Sv.unsqueeze(0)).squeeze(0)
# Смотрим что прочиталось
z = torch.vstack([a, b, c, d])
z = F.normalize(z)
r = Sv @ z.T
print(r)
# [-0.06, -0.03, 0.37, 0.39]