code: def optimize(self, sess, batch_index):
          
          feed_dict = {
              self._batch_index: batch_index,
              self._per_device_batch_size: self._loaded_per_device_batch_size,
              self._max_seq_len: self._loaded_max_seq_len,
          }
          for tower in self._towers:
              feed_dict.update(tower.loss_graph.extra_compute_grad_feed_dict())
  
          fetches = {"train": self._train_op}
          for tower in self._towers:
              fetches.update(tower.loss_graph.extra_compute_grad_fetches())
  
          return sess.run(fetches, feed_dict=feed_dict)
docs: Run a single step of SGD.
  
          Runs a SGD step over a slice of the preloaded batch with size given by
          self._loaded_per_device_batch_size and offset given by the batch_index
          argument.
  
          Updates shared model weights based on the averaged per-device
          gradients.
  
          Args:
              sess: TensorFlow session.
              batch_index: Offset into the preloaded data. This value must be
                  between `0` and `tuples_per_device`. The amount of data to
                  process is at most `max_per_device_batch_size`.
  
          Returns:
              The outputs of extra_ops evaluated over the batch.