Это 9-й день моего участия в августовском испытании обновлений. Узнайте подробности мероприятия: Испытание августовского обновления
В природе, помимо 2D, 3D-изображений, видео, расстояния вождения, больше похоже на некоторые серии данных, такие как голос, текст, данные в хронологическом порядке.
Теперь есть такая проблема.Для последовательности 2D-изображений мы используем значение RGB пикселя для представления цвета пикселя. А как же голос и текст?
Речь будет генерировать сигнал в течение определенного периода времени, и пиковое значение в этом сигнале может представлять интенсивность звука в данный момент. Он также может представлять символы в фрагменте текста. Но в PyTorch нет строкового типа, мы должны представить строковый тип как другой числовой тип. как действоватьПредставление временных рядов, как выполнить извлечение информации (Information Extraction) из временных рядов стало ключевым вопросом в исследовании временных рядов
Sequence Representation
Предположим, что в предложении 5 слов, тогда,иЗависит от сценария вашего приложения, скажем, каждое слово представлено одномерным вектором, затем, если каждое слово представлено 100-мерным вектором, то
Например, исторический ценовой график на рисунке ниже представлен как [100,1]
How to represent a word
Обычно мы будем использовать однократное кодирование для кодирования текста, см. следующий пример.
Предположим, что есть следующие два предложения:
- have a good day
- have a great day
В этих двух предложениях всего 5 слов, поэтому вы можете использоватьсказал, из которых. Поскольку слов 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]
Но это имеет следующие недостатки:
- Вектор каждого слова независим, поэтому использование одноразового кодирования не отражает отношения между словами и словами.
- Если словарный запас большой, размерность вектора будет очень большой, и в то же время это вызовет проблему разреженности данных.
Word Embedding
Есть много проблем с приведенным выше одноразовым кодированием, так как мне его изменить? Мы можем определить каждое слово по-другому — встраивание слов. Следующее предложение объясняет, что встраивание слов очень подходит
Вложения слов встраивают значение текста в векторное пространство.
Некоторые слова имеют похожие части речи, такие как «любовь» и «нравится». Для слов с похожими частями речи нам нужно, чтобы их векторные представления были похожи. Как измерить и определить сходство между векторами? Очень просто, это использовать угол между двумя векторами, чем меньше угол, тем он ближе. Например, ниже 4 абзаца.
- The cat likes playing wool.
- The kitty likes playing wool.
- The dog likes playing ball
- The boy does not like playing ball or wool.
В нем 4 слова, а именно кошка, котенок, собака и мальчик. Ниже мы используем двумерный вектор словЧтобы представить каждое слово, где a и b представляют атрибут слова, например, a представляет, нравится ли вам играть в мяч, b представляет, нравится ли вам играть с шерстью, чем больше значение, тем больше вам это нравится, затем мы можем использовать значение для определения каждого слова
Для кота мы можем определить его вложение слова как (-1, 4), потому что он не любит играть в мяч и любит играть с шерстью; котенок (-2, 5); собака (3, -2) ; мальчик (-2, -3). Представьте эти четыре вектора в системе координат
На картинке выше хорошо видно, что угол между котенком и кошкой относительно мал, поэтому они похожи, а угол между собакой и мальчиком большой, поэтому они не похожи.
Конкретная формула описана ниже. для вектора, их косинусное сходство есть косинус угла между ними
Встраивание слов в 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)