If you have read chapters 15 and 16, you should by now be familiar with graph embeddings and optimization problems. In the previous chapter, in particular, we explained how to reformulate graph embedding as an optimization problem, and we introduced gradient descent, an optimization technique that can be used to find (near-)optimal solutions to this category of problems. In particular, we discussed two solutions to the problem, seen as crossing-number optimization and as a force-directed graph drawing; gradient descent is particularly suitable for the latter, while particularly bad for the former.
One issue we have seen with gradient descent is that it tends to get stuck in local minima, which is pretty much the last thing we would want, considering that we often have to deal with cost functions having lots of local peaks.