Softmax fix in Mixed Precision
Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this [failed invocation](https://github.com/tensorflow/tensorflow/pull/59657/checks?check_run_id=11283700124) of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request. Hi @dsr-lab It looks like your PR relates to the Keras component. Please submit it to the github.com/keras-team/keras repository instead. Thankyou.
@fchollet, @qlzh727
## Contributors:
* Gaetano Signorelli (https://github.com/gaetano-signorelli)
* Daniele Sirocchi (https://github.com/dsr-lab)

## Description
We found a possible bug in the implementation of the *Softmax* activation.
In particular, we noticed learning issues when we trained a model with Mixed Precision (https://www.tensorflow.org/guide/mixed_precision) coupled with MultiHeadAttention (https://www.tensorflow.org/api_docs/python/tf/keras/layers/MultiHeadAttention).

The potential problem is located in the following lines of code (see line 338 in module *advanced_activations.py*):

```
adder = (1.0 - math_ops.cast(mask, inputs.dtype)) * (
          _large_compatible_negative(inputs.dtype))

...

inputs += adder
```

Specifically, the method **_large_compatible_negative** returns a value that is **too negatively large** when the data type is float16 (i.e., the mixed precision is enabled), and it causes **overflows** when the *adder* variable is combined with the *inputs*. Therefore, our model was unable to learn during the training procedure.

Our fix consisted in moving this value away from the overflow edge, scaling it, but without changing the role of the **_large_compatible_negative** method, namely to return a big negative value to mask some parts of the inputs.
After this fix, our model trained smoothly, and it was eventually able to learn how to solve our task.
