# Numerical issues with Multinomial

**URL:** <https://discourse.edwardlib.org/t/numerical-issues-with-multinomial/540>\
**Category:** General\
**Created:** [December 13, 2017, 9:41pm UTC](https://discourse.edwardlib.org/t/numerical-issues-with-multinomial/540 "2017-12-13T21:41:52Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![mortonjt](https://avatars.discourse-cdn.com/v4/letter/m/3bc359/32.png) [@mortonjt](https://discourse.edwardlib.org/u/mortonjt)\
**Post date:** [December 13, 2017, 9:41pm UTC](https://discourse.edwardlib.org/t/numerical-issues-with-multinomial/540/1 "2017-12-13T21:41:53Z")

</div>

This may be a tensorflow question, but I’d like to first get a better understand how Edward uses the multinomial.

Right now, I’m building off of the Multinomial Logistic Normal [here](https://discourse.edwardlib.org/t/multinomial-logistic-normal-model-probably-my-fault/478/2). Specifically, I’m specifying the `_sample_n` function as follows (since Tensorflow does not have batch multinomial sampling enabled yet).

```auto
def _sample_n(self, n=1, seed=None):
    # define Python function which returns samples as a Numpy array
    def np_sample(p, n):
        return multinomial.rvs(p=p, n=n, random_state=seed).astype(np.float32)

    # wrap python function as tensorflow op
    val = tf.py_func(np_sample, [self.probs, n], [tf.float32])[0]
    # set shape from unknown shape
    batch_event_shape = self.batch_shape.concatenate(self.event_shape)
    shape = tf.concat(
        [tf.expand_dims(n, 0), tf.convert_to_tensor(batch_event_shape)], 0)
    val = tf.reshape(val, shape)
    return val
Multinomial._sample_n = _sample_n

```

It does work well for small datasets (i.e. 100 x 2000) when using SGLD and MAP. However, numerical issues start to seep in when I try to scale this to larger datasets (100 x 10000). I also tried Variational Inference, but that doesn’t be working either.

Looking at the outputs, I think the issues are arising from the Multinomial sampling - since the tfdbg is showing that all of the nans and infs are arising within the Multinomial sampling step. There have been a few issues below that have pointed to numerical issues within Tensorflow

> <https://github.com/blei-lab/edward/issues/724>

  

> <https://github.com/tensorflow/tensorflow/issues/2774>

  

> <https://github.com/tensorflow/tensorflow/pull/12485>

Here’s the big question – how is Edward actually sampling from the Multinomial distribution? Are counts actually being drawn from the Multinomial? Or is only the likelihood of the multinomial being evaluated? Is the `_sample_n` example above prone to underflow issues? And would implementing the gumbel arg max trick as hinted [here](https://github.com/blei-lab/edward/issues/51) provide a means of addressing this issue?

Any insights or even links to relevant source code within Edward or Tensorflow would be really appreciated!

---

<div class="post-metadata">

**Author:** ![mortonjt](https://avatars.discourse-cdn.com/v4/letter/m/3bc359/32.png) [@mortonjt](https://discourse.edwardlib.org/u/mortonjt)\
**Post date:** [January 3, 2018, 5:47pm UTC](https://discourse.edwardlib.org/t/numerical-issues-with-multinomial/540/2 "2018-01-03T17:47:09Z")

</div>

Just as a heads up - I got something working using the MAP estimator. It seems that once I reduce the learning rate down sufficiently, I can get something that looks sane.

Here’s the code I’m using to do this.

```python
## Model
# N = number of samples
# p = number of covariates in regression model
# D = number of features within each sample
# psi = predefined orthonormal basis to ensure identifiability when performing the softmax transform
G = tf.placeholder(tf.float32, [N, p])
B = Normal(loc=tf.zeros([p, D-1]), 
           scale=tf.ones([p, D-1]))
v = tf.matmul(G, B) 
eta = tf.nn.log_softmax(tf.matmul(v, psi))
Y = Multinomial(total_count=n, logits=eta, 
                value=tf.zeros([N, D], dtype=tf.float32))

## Inference
qB = PointMass(params=tf.Variable(tf.zeros([p, D-1])))
inference = ed.MAP(
    {B: qB},     
    data={G: G_data, Y: y_data}
)
optimizer = tf.train.AdamOptimizer(5e-4, 
                                   beta1=0.9,
                                   beta2=0.999)
inference.run(n_iter=5000, optimizer=optimizer)

```

Still having a bit of trouble getting the other inference techniques to work. Could be due to difficulties handling the Multinomial. But I’m not entirely sure.
