|
|
| import torch |
|
|
|
|
| class L2Wrap(torch.autograd.Function): |
| r""" |
| This class of penalty prevents the model from becoming overconfident, |
| thereby mitigating precision loss in BF16. |
| |
| This version is memory-optimized by not storing the full logits tensor. |
| """ |
| @staticmethod |
| def forward(ctx, loss, logits, l2_penalty_factor=1e-4): |
| """ |
| Forward pass for L2 penalty. |
| Args: |
| loss (torch.Tensor): The loss tensor. |
| logits (torch.Tensor): Shape[B, T, V] The logits tensor. |
| l2_penalty_factor (float): The factor for L2 penalty. |
| """ |
| maxx, ids = torch.max(logits, dim=-1, keepdim=True) |
| ctx.logits_shape = logits.shape |
| factor = l2_penalty_factor / (logits.shape[0] * logits.shape[1]) |
| maxx = maxx * factor |
| ctx.save_for_backward(maxx, ids) |
| return loss |
|
|
| @staticmethod |
| def backward(ctx, grad_output): |
| maxx, ids = ctx.saved_tensors |
| glogits = torch.zeros(ctx.logits_shape, device=grad_output.device, |
| dtype=grad_output.dtype) |
| glogits.scatter_(-1, ids, maxx) |
| return grad_output, glogits, None |
|
|
|
|
| l2_warp = L2Wrap.apply |
|
|