I am a PhD student at ENS de Lyon and a member of the OCKHAM team. My research focuses on the geometry of ReLU neural networks — rescaling symmetries, conditioning and compression — with applications to optimized on-board decision-making, in collaboration with the CNES. I am supervised by Titouan Vayer and Rémi Gribonval.

News

Publications

Path-conditioned training: a principled way to rescale ReLU neural networks

Arthur Lebeurrier, Titouan Vayer, Rémi Gribonval

ICML 2026

Abstract

Despite recent algorithmic advances, the field lacks principled methods to leverage the rescaling symmetries present in ReLU neural network parameters: two properly rescaled weight configurations implement the same function, yet their training dynamics can differ substantially. We build on the path-lifting framework, which offers a compact factorization of ReLU networks, to derive a geometrically motivated criterion for rescaling neural network parameters. Minimizing this criterion yields a conditioning strategy that aligns a kernel in the path-lifting space with a chosen reference, and we provide an efficient algorithm to perform this alignment. We analyze how architecture and initialization scale jointly influence the method's output in random network initialization, and numerical experiments demonstrate its potential to accelerate training.

A multilevel approach to accelerate the training of Transformers

Guillaume Lauga, Maël Chaumette, Edgar Desainte-Maréville, Étienne Lasalle, Arthur Lebeurrier

GRETSI'25

Abstract

In this article, we investigate the potential of multilevel approaches to accelerate the training of transformer architectures. Using an ordinary differential equation (ODE) interpretation of these architectures, we propose an appropriate way of varying the discretization of these ODE Transformers in order to accelerate the training. We validate our approach experimentally by a comparison with the standard training procedure.

Software

PathCond

Code for "Path-conditioned training" (ICML 2026)

A principled and computationally cheap method to rescale ReLU neural networks at initialization. It exploits rescaling symmetries to improve loss-landscape conditioning and accelerate training, is function-preserving, and integrates into standard PyTorch training loops with a single initialization call — no changes to the training loop itself.

pyRiemann

Open-source contributor

pyRiemann is a Python package for machine learning based on the Riemannian geometry of symmetric positive-definite matrices, mainly applied to multivariate biosignals such as EEG/BCI, with a scikit-learn-compatible API. I contributed to its development.

Teaching

2025 – 2026 Teaching assistant, Foundations of Machine Learning (M1), ENS de Lyon
2024 – 2025 Teaching assistant, Logique (L3 Computer Science), ENS de Lyon

Blog beta

The normal equation

For \(A \in \mathbb{R}^{m \times n}\), \(b \in \mathbb{R}^m\) and \(x \in \mathbb{R}^n\), the normal equation is given by

\[ A^\top A x = A^\top b \]

Existence

There always exists a solution to the normal equation.

Proof

We want to prove that \(\text{Im}(A^\top A) = \text{Im}(A^\top)\).

First, it is clear that \(\text{Im}(A^\top A) \subset \text{Im}(A^\top)\). Then, we need to prove the equality of dimensions, which, with the property of finite-dimensional subspaces, allows us to conclude the equality of the two spaces.

By noting that \(\text{rank}(A) = \text{rank}(A^\top)\) (which can be justified by the \(J_r\) decomposition), it remains to show that \(\text{rank}(A) = \text{rank}(A^\top A)\).

First, we prove that \(\text{Ker}(A^\top A) = \text{Ker}(A)\).

It is clear that \(\text{Ker}(A) \subset \text{Ker}(A^\top A)\). Then, for \(x \in \text{Ker}(A^\top A)\), we have:

\[ \begin{align*} A^\top A x = 0 &\Rightarrow x^\top A^\top A x = 0\\ &\Rightarrow \|Ax\|^2_2 = 0\\ &\Rightarrow Ax = 0 \end{align*} \]

Thanks to the rank theorem, we have:

\[ n = \text{dim}(\text{Ker}(A)) + \text{rank}(A) \]

and

\[ n = \text{dim}(\text{Ker}(A^\top A)) + \text{rank}(A^\top A) \]

So, because \(\text{Ker}(A^\top A) = \text{Ker}(A)\), we also have the equality of dimensions and thus:

\[ \text{rank}(A) = \text{rank}(A^\top A) \]

Finally, we have:

\[ A^\top b \in \text{Im}(A^\top) = \text{Im}(A^\top A) \]

So, there exists \(x\) such that \(A^\top A x = A^\top b\).

Remarks

  • \(x\) is a solution to the normal equation if and only if it minimizes the least square error \( \| Ax - b \|_2^2 \).
  • For a full rank matrix \(A\), there exists a unique solution: \[ x = (A^\top A)^{-1} A^\top b \]
  • \( x = (A^\top A)^+ A^\top b \) belongs to the set of solutions and minimizes the norm of \(x\).

Acknowledgment: Some insights and inspiration were taken from discussions with Maël Chaumette.

Submitting to arXiv with latexpand

1. Install latexpand

# check whether it's already available
latexpand --version

# Ubuntu / Debian
sudo apt install texlive-extra-utils

# macOS (Homebrew)
brew install latexpand

2. Typical project layout

my_paper/
├── main.tex              ← main file
├── intro/
│   └── intro.tex
├── methods/
│   └── methods.tex
├── figures/
│   ├── fig1.pdf
│   └── fig2.pdf
├── icml.sty               ← conference style file
├── references.tex         ← or main.bbl if using BibTeX
└── bibliography.bib       ← local only, not for arXiv

3. Flatten the .tex files

From the project root:

cd my_paper/
latexpand main.tex > main_flat.tex

# keep comments
latexpand --keep-comments main.tex > main_flat.tex

# verbose, for debugging
latexpand --verbose main.tex > main_flat.tex

latexpand automatically resolves every \input{} and \include{}, including inlined bibliography files.

4. Check that it still compiles

pdflatex main_flat.tex
bibtex main_flat        # if using BibTeX
pdflatex main_flat.tex
pdflatex main_flat.tex

5. Handling citations without a .bib file

Case A — thebibliography directly in the .tex: nothing to do, latexpand already inlined it.

Case B — you used BibTeX (.bib): after compiling, a main_flat.bbl file is generated. That's what arXiv expects — not the .bib. You can also paste the .bbl content directly into main_flat.tex in place of \bibliography{refs}.

Case C — manual bibliography:

\begin{thebibliography}{99}
  \bibitem{ref1} Author A., \textit{Title}, Journal \textbf{12} (2023) 1--10.
  \bibitem{ref2} Author B., \textit{Book}, Publisher, 2021.
\end{thebibliography}

6. Clean up before submission

# preview what will be deleted
find . -type f \
  ! -name "*.tex" ! -name "*.pdf" ! -name "*.png" \
  ! -name "*.jpg" ! -name "*.eps" ! -name "*.bbl" ! -name "*.sty"

# delete — irreversible, check the preview first!
find . -type f \
  ! -name "*.tex" ! -name "*.pdf" ! -name "*.png" \
  ! -name "*.jpg" ! -name "*.eps" ! -name "*.bbl" ! -name "*.sty" \
  -delete

7. Build the arXiv archive

mkdir arxiv_submission
cp main_flat.tex  arxiv_submission/main.tex
cp main_flat.bbl  arxiv_submission/main.bbl   # if BibTeX
cp *.sty          arxiv_submission/
cp -r figures/    arxiv_submission/figures/

tar -czf submission.tar.gz arxiv_submission/

8. What arXiv expects

FileInclude?Notes
Flattened main.texYesProduced by latexpand
*.styYesCustom style files
*.bblYesCompiled bibliography
Figures (*.pdf, *.png, …)Yes
*.bibNoLocal only
Auxiliary files (*.aux, *.log, …)No

9. Common pitfalls

ProblemFix
Broken figure pathsUse \graphicspath{{figures/}} in the .tex
Missing custom .styAlways include it in the archive
EncodingMake sure the .tex is UTF-8
Complex figuresarXiv accepts .pdf, .png, .eps

One-liner

latexpand main.tex > main_flat.tex && pdflatex main_flat.tex
MLflow for a PhD workflow: tracking path-conditioning experiments

Notes on running MLflow locally to track training runs for the path-conditioning experiments, using the local file store (simpler and more stable than a remote tracking server).

Recovering from a stuck server

# check what's holding the port
lsof -i :5000

# kill any lingering mlflow processes
pkill -f mlflow

# clear the tracking URI env var (avoids the UI hanging at 0%)
unset MLFLOW_TRACKING_URI

# restart cleanly from the project root
mlflow ui --host 127.0.0.1 --port 8008

Python setup

At the top of the training script, to keep runs consistent:

import mlflow

# use the local 'mlruns' folder
mlflow.set_experiment("PathCond_Stability_Analysis")

# log GPU / RAM usage alongside metrics
mlflow.config.enable_system_metrics_logging()

Grouping runs by method and architecture

To compare methods, group by architecture and average over seeds:

Tag (param)MeaningGroup by?
methodbaseline, pathcond, enormyes
architecturee.g. [16, 16]yes
seedreproducibilityaverage
num_paramsactual model complexityx-axis
# df is the DataFrame returned by mlflow.search_runs()
df_stats = df.groupby(['params.method', 'num_params']).agg(
    mean_epochs=('epochs_to_target', 'mean'),
    std_epochs=('epochs_to_target', 'std')
).reset_index()

Viewing the UI from a remote server

When experiments run on a compute server but the UI should be viewed locally:

# on the server, inside tmux
mlflow ui --port 8008

# on the local machine
ssh -L 8008:localhost:8008 user@server_ip

# then open http://localhost:8008 in a browser

Long-running jobs with tmux

tmux new -s training
python train.py
# detach with Ctrl-b d

tmux new -s mlflow-server
mlflow ui --port 8008

tmux kill-server

Checklist

  • No trailing slash in tracking URIs.
  • mlruns/ is in .gitignore — never push raw run data to git.
  • Use mlflow.pytorch.load_model(model_uri) to reload the exact model of a given run instead of recreating it by hand.

Curriculum

Mar. 2024 – Sept. 2027 Research Intern and PhD Student at ENS de Lyon in the OCKHAM team
Apr. 2023 – Sept. 2023 Data Scientist Intern at Maskott
Apr. 2022 – Sept. 2022 Research Intern at Inria in the Statify team
Sept. 2021 – Sept. 2024 Engineering student at ENSIMAG

Contact

  • arthur.a.lebeurrier (at) inria.fr
  • arthur.lebeurrier (at) ens-lyon.fr
  • M7-1H29, ENS Lyon, site Monod, 46 allée d'Italie, 69007, Lyon, France