Skip to content

Commit

Permalink
fleshing out mixed tensors and multilinear documentation
Browse files Browse the repository at this point in the history
  • Loading branch information
mfinzi committed Mar 20, 2021
1 parent 92e2467 commit c774c40
Show file tree
Hide file tree
Showing 13 changed files with 1,190 additions and 234 deletions.
59 changes: 37 additions & 22 deletions docs/notebooks/2building_a_model.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Equivariant Linear Layers (low level)"
"## Breaking EMLP down into equivariant layers (mid level)"
]
},
{
Expand Down Expand Up @@ -310,7 +310,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Below is a trimmed down version of EMLP, so you can see how it is built from the component layers LieLinear, BiLinear, and GatedNonlinearities. These layers can be constructed like ordinary objax modules, using the input and output representations."
"Below is a trimmed down version of EMLP, so you can see how it is built from the component layers `LieLinear`, `BiLinear`, and `GatedNonlinearities`. These layers can be constructed like ordinary objax modules, using the input and output representations."
]
},
{
Expand Down Expand Up @@ -352,36 +352,51 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"The only thing out of the ordinary is the need to add scalar gate channels to the representation in the linear layers directly before the `GatedNonlinearity` with the `gated` function."
"The representations of the hidden layers (taking place of the number of channels in a standard MLP) is by default given by this `uniform_rep` shown above. Unlike this pedagogical implementation you can specify the representation of the hidden layers directly in the [full EMLP](https://emlp.readthedocs.io/en/latest/package/emlp.models.mlp.html#emlp.models.EMLP) by feeding in a representation to the `ch` argument, or even a list of representations to specify each hidden layer."
]
},
{
"cell_type": "code",
"execution_count": null,
"cell_type": "markdown",
"metadata": {},
"outputs": [],
"source": []
"source": [
"Note that since we are using the `GatedNonlinearity`, additional scalar gate channels need to be added to the output representation for the layer directly before the nonlinearity (in this case the `LieLinear` layer) which can be achieved with the `gated` function."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## The equivariant linear layers (low level)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"At a lower level, the implementation of the `LieLinear` is fairly straightforward. An unconstrained bias `b` and weight matrix `w` are initialized. The projection matrices $P_b$ and $P_w$ are computed which are used project onto the symmetric subspace for each. Finally, during the forward pass, the unconstrained parameters are reshaped to vectors, projected via the matrices, and reshaped back to the original sizes. Then these projected parameters are applied to the input like a standard linear layer."
]
},
{
"cell_type": "code",
"execution_count": 34,
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# from emlp.models.mlp import Standardize\n",
"# from emlp.models.model_trainer import RegressorPlus\n",
"# from emlp.slax.utils import LoaderTo\n",
"# BS=500\n",
"# lr=3e-3\n",
"# NUM_EPOCHS=100\n",
"\n",
"# dataloaders = {k:LoaderTo(DataLoader(v,batch_size=BS,shuffle=(k=='train'),\n",
"# num_workers=0,pin_memory=False)) for k,v in {'train':trainset,'test':testset}.items()}\n",
"# dataloaders['Train'] = dataloaders['train']\n",
"# opt_constr = objax.optimizer.Adam\n",
"# lr_sched = lambda e: lr\n",
"# trainer = RegressorPlus(model,dataloaders,opt_constr,lr_sched,log_args={'minPeriod':.02,'timeFrac':.25})\n",
"# trainer.train(NUM_EPOCHS)"
"class LieLinear(Module):\n",
" \"\"\" Basic equivariant Linear layer from repin to repout.\"\"\"\n",
" def __init__(self, repin, repout):\n",
" nin,nout = repin.size(),repout.size()\n",
" self.b = TrainVar(objax.random.uniform((nout,))/jnp.sqrt(nout))\n",
" self.w = TrainVar(orthogonal((nout, nin)))\n",
" self.rep_W = rep_W = repout*repin.T\n",
" \n",
" self.Pb = repout.symmetric_projector() # the bias vector has representation repout\n",
" self.Pw = rep_W.symmetric_projector()\n",
" \n",
" def __call__(self, x):\n",
" W = (self.Pw@self.w.value.reshape(-1)).reshape(*self.w.value.shape)\n",
" b = self.Pb@self.b.value\n",
" return x@W.T+b"
]
}
],
Expand Down
117 changes: 86 additions & 31 deletions docs/notebooks/5mixed_tensors.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -4,53 +4,87 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# Combining Representations from Different Groups (experimental)"
"# Combining Representations from Different Groups (experimental)\n",
"## Direct Product groups"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It is possible to combine representations from different groups."
"It is possible to combine representations from different groups. These kinds of representations are relevant when there are multiple structures in the data. For example, a point cloud is a set of vectors which transforms both under permutations and rotations of the vectors. We can formalize this as $V_{S_n}\\otimes V_{SO(3)}$ or in tensor notation $T_1^{S_n}\\otimes T_1^{SO(3)}$. While this object could be expressed as the representation of the product group $V_{S_n \\times SO(3)}$, other objects like $T_k^{S_n}\\otimes T_j^{SO(3)}$ can not be so easily.\n",
"\n",
"Nevertheless, we can calculate the symmetric bases for these objects. For example, maps from vector edge features $T_1^{SO(3)}\\otimes T_2^{S_n}$ to matrix node features $T_2^{SO(3)}\\otimes T_1^{S_n}$ can be computed:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"execution_count": 1,
"metadata": {},
"outputs": [],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"V²_S(4)⊗V_SO(3) --> V_S(4)⊗V²_SO(3)\n"
]
}
],
"source": [
"from emlp.solver.groups import *\n",
"from emlp.solver.representation import T,vis,V"
"from emlp.solver.representation import T,vis,V,Scalar\n",
"\n",
"repin,repout = T(1)(SO(3))*T(2)(S(4)),T(2)(SO(3))*T(1)(S(4))\n",
"print(repin,\"-->\", repout)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 7,
"metadata": {},
"outputs": [],
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"rep = 2*T(1)(Z(3))*T(1)(S(4))+T(2)(SO(3))"
"vis(repin,repout,cluster=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Or perhaps you would like equivariant maps from two sequence of sets and a matrix (under 3D rotations) to itself. You can go wild."
]
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"V⁴+4V_Z(3)⊗V²_SO(3)⊗V_S(4)+4V²_Z(3)⊗V²_S(4)"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
"name": "stdout",
"output_type": "stream",
"text": [
"Rep: V²+2V_S(4)⊗V_Z(3)\n",
"Linear maps: V⁴+4V_S(4)⊗V_Z(3)⊗V²_SO(3)+4V²_S(4)⊗V²_Z(3)\n"
]
}
],
"source": [
"(rep>>rep)"
"rep = 2*T(1)(Z(3))*T(1)(S(4))+T(2)(SO(3))\n",
"print(f\"Rep: {rep}\")\n",
"print(f\"Linear maps: {rep>>rep}\")"
]
},
{
Expand Down Expand Up @@ -78,42 +112,49 @@
]
},
{
"cell_type": "code",
"execution_count": 5,
"cell_type": "markdown",
"metadata": {},
"outputs": [],
"source": [
"repin,repout = T(1)(SO(3))*T(2)(S(4)),T(2)(SO(3))*T(1)(S(4))"
"The kronecker product of the individual solutions for different groups can be seen in these basis matrices, in the top left hand corner we have a circulant matrix of deep set solutions (identity + background)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAOcAAADnCAYAAADl9EEgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEpklEQVR4nO3cPWuedRiH4TttoNAvoHPFRYJkKmSU6l4EwZZu7dSl2MmX2ZcpkiUfIQiCe1F06BBIEVIpLmKHDsWv4NA+foHk6XLVng8cx/jccJHl5A8Zflur1WoBei686T8AOJs4IUqcECVOiBInRG2v+/jlHx+P/Cv3+P7ViTNJz+68GLlz5ebpyJ2aB89PR+7sHNwduVP057efbZ31u5cTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LWLiFMLRjs7Z+M3CkuKkwtGDw92h25U1tUmFoweHLvcOTOsmzOqoKXE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROi1i4hTLGo8GoWFdabXC+YWlV43YsKXk6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiNparVbnfvzgw+/O/7jBphYVlmVZHu1eHLtVMrWocOnx5ZE7RVOLChfe/mvrzN9HrgPjxAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUWtnSl7+8+7ITMnOwd2JM0nXbzwcuXN8/+rInZpnd16M3Lly83TkTtHPL380UwKbRJwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IWrtEsJ7X3w/soTw5N7hxJnkosJbj/4dubO3fzJyp7aosP3r7yN3nh7tjtxZlt6qgiUE2DDihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR/8sSwpTiosLUEsKU2qLC1BLCpKlVhalFBUsIsGHECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROiNmoJYcrUosKyLMu1W7fHbpVMLSo82r04cqdoalHh70+/soQAm0ScECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFq7RLCOz98PbKEcOXm6cSZpAfPT0fu7BzcHblTc/3Gw5E7x/evjtwp+u2Xzy0hwCYRJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6I2l73cWrB4OnR7sid4qLC1ILBk3uHI3dqiwpTCwZ7+ycjd5Zlc1YVvJwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiFo7UzLF3MmrmTtZb3JaZGry5HXPnXg5IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFqa7VanfvxowufnP9xg00tKizLslx6fHnsVsnUosK1W7dH7hRNLSp88/5PW2f97uWEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihKi1SwjAm+PlhChxQpQ4IUqcECVOiBInRP0H3NO3PQoCCbMAAAAASUVORK5CYII=\n",
"text/plain": [
"V³_S(4)⊗V³_SO(3)"
"<Figure size 432x288 with 1 Axes>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"(repin>>repout)"
"vis(V(Z(3))*V(S(4)),V(Z(3))*V(S(4)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And in the bottom left we have maps $V_{Z_3}\\otimes V_{S_4} \\rightarrow V_{SO(2)}^{\\otimes 2}$ of which the solutions are the product of $V_{Z_3}\\otimes V_{S_4} \\rightarrow \\mathbb{R}$ (the vector $\\mathbf{1}$) and $\\mathbb{R} \\rightarrow V_{SO(2)}^{\\otimes 2}$ (the flattened $I_{3\\times 3}$)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAATAAAADnCAYAAACZtwrQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAADZUlEQVR4nO3dsY3CQBRF0bVFEYicnC4omlJogCo82wDjYIXMXumc9CU/uhrJgZcxxg9A0frtAwD+SsCALAEDsgQMyBIwIOu0N26vq0+UwFet5+cy3Y48BOCTBAzIEjAgS8CALAEDsgQMyBIwIEvAgCwBA7IEDMgSMCBLwIAsAQOyBAzIEjAgS8CALAEDsgQMyBIwIEvAgCwBA7IEDMgSMCBr97+Q98vtoDMA3nts880LDMgSMCBLwIAsAQOyBAzIEjAgS8CALAEDsgQMyBIwIEvAgCwBA7IEDMgSMCBLwIAsAQOyBAzIEjAgS8CALAEDsgQMyBIwIEvAgCwBA7IEDMgSMCBLwIAsAQOyBAzIEjAgS8CALAEDsgQMyBIwIEvAgCwBA7IEDMgSMCBLwIAsAQOyBAzIEjAgS8CALAEDsgQMyBIwIEvAgCwBA7IEDMgSMCBLwIAsAQOyBAzIEjAgS8CALAEDsgQMyBIwIEvAgCwBA7IEDMgSMCBLwIAsAQOyBAzIEjAgS8CALAEDsgQMyBIwIEvAgCwBA7KWMcZ03F7X+QhwgPX8XKbbkYcAfJKAAVkCBmQJGJAlYECWgAFZAgZkCRiQJWBAloABWQIGZAkYkCVgQJaAAVkCBmQJGJAlYECWgAFZAgZkCRiQJWBAloABWQIGZJ32xvvldtAZAO89tvnmBQZkCRiQJWBAloABWQIGZAkYkCVgQJaAAVkCBmQJGJAlYECWgAFZAgZkCRiQJWBAloABWQIGZAkYkCVgQJaAAVkCBmQJGJAlYECWgAFZAgZkCRiQJWBAloABWQIGZAkYkCVgQJaAAVkCBmQJGJAlYECWgAFZAgZkCRiQJWBAloABWQIGZAkYkCVgQJaAAVkCBmQJGJAlYECWgAFZAgZkCRiQJWBAloABWQIGZAkYkCVgQJaAAVkCBmQJGJAlYECWgAFZAgZkCRiQJWBAloABWQIGZAkYkCVgQJaAAVkCBmQJGJAlYECWgAFZyxhjOm6v63wEOMB6fi7T7chDAD5JwIAsAQOyBAzIEjAgS8CALAEDsgQMyBIwIEvAgCwBA7IEDMgSMCBLwIAsAQOyBAzIEjAgS8CALAEDsgQMyBIwIEvAgCwBA7J2/wsJ8J95gQFZAgZkCRiQJWBAloABWQIGZP0C0FAeWUQoKl0AAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
Expand All @@ -125,7 +166,21 @@
}
],
"source": [
"vis(repin,repout,cluster=False)"
"vis(V(Z(3))*V(S(4)),T(2)(SO(3)),False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Wreath Products (coming soon)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"These are all examples of tensor products of representations, which are in turn a kind of representation on the direct product group $G=G_1\\times G_2$. There are other ways of combining groups however, and for many hierarchical structures there is a larger group of symmetries $G_1\\wr G_2$ that contains $G_1 \\times G_2$ but also other elements. These so called wreath products in the very nice paper [Equivariant Maps for Hierarchical Structures](https://arxiv.org/pdf/2006.03627.pdf). Support for the wreath product of representations is not yet implemented but if this is something that would be useful to you, send me an email."
]
}
],
Expand Down

0 comments on commit c774c40

Please sign in to comment.