Massimiliano Allegri's men were given a run for their money against the Giallorossi, but secured the victory in a thrilling game
An exciting first half saw Zlatan Ibrahimovic and Nicolas Burdisso trade goals, before veteran Alessandro Nesta put the Rossoneri ahead with a thumping header.
Roma pushed hard for an equaliser after the break, but were punished by Ibrahimovic, who completed his brace. Bojan Krkic found a late goal for the Giallorossi, but it proved to be a mere consolation.
The hosts dominated proceedings early on as they were keeping possession, pinning back the visitors in their own half. This, however, was leaving them vulnerable to swift counterattacks and Massimiliano Allegri's players soon took advantage.
In the 17th minute, a sublime cross by Alberto Aquilani found Ibrahimovic, who headed past Maarten Stekelenburg in trademark fashion to give Milan the lead.
Roma, spurred on by conceding a relatively simple goal, decided to send even more bodies into the final third, and their gamble soon produced results.
Some appalling defending by Gianluca Zambrotta allowed Burdisso to head in the equaliser, following a corner on the left as the Rossoneri finally buckled under the pressure.
On the half-hour mark, however, veteran Nesta put the visitors back in the driving seat with a carbon copy of the Argentinian's strike as he headed past Stekelenburg after an assist by Robinho.
Things went from bad to worse for Luis Enrique's men in the 39th minute, when Fabio Borini picked up and injury and had to be replaced by ex-Barcelona striker and Spain international Bojan.
Roma started brightly in the second period, but were struggling to break AC Milan's resolute defence. The Rossoneri had Nesta to thank in the 55th minute, when the ex-Lazio man made a crucial intervention to prevent a shot from Bojan going past the beaten Christian Abbiati.
Moments later, the goalkeeper redeemed himself as he pulled off an immense save to stop a Miralem Pjanic free-kick from going in the left corner.
Then, in a curious accident, substituted midfielder Kevin-Prince Boateng was sent off after he allegedly verbally abused the fourth official on his way from the pitch.
Roma were continuing to press and nearly equalised moments later, when Abbiati pulled off an immense reflex save from six yards out to deny Pablo Osvaldo. The Giallorossi, however, were looking increasingly fragile at the back, and soon paid the price for their reckless attacking.
Aquilani was once again the provide, when his cross from the right was met with a header by Ibrahimovic, who completed his brace to put the game beyond the Giallorossi's reach.
Roma ultimately managed to score again through Bojan, but it was too late, too little as the game finished 3-2. Milan return to the top of the table for the time being, replacing Juventus, who face Inter in Saturday's late Serie A action.