Reptile: A Scalable Meta-Learning Algorithm
Reptile: A Scalable Meta-Learning Algorithm

Reptile: A Scalable Meta-Learning Algorithm

Reptile: A Scalable Meta-Learning Algorithm

We've developed a simple meta-learning algorithm called Reptile which works by repeatedly sampling a task, performing stochastic gradient descent on it, and updating the initial parameters towards the final parameters learned on that task. This method performs as well as MAML, a broadly applicable meta-learning algorithm, while being simpler to implement and more computationally efficient.

Read paper View Code

Meta-learning is the process of learning how to learn. A meta-learning algorithm takes in a distribution of tasks, where each task is a learning problem, and it produces a quick learner — a learner that can generalize from a small number of examples. One well-studied meta-learning problem is few-shot classification, where each task is a classification problem where the learner only sees 1–5 input-output examples from each class, and then it must classify new inputs. Below, you can try out our interactive demo of 1-shot classification, which uses Reptile.

Try clicking the "Edit All" button, drawing three distinct shapes or symbols, then drawing one of them again in the input field on the right, and see how well Reptile can classify it. The first three drawings are the labelled examples: each drawing defines one of the classes. The final drawing represents the unknown example, and Reptile outputs the probabilities of it belonging to each of the classes.

How Reptile Works

Like MAML, Reptile seeks an initialization for the parameters of a neural network, such that the network can be fine-tuned using a small amount of data from a new task. But while MAML unrolls and differentiates through the computation graph of the gradient descent algorithm, Reptile simply performs stochastic gradient descent (SGD) on each task in a standard way — it does not unroll a computation graph or calculate any second derivatives. This makes Reptile take less computation and memory than MAML. The pseudocode is as follows:

As an alternative to the last step, we can treat \(\Phi - W\) as a gradient and plug it into a more sophisticated optimizer like Adam.

It is at first surprising that this method works at all. If \(k=1\), this algorithm would correspond to "joint training" — performing SGD on the mixture of all tasks. While joint training can learn a useful initialization in some cases, it learns very little when zero-shot learning is not possible (e.g. when the output labels are randomly permuted). Reptile requires \(k>1\), where the update depends on the higher-order derivatives of the loss function; as we show in the paper, this behaves very differently from k=1 (joint training).

To analyze why Reptile works, we approximate the update using a Taylor series. We show that the Reptile update maximizes the inner product between gradients of different minibatches from the same task, corresponding to improved generalization. This finding may have implications outside of the meta-learning setting for explaining the generalization properties of SGD. Our analysis suggests that Reptile and MAML perform a very similar update, including the same two terms with different weights.

In our experiments, we show that Reptile and MAML yield similar performance on the Omniglot and Mini-ImageNet benchmarks for few-shot classification. Reptile also converges to the solution faster, since the update has lower variance.

Our analysis of Reptile suggests a plethora of different algorithms that we can obtain using different combinations of the SGD gradients. In the figure below, assume that we perform k steps of SGD on each task using different minibatches, yielding gradients \(g_1, g_2, \dots, g_k\). The figure below shows the learning curves on Omniglot obtained by using each sum as the meta-gradient. \(g_2\) corresponds to first-order MAML, an algorithm proposed in the original MAML paper. Including more gradients yields faster learning, due to variance reduction. Note that simply using \(g_1\) (which corresponds to \(k=1\)) yields no progress as predicted for this task since zero-shot performance cannot be improved.
Reptile: A Scalable Meta-Learning Algorithm

Implementations

Our implementation of Reptile is available on GitHub. It uses TensorFlow for the computations involved, and includes code for replicating the experiments on Omniglot and Mini-ImageNet. We're also releasing a smaller JavaScript implementation that fine-tunes a model pre-trained with TensorFlow — we used this to create the above demo.

Finally, here's a minimal example of few-shot regression, predicting a random sine wave from 10 \((x, y)\) pairs. This one uses PyTorch and fits in a gist: