我有一些没有标签的文本。只是大量的文本文件。我想训练一个Embedding层,将单词映射到嵌入向量。我迄今为止看到的大多数例子都是这样的:
from keras.models import Sequentialfrom keras.layers import Embedding, Flatten, Densemodel = Sequential()model.add(Embedding(max_words, embedding_dim, input_length=maxlen))model.add(Flatten())model.add(Dense(32, activation='relu'))model.add(Dense(1, activation='sigmoid'))model.summary()model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])model.fit(x_train, y_train, epochs=10, batch_size=32, validation_data=(x_val, y_val))
它们都假设Embedding层是试图预测标签的更大模型的一部分。但在我的情况下,我没有标签。我不是要对任何东西进行分类。我只是想训练从单词(更准确地说是整数)到嵌入向量的映射。但模型的fit
方法要求x_train
和y_train
(如上例所示)。
如何仅用一个Embedding层且没有标签来训练模型?
[UPDATE]
根据我从@***得到的回答,Keras中的Embedding层实现的是监督算法,因此不能在没有标签的情况下进行训练。最初,我认为它是Word2Vec的一种变体,因此不需要标签来训练。显然,事实并非如此。个人来说,我最终使用了FastText,它与Keras或Python无关。
回答:
没有标签/目标的情况下这样做有意义吗?
如果没有目标,你的模型如何决定向量中的哪些值是好的?
所有嵌入都是为了某个目的而“训练”的。如果没有目的,就没有目标,如果没有目标,就没有训练。
如果你真的想在没有目的/目标的情况下将单词转换为向量,你有两个选择:
- 制作独热编码向量。你可以使用Keras的
to_categorical
函数来实现这一点。 - 使用预训练的嵌入。有几种可用的,例如glove,来自Google的嵌入等。(它们都是在某个时候为了某个目的而训练的)。
基于我们聊天的非常简单的做法,考虑单词距离
警告:我对Word2Vec一无所知,但我会尝试展示如何使用一些简单的单词距离规则来添加你的嵌入规则,以及如何使用虚假“标签”仅为了满足Keras的训练方式。
from keras.layers import Input, Embedding, Subtract, Lambdaimport keras.backend as Kfrom keras.models import Modelinput1 = Input((1,)) #word1input2 = Input((1,)) #word2embeddingLayer = Embedding(...params...)word1 = embeddingLayer(input1)word2 = embeddingLayer(input2)#简单的距离规则,相减,期望零差异word_distance = Subtract()([word1,word2])#将所有维度减少到单一维度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')
并使用word2作为word1之后的单词进行训练:
xTrain = entireTextxTrain1 = entireText[:-1]xTrain2 = entireText[1:]yTrain = np.zeros((len(xTrain1),))model.fit([xTrain1,xTrain2], yTrain, .... more params.... )
尽管这可能与Word2Vec的实际做法完全不同,但它展示了以下主要观点:
- Embedding层没有特殊属性,它们只是可训练的查找表
- 创建嵌入的规则应该由模型和预期输出定义
- Keras模型需要“目标”,即使这些目标不是“标签”,而是一种数学技巧以获得预期结果。