Имеет ли смысл делать это без метки / цели?
Как ваша модель решит, какие значения в векторах подходят для чего-либо, если нет цели?
Все вложения"обучены" для определенной цели.Если нет цели, нет цели, если нет цели, нет обучения.
Если вы действительно хотите преобразовать слова в векторы без какой-либо цели / цели, у вас есть два варианта:
- Создание закодированных векторов в горячем виде.Для этого вы можете использовать функцию Keras
to_categorical
. - Используйте предварительно обученное вложение.Есть некоторые доступные, такие как перчатки, вложения от Google и т. Д. (Все они были обучены в какой-то момент для какой-то цели).
Очень наивный подход, основанный на нашем чате, с учетом расстояния до слова
Предупреждение: я действительно ничего не знаю о Word2Vec, но я постараюсь показать, какдобавить правила для встраивания с использованием некоторого наивного вида расстояния между словами и как использовать фиктивные «метки» только для того, чтобы удовлетворить способ обучения Кераса.
from keras.layers import Input, Embedding, Subtract, Lambda
import keras.backend as K
from keras.models import Model
input1 = Input((1,)) #word1
input2 = Input((1,)) #word2
embeddingLayer = Embedding(...params...)
word1 = embeddingLayer(input1)
word2 = embeddingLayer(input2)
#naive distance rule, subtract, expect zero difference
word_distance = Subtract()([word1,word2])
#reduce all dimensions to a single dimension
word_distance = Lambda(lambda x: K.mean(x, axis=-1))(word_distance)
model = Model([input1,input2], word_distance)
Теперь, когда наша модель выводит непосредственно расстояние между словами,наши метки будут «нулевыми», они не совсем метки для контролируемого обучения, но это ожидаемый результат модели, что-то необходимое для работы Keras.
В качестве функции потерь мы можем иметьНапример, mae
(средняя абсолютная ошибка) или mse
(среднеквадратичная ошибка).
model.compile(optimizer='adam', loss='mse')
И тренировка со словом 2, являющимся словом после слова 1:
xTrain = entireText
xTrain1 = entireText[:-1]
xTrain2 = entireText[1:]
yTrain = np.zeros((len(xTrain1),))
model.fit([xTrain1,xTrain2], yTrain, .... more params.... )
Хотяэто может быть совершенно неверно в отношении того, что на самом деле делает Word2Vec, он показывает основные моменты:
- Встраиваемые слои не имеют специальных свойств, они просто обучаемые таблицы поиска
- Правила создания встраивания должны определяться моделью и ожидаемыми результатами
- Для модели Keras потребуются «цели», даже если эти цели не являются «метками», а математическим приемом для ожидаемого результата.