Как tf1.x использует встраивание?

Как использовать встраивание?

Недавно мне нужно было использовать 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. и получите Результат — результат встраивания метки.

Программирование — дело непростое. Если вам это помогло, поставьте лайк и подпишитесь!

Supongo que te gusta

Origin blog.csdn.net/weixin_43669978/article/details/122738768
Recomendado
Clasificación