es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo obtener la suma de gradientes inmediatamente después de loss.backward()?

Soy nuevo en Pytorch y estoy tratando de hacer algunos experimentos de muestreo de importancia:
Durante una época de evaluación, calculo la pérdida para cada muestra de entrenamiento y obtengo la suma de gradientes para esta muestra de entrenamiento. Finalmente, ordenaré las muestras de entrenamiento según los gradientes que introdujeron. Por ejemplo, si la muestra A muestra una suma de gradientes muy alta, debe ser una muestra importante para el entrenamiento. De lo contrario, no es una muestra muy importante.

Tenga en cuenta que los gradientes calculados aquí no se utilizarán para actualizar los parámetros. En otras palabras, solo se utilizan para seleccionar muestras de importancia.

Sé que los gradientes estarán listos en algún lugar después de loss.backward(). Pero, ¿cuál es la forma más sencilla de obtener los gradientes sumados sobre todo el modelo? En mi implementación actual, solo se me permite modificar un pequeño módulo con solo la pérdida disponible, por lo que no tengo “inputs” o “model”. ¿Es posible obtener los gradientes solo a partir de “loss”?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible obtener los gradientes solo a partir de la “pérdida” utilizando el paquete de diferenciación automática de PyTorch llamado “autograd”. Después de calcular la pérdida para cada muestra de entrenamiento, puedes llamar a la función “.backward()” en el tensor de pérdida, lo cual llenará el atributo “.grad” de cada tensor de parámetros en el modelo con su gradiente. Para obtener la suma de gradientes correspondiente a cada muestra de entrenamiento, puedes llamar al atributo “.grad” del tensor de entrada correspondiente después de llamar a “.backward()” en el tensor de pérdida.

    Aquí tienes un ejemplo de código:

    import torch
    
    # definiendo la función de pérdida
    loss_fn = torch.nn.CrossEntropyLoss()
    
    # iterando a través de cada muestra de entrenamiento
    for input, target in data_loader:
        # estableciendo requires_grad=True en todos los tensores de entrada
        input.requires_grad = True
    
        # calculando la pérdida
        output = model(input)
        loss = loss_fn(output, target)
    
        # calculando los gradientes
        loss.backward()
    
        # obteniendo la suma de gradientes para esta muestra
        sample_gradient_sum = input.grad.abs().sum()
    
        # haciendo un seguimiento de las muestras importantes
        importance_samples.append((sample_gradient_sum.item(), (input, target)))
    
        # poniendo los gradientes a cero para la próxima iteración
        model.zero_grad()
    

    En este ejemplo, estamos calculando la suma de gradientes para cada muestra de entrenamiento llamando al atributo “.grad” del tensor de entrada correspondiente, el cual está configurado como “requires_grad=True”. También estamos poniendo los gradientes a cero para la próxima iteración utilizando la función “zero_grad()” en el modelo. Finalmente, estamos almacenando las muestras importantes en una lista junto con sus sumas de gradientes correspondientes para ordenarlas al final.

Comments are closed.