Why does every neuron in a multi-layer perceptron typically have the same activation function? Is this a requirement, are there any advantages, or maybe is it just a rule of thumb?
They don't. In fact, if we look to similar models like convolutional neural nets, we see that it's popular to have some form of a rectified linear unit (ReLU) activation in earlier layers and the output layer is often a softmax activation, which provides an output that can be viewed as a probability distribution.
Generally, it depends on what you're trying to achieve. For a long time, the logistic (sigmoid) activation was popular because it was thought to be similar to the synaptic potentials seen in the neurons of the human brain. But it turns out that the this activation function has some issues, such as vanishing gradients. One way to get around the vanishing gradient problem is to use a different activation – in effect discarding the biological motivation of the model for greater stability during training.
You could generalize this further to blocks of different activation functions within the same layer. This is something I've thought about, haven't done, but imagine has been attempted. In some sense, the idea here would be to allow for a subsection of the network to develop a representation that may not be feasible otherwise. These different representations within the same layer would then be unified by subsequent layers as we move closer to the output.