Как использовать встраивание?
Принцип и использование
Недавно мне нужно было использовать Embedding для встраивания функций, но я не могу найти конкретное использование встраивания в Интернете. Я, наконец, понял это после того, как собрал его воедино. Я напишу статью, чтобы обобщить это и разобраться во всех тонкостях. .
Можно сказать, что встраивание является средством кодирования дискретных функций.
Когда дело доходит до кодирования дискретных функций, я считаю, что большинство людей сначала подумают о кодировании Onehot. Давайте рассмотрим кодирование Onehot в качестве примера.
1. Что такое кодировка OneHot
Я думаю, что все знакомы с набором данных mnist. Это набор данных, используемый для классификации рукописных цифр. Существует десять чисел от 0 до 9, поэтому должно быть 10 типов меток: 0-9, соответствующих цифрам 0- 9.
Итак, если вы используете кодировку OneHot, то:
0: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
1: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
2: [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
3: [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
4: [0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
5: [0, 0, 0, 0, 0, 1, 0, 0, 0, 0]
6: [0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
7: [0, 0, 0, 0, 0, 0, 0, 1, 0, 0]
8: [0, 0, 0, 0, 0, 0, 0, 0, 1, 0]
9: [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
Это то, что мы обычно делаем во время обучения. Сначала Onehot кодирует метки, чтобы облегчить последующее обучение, проверку и тестирование.
Горячее кодирование (поскольку большинство алгоритмов рассчитываются на основе мер в векторном пространстве, чтобы значения переменных в нечастично упорядоченных отношениях не имели частичного упорядочения и были равноудалены от начала координат. Используйте одногорячее кодирование
, расширение значений дискретных признаков в евклидово пространство, а определенное значение дискретного признака соответствует определенной точке в евклидовом пространстве.Использование горячего кодирования для дискретных признаков сделает расчет расстояния между признаками более разумным.
Но есть проблемы с кодированием OneHot. Когда наше пространство функций очень велико, например, кодирование всех слов в словаре, предполагая, что в словаре есть слова мощностью 10 Вт, нам понадобится матрица 10 Вт * 10 Вт для их сопоставления. Кодирование, очевидно, избыточность этого метода кодирования слишком велика, большинство значений равно 0, а количество содержащейся информации слишком мало.
2. Что такое встраивание?
В это время появилось встраивание.Не является ли самая большая проблема OneHot избыточной? Тогда мое встраивание здесь, чтобы устранить избыточность для вас (в случае уменьшения размерности встраивание может увеличить размерность функций).Предположим, теперь у нас есть матрица функций, состоящая из строк 10 Вт и столбцов 10 Вт. Каждая строка представляет слово в словаре. Если мы умножим эту матрицу на матрицу из строк 10 Вт и столбцов 200, то результатом будет матрица строк 10 Вт * столбцов 200. Каждая строка по-прежнему представляет слово, но мы используем только 200 признаков, чтобы отличить это слово от других слов. открылся. Размерность всей матрицы уменьшается на 100000/200=500.
Давайте возьмем другой конкретный пример:
предположим, что в словаре всего 6 слов: солнце, апельсин, виноград, колесо, яблоко, дуриан.
Если вы используете onehot для кодирования, вам нужно использовать матрицу признаков 6*6=36:
太阳:[1, 0, 0,0,0,0]
橘子:[0, 1, 0,0,0,0]
葡萄:[0, 0, 1,0,0,0]
车轮:[0, 0, 0,1,0,0]
香蕉:[0, 0, 0,0,1,0]
榴莲:[0, 0, 0,0,0,1]
И теперь мы можем полностью различать их по трем признакам: Фрукты? Круглый? размер?
水果 圆形 大小
太阳:[0, 1, 1]
橘子:[1, 1, 1]
葡萄:[1, 1, 1]
车轮:[0, 1, 0]
香蕉:[1, 1, 0]
榴莲:[1, 0, 1]
Видно, что мы можем прекрасно различить эти шесть слов, используя только матрицу признаков 6 * 3 = 18. Причина в том, что в матрице onehot каждая строка не имеет никакого значения, кроме значения числа 1. Каждый признак в каждой строке приведенной ниже матрицы имеет фиксированное значение.
3. Как пользоваться встраиванием в tf1.X?
Мы отмечаем верхнюю матрицу как A, а нижнюю как B. Мы можем думать об этом как B = A * X.
Этот X — наша матрица вложения. Мы можем сделать вывод, что размеры X составляют: 6 строк и 3 столбца. Каждый столбец представляет функцию. Однако эти функции не так интерпретируемы, как приведенные выше примеры, поэтому мы обычно предпочитаем устанавливать X в качестве переменной матрицы, которая получается путем обучения в нейронной сети.
Чтобы вычислить размерность
матрицы
Очевидно, что в результате умножения матрицы размерность X можно получить как 10 *4.
Давайте возьмем простую демонстрацию нейронной сети:
def generator(x, y):
reuse = len([t for t in tf.global_variables() if t.name.startswith('generator')]) > 0
with tf.variable_scope('generator', reuse = reuse):
embedding_dict = tf.get_variable(name="embedding_1", shape=(10, 8), dtype=tf.float32)
y = tf.nn.embedding_lookup(embedding_dict, y)
y = slim.flatten(y)
x = tf.concat([x, y], 1)
x = slim.fully_connected(x, 32, activation_fn = tf.nn.relu)
x = slim.fully_connected(x, 128, activation_fn = tf.nn.relu)
x = slim.fully_connected(x, mnist_dim, activation_fn=tf.nn.sigmoid)
return x
Это простой генератор генеративно-состязательной сети. В него вводятся два вектора X и y, где y — метка mnist, 0–9, поэтому размерность признака равна 10. Теперь мы хотим проверить его в длиной вектора 8, затем создаем матрицу словаря внедрения, значения переменных в котором необходимо узнать.
Затем мы кодируем функции, вызывая функцию tf, nn, embedding_lookup(). Нам нужно передать два параметра: один — только что созданная матрица словаря внедрения, а другой — функция, которую нам нужно закодировать.
Суть функции tf, nn, embedding_lookup() эквивалентна тому, что сначала выполняется одногорячее кодирование всех признаков, а затем выполняется умножение матриц matmul с использованием матрицы onehot признаков и словарной матрицы (подробно упомянуто выше, на примере A*X =Б).
Фактически, если говорить прямо, операция встраивания такая же, как и в полносвязной сети: это умножение матриц и может быть заменено слоем плотной нейронной сети (называемым полносвязным слоем полносвязной сети (FC) в CV).
Альтернативный метод также очень прост. Onehot кодирует объекты, а затем вводит слой FC с dim = количество классов объектов, а затем вводит слой FC с dim = длину вектора регистрации. Полученный вектор после обучения — вектор внедрения.
Взяв в качестве примера встраивание метки mnist, мы сначала выполняем кодирование метки onehot. Длина вектора onehot, полученного для каждой метки, равна 10, вводим слой FC с dim = 10, а затем вводим слой FC с dim = 8. и получите Результат — результат встраивания метки.
Программирование — дело непростое. Если вам это помогло, поставьте лайк и подпишитесь!