Как кодировать информацию о времени в задаче прогнозирования LSTM - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь построить модель на основе недавней статьи Google, которая называется «Масштабируемое и точное глубокое обучение для электронных медицинских карт».В документе описывается, как встраивать медицинские данные для последующих задач прогнозирования.

В дополнительном материале есть раздел, описывающий, как встраивать медицинские данные, выполняя следующие действия (рис. Также прилагается ниже):

1) Возьмите необработанные медицинские данные по каждому пациенту за шаг по времени и вставьте их (например, как это делается в вложениях слов)

2) Объедините всю историю этого пациента за этот временной шаг вместе в длинный вектор

2a) Для нескольких данных одного и того же типа усредните вложения с использованием усвоенного веса

3) Создайте еще один вектор, содержащий информацию о времени (в секундах)

enter image description here

Я довольно новичок в LSTM, но я нашел некоторый код, который я хотел изменить, чтобы получить вложения и информацию о времени:

class LSTMClassifier(nn.Module):

def __init__(self, embedding_dim, hidden_dim, vocab_size, label_size):
    super(LSTMClassifier, self).__init__()
    self.hidden_dim = hidden_dim
    self.embeddings = nn.Embedding(vocab_size, embedding_dim)
    self.lstm = nn.LSTM(embedding_dim, hidden_dim)
    self.hidden2label = nn.Linear(hidden_dim, label_size)
    self.hidden = self.init_hidden()

def init_hidden(self):
    # the first is the hidden h
    # the second is the cell  c
    return (autograd.Variable(torch.zeros(1, 1, self.hidden_dim)),
            autograd.Variable(torch.zeros(1, 1, self.hidden_dim)))

def forward(self, sentence):
    embeds = self.embeddings(sentence)
    x = embeds.view(len(sentence), 1, -1)
    lstm_out, self.hidden = self.lstm(x, self.hidden)
    y = self.hidden2label(lstm_out[-1])
    log_probs = F.log_softmax(y)
    return log_probs

Наконец, в дополнительномВ материале говорится, что:

Последовательность вложений была дополнительно сокращена до более короткой последовательности.Как правило, более короткие последовательности делятся на временные шаги по 12 часов, где вложения для всех признаков в категории в один и тот же день объединяются с использованием взвешенного усреднения.Взвешенное усреднение выполняется путем связывания каждого признака с неотрицательным весом, который тренируется совместно с моделью.Эти веса также используются для атрибуции прогноза.Лог средней дельты времени, деленный на коэффициент (управляемый гиперпараметром) на каждом временном шаге, также внедряется в небольшой вектор с плавающей запятой (который также произвольно инициализируется) и объединяется с входным вложением в каждый момент времени.step.

Мой общий вопрос: как мне на самом деле вставить этот вектор времени?

Я смущен, потому что говорится, что последовательности были разбиты на 12-часовые временные шаги.Если это так, то зачем нужен вектор времени?Затем в последующем говорится, что вы можете просто объединить вектор времени для вложения.Почему бы простой конкатенации, как эта работа и как модель узнает, чтобы связать эту информацию времени с соответствующей частью ввода?Фактическое орудие как бы потеряно для меня, поэтому мы будем благодарны за любые рекомендации!

...