code: def compute_soft_cross_entropy(
      labels_multiannotator: np.ndarray,
      pred_probs: np.ndarray,
  ) -> float:
      """Compute soft cross entropy between the annotators' empirical label distribution and model pred_probs"""
      num_classes = get_num_classes(pred_probs=pred_probs)
  
      empirical_label_distribution = np.full(
          (len(labels_multiannotator), num_classes), np.NaN
      )
      for i, labels in enumerate(labels_multiannotator):
          labels_subset = labels[~np.isnan(labels)]
          empirical_label_distribution[i, :] = value_counts(
              labels_subset, num_classes=num_classes
          ) / len(labels_subset)
  
      clipped_pred_probs = np.clip(
          pred_probs, a_min=SMALL_CONST, a_max=None
      )
      soft_cross_entropy = -np.sum(
          empirical_label_distribution * np.log(clipped_pred_probs),
          axis=1,
      ) / np.log(num_classes)
  
      return soft_cross_entropy
  
file_path: cleanlab/cleanlab/internal/multiannotator_utils.py
imports: from cleanlab.typing import LabelLike
  from typing import Optional, Tuple
  import warnings
  import numpy
  import pandas
  from cleanlab.internal.validation import assert_valid_class_labels
  from cleanlab.internal.numerics import softmax
  from cleanlab.internal.util import get_num_classes, value_counts
label_desc: Use image node_id 5 for calling a global function with example usage: compute_soft_cross_entropy(labels_multiannotator, pred_probs) and returns: soft_cross_entropy