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.

Descenso de Gradientes Proyectado en Simplex de Probabilidad en PyTorch.

Tengo una matriz A de dimensión 1000×70000. Mi función de pérdida incluye A y quiero encontrar el valor óptimo de A usando descenso de gradiente donde la restricción es que las filas de A permanezcan en el simplex de probabilidad (es decir, cada fila suma 1). He inicializado A como se muestra a continuación:

A = np.random.dirichlet(np.ones(70000), 1000)
A = torch.tensor(A, requires_grad=True)

y mi bucle de entrenamiento se ve así:

para época en rango(500):
y_pred=forward(X)
y=model(torch.mm(A.float(),X))
l=loss(y,y_pred)
l.backward()
A.grad.data=-A.grad.data
optimizer.step()
optimizer.zero_grad()
si época%2==0:
print(“Pérdida”, l, “\n”)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema requiere encontrar el valor óptimo de la matriz A mientras se restringen sus filas al simplejo de probabilidad. Esto se puede lograr utilizando descenso de gradiente y asegurándose de que las filas de la matriz A siempre sumen 1.

    El fragmento de código inicializa la matriz A utilizando la función dirichlet de numpy, que devuelve una matriz aleatoria con columnas que suman 1. Luego, la matriz se convierte en un tensor de PyTorch y se establece para requerir gradientes.

    El ciclo de entrenamiento utiliza la función forward para predecir la salida, calcula la función de pérdida que incluye la matriz A y luego actualiza los gradientes utilizando la retropropagación. Luego se toma el paso del optimizador, seguido de poner los gradientes a cero.

    Para asegurarnos de que las filas de A permanezcan en el simplejo de probabilidad, necesitamos re-normalizarlos después de cada actualización. Esto se puede lograr dividiendo cada fila por su suma.

    El ciclo de entrenamiento modificado se vería así:

    for epoch in range(500):
        y_pred = forward(X)
        y = model(torch.mm(A.float(), X))
        l = loss(y, y_pred)
        l.backward()
        A.grad.data = -A.grad.data
        A = A.div(A.sum(dim=1, keepdim=True))
        optimizer.step()
        optimizer.zero_grad()
        if epoch % 2 == 0:
            print("Pérdida", l, "\n")
    

    Aquí, calculamos las sumas de fila utilizando la función sum de PyTorch a lo largo de la dimensión de fila, y luego dividimos cada fila por su suma utilizando la función div. Esto asegura que las filas de A permanezcan en simplejo de probabilidad.

Comments are closed.