Add AdaGrad to learning_rule

Implements the AdaGrad learning rule as described in: "Adaptive subgradient methods for online learning and stochastic optimization", Duchi J, Hazan E, Singer Y.

And I noticed there are some redundant code in learning_rule, like:
```
updates = OrderedDict()

        for (param, grad) in grads.iteritems():
```
Should we move these to the base class?
Since you don't do anything in this method, it's better not to implement it.
I see the base class raises NotImplementedError, which forces you to implement it. That's a mistake in the base class. You can delete AdaGrad.add_channels_to_monitor and also delete the raise NotImplementedError in LearningRule.add_channels_to_monitor