summarize_from_feedback/models/loss_functions.py (13 lines of code) (raw):

from torch.nn.functional import cross_entropy as torch_cross_entropy def softmax_xent_loss_fn(outputs_mb, global_inputs_mb, reduction="mean", logits_key="logits"): """ Take a batch of logits and loss inputs and compute a scalar loss. If reduction="mean", average all losses. If reduction="none", return loss per token, with same shape is targets """ targets = global_inputs_mb["targets"] flat_targets = targets.contiguous().view([-1]) logits_mb = outputs_mb[logits_key] n_vocab = logits_mb.shape[-1] flat_logits = logits_mb.contiguous().view([-1, n_vocab]) loss = torch_cross_entropy( input=flat_logits.float(), target=flat_targets.long(), reduction=reduction ) if reduction == "mean": return loss return loss.reshape(targets.shape)