def METHOD_NAME(self, *args, **kwargs):
    """
    :returns: estimate of the loss
    :rtype: float
    Take a gradient step on the loss function. Arguments are passed to the
    model and guide.
    """
    with poutine.trace(param_only=True) as param_capture:
        loss = self.loss_and_grads(True, None, *args, **kwargs)
    params = set(
        site["value"].unconstrained()
        for site in param_capture.trace.nodes.values()
        if site["value"].grad is not None
    )
    self.optim(params)
    pyro.infer.util.zero_grads(params)
    return torch_item(loss)