представление временных рядов

алгоритм

Это 9-й день моего участия в августовском испытании обновлений. Узнайте подробности мероприятия:  Испытание августовского обновления

В природе, помимо 2D, 3D-изображений, видео, расстояния вождения, больше похоже на некоторые серии данных, такие как голос, текст, данные в хронологическом порядке.

Теперь есть такая проблема.Для последовательности 2D-изображений мы используем значение RGB пикселя для представления цвета пикселя. А как же голос и текст?

Речь будет генерировать сигнал в течение определенного периода времени, и пиковое значение в этом сигнале может представлять интенсивность звука в данный момент. Он также может представлять символы в фрагменте текста. Но в PyTorch нет строкового типа, мы должны представить строковый тип как другой числовой тип. как действоватьПредставление временных рядов, как выполнить извлечение информации (Information Extraction) из временных рядов стало ключевым вопросом в исследовании временных рядов

Sequence Representation

  • [seq_len,feature_len][\text{seq\_len}, \text{feature\_len}]

Предположим, что в предложении 5 слов, тогдаseq_len=5\text{seq\_len}=5feature_len\text{feature\_len}Зависит от сценария вашего приложения, скажем, каждое слово представлено одномерным вектором, затемfeature_len=1\text{feature\_len}=1, если каждое слово представлено 100-мерным вектором, тоfeature_len=100\text{feature\_len}=100

Например, исторический ценовой график на рисунке ниже представлен как [100,1]

How to represent a word

Обычно мы будем использовать однократное кодирование для кодирования текста, см. следующий пример.

Предположим, что есть следующие два предложения:

  • have a good day
  • have a great day

В этих двух предложениях всего 5 слов, поэтому вы можете использоватьVVсказал, из которыхV={have,a,good,great,day}V=\{\text{have}, \text{a}, \text{good}, \text{great}, \text{day}\}. Поскольку слов 5, каждое слово представлено 5-мерным вектором следующим образом:

  • have = [1, 0, 0, 0, 0]
  • a = [0, 1, 0, 0, 0]
  • good = [0, 0, 1, 0, 0]
  • great = [0, 0, 0, 1, 0]
  • day = [0, 0, 0, 0, 1]

Но это имеет следующие недостатки:

  1. Вектор каждого слова независим, поэтому использование одноразового кодирования не отражает отношения между словами и словами.
  2. Если словарный запас большой, размерность вектора будет очень большой, и в то же время это вызовет проблему разреженности данных.

Word Embedding

Есть много проблем с приведенным выше одноразовым кодированием, так как мне его изменить? Мы можем определить каждое слово по-другому — встраивание слов. Следующее предложение объясняет, что встраивание слов очень подходит

Вложения слов встраивают значение текста в векторное пространство.

Некоторые слова имеют похожие части речи, такие как «любовь» и «нравится». Для слов с похожими частями речи нам нужно, чтобы их векторные представления были похожи. Как измерить и определить сходство между векторами? Очень просто, это использовать угол между двумя векторами, чем меньше угол, тем он ближе. Например, ниже 4 абзаца.

  1. The cat likes playing wool.
  2. The kitty likes playing wool.
  3. The dog likes playing ball
  4. The boy does not like playing ball or wool.

В нем 4 слова, а именно кошка, котенок, собака и мальчик. Ниже мы используем двумерный вектор слов(a,b)(a,b)Чтобы представить каждое слово, где a и b представляют атрибут слова, например, a представляет, нравится ли вам играть в мяч, b представляет, нравится ли вам играть с шерстью, чем больше значение, тем больше вам это нравится, затем мы можем использовать значение для определения каждого слова

Для кота мы можем определить его вложение слова как (-1, 4), потому что он не любит играть в мяч и любит играть с шерстью; котенок (-2, 5); собака (3, -2) ; мальчик (-2, -3). Представьте эти четыре вектора в системе координат

На картинке выше хорошо видно, что угол между котенком и кошкой относительно мал, поэтому они похожи, а угол между собакой и мальчиком большой, поэтому они не похожи.

Конкретная формула описана ниже. для вектораx,yеRd\boldsymbol{x}, \boldsymbol{y} \in \mathbb{R}^d, их косинусное сходство есть косинус угла между ними

xyxyе[1,1].\frac{\boldsymbol{x}^\top \boldsymbol{y}}{\|\boldsymbol{x}\| \|\boldsymbol{y}\|} \in [-1, 1].

Встраивание слов в PyTorch реализовано с помощью функцииnn.Embedding

import torch
import torch.nn as nn

word_to_idx = {"hello": 0, "world": 1} # 给每个词打上索引

lookup_tensor = torch.tensor([word_to_idx["hello"]], dtype=torch.long) # 取出"hello"对应的索引

embeds = nn.Embedding(2, 5) # 2 words in vocab, 5 dimensional embeddings
hello_embed = embeds(lookup_tensor) # 传入索引

print(hello_embed)

вывод

tensor([[-1.2999,  2.2142,  0.2436, -1.9585,  0.8714]],
       grad_fn=<EmbeddingBackward>)

Объясните немного эти строки кода, прежде всего потому, что каждое слово должно быть представлено числом, поэтому мы должны построить сопоставление слово-число.

Послеnn.Embedding(2, 5), 2 означает 2 слова, 5 означает 5 измерений, что на самом деле является матрицей 2×5. Итак, если у вас есть 1000 слов, и каждое слово должно быть 100-мерным, вы можете написать эту строку кода следующим образом.nn.Embedding(1000, 100)