## Stochastic Normalizing Flows

We introduce stochasticity in Boltzmann-generating flows. Normalizing flows are exact-probability generative models that can efficiently sample x and compute the generation probability p(x), so that probability-based methods can be used to train the generator. Boltzmann-generating flows combine flows and reweighting in order to learn to generate unbiased samples with respect to some target density exp(-u(x)) that is approximated by p(x) and then reweighted. Here we introduce sochasticity in Boltzmann-generating flows. The key methodological advance is that we avoid to compute p(x) point-wise, which would require an intractable integration over all paths mapping to the same x, and show how both training of the flow and reweighting of p(x) to exp(-u(x)) can be done via path sampling and without requiring p(x) explicitly.

## Publication

Please find the arxiv preprint here: https://arxiv.org/abs/2002.06707

Stochastic Normalizing Flows is in press in NeurIPS 2020, citation update is coming up...

```
@article{snf,
title={Stochastic Normalizing Flows},
author={H. Wu and J. K{\"o}hler and F. {\'e}},
journal = {arxiv:2002.06707},
year = {2020}
}
```

## Installation and running experiments

**System requirements** All experiments were run with Python 3.7 and PyTorch 1.5 on MacOS. They are expected to work on MacOS and Linux systems with these or newer Python and PyTorch versions

**Installation** Install the bgtorch flow package

```
cd bgtorch
python setup.py develop
cd ..
```

Install snf_code package (specialized code for this paper)

```
cd snf_code
python setup.py develop
cd ..
```

Optional: install OpenMM for running experiment 3

```
conda install -c omnia openmm
conda install -c omnia openmmtools
```

**Run Experiments**

- To run experiments 1-3, open and run the respective notebooks with jupyter
- To run experiment 4, run the respective Python file directly