Is Theano using back-propagation? I am following the following tutorial:
http://deeplearning.net/tutorial/mlp.html
Which is about training an Multilayer Perceptron (MLP) for the MNIST data set. 
As far as I understand what Theano does is to use symbolic differentiation to calculate the gradient. With this calculated it is easy to implement Gradient Descent and I believe Theano does it with the following lines:
gparams = [T.grad(cost, param) for param in classifier.params]
Now my question: 
Given that Back Propagation is a form of Gradient Descent is Theano in fact using backpropagation? in other words, is it different to use gradient descent symbolically and actually implementing the backward pass in some cases? is it more stable or more prone to errors? 
I guess that in most of the cases the results should be the same but I am wondering about it.
Thanks in advance and all the best,
 A: Theano creates a symbolic graph. This graph allows it to compute derivatives based on the connected inputs, the Op implemented on the Variables, and the output(created by the Apply Node).
import theano.tensor as T
x = T.dmatrix('x')
y = T.dmatrix('y')
z = x + y


The Apply nodes are blue, Variables are red, Op is green, and Types are purple.
As given in the theano official documentation,

Having the graph structure, computing automatic differentiation is simple. The only thing tensor.grad() has to do is to traverse the graph from the outputs back towards the inputs through all apply nodes (apply nodes are those that define which computations the graph does). For each such apply node, its op defines how to compute the gradient of the node’s outputs with respect to its inputs. Note that if an op does not provide this information, it is assumed that the gradient is not defined. Using the chain rule these gradients can be composed in order to obtain the expression of the gradient of the graph’s output with respect to the graph’s inputs .
Comparing with the Python language, an Apply node is Theano’s version of a function call whereas an Op is Theano’s version of a function definition.

While finding derivatives by hand is simple for feed forward neural networks, it becomes exceedingly complex in the case of Recurrent Neural Networks and Long Short Term Memory Cells, especially if the network is deep.
A: I think that when you refer to "backpropagation" here you're really meaning "automatic differentiation".  The alternative would be "symbolic differentiation", where you find a formula for the derivative of some loss wrt some parameter and compute gradients according to that formula.
Theano sort of combines both.  Each Op defines a function for the forward pass and a function for propagating the gradient back, and theano takes care of passing signals between these functions to implement backpropagation.  This alone would just be (reverse mode) automatic differentiation.  
The thing is theano also has an optimizer which can simplify expressions to reduce computation (eg $x_1\cdot W+x_2\cdot W \rightarrow (x_1+x_2)\cdot W$) or for numerical stability, which makes it a bit more like symbolic differentiation.  
There's more discussion on the topic here.
