Как оптимизировать метрику моделирования с глубоким обучением без целевых значений? - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь использовать модель RNN, которая выводит автобусные маршруты, а ее вход является матрицей спроса. Автобусные маршруты затем используются в симуляции, которая показывает метрику того, как выполняются маршруты. Вопрос в том, что, поскольку нет целевого значения автобусных маршрутов, как мне распространить результат моделирования обратно?

Чтобы объяснить вопрос с помощью простого кода Python:

"""
The model is an RNN that takes 400,24,24 matrix as input

dimension 0 represents time, dimension 1 represents departure bus stop and dimension 2 represents the arrival bus stop. Each value is a count of the number of passengers who departed at a bus stop with an arrival bus stop in mind in a specific time

output is 64,24 matrix which will be reshaped to 8,8,24
dimension 0 is the sequence index, dimension 1 is the index of bus (there are 8 buses), dimension 2 is the softmaxed classifier dimension of 24 different bus stops. From the output, 8 bus stops are picked per bus with a sequence

These sequences are then used for path generations of buses and they are evaluated from a simulation
"""

model.train()
optimizer.zero_grad()
out = model(demand)#out is 64,24 demand is 400,24,24
demand, performance = simulation(out)#assume performance as float
#here the out has grad_fn but the performance does not
loss = SOME_NUMBER - performance
loss = torch.FloatTensor(loss)
#here I need to back propagate and it is the confusing part

#simply doing loss.backward() does nothing because no grad_fn

#out.backward() requires 64,24 gradients computed somehow from 1 #metric, causes complete divergence within few steps

optimizer.step()

1 Ответ

1 голос
/ 04 ноября 2019

Как выходные данные модели представляют автобусные маршруты? Может быть, вы могли бы попробовать усиленный подход к обучению. Взгляните на Deep-Q Learning, он в основном принимает и вводит вектор (состояние системы) и выводит действие (обычно представляемое индексом в вашем выходном слое), затем вычисляет вознаграждение за это действие и использует его дляобучить модель (без необходимости целевых значений).

Вот некоторые ресурсы, которые могут помочь вам начать:

https://towardsdatascience.com/double-deep-q-networks-905dd8325412

https://arxiv.org/pdf/1802.09477.pdf

https://arxiv.org/pdf/1509.06461.pdf

Надеюсь, это было полезно.

ОБНОВЛЕНИЕ

Есть второй вариант, вы можете определить пользовательскую функцию потерь. Обычно эти функции принимают только два аргумента, предикат_у и целевой_, в вашем случае нет target_y, поэтому вы можете передать фиктивный target_y и не использовать его внутри функции (я предполагаю, что вы можете вызвать процесс моделирования внутри этой функциии верните метрику как «убыток»). Вот примеры в PyTorch и Keras.

Keras: Создание пользовательской функции потерь в keras

PyTorch: Пользовательская функция потерь PyTorch

...