-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.xml
430 lines (288 loc) · 53.6 KB
/
index.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Justas Dauparas on Justas Dauparas</title>
<link>https://dauparas.github.io/</link>
<description>Recent content in Justas Dauparas on Justas Dauparas</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language>
<copyright>&copy; 2020 Justas Dauparas</copyright>
<lastBuildDate>Thu, 17 Dec 2020 06:44:46 -0400</lastBuildDate>
<atom:link href="/" rel="self" type="application/rss+xml" />
<item>
<title>AlphaFold 2 & Equivariance</title>
<link>https://dauparas.github.io/post/af2/</link>
<pubDate>Thu, 17 Dec 2020 06:44:46 -0400</pubDate>
<guid>https://dauparas.github.io/post/af2/</guid>
<description>
<p><a href="https://twitter.com/fabianfuchsml" target="_blank">Fabian Fuchs</a> &amp; <a href="https://twitter.com/JustasDauparas" target="_blank">Justas Dauparas</a></p>
<p>A few weeks ago, in the latest CASP competition for protein structure prediction (<a href="https://predictioncenter.org/casp14/index.cgi" target="_blank">CASP14</a>), DeepMind&rsquo;s AlphaFold 2<sup class="footnote-ref" id="fnref:3"><a href="#fn:3">1</a></sup> outperformed all its competitors with an unprecedented margin. In this blog post, we aim to shed light on one of the important building blocks that distinguishes AlphaFold 2 from the other approaches and likely contributed to their success: an equivariant structure prediction module.</p>
<p>In short: this module is a neural network that iteratively refines the structure predictions while respecting and leveraging an important symmetry of the problem, namely that of roto-translations. At this point, DeepMind has not yet published a paper so we do not know how exactly they address this. However, from their CASP14 presentation, it seems possible that their model is similar to the <a href="https://arxiv.org/abs/2006.10503" target="_blank">SE(3)-Transformer</a>. Most of this blog post is written irrespectively of the exact implementation of their SE(3)<sup class="footnote-ref" id="fnref:4"><a href="#fn:4">2</a></sup>-equivariant transformer module. At some points, particularly when we go into depth, we need to make some assumptions, but we will state those explicitly. We assume some basic understanding of deep learning as a prerequisite for reading this post, but not much more. We hope this blog post is valuable for both machine learners and biologists/chemists.</p>
<h2 id="what-is-the-protein-structure-prediction-problem-and-why-is-it-symmetric"><strong>What is the Protein Structure Prediction Problem and Why is it Symmetric?</strong></h2>
<p>In the protein structure prediction problem the rules of the game are that given a sequence of <a href="https://en.wikipedia.org/wiki/Amino_acid" target="_blank">amino acids</a> (alphabet = &ldquo;ARNDCQEGHILKMFPSTWYV-&rdquo;) you have to return XYZ coordinates of all atoms in some frame of reference. The simplified version of this problem is to return XYZ coordinates of the protein backbone atoms only, ignoring side chain atoms.</p>
<p>What does <em>some frame of reference</em> mean? It means that the model is expected to choose an <em>overall orientation</em> of the protein arbitrarily. This can be broken down into the position of the centre of mass as well as the angular orientation. Assuming the protein floats freely in a solution, both of these choices do not affect the energy of the system<sup class="footnote-ref" id="fnref:5"><a href="#fn:5">3</a></sup>. Leveraging this property of the prediction task could prove very beneficial for the performance of the model. We will explore this later in this blog post.</p>
<p>Traditionally, this symmetry has been dealt with in a fairly straightforward way. The first generation of AlphaFold, for example, predicted distance distributions between atoms and converted those into a potential (which is easy to make symmetric). A gradient descent algorithm was then used to find coordinates for the protein which minimise the potential. AlphaFold 2, on the other hand, is doing something different. It predicts the coordinates directly, in an end-to-end fashion. This end-to-end regression to 3D coordinates is what makes it more difficult to deal with the symmetry correctly.</p>
<h2 id="protein-backbone-geometry"><strong>Protein Backbone Geometry</strong></h2>
<p>As we mentioned earlier, the easier (but still pretty hard) version of the protein structure prediction problem is to determine the protein backbone geometry. Let&rsquo;s have a look at what a protein backbone is and how it can be represented.</p>
<p>A protein backbone is a repeating sequence (linear chain) of 3 atoms: nitrogen, carbon, and another carbon, namely</p>
<p>$$\underbrace{N^{(1)}, C_{\alpha}^{(1)}, C^{(1)}}, \underbrace{N^{(2)}, C_{\alpha}^{(2)}, C^{(2)}},&hellip;,\underbrace{N^{(L)}, C_{\alpha}^{(L)}, C^{(L)}}$$</p>
<p>for the protein of length $L$. The middle carbon has a special name. It is called &ldquo;C alpha&rdquo; because that is where the side chain is connected to. The first three atoms belong to the first amino acid (first residue), the next three to the next amino acid (next residue) etc. Below we depict the protein backbone geometry of two residues.</p>
<p><img src="https://i.imgur.com/fZ0Sx3V.png" alt="" />
In the above illustration of the protein backbone, the atoms would be represented as: $N^{(1)}, C_{\alpha}^{(1)}, C^{(1)}, N^{(2)}, C_{\alpha}^{(2)},C^{(2)},N^{(3)}.$ Bond lengths are shown in angstroms and angles in degrees. For example the distance between $N^{(i)}$ and $C^{(i)}$ is about $1.47 \unicode{x212B}$ (in SI units $1.47\cdot 10^{-10}$ meters). Notice that the bond lengths and angles between neighboring backbone atoms are fixed. The only remaining degrees of freedom are the so-called torsion (dihedral) angles. Those are shown as $\psi^{(1)}, \omega^{(1)}, \phi^{(2)}, \psi^{(2)}, \omega^{(2)}$ in the diagram. A red triangle shows a plane connecting 3 atoms from one amino acid. All red triangles are of the same size except that they have different positions and different orientations. Now let&rsquo;s have a look at a real protein structure visualised in PyMOL where each amino acid is only depicted by its $C_{\alpha}$ because other backbone atoms are rigidly connected to it.</p>
<p><img src="https://i.imgur.com/uiW9ESH.jpg" alt="" />
This example protein, <a href="https://www.rcsb.org/structure/1qys" target="_blank">1QYS</a>, demonstrates a relatively simple backbone configuration. On the left, adjacent $C_{\alpha}$ atoms (black dots) are connected by straight lines ($N, C$ are left out for clarity). On the right, the cartoon structure shows subsets of residues as <a href="https://en.wikipedia.org/wiki/Alpha_helix" target="_blank">alpha helices</a> and <a href="https://en.wikipedia.org/wiki/Beta_sheet" target="_blank">beta sheets</a> which are <a href="https://en.wikipedia.org/wiki/Protein_secondary_structure" target="_blank">secondary structure</a> representations. The colour changes from blue at the start to red at the end of the backbone. This protein is 92 amino acid residues long ($L=92$).</p>
<p>Proteins come in various lengths. For example, in the CASP14 competition, the shortest target protein had 32 amino acids, whereas the longest one had 2180. This means that the computational structure prediction pipeline needs to handle variable-length inputs/outputs as well as long sequences. Furthermore, proteins can assemble into <a href="https://en.wikipedia.org/wiki/Protein_complex" target="_blank">protein complexes</a> to form larger structures which are more difficult to predict.</p>
<!-- **Fabian:** *I think, after the figure and before the next headline it would be nice to have a paragraph giving a little background about the relevance of this backbone representation. Is there some upper limit on how heavy a residue can be? How heavy is the overall protein? How long can the backbone be?* -->
<h3 id="ways-to-represent-a-protein-backbone">Ways to Represent a Protein Backbone</h3>
<p>Predicting backbone configurations in 3D space may seem to be straightforward, but is in fact challenging because atoms that are far in the sequence space (<a href="https://en.wikipedia.org/wiki/Protein_structure#Primary_structure" target="_blank">primary protein structure</a>) can be close in 3D space and they can interact. This suggests that non-local modelling is needed to accurately predict <a href="https://en.wikipedia.org/wiki/Protein_structure#Tertiary_structure" target="_blank">tertiary structure</a>. At the same time, protein backbones have a clearly defined local structure (bond lengths and angles are fixed). Choosing to focus on local and/or non-local interactions leads to different backbone representations. In the following, we will describe four common ways of representing the protein backbone. Finally, we will explain how AlphaFold 2 combined some of these and why.</p>
<!--
We are going to describe protein backbone in four different ways using XYZ coordinates of all atoms, XYZ coordinates of C alpha + orientation, torsion angles, and relative distances/orientations. -->
<!-- **Fabian:** *Let's add a paragraph motivating why knowing about the different representations is important? Motivating here + summarise in the end* -->
<h4 id="1-xyz-coordinates-of-atoms">1. XYZ Coordinates of Atoms</h4>
<p>Protein backbone atoms can be described using XYZ coordinates. The first residue is composed of $N^{(1)}, C_{\alpha}^{(1)}$, and $C^{(1)}$ each of which has an X, Y, and Z coordinate. This results in a 3 by 3 matrix that represents the entire residue. When you stack these together for the whole backbone of length $L$ you generate a tensor $X$:</p>
<p>$$X\in \mathbb{R}^{3\times 3 \times L},$$</p>
<p>Remember that some distances and angles between backbone atoms (within and between residues) are fixed, so these coordinates will have to satisfy those constraints to result in a valid protein structure.</p>
<h4 id="2-xyz-coordinates-of-c-alpha-orientation">2. XYZ Coordinates of $C_\alpha$ + Orientation</h4>
<p>This representation is based on the premise that distances and angles between $C_{\alpha}^{(i)}$ and $N^{(i)}$ and $C^{(i)}$ are fixed. Therefore it is enough to represent the XYZ coordinates of $C_{\alpha}^{(i)}$ and the orientation of these atoms relative to $C_{\alpha}^{(i)}$. There will still be constraints on the distance and angle between adjacent residues that need to be satisfied for the local geometry to be feasible, but otherwise this representation automatically preserves intrinsic residue geometry. AlphaFold 2 used this representation in their structure module.</p>
<h4 id="3-protein-torsion-dihedral-angles">3. Protein Torsion (Dihedral) Angles</h4>
<p>Since bond lengths and angles between neighbouring backbone atoms are fixed, the only remaining degrees of freedom are the torsion (dihedral) angles.</p>
<!-- ![](https://i.imgur.com/HWuiR3Z.png) -->
<p><img src="https://i.imgur.com/53c5aWm.png" alt="" /></p>
<p>A torsion (dihedral) angle is the angle between two intersecting planes, in this case it is the angle between the green and the red planes. Mathematically we define the function called $\text{Torsion}$ which takes in 4 points in a chain ($C^{(1)}, N^{(2)}, C_{\alpha}^{(2)}, C^{(2)}$) and outputs the angle between the planes created by $C^{(1)}, N^{(2)}, C_{\alpha}^{(2)}$ and $N^{(2)}, C_{\alpha}^{(2)}, C^{(2)}$ as a value between $-\pi$ and $\pi$. We write this as</p>
<p>$$\phi^{(2)}=\text{Torsion}(C^{(1)}, N^{(2)}, C_{\alpha}^{(2)}, C^{(2)})\in [-\pi, \pi].$$
<img src="https://i.imgur.com/fZ0Sx3V.png" alt="" />
Demonstrated in the picture above, each torsion angle has a specific name in protein literature. They are defined as</p>
<p>$$
\begin{align}
\phi^{(i)}&amp;=\text{Torsion}(C^{(i-1)}, N^{(i)}, C_{\alpha}^{(i)}, C^{(i)}),\\<br />
\psi^{(i)}&amp;=\text{Torsion}(N^{(i)}, C_{\alpha}^{(i)}, C^{(i)}, N^{(i+1)}),\\<br />
\omega^{(i)}&amp;=\text{Torsion}(C_{\alpha}^{(i)}, C^{(i)}, N^{(i+1)}, C_{\alpha}^{(i+1)}),
\end{align}
$$</p>
<p>where $i = 1, 2, 3&hellip;,L$. Notice that $\phi^{(1)}$ and $\psi^{(L)}, \omega^{(L)}$ are not defined because there are no $C^{(0)}$ and $N^{(L+1)}$ atoms. Therefore a protein backbone can be represented as a sequence of torsion angles: $$\psi^{(1)}, \omega^{(1)}, \phi^{(2)}, \psi^{(2)}, \omega^{(2)},&hellip;,\phi^{(L)}.$$This representation is independent of the frame of reference and it does not have any local bond length/angle constraints, but it suffers from the lever arm effect meaning that small errors propagate along the backbone. Interestingly, AlphaFold 1 predicted torsion angles to initialise the gradient descent algorithm to optimize the relative distance potentials to obtain the protein structure. It is possible that AlphaFold 2 also predicted torsion angles to obtain initial coordinates of the structure.</p>
<h4 id="4-relative-distances-and-angles-between-residues">4. Relative Distances and Angles between Residues</h4>
<p>Another way to represent backbone atoms without a frame of reference is to use the pairwise distance and angle representations. One choice could be to represent relative distances between $C_{\alpha}$ coordinates and relative orientations (e.g. <a href="https://en.wikipedia.org/wiki/Euler_angles" target="_blank">Euler angles</a>) between red triangles. Denote the Euclidean distance between $C_{\alpha}^{(i)}$ and $C_{\alpha}^{(j)}$ as the distance matrix $D^{(ij)}_{\alpha}$:</p>
<p>$$D^{(ij)}_{\alpha}=\sqrt{(X_{\alpha}^{(i)}-X_{\alpha}^{(j)})\cdot(X_{\alpha}^{(i)}-X_{\alpha}^{(j)})}=\left\lVert(X_{\alpha}^{(i)}-X_{\alpha}^{(j)})\right \rVert_2.$$</p>
<p>The $(D^{(ij)}_{\alpha})^2$ matrix has some special properties. If we write out the dot product we get</p>
<p>\begin{align}
(D^{(ij)}_{\alpha})^2=&amp;(X_{\alpha}^{(i)}\cdot X_{\alpha}^{(i)}+X_{\alpha}^{(j)}X_{\alpha}^{(j)}-2X_{\alpha}^{(i)}X_{\alpha}^{(j)}),\\<br />
(D^{(ij)}_{\alpha})^2=&amp;(G_{\alpha}^{(ii)}+G_{\alpha}^{(jj)}-2G_{\alpha}^{(ij)}),\\<br />
G_{\alpha}^{(ij)} :=&amp; X_{\alpha}^{(i)}X_{\alpha}^{(j)},
\end{align}</p>
<p>where $G_{\alpha}^{(ij)}$ is known as a <a href="https://en.wikipedia.org/wiki/Gramian_matrix" target="_blank">Gram matrix</a>. The Gram matrix has rank 3 because it is a product of two 3-dimensional vectors $X_{\alpha}^{(i)}$ and $X_{\alpha}^{(j)}$ and therefore the square of the distance matrix has rank $\leq 1+1+3=5$. There are requirements for the geometrically centred distance matrix to be positive semi-definite (meaning all eigenvalues are greater or equal to zero). Read more about Euclidean Distance Matrices <a href="https://arxiv.org/abs/1502.07541.pdf" target="_blank">here</a>. It is a global representation of the structure.</p>
<p>If one has a distance matrix, there is a simple algorithm to obtain coordinates that satisfy those distances. It is called <a href="https://en.wikipedia.org/wiki/Multidimensional_scaling" target="_blank">Multidimensional scaling (MDS)</a>. Here is how it works.</p>
<p>The squared distance matrix $D_{\alpha}^2$ is centred by the matrix $J$ to recover the Gram matrix $G_{\alpha}$ and then the Gram matrix is decomposed using eigenvalue decomposition into the diagonal matrix of eigenvalues $\Lambda$ and orthonormal matrix $U$. The obtained coordinates $X_{\alpha}$ are correct up to orthogonal transformation (rotation or reflection).</p>
<p>\begin{align}
J =&amp; I-\frac{1}{L} 11^{T},\\<br />
G_{\alpha} =&amp; -\frac{1}{2}JD_{\alpha}^2J,\\<br />
G_{\alpha} =&amp; U\Lambda U^{T}=X_{\alpha}X_{\alpha}^{T},\\<br />
X_{\alpha} =&amp; U\sqrt{\Lambda}.
\end{align}</p>
<p>There are many different representations for 3D <a href="https://en.wikipedia.org/wiki/Orientation_(geometry)" target="_blank">relative angles</a> (change of frame). We are not going to discuss them here.</p>
<h4 id="summary">Summary</h4>
<p>Even though the final outputs need to be XYZ coordinates, it can be beneficial to use various representations in different parts of the pipeline. Most of the information for protein structure prediction comes from the inverse covariance matrix which is estimated using homologous sequences based on the premise of <a href="https://en.wikipedia.org/wiki/Direct_coupling_analysis" target="_blank">coevolution</a>. This information comes in a pairwise fashion (because it is a covariance matrix) and is used to predict the relative distances and angles (see method 4 above). Previously, AlphaFold 1 used the <a href="https://en.wikipedia.org/wiki/Residual_neural_network" target="_blank">ResNet</a> architecture to map coevolution features to binned distance probabilities.</p>
<p>A protein can be represented as a graph where nodes are residues and edges are the connections between them. These edges include information about the relative distances and angles, but the graph is not embedded in 3D space. This is the &lsquo;trunk&rsquo; part of the AlphaFold 2 network, as shown later. To begin representing this information in 3D space, and obtain intitial XYZ coordinates, one could potentially use torsion angles (see method 3), but this might be too constraining. AlphaFold 2 probably used some network/algorithm to map graph features to obtain the initial XYZ coordinates of $C_\alpha$ + orientation (see method 2 above). Later in the pipeline, they improved their initial prediction by iteratively running their structure module. This is called the refinement step. Now we are going to look at the AlphaFold 2 architecture in more detail.</p>
<h2 id="the-alphafold-2-architecture"><strong>The AlphaFold 2 Architecture</strong></h2>
<p>Having introduced the problem as well as different ways to represent a protein backbone, let&rsquo;s now examine what AlphaFold 2 is doing. The following slide is taken from the CASP14 conference <a href="https://predictioncenter.org/casp14/doc/presentations/2020_12_01_TS_predictor_AlphaFold2.pdf" target="_blank">presentation</a>:</p>
<p><img src="https://i.imgur.com/uhRTxUk.png" alt="AlphaFold2 model" /></p>
<p>As we can see, the AlphaFold 2 architecture consists of three parts:</p>
<p><strong>The Embedding.</strong> This is used to encode the target sequence and related sequences (MSA - <a href="https://en.wikipedia.org/wiki/Multiple_sequence_alignment" target="_blank">multiple sequence alignment</a>) as well as related protein structures called <a href="https://en.wikipedia.org/wiki/Homology_modeling" target="_blank">templates</a>.</p>
<p><strong>The Trunk.</strong> This part learns the residue-residue graph edges and the sequence-residue graph edges. The residue-residue edges represent pairwise information between all residues similar to relative distances in 3D space and relative angles. The sequence-residue edges might have sequence evolutionary information. This information can be used to predict pairwise distances as shown in the slide, but more importantly, it is passed to the structure module to build XYZ coordinates of the structure.</p>
<p><strong>The Structure module.</strong> This module uses a 3D equivariant transformer architecture to refine backbone coordinates and predict side chains. The backbone is represented as oriented red triangles, and the task of this network is to predict new positions and orientations of red triangles as well as the confidence score:</p>
<p><img src="https://i.imgur.com/ZeeFc3k.png" alt="" /></p>
<p>From here on, we will focus on the structure module as this is where the symmetry is broken (initial 3D coordinates obtained). The &lsquo;Embedding&rsquo; and the &lsquo;Trunk&rsquo; take strings of amino acids and create matrix descriptions about potential interactions and relations. None of this is embedded in 3D space; there are no coordinates attached to any of this information. In the structure module, this bit becomes tricky. Suddenly, there are 3D coordinates. Ordinary neural networks do not know what coordinates are. By default, coordinates are just numbers. If we rotate the entire backbone, these numbers change a lot, even though the energy stays the same. This could, in principle, be learned by a neural network, but dealing with global rotations correctly in itself imposes a learning problem that is far beyond trivial. AlphaFold 2&rsquo;s structure module does not have to learn this. It is baked into its design. To that end, it combines two concepts: self-attention (aka the transformer mechanism) and equivariance.</p>
<h2 id="what-is-a-transformer"><strong>What is a Transformer?</strong></h2>
<p>The words <em>Transformer</em> and <em>self-attention</em> are often used interchangeably and describe a mechanism in neural networks which operates on a set of objects (an object could, for example, be an atom or an amino acid) that allows for querying specific information. A self-attention layer maps from set to set or &mdash; in our case &mdash; graph to graph updating the features of the nodes. It focuses on one object at a time, let&rsquo;s say a carbon atom, and queries the surrounding objects <em>conditioned</em> on the information/features attached to this carbon atom. For example, given what we know already about the location of the carbon atom, it might be particularly useful to query for nitrogen atoms in its surrounding. This is in contrast to ordinary convolutions, which combine features in a weighted sum depending on their relative distance but not depending on the query point.</p>
<p>We will first go through the attention mechanism in a general setting and then move to a graph context. If you are very familiar with graphs, but you find the first part confusing, stick with us until the end of this section before re-reading, the paragraph on graphs might make it clear for you.</p>
<p>The following diagram gives a detailed description of what&rsquo;s happening in a general non-graph context:</p>
<p><img src="https://i.imgur.com/KZYyQ5S.png" alt="" /></p>
<p>At the beginning of the layer, each object has features $f_{in}$ attached to them. The output of the layer will be updated features $f_{out}$ for each object. Linear maps project the input features to <strong>q</strong>ueries, <strong>k</strong>eys, and <strong>v</strong>alues. The query from one object is compared to the keys of all other points using a scalar product and resulting in the attention weights. These are then used to get a weighted sum of the values.</p>
<p>Moving to a graph context, we can think of it as follows. At the beginning of a layer, we have a feature vector attached to each node. Each feature is then transformed (via a learnable, linear function) into a key, a value and a query vector. The keys and values are then propagated to all the (directed) edges going away from the node. The queries are propagated to all the incoming edges. Next, queries and keys are multiplied to get weights. For each node, a softmax over all the weights on the incoming edges is applied to normalise the attention weights. Finally, the values are multiplied with the attention weights and propagated to the nodes.</p>
<p>The self-attention mechanism seems like a set of arbitrary choices, so why should we use this? In short, because it is known to work really well. It &lsquo;transformed&rsquo; (sorry) the field of <a href="https://arxiv.org/abs/1706.03762" target="_blank">natural language processing</a> and also had major successes in the fields of graph learning, image processing and relational reasoning.</p>
<h2 id="what-is-equivariance"><strong>What is Equivariance?</strong></h2>
<p>The second machine learning concept we will take a look at is equivariance. It is explained easiest by referring to CNNs (convolutional neural networks). Convolutional layers are translation equivariant, meaning that if the input image is shifted by 3 pixels to the right, the output is also shifted by 3 pixels to the right (assuming a stride of 1). Shifting the input by a few pixels to the right does not pose an entirely new problem. Making use of this <em>symmetry</em> and treating the two inputs similarly is important: it saves parameters, reduces overfitting and speeds up learning.</p>
<p>The following video by Daniel Worrall visualises nicely how this plays out in a CNN (full video <a href="https://www.youtube.com/watch?v=qoWAFBYOtoU" target="_blank">here</a>):</p>
<p><p align="center"><iframe width="700" height="400" src="http://edwag.github.io/video/translation_equivariance.mp4" frameborder="0" allowfullscreen></iframe><a href="https://dauparas.github.io/" target="_blank"></a></p>
<p>Formally, a function $h(x)$ being equivariant can be written as follows<sup class="footnote-ref" id="fnref:1"><a href="#fn:1">4</a></sup>:</p>
<p>$$h\big(\sigma (x)\big) = \sigma \big(h(x)\big) \quad \quad \forall \sigma, x$$</p>
<p>Applying a transformation $\sigma$ on the input has the same effect as applying it to the output. For ordinary convolutions $\sigma$ is a translation of all pixels. For 2D images, this is often all we need. However, when we move to proteins (or other graphs / point clouds in 3D), translations alone really do not capture all the relevant transformations. One crucial symmetry group apart from translations is the special orthogonal group SO(3). This is the group which describes rotation in 3D space. Equivariance for rotations reads as follows:</p>
<p>$$h\big(\mathbf{R} (x)\big) = \mathbf{R} \big(h(x)\big) \quad\quad \forall \,\mathbf{R} \in SO(3)$$</p>
<p>Let&rsquo;s go back to Deepmind&rsquo;s slide on the structure module in AlphaFold 2. In each iteration, the structure module takes in a spatial configuration (the current best guess of what the protein looks like) and predicts corrections, i.e. local shifts and rotations of individual parts of the chain:</p>
<p><img src="https://i.imgur.com/vbxEcls.png" alt="" /></p>
<p>The key here is: the orientation of the current protein configuration (i.e. the input to each iteration) is completely arbitrary and to some degree random. In other words, there is a symmetry we should leverage. When rotating the input protein, the corrections (which need to be expressed as vectors and/or matrices) should rotate as well. Any type of network could theoretically <em>learn</em> this, but it would be much more elegant to bake this into the model directly &mdash; with a rotation equivariant neural network. And to capture both translation <em>and</em> rotation, we extend the requirement to roto-translation equivariance.</p>
<h2 id="how-to-build-a-3d-transformer-se-3-transformer"><strong>How to build a 3D Transformer / SE(3)-Transformer</strong></h2>
<p>So far, we established the usefulness of transformers and of roto-translation equivariance. The question is, how to actually build a roto-translation equivariant transformer network.</p>
<p>To clean up nomenclature: the group of roto-translations in 3D is called the SE(3) group. We will assume that DeepMind uses <em>3D</em> instead of <em>SE(3)</em> in their slides simply because not everyone knows what SE(3) is.</p>
<p>There are multiple possible ways of constructing an SE(3)-equivariant transformer. Currently, the only paper that we are aware of that describes this, is ours: <a href="https://arxiv.org/abs/2006.10503.pdf" target="_blank">SE(3)-Transformers: 3D Roto-Translation Equivariant Attention Networks</a>. We can only speculate whether DeepMind uses a similar approach. So at this point, a big fat <strong>disclaimer</strong>: For the sake of this blog post (and because we are biased), we will assume that they use an approach similar to the SE(3)-Transformer, or at least an approach using irreducible representations<sup class="footnote-ref" id="fnref:2"><a href="#fn:2">5</a></sup>.</p>
<p>One instrumental truth in equivariance is the following: stacking multiple layers (transformations) which are equivariant with respect to the same group (e.g. SE(3)) will result in a transformation that is also equivariant with respect to that group. To start simple, let&rsquo;s build a layer which takes in a vector and changes its length:</p>
<p>$$h(\vec{x}) = \alpha \cdot \vec{x}$$</p>
<p>This is equivariant with respect to rotations:
$$\mathbf{R} \cdot h(\vec{x}) = \mathbf{R} \cdot \alpha \cdot \vec{x} = \alpha \cdot \mathbf{R} \cdot \vec{x} = h(\mathbf{R} \cdot \vec{x})$$</p>
<p>Clearly, we can stack many of these operations, and equivariance will still be preserved. However, that&rsquo;s not very exciting. Let&rsquo;s get a little bit more creative: we know that the norm of $\vec{x}$ does not change under rotation, so we can actually make $\alpha$ a function depending on the norm of $\vec{x}$ without breaking equivariance:</p>
<p>$$h(\vec{x}) = \alpha(\left\lVert \vec{x} \right \rVert_2) \cdot \vec{x}$$</p>
<p>where the function $\alpha$ can be quite complicated, e.g. a trainable neural network. This actually already gives us a valid non-linearity for equivariant neural networks.</p>
<p>So far, $\alpha$ was a scalar. What if we tried to make $\alpha$ a rotation matrix? If we look at the second last equation above, there is a place where we rely on the commuting of $\alpha$ and $\mathbf{R}$:</p>
<p>$$\mathbf{R} \cdot \alpha \cdot \vec{x} = \alpha \cdot \mathbf{R} \cdot \vec{x}$$</p>
<p>Again, this has to hold <em>for all</em> $\vec{x}$. In 2D, this would be fine for any rotation matrix as 2D rotation matrices commute. In 3D however, that is not the case. It turns out that this massively restricts the computations we can do. However, there is a way around it. If we <em>condition</em> $\alpha$ on $\vec{x}$, there are non-trivial functions which fulfill the equivariance constraint. In the literature, $\alpha$ conditioned on $\vec{x}$, i.e. $\alpha(\vec{x})$, is often refered to as the kernel and denoted as $\mathbf{W}(\vec{x})$. And by choosing this kernel correctly, we can ensure that it commutes with rotations:</p>
<p>$$\mathbf{R} \cdot \mathbf{W}(\vec{x}) \cdot \vec{x} = \mathbf{W}(\vec{x}) \cdot \mathbf{R} \cdot \vec{x}$$</p>
<p>There are some simplifications we made so far, which would again make the types of functions we can learn overly restrictive. In the above, we assumed that the input to the kernel and the feature that is transformed are the same vector $\vec{x}$. This does not have to be the case, so let&rsquo;s relax this:</p>
<p>$$h(\vec{x}, \vec{f})= \mathbf{W}(\vec{x}) \cdot \vec{f}$$</p>
<p>Furthermore, we implicitly assumed that $\vec{f}$ is a 3D vector which is rotated by 3x3 rotation matrix. We want to extend this for two reasons: (1) The inputs and outputs of our neural network in most cases include information which is not best represented as 3D vector. (2) Even if we only dealt with 3D vectors in input and output space, it turns out that it is helpful to go to other representations in intermediate layers. The later has again to do with the equivariance constrains &mdash; we can simply learn a more complex set of functions.</p>
<p>This brings us to the concept of irreducible representations. We might have different types of information attached to the nodes (amino acids) in our graph. Often, we have so-called scalar information, e.g. which atoms the amino acid is composed of. Scalar information does not rotate &mdash; or in other words, it is rotated by the identity matrix. We speak of information of different <em>types</em>. 3D vectors are referred to as type 1; scalar information is referred to as type 0. There is also type 2, type 3, and so on. The theory of irreducible representations tells us that we can represent <em>any</em> information as a concatenation of different types, the so-called irreducible representations. Moreover, we know how to rotate vectors of any type, namely by the Wigner-D matrices. The type-0 Wigner D matrix is the identity. The type one Wigner D matrices are the 3x3 rotation matrices we are familiar with. In general, type $\ell$ Wigner D matrices are of dimension $(2\ell + 1) \times (2\ell + 1)$.</p>
<p>Expressing everything in vectors of types $\ell_1, \ell_2, &hellip;$ allows us to write down and solve the linear equivariance constraint for a transformation of point $\vec{x}$ with a feature vector $f$ attached to it. How to derive this is described in Appendix A and B of the SE(3)-Transformer <a href="https://arxiv.org/abs/2006.10503.pdf" target="_blank">paper</a>. To cut it short, it turns out that the spherical harmonics together with the Clebsch-Gordan coefficients form basis vectors for solving this constraint<sup class="footnote-ref" id="fnref:6"><a href="#fn:6">6</a></sup>. <a href="https://arxiv.org/abs/1807.02547" target="_blank">3D Steerable CNNs</a> and <a href="https://arxiv.org/abs/1802.08219" target="_blank">Tensor Field Networks</a> use these results to construct SE(3)-equivariant kernels for building convolutional networks. The <a href="https://arxiv.org/abs/2006.10503.pdf" target="_blank">SE(3)-Transformer</a> uses the same principles to build an equivariant attention mechanism.</p>
<h3 id="building-an-equivariant-transformer">Building an Equivariant Transformer</h3>
<!-- There are obviously mutiple potential ways to build an SE(3)-equivariant transformer and we do not know how exactly DeepMind did it and whether they deviated from the SE(3)-Transformer. Time will show, but for now, here is how it's done in the SE(3)-Transformer: -->
<p>First, we will deal with translations. By only considering relative positions between building blocks of the protein chain, the entire network, from beginning to end, is already translation invariant. This reduces the challenge to being SO(3)-equivariant, where SO is the special orthogonal group &mdash; in other words, the group of rotations. Therefore, the theory above, which provides equivariance with respect to rotations, suffices.</p>
<p>Next, we make a choice to make our lives simpler. Above, we showed that multiplying an equivariant feature with an invariant scalar results in a new equivariant feature. For the attention mechanism, this means we can (and will) choose equivariant values and invariant weights, preserving overall equivariance.</p>
<p>We also established that we need to condition our transformations $\alpha$ on a vector to get non-trivial solutions to the equivariance constraint. For each edge in the graph, we choose this to be the relative position vector between two nodes.</p>
<p>For each of keys, queries, and values, we can use the theory described above to build an equivariant transformation. E.g., to obtain a key for an edge going from node $j$ to node $i$, the feature $f_i$ is mapped to a key $k_{ij}$:
$$k_{ij} = W_k(x_{i} - x_{j})f_j$$
and analogously for queries and values.
$$q_{ij} = W_q(x_{i} - x_{j})f_i$$
$$v_{ij} = W_v(x_{i} - x_{j})f_j$$
where the weight matrices $W$ will be constructed from spherical harmonics, Clebsch-Gordan coefficients, and learnable radial basis functions.</p>
<p>The values are equivariant, just as we wanted them to be. The keys and the queries now have to be combined to create invariant weights. We make use of the fact that scalar products of features of the same irreducible representation are invariant. Hence, if $k_{ij}$ and $q_{ij}$ have the same representation, $w_{ij} = k_{ij}\cdot q_{ij}$ will be invariant. The weights for node $i$ are then normalised via a softmax over all $j$.</p>
<p>To make everything scale better, we introduce neighbourhoods. In the SE(3)-Transformer experiment on the QM9 dataset, for each atom in the molecule, those neighbourhoods were chosen to be all other atoms the atom shares a bond with. However, using the $k$ nearest neighbours is an equally valid approach.</p>
<p>The theory described in the above paragraphs is summarised in figure 2 of the SE(3)-Transformer paper:
<img src="https://i.imgur.com/6GNsG5N.png" alt="" /></p>
<h3 id="what-about-edge-information">What about Edge Information?</h3>
<p>The vigilant reader might have noticed that we have only been talking about node information but have ignored edge information. An example of edge information on the input level could be the bond type between two atoms. How to incorporate this into the model depends critically on the <em>type</em> of this information. If it is a scalar (that is the usual case), then the edge information can just be concatenated with the norm of the relative position and fed as input to the radial neural network in step 2 the figure above. If it was not a scalar but, e.g., a type-1 vector, then this procedure would break equivariance. In this case, the edge feature can be concatenated to the node features at the exact point where they are propagated to the edges. They can hence serve as input to the calculations of keys, queries, and/or values.</p>
<h2 id="conclusion"><strong>Conclusion</strong></h2>
<p>That&rsquo;s it! That was our take on AlphaFold 2 with a special focus on equivariance. AlphaFold 2 is fascinating for all the right reasons. It is an impressive, interdisciplinary piece of intellectual work and will clearly have an impact beyond the scientific community. Beyond that, it might also do a great service to the equivariance community. By no means is it the first time that equivariant neural networks were used to tackle problems in the natural sciences, but it might already be the most prominent instance. We are curious where people will take this next. For more reading around equivariance and AlphaFold, we provided some references in the footnotes. If you want to play around with the code of the SE(3)-Transformer, click <a href="https://github.com/FabianFuchsML/se3-transformer-public" target="_blank">here</a>.</p>
<p><strong>Credit</strong>: <em>A big thank you to Adam Kosiorek, Bradley Gram-Hansen, Coral Bays-Muchmore, Haobo Wang, and Adam Golinski for helpful discussions and feedback. Fabian is part of the A2I lab at Oxford and funded by the EPSRC Centre for Doctoral Training in Autonomous Intelligent Machines and Systems. Justas is at the Baker Lab which is part of the University of Washington Institute for Protein Design and he is supported by The Open Philanthropy Project Improving Protein Design.</em></p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:3">We suggest to read DeepMind&rsquo;s blog posts for more details: <a href="https://deepmind.com/blog/article/AlphaFold-Using-AI-for-scientific-discovery" target="_blank">AlphaFold 1</a>, <a href="https://deepmind.com/blog/article/alphafold-a-solution-to-a-50-year-old-grand-challenge-in-biology" target="_blank">AlphaFold 2</a>. Slides from the CASP14 conference are publicly available <a href="https://predictioncenter.org/casp14/doc/presentations/2020_12_01_TS_predictor_AlphaFold2.pdf" target="_blank">here</a>.
<a class="footnote-return" href="#fnref:3"><sup>^</sup></a></li>
<li id="fn:4">SE(3) is the group of rotations and translations in 3D. SE is short for <em>special euclidean</em>. DeepMind says &lsquo;3D equivariant transformer&rsquo; in their presentation. Most likely, they chose <em>3D</em> just because the term is a lot more intuitive.
<a class="footnote-return" href="#fnref:4"><sup>^</sup></a></li>
<li id="fn:5">This is true because the gravitational forces are irrelevant compared to the electrostatic forces that govern the folding of a protein. The process of experimental measuring itself does actually introduce a frame of reference &mdash; as any measuring procedure does.
<a class="footnote-return" href="#fnref:5"><sup>^</sup></a></li>
<li id="fn:1">This equation is actually stricter than it needs to be. The transformation $\sigma$ does not have to be the same on both sides of the equation. It just needs to be a representation of the same group.
<a class="footnote-return" href="#fnref:1"><sup>^</sup></a></li>
<li id="fn:2">Irreducible representations are the basis of multiple works in this area, particularly of <a href="https://arxiv.org/abs/1807.02547" target="_blank">3D Steerable CNNs</a> and <a href="https://arxiv.org/abs/1802.08219" target="_blank">Tensor Field Networks</a>. The <a href="https://arxiv.org/abs/2006.10503" target="_blank">SE(3)-Transformer</a> is heavily based on both of these. Another set of works uses regular representations. If you want to learn about these, you could read <a href="https://fabianfuchsml.github.io/equivariance1of2/" target="_blank">this blog post</a> about Taco Cohen&rsquo;s seminal work from 2016, or <a href="https://arxiv.org/abs/2002.12880" target="_blank">this 2020 paper</a> from Marc Finzi.
<a class="footnote-return" href="#fnref:2"><sup>^</sup></a></li>
<li id="fn:6">Knowing about spherical harmonics and Clebsch-Gordan coefficients is not important for understanding the rest of the blog post. If you are still curious: the <a href="https://en.wikipedia.org/wiki/Spherical_harmonics" target="_blank">spherical harmonics</a> are a set of functions defined on the surface of a sphere. In fact, they form an orthonormal basis for functions on the sphere, so any function on the sphere can be expressed as a linear combination of spherical harmonics. The <a href="https://en.wikipedia.org/wiki/Clebsch%E2%80%93Gordan_coefficients" target="_blank">Clebsch-Gordan</a> coefficients serve as a change-of-basis matrix and are part of a particular identity when working with irreducible representations (see Eqn. 26 in the <a href="https://arxiv.org/abs/2006.10503.pdf" target="_blank">SE(3)-Transformer</a>).
<a class="footnote-return" href="#fnref:6"><sup>^</sup></a></li>
</ol>
</div>
</description>
</item>
<item>
<title>Learn it yourself - online resources</title>
<link>https://dauparas.github.io/post/learning/</link>
<pubDate>Sun, 26 Jul 2020 06:44:46 -0400</pubDate>
<guid>https://dauparas.github.io/post/learning/</guid>
<description>
<p>This is a short list of books and lectures with links for myself and anyone else who might find them useful. A book is worth a thousand arXiv papers!</p>
<h3 id="machine-learning-books">Machine Learning Books</h3>
<ol>
<li><a href="https://www.microsoft.com/en-us/research/uploads/prod/2006/01/Bishop-Pattern-Recognition-and-Machine-Learning-2006.pdf" target="_blank">Pattern Recognition and Machine Learning</a> by Christopher M. Bishop,</li>
<li><a href="http://www.inference.org.uk/itprnn/book.pdf" target="_blank">Information Theory, Inference, and Learning Algorithms</a> by David J.C. MacKay, <a href="https://www.youtube.com/watch?v=BCiZc0n6COY&amp;list=PLruBu5BI5n4aFpG32iMbdWoRVAA-Vcso6" target="_blank">videos</a>,</li>
<li><a href="http://noiselab.ucsd.edu/ECE228/Murphy_Machine_Learning.pdf" target="_blank">Machine Learning: A Probabilistic Perspective</a> by Kevin P. Murphy,</li>
<li><a href="http://web4.cs.ucl.ac.uk/staff/D.Barber/pmwiki/pmwiki.php?n=Brml.Online" target="_blank">Bayesian Reasoning and Machine Learning</a> by David Barber,</li>
<li><a href="https://www.deeplearningbook.org/" target="_blank">Deep Learning</a> by Ian Goodfellow, Yoshua Bengio, and Aaron Courville,</li>
<li><a href="https://web.stanford.edu/~hastie/ElemStatLearn/printings/ESLII_print12.pdf" target="_blank">The Elements of Statistical Learning</a> by Trevor Hastie, Robert Tibshirani, and Jerome Friedman,</li>
<li><a href="https://www.stat.cmu.edu/~larry/all-of-statistics/" target="_blank">All of Statistics A Concise Course in Statistical Inference</a> by Larry Wasserman,</li>
<li><a href="http://www.incompleteideas.net/book/RLbook2018.pdf" target="_blank">Reinforcement learning: An introduction</a> by Richard S. Sutton and Andrew G. Barto.</li>
</ol>
<h3 id="lectures-on-machine-learning">Lectures on Machine Learning</h3>
<ol>
<li><a href="https://www.fast.ai/" target="_blank">fast.ai</a>,</li>
<li><a href="http://web.stanford.edu/class/cs224n/index.html#schedule" target="_blank">Natural Language Processing with Deep Learning</a>, CS224n at Stanford,</li>
<li><a href="http://vision.stanford.edu/teaching/cs231n/" target="_blank">Convolutional Neural Networks for Visual Recognition</a> CS231n at Stanford,</li>
<li><a href="https://sites.google.com/view/berkeley-cs294-158-sp20/home" target="_blank">Deep Unsupervised Learning</a>, CS294-158 at UC Berkeley,</li>
<li><a href="http://rail.eecs.berkeley.edu/deeprlcourse/" target="_blank">Deep Reinforcement Learning</a> CS285 at UC Berkeley.</li>
</ol>
<!-- ### Computer Science Lectures
1. [Structure and Interpretation of Computer Programs] (https://web.mit.edu/alexmv/6.037/sicp.pdf) by
### Biology Lectures
1. [Introduction to Biology - The Secret of Life](https://www.edx.org/course/introduction-to-biology-the-secret-of-life-3), -->
<h3 id="lectures-on-theoretical-physics-by-david-tong">Lectures on Theoretical Physics by David Tong</h3>
<ol>
<li><a href="http://www.damtp.cam.ac.uk/user/tong/relativity.html" target="_blank">Dynamics and Relativity</a>,</li>
<li><a href="http://www.damtp.cam.ac.uk/user/tong/dynamics.html" target="_blank">Classical Dynamics</a>,</li>
<li><a href="http://www.damtp.cam.ac.uk/user/tong/em.html" target="_blank">Electromagnetism</a>,</li>
<li><a href="http://www.damtp.cam.ac.uk/user/tong/topicsinqm.html" target="_blank">Topics in Quantum Mechanics</a>,</li>
<li><a href="http://www.damtp.cam.ac.uk/user/tong/solidstate.html" target="_blank">Solid State Physics</a>,</li>
<li><a href="http://www.damtp.cam.ac.uk/user/tong/qhe.html" target="_blank">Quantum Hall Effect</a>,</li>
<li><a href="http://www.damtp.cam.ac.uk/user/tong/statphys.html" target="_blank">Statistical Physics</a>,</li>
<li><a href="http://www.damtp.cam.ac.uk/user/tong/kinetic.html" target="_blank">Kinetic Theory</a>,</li>
<li><a href="http://www.damtp.cam.ac.uk/user/tong/sft.html" target="_blank">Statistical Field Theory</a>,</li>
<li><a href="http://www.damtp.cam.ac.uk/user/tong/qft.html" target="_blank">Quantum Field Theory</a>,</li>
<li><a href="http://www.damtp.cam.ac.uk/user/tong/gaugetheory.html" target="_blank">Gauge Theory</a>,</li>
<li><a href="http://www.damtp.cam.ac.uk/user/tong/tasi.html" target="_blank">Solitons</a>,</li>
<li><a href="http://www.damtp.cam.ac.uk/user/tong/gr.html" target="_blank">General Relativity</a>,</li>
<li><a href="http://www.damtp.cam.ac.uk/user/tong/cosmo.html" target="_blank">Cosmology</a>,</li>
<li><a href="http://www.damtp.cam.ac.uk/user/tong/string.html" target="_blank">String Theory</a>.</li>
</ol>
</description>
</item>
<item>
<title>Theoretical Physics</title>
<link>https://dauparas.github.io/links/physics/</link>
<pubDate>Fri, 29 Mar 2019 11:26:20 -0400</pubDate>
<guid>https://dauparas.github.io/links/physics/</guid>
<description><p>This is a link to theoretical physics.</p>
</description>
</item>
<item>
<title>Unified framework for multivariate distributions in biological sequences</title>
<link>https://dauparas.github.io/publication/unified/</link>
<pubDate>Sun, 03 Mar 2019 20:01:19 -0500</pubDate>
<guid>https://dauparas.github.io/publication/unified/</guid>
<description></description>
</item>
<item>
<title>Depth and nonlinearity induce implicit exploration</title>
<link>https://dauparas.github.io/publication/rl/</link>
<pubDate>Tue, 29 May 2018 19:18:17 -0500</pubDate>
<guid>https://dauparas.github.io/publication/rl/</guid>
<description></description>
</item>
<item>
<title>Self-organization of swimmers drives long-range fluid transport in bacterial colonies</title>
<link>https://dauparas.github.io/publication/self_organisation/</link>
<pubDate>Sat, 24 Feb 2018 20:25:06 -0500</pubDate>
<guid>https://dauparas.github.io/publication/self_organisation/</guid>
<description></description>
</item>
<item>
<title></title>
<link>https://dauparas.github.io/publication/corner_flows/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://dauparas.github.io/publication/corner_flows/</guid>
<description></description>
</item>
<item>
<title></title>
<link>https://dauparas.github.io/publication/flagellar_flows/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://dauparas.github.io/publication/flagellar_flows/</guid>
<description></description>
</item>
<item>
<title></title>
<link>https://dauparas.github.io/publication/helical_micropumps/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://dauparas.github.io/publication/helical_micropumps/</guid>
<description></description>
</item>
<item>
<title></title>
<link>https://dauparas.github.io/publication/thesis/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://dauparas.github.io/publication/thesis/</guid>
<description></description>
</item>
<item>
<title>Theoretical Physics</title>
<link>https://dauparas.github.io/talk/physics/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://dauparas.github.io/talk/physics/</guid>
<description><p>This is a link to theoretical physics.</p>
</description>
</item>
</channel>
</rss>