Implemented gradient ascent. However, there seems to be a bug I can't
track down. After many iterations of the liklihood going up, it starts
to crash all of the sudden, potentially due to underflow somewhere.

I think i may be doing gradient ascent slightly wrong, so fixing this
may also help with the bug. Currently, we update the weight for each
feature function as we slide along the observations file. So everytime
we run inference (once per window), we use the updated weights from the
previous window.

Instead, we should hold the weights constant for the whole pass through
the file, and simply keep an aggregate sum  of the gradient for each
weight. Then, we can update the weights after the whole pass through the
file, and repeat.

In terms of the code: instead of updating weights inside gradient_step, we should
be adding up the values of 'd' for each weight, then update each weight
at the end of gradient_sweep to be sum(d) / (# of training examples)