Illia Dovhopolyi, Artem Sdobnov, Dmytro Zakharov
Acknowledgement
The UltraGroth proving system explained here is an adapted for real use cases version of the protocol initially described in Merlin404's article on HackMD. Huge credit to their work, which inspired much of what follows.
Prerequisites
We assume you already understand the basics of modern zero-knowledge (ZK) constructions. This article aims to build intuition around the UltraGroth proving system, and deep, formal knowledge of Groth16 isn't strictly necessary. However, familiarity with our previous blogs on the Bionetta framework will be beneficial, as examples here utilize Bionetta circuits.
Activation Functions are too expensive
During the development of Bionetta, one of our most significant challenges was optimizing the constraint cost of activation functions like ReLU. Each ReLU operation costs at least $253$ constraints due to the bit decomposition of input signals. Considering neural networks rely heavily on non-linear activations, this quickly becomes prohibitively expensive. As an example, consider our LeakyReLU implementation: