text: Title: Word2vec: loss tally maxes at 134217728.0 due to float32 limited-precision
  Body: 
  <!--
  **IMPORTANT**:
  
  - Use the [Gensim mailing list](https://groups.google.com/forum/#!forum/gensim) to ask general or usage questions. Github issues are only for bug reports.
  - Check [Recipes&FAQ](https://github.com/RaRe-Technologies/gensim/wiki/Recipes-&-FAQ) first for common answers.
  
  Github bug reports that do not include relevant information and context will be closed without an answer. Thanks!
  -->
  
  #### Cumulative loss of word2vec maxes out at 134217728.0
  
  I'm training a word2vec model with 2,793,404 sentences / 33,499,912 words, vocabulary size 162,253 (words with at least 5 occurrences).
  
  Expected behaviour: with `compute_loss=True`, gensim's word2vec should compute the loss in the expected way.
  
  Actual behaviour: the cumulative loss seems to be maxing out at `134217728.0`:
  
      Building vocab...
      Vocab done. Training model for 120 epochs, with 16 workers...
      Loss after epoch 1: 16162246.0 / cumulative loss: 16162246.0
      Loss after epoch 2: 11594642.0 / cumulative loss: 27756888.0
  
      [ - snip - ]
  
      Loss after epoch 110: 570688.0 / cumulative loss: 133002056.0
      Loss after epoch 111: 564448.0 / cumulative loss: 133566504.0
      Loss after epoch 112: 557848.0 / cumulative loss: 134124352.0
      Loss after epoch 113: 93376.0 / cumulative loss: 134217728.0
      Loss after epoch 114: 0.0 / cumulative loss: 134217728.0
      Loss after epoch 115: 0.0 / cumulative loss: 134217728.0
  
  And it stays at `134217728.0` thereafter. The value `134217728.0` is of course exactly `128*1024*1024`, which does not seem like a coincidence.
  
  #### Steps to reproduce
  
  My code is as follows:
  
      class MyLossCalculator(CallbackAny2Vec):
          def __init__(self):
              self.epoch = 1
              self.losses = []
              self.cumu_losses = []
  
          def on_epoch_end(self, model):
              cumu_loss = model.get_latest_training_loss()
              loss = cumu_loss if self.epoch <= 1 else cumu_loss - self.cumu_losses[-1]
              print(f"Loss after epoch {self.epoch}: {loss} / cumulative loss: {cumu_loss}")
              self.epoch += 1
              self.losses.append(loss)
              self.cumu_losses.append(cumu_loss)
  
      def train_and_check(my_sentences, my_epochs, my_workers=8):
          print(f"Building vocab...")
          my_model: Word2Vec = Word2Vec(sg=1, compute_loss=True, workers=my_workers)
          my_model.build_vocab(my_sentences)
          print(f"Vocab done. Training model for {my_epochs} epochs, with {my_workers} workers...")
          loss_calc = MyLossCalculator()
          trained_word_count, raw_word_count = my_model.train(my_sentences, total_examples=my_model.corpus_count, compute_loss=True,
                                                              epochs=my_epochs, callbacks=[loss_calc])
          loss = loss_calc.losses[-1]
          print(trained_word_count, raw_word_count, loss)
          loss_df = pd.DataFrame({"training loss": loss_calc.losses})
          loss_df.plot(color="blue")
      #    print(f"Calculating accuracy...")
      #    acc, details = my_model.wv.evaluate_word_analogies(questions_file, case_insensitive=True)
      #    print(acc)
          return loss_calc, my_model
  
  The data is a news article corpus in Finnish; I'm not at liberty to share all of it (and anyway it's a bit big), but it looks like one would expect:
  
      [7]: df.head(2)
      [7]: [Row(file_and_id='data_in_json/2018/04/0001.json.gz%%3-10169118', index_in_file='853', headline='Parainen pyristelee pois lastensuojelun kriisistä: irtisanoutuneiden tilalle houkutellaan uusia sosiaalityöntekijöitä paremmilla työeduilla', publication_date='2018-04-20 11:59:35+03:00', publication_year='2018', publication_month='04', sentence='hän tiesi minkälaiseen tilanteeseen tulee', lemmatised_sentence='hän tietää minkälainen tilanne tulla', source='yle', rnd=8.436637410902392e-08),
           Row(file_and_id='data_in_xml/arkistosiirto2018.zip%%arkistosiirto2018/102054668.xml', index_in_file=None, headline='*** Tiedote/SDP: Medialle tiedoksi: SDP:n puheenjohtaja Antti Rinteen puhe puoluevaltuuston kokouksessa ***', publication_date='2018-04-21T12:51:44', publication_year='2018', publication_month='04', sentence='me haluamme jättää hallitukselle välikysymyksen siitä miksi nuorten ihmisten tulevaisuuden uskoa halutaan horjuttaa miksi epävarmuutta ja näköalattomuutta sekä pelkoa tulevaisuuden suhteen halutaan lisätä', lemmatised_sentence='me haluta jättää hallitus välikysymys se miksi nuori ihminen tulevaisuus usko haluta horjuttaa miksi epävarmuus ja näköalattomuus sekä pelko tulevaisuus suhteen haluta lisätä', source='stt', rnd=8.547760445010155e-07)]
  
      sentences = list(map(lambda r: r["lemmatised_sentence"].split(" "), df.select("lemmatised_sentence").collect()))
  
      [18]: sentences[0]
      [18]: ['hän', 'tietää', 'minkälainen', 'tilanne', 'tulla']
  
  #### Versions
  
  The output of:
  
  ```python
  import platform; print(platform.platform())
  import sys; print("Python", sys.version)
  import numpy; print("NumPy", numpy.__version__)
  import scipy; print("SciPy", scipy.__version__)
  import gensim; print("gensim", gensim.__version__)
  from gensim.models import word2vec;print("FAST_VERSION", word2vec.FAST_VERSION)
  ```
  
  is:
  
      Windows-10-10.0.18362-SP0
      Python 3.7.3 | packaged by conda-forge | (default, Jul  1 2019, 22:01:29) [MSC v.1900 64 bit (AMD64)]
      NumPy 1.17.3
      SciPy 1.3.1
      gensim 3.8.1
      FAST_VERSION 1
  
  Finally, I'm not the only one who has encountered this issue. I found the following related links:
  
  https://groups.google.com/forum/#!topic/gensim/IH5-nWoR_ZI
  
  https://stackoverflow.com/questions/59823688/gensim-word2vec-model-loss-becomes-0-after-few-epochs
  
  I'm not sure if this is only a display issue and the training continues normally even after the cumulative loss reaches its "maximum", or if the training in fact stops at that point. The trained word vectors seem reasonably ok, judging by `my_model.wv.evaluate_word_analogies()`, though they do need more training than this.
  