Carrying over algorithm in transformers
Jorrit Kruthoff
TL;DR
The paper tackles how Transformer models learn and implement the carrying over algorithm for digit-wise addition, using small encoder-only and decoder-like models on a 3-digit addition task. It reveals a modular implementation where layer 0 performs per-position addition, layer 1 determines where carries are needed via attention, and a final MLP executes the carry, with neuron-level evidence (SVD) and ablations supporting this view. The authors demonstrate length generalisation through priming and finetuning, extending insights to 4- and 6-digit cases, and provide suggestive evidence of similar modular patterns in 7B LLMs (Alpaca, Llemma, Zephyr). The work contributes a mechanistic, interpretable account of arithmetic in transformers, offering practical guidance for enhancing mathematical reasoning and generalisation in large models.
Abstract
Addition is perhaps one of the simplest arithmetic tasks one can think of and is usually performed using the carrying over algorithm. This algorithm consists of two tasks: adding digits in the same position and carrying over a one whenever necessary. We study how transformer models implement this algorithm and how the two aforementioned tasks are allocated to different parts of the network. We first focus on two-layer encoder-only models and show that the carrying over algorithm is implemented in a modular fashion. The first layer is mostly responsible for adding digits in the same position. The second layer first decides, in the attention, which positions need a carried one or not, and then performs the carrying of the one in the final MLP. We provide a simple way of precisely identifying which neurons are responsible for that task. This implementation of the carrying over algorithm occurs across a range of hyperparameters for two as well as three-layer models. For small decoder-only models, we observe the same implementation and provide suggestive evidence for its existence in three 7B large language models.
