The reason for adding self-loops to the adjacency matrix A is to allow each node in the graph to incorporate its own features along with its neighbor features during the aggregation step. Without self-loops, the updated node embedding v (l+1) would include information only from its neighbors, excluding its own features. Moreover, the scaling term prevents the explosion or vanishing of potentially relevant node features during the aggregation step.