message: Adding an example for tf.stop_gradient
diff: @@ -12,7 +12,45 @@ in the graph it inputs are masked from the gradient generator. They are not
  taken into account for computing gradients.
  This is useful any time you want to compute a value with TensorFlow but need
  -to pretend that the value was a constant. Some examples include:
  +to pretend that the value was a constant. For example, the softmax function
  +for a vector x can be written as
  +
  +```python
  +
  + def softmax(x):
  + numerator = tf.exp(x)
  + denominator = tf.reduce_sum(numerator)
  + return numerator / denominator
  +```
  +
  +This however is susceptible to overflow if the values in x are large. An
  +alternative more stable way is to subtract the maximum of x from each of the
  +values.
  +
  +```python
  +
  + def stable_softmax(x):
  + z = x - tf.reduce_max(x)
  + numerator = tf.exp(z)
  + denominator = tf.reduce_sum(numerator)
  + return numerator / denominator
  +```
  +
  +However, when we backprop through the softmax to x, we dont want to backprop
  +through the `tf.reduce_max(x)` (if the max values are not unique then the
  +gradient could flow to the wrong input) calculation and treat that as a
  +constant. Therefore, we should write this out as
  +
  +```python
  +
  + def stable_softmax(x):
  + z = x - tf.stop_gradient(tf.reduce_max(x))
  + numerator = tf.exp(z)
  + denominator = tf.reduce_sum(numerator)
  + return numerator / denominator
  +```
  +
  +Some other examples include:
  * The *EM* algorithm where the *M-step* should not involve backpropagation
  through the output of the *E-step*.
  