How does epoch-wise double descent occur if training error is 0? In this paper, they talk about the existence of epoch-wise double descent. In Figure 10, you can see that, with a sufficiently large model, the test error keeps decreasing even after the training error has become 0. 
In my understanding, SGD should not change any weights once the training error is 0, since gradients would also be 0.

So why does the test error keep decreasing? Is it because of the momentum of the optimizer?

My understanding of the paper you reference is that the authors (Nakkiran et al.) do mean the training error as calculated by the loss function of the training algorithm. Where they discuss epoch-wise double descent, they don't say the training error reached 0, they say it reached $\approx 0$ (although I agree fig 10 makes it look like the training error did drop to 0), which they call the interpolation point. So because the error is not quite 0, there's room for the weights to change as training continues.
As to why this happens - in the original "double descent" paper Belkin et al. suggest that the double descent observed as model size is increased happens because as the amount of over-parameterisation increases, the model learns closer to the "smallest norm function" - in other words, the over-parameterisation acts as a type of regularisation. Nakkiran et al. are suggesting a similar mechanism happens on some large models if training continues past the interpolation point.
