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”)
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í:
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óndiv
. Esto asegura que las filas de A permanezcan en simplejo de probabilidad.