change in weight should be " w = w - (lr * dL/dw) "

The Adam optimizer that you’re using is not doing such a simple update. There are a couple momentum and scaling terms that are used.
To get this step, you should use SGD with no momentum.