Одно измерение Hot Encoding - модель Compexity - PullRequest
0 голосов
/ 15 января 2019

Я объясню мою проблему:

  • У меня около 50.000 выборок, каждая из которых описывается списком кодов, представляющих «события»
  • Количество уникальных кодов около 800.
  • Максимальное количество кодов, которое может иметь образец, составляет около 600.

Я хочу представить каждый образец, используя горячее кодирование. Представление должно быть, если мы рассмотрим операцию заполнения для тех выборок, у которых меньше кодов, матрицу 800x600.

Предоставление этого нового представления в качестве входных данных сети означает выравнивание каждой матрицы до вектора размером 800x600 (460 000 значений).

В конце набор данных должен состоять из 50 000 векторов размером 460 000.

Теперь у меня есть два соображения:

  • Как можно обрабатывать набор данных такого размера? (Я пробовал генератор данных, чтобы получить представление на лету, но они действительно медленные).
  • Наличие вектора размера 460.000 в качестве входных данных для каждой выборки означает, что сложность моей модели (количество изучаемых параметров) чрезвычайно высока (около 15.000.000 в моем случае) и, следовательно, мне нужен огромный набор данных правильно тренировать модель. Не так ли?

1 Ответ

0 голосов
/ 16 января 2019

Почему вы не используете обычную модель, используемую в НЛП?

Эти события могут быть переведены, как вы говорите, путем встраивания матрицы. Затем вы можете представить цепочки событий, используя LSTM (или GRU или RNN или двусторонний LSTM), отличие использования LSTM вместо обычной сети состоит в том, что вы используете один и тот же модуль, повторенный N раз. Таким образом, ваш вклад на самом деле не 460 000, а внутренне событие A косвенно помогает вам узнать о событии B. Это потому, что LSTM имеет модуль, который повторяется для каждого события в цепочке.

У вас есть пример здесь: https://www.kaggle.com/ngyptr/lstm-sentiment-analysis-keras

В общих чертах, я бы сделал следующее (в псевдокоде Keras):

  • Определить количество общих событий. Я генерирую уникальный список.
    unique_events = list (set ([event_0, ..., event_n]))
    You can perform the translation of a sequence with:
    seq_events_idx = map (unique_events.index, seq_events)
    
  • Добавьте необходимый пэд в каждую последовательность:
    sequences_pad = pad_sequences (sequences, max_seq)
    
  • Затем вы можете напрямую использовать вложение для переноса события в связанный вектор измерения, которое вы рассматриваете.
    input_ = Input (shape = (max_seq,), dtype = 'int32')
    embedding = Embedding (len(unique_events),
                        dimensions,
                        input_length = max_seq,
                        trainable = True) (input_)
    
  • Затем вы определяете архитектуру вашего LSTM (например):
    lstm = LSTM (128, input_shape = (max_seq, dimensions), dropout = 0.2, recurrent_dropout = 0.2, return_sequences = True) (embedding)
    
  • Добавьте плотность и результат, который вы хотите:
    out = Dense (10, activation = 'softmax') (lstm)
    

Я думаю, что этот тип модели может помочь вам и дать лучшие результаты.

...