As a mom and a former daycare teacher, I would like to offer a modeling behavior. I was taught a way to help children learn sympathy and empathay from adults without forcing the child to do so.
In a senario where your child pushes another child, quickly intervine, but do not say anything to your son. Move past him to help the other child up. Say "I'm so sorry that "Billy" pushed you. That was not a nice thing to do." Next turn to your son, direct him to a different area and explain to him that you are sorry that he pushed the child down. He hurt the child, etc. Tell him how it makes you feel when he pushes another child. From there, redirect him to another area of children/toys/etc.
In this type of modeling, we (as the teachers) were not able to make the child say "I'm sorry" to another child. Saying sorry is a learned behavior, but is usually forced. When you take the part of saying sorry you are showing your son, without forcing him, how to care for others in a way that he would care for himself.
But when you do not saying anything to him first, you are showing him that you feel what he did was wrong. It was not fun, or funny. It was hurtful to another child.
I saw this work in the classroom from the toddler room to the After-school room. I have used it in other centers and while I nannied as well. I hope it can help.