I had exactly the same issue and stumbled across your post.
Silly question: Why do you muck around with the gradient to get the normal ?
Why the division by the noise and the position messing around.
I thought that the gradient of a surface is the normal itself (you might be able to normalize)