https://arunangshudas.com/blog/gradient-descent-optimizer/