1. Что такое Word2vec и зачем он нужен?
- Горячее кодирование страдает от проклятия размерности и семантического разрыва.
Проклятие размерности заключается в том, что размерность вектора одного горячего вектора совпадает с размером тезауруса. Размерность вектора, представленного one-hot, очень велика, что делает выборки данных разреженными, вычисление расстояния затруднено, и возникает катастрофа размерности.
Семантический разрыв возникает из-за того, что векторы слов, сгенерированные one-hot, ортогональны друг другу и не отражают никакой семантической связи.
-
Встраивание слов заключается в преобразовании «невычислимых» и «неструктурированных» слов в «вычислимые» и «структурированные» векторы.
-
Word2vec — это один из методов встраивания Word. Word2vec — это набор инструментов, специально используемый для получения векторов слов, который был запущен командой Google в 2013 году. Его основной алгоритм направлен на повышение эффективности части с наибольшим объемом вычислений NNLM. word2vec кодирует слова в векторы с помощью обучения сети, и эффект кодирования этого метода лучше, чем у one-hot.
-
преимущество:
1. Поскольку Word2vec будет учитывать контекст, эффект лучше, чем у предыдущего метода встраивания.
2. Меньше размеров, чем в предыдущем методе встраивания, поэтому он быстрее
3. Он очень универсален и может использоваться в различных задачах НЛП.
2. Процесс Word2vec
word2vec в основном включает две модели: скип-грамм и непрерывный пакет слов (CBOW).
- Модель CBOW предсказывает центральное слово в соответствии со словами вокруг центрального слова W(t), как показано на рисунке ниже. Модель характеризуется вводом известного контекста и выводом предсказания текущего слова.
Его цель обучения состоит в том, чтобы максимизировать функцию логарифмического правдоподобия:
Процесс обучения модели:
(1) Во входной слой вводится уникальное тепловое кодирование контекста текущего слова.
(2) Эти слова умножаются на одну и ту же матрицу для получения соответствующих одномерных векторов.
(3) Усредните эти векторы в одномерный вектор как результат скрытого слоя.
(4) Умножьте этот выходной вектор на матрицу между скрытым слоем и выходным слоем, чтобы получить выходной одномерный вектор.
(5) Нормируйте вектор softmax и выведите вектор вероятности каждого слова.
(6) В качестве предсказанного слова используется слово, соответствующее числу с наибольшим значением вероятности.
(7) Вычислить ошибку между предсказанным вектором результата и реальным вектором метки
(8) Ошибка обратного распространения обновляет весовые и пороговые матрицы после каждого прямого прохода.
-
Модель скип-граммы:
Skip-gram просто меняет причинно-следственную связь CBOW, то есть текущее слово известно, а контекст предсказывается.
Описание используемых параметров:
1. Сводный словарь специальных слов, встречающихся в базе данных или тексте. Этот словарь называется словарем и является известным словом системы. Лексика представлена буквой «v».
2. «N» представляет количество нейронов в скрытом слое.
3. Размер окна — это наибольшая контекстная позиция прогнозируемого слова. "c" представляет размер окна. Например, в данном архитектурном графе размер окна равен 2, поэтому мы будем предсказывать слова в контекстных позициях (t-2), (t-1), (t+1) и (t+2).
4. Окно контекста относится к количеству предсказуемых слов, которые появятся в диапазоне заданного слова. Для размера окна 2*c, обозначенного буквой K, значение контекстного окна в два раза больше размера окна. Значение контекстного окна для данного изображения равно 4.
5. Размерность входного вектора равна |V|. Каждое слово закодировано горячим способом.
6. Размер матрицы весов (W) скрытого слоя равен [|V|, N]. «||» — это функция по модулю, которая восстанавливает значение массива.
7. Выходной вектор скрытого слоя равен H[N].
8. Размер матрицы весов (W’) между скрытым слоем и выходным слоем равен [N,|V|].
9. Скалярное произведение между W' и H генерирует выходной вектор U[|v|]
Конкретный процесс:
- Преобразуйте слова в векторы, используя однократное кодирование, и эти векторы имеют размерность [1,|v|].
-
Слово w(t) передается от нейрона |V| скрытому слою.
-
Скрытый слой выполняет скалярное произведение между вектором весов W[|v|, N] и входным вектором w(t). Здесь мы можем заключить, что W[|v|, N] в строке (t) выведет (H[1, N]).
-
Помните: скрытый слой не использует функцию активации, поэтому H[1,k] передается непосредственно выходному слою.
-
Выходной слой выполняет скалярное произведение между H[1, N] и W'[N, |v|] и дает вектор U.
-
Теперь, чтобы получить вероятность каждого вектора, мы используем функцию softmax, поскольку каждая итерация дает выходной вектор U, который является режимом горячего кодирования.
-
Слово с наибольшей вероятностью является окончательным результатом. Если предсказанное слово в указанной позиции контекста неверно, мы используем алгоритм обратного распространения ошибки для исправления весовых векторов W и W'.
Описанные выше шаги выполняются для каждого слова w(t) в словаре. Кроме того, каждое слово w(t) передается K раз. Таким образом, мы можем знать, что алгоритм прямого распространения будет выполняться |v|*k раз в каждый период времени.
Функция вероятности:
w(c, j) — j-е слово, предсказанное в c-й позиции контекста; w(O, c) — фактическое слово, которое встречается в c-й позиции контекста; w(I) — единственное входное слово u(c, j) — j-е значение вектора U при предсказании слова в c-й контекстуальной позиции.
Функция потерь:
Поскольку мы хотим максимизировать вероятность предсказания w(c, j) в c-й позиции контекста, можно использовать функцию потерь L.
3. Технические преимущества word2vec
Мы знаем, что в модели word2vec, когда обучающая выборка или корпус очень велики, функция softmax вычисляет каждое предсказание на основе всего набора данных, что будет очень большим вычислительным процессом.
В моделях word2vec есть два эффективных метода обучения: отрицательная выборка и иерархический софтмакс (hierarchical softmax).
- negative sampling:
Отрицательная выборка — это средство выборки отрицательных примеров для облегчения обучения и используется для повышения скорости обучения модели. Например, у нас есть обучающая выборка, центральное слово — w, а в окружающем контексте есть 2c слов, обозначаемых как context(w). Поскольку это центральное слово w действительно существует по отношению к контексту (w), это действительно положительный пример. С помощью отрицательной выборки мы получаем отрицательные и w разные центральные слова wi,i=1,2,..neg, так что контекст(w) иПараметр модели $\theta_{i}, соответствующий w_i, и вектор слов каждого слова.
Для расчета используется сигмоидальная функция. Конкретный процесс расчета подробно не описан:blog.CSDN.net/Sun_brother…
- иерархический софтмакс:
Поскольку мы преобразовали все расчеты вероятности из выходного слоя softmax в двоичное дерево Хаффмана, наш расчет вероятности softmax необходимо выполнять только вдоль древовидной структуры. Как показано на рисунке ниже, мы можем следовать дереву Хаффмана от корневого узла до слова w2 нашего конечного узла.
По сравнению с предыдущей языковой моделью нейронной сети все внутренние узлы нашего дерева Хаффмана подобны нейронам в скрытом слое предыдущей нейронной сети, где вектор слов корневого узла соответствует нашему проецируемому вектору слов, а все листья Узлы аналогичны нейронам в выходном слое softmax предыдущей нейронной сети, а количество листовых узлов соответствует размеру словаря. В дереве Хаффмана отображение softmax из скрытого слоя в выходной слой не завершается сразу, а выполняется шаг за шагом по дереву Хаффмана, поэтому этот softmax называется «Иерархический Softmax».
Как «шаг за шагом по дереву Хаффмана»? В word2vec мы используем метод бинарной логистической регрессии, то есть если мы идем по левому поддереву, то это отрицательный класс (код дерева Хаффмана 1), а если мы идем по правому поддереву, то это положительный класс (Код дерева Хаффмана 1. Код дерева Манна 0). Чтобы различать положительные и отрицательные классы, нужно использовать сигмовидную функцию, то есть:
где xw — вектор слов текущего внутреннего узла, а θ — параметр модели логистической регрессии, который нам нужно получить из обучающей выборки.
Каковы преимущества использования деревьев Хаффмана? Во-первых, поскольку это бинарное дерево, объем вычислений раньше был равен V, а теперь он становится log2V. Во-вторых, поскольку высокочастотные слова находятся близко к корню дерева с использованием дерева Хаффмана, для поиска высокочастотных слов требуется меньше времени, что соответствует нашей идее жадной оптимизации.
Легко понять, что вероятность быть разделенным на левое поддерево и стать отрицательным классом равна P(-)=1-P(+). В определенном внутреннем узле критерий для решения, идти ли по левому или правому поддереву, состоит в том, чтобы увидеть, какое из P (-) и P (+) имеет большее значение вероятности. Одним из факторов, управляющих значением вероятности P(-) и P(+), является вектор слова текущего узла, а другим является параметр модели θ текущего узла.
Для w2 на приведенном выше рисунке, если это результат обучающей выборки, то мы ожидаем большую вероятность P(-) для скрытого узла n(w2,1) внутри и вероятность P(-) для n (w2,2) Большой, вероятность P(+) n(w2,3) велика.
- Сравнительный анализ двух методов:
Хотя эффективность может быть повышена за счет вида дерева Хаффмана, если целевое слово обучающей выборки является очень редким словом, то оно должно долго спускаться по дереву Хаффмана. Другими словами, Hierachical softmax на самом деле является недостаточно стабильным алгоритмом. А отрицательная выборка отбрасывает деревья Хаффмана.
4.word2vec простой код
- gensim
from gensim.models import word2vec
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
model = word2vec.Word2Vec(sens_list,min_count=1,iter=20)
model.save("word2vec.model")
- python
def generate_batch(batch_size, num_skips, skip_window):
global data_index #global关键字 使data_index 可在其他函数中修改其值
assert batch_size % num_skips == 0 #assert断言用于判断后者是否为true,如果返回值为假,处罚异常
assert num_skips <= 2 * skip_window
batch = np.ndarray(shape=(batch_size), dtype=np.int32) #ndarray对象用于存放多维数组
labels = np.ndarray(shape=(batch_size, 1), dtype=np.int32)
span = 2 * skip_window + 1 # [ skip_window target skip_window]
# 初始化最大长度为span的双端队列,超过最大长度后再添加数据,会从另一端删除容不下的数据
# buffer: 1, 21, 124, 438, 11
buffer = collections.deque(maxlen=span) #创建一个队列,模拟滑动窗口
for _ in range(span):
buffer.append(data[data_index])
data_index = (data_index + 1) % len(data)
for i in range(batch_size // num_skips): # // 是整数除
# target : 2
target = skip_window # target label at the center of the buffer
# target_to_avoid : [2]
targets_to_avoid = [ skip_window ] # 需要忽略的词在当前的span位置
# 更新源单词为当前5个单词的中间单词
source_word = buffer[skip_window]
# 随机选择的5个span单词中除了源单词之外的4个单词中的两个
for j in range(num_skips):
while target in targets_to_avoid:
target = random.randint(0, span - 1)
targets_to_avoid.append(target) # 已经经过的target放入targets_to_avoid
#batch中添加源单词
batch[i * num_skips + j] = source_word
#labels添加目标单词,单词来自随机选择的5个span单词中除了源单词之外的4个单词中的两个
labels[i * num_skips + j, 0] = buffer[target]
# 往双端队列中添加下一个单词,双端队列会自动将容不下的数据从另一端删除
buffer.append(data[data_index])
data_index = (data_index + 1) % len(data)
return batch, labels
```