Python 如何训练Keras中只有嵌入层且没有标签的模型

Python 如何训练Keras中只有嵌入层且没有标签的模型,python,machine-learning,keras,word-embedding,Python,Machine Learning,Keras,Word Embedding,我有一些没有任何标签的文本。只是一堆文本文件。我想训练一个嵌入层,将单词映射到嵌入向量。到目前为止,我看到的大多数示例如下: from keras.models import Sequential from keras.layers import Embedding, Flatten, Dense model = Sequential() model.add(Embedding(max_words, embedding_dim, input_length=maxlen)) model.add(

我有一些没有任何标签的文本。只是一堆文本文件。我想训练一个嵌入层,将单词映射到嵌入向量。到目前为止,我看到的大多数示例如下:

from keras.models import Sequential
from keras.layers import Embedding, Flatten, Dense

model = 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))
他们都假设嵌入层是试图预测标签的更大模型的一部分。但就我而言,我没有标签。我不想把任何东西分类。我只想训练从单词(更精确地说是整数)到嵌入向量的映射。但是模型的
fit
方法要求
x\u列车
y\u列车
(如上所示)

我如何训练一个只有嵌入层而没有标签的模型

[更新]


根据我从@Daniel Möller那里得到的答案,Keras中的嵌入层实现了一种有监督的算法,因此没有标签就无法进行训练。最初,我认为它是Word2Vec的一个变体,因此不需要对标签进行培训。显然,情况并非如此。就我个人而言,我最终使用了与Keras或Python无关的。

在没有标签/目标的情况下这样做有意义吗

如果没有目标,您的模型将如何决定向量中的哪些值对任何事情都有好处

所有嵌入件都经过专门的“培训”。没有目标就没有目标,没有目标就没有训练

如果您真的想在向量中转换单词而没有任何目的/目标,您有两个选项:

  • 制作一个热编码向量。您可以使用Keras
    来进行分类
    
  • 使用预训练的嵌入。有一些是可用的,比如手套,谷歌的嵌入,等等(他们都是为了某种目的而在某个时候接受培训的)

考虑到单词距离,这是一种基于聊天的非常简单的方法 警告:我对Word2Vec一无所知,但我将尝试展示如何使用一些简单的单词距离为嵌入添加规则,以及如何使用虚拟“标签”来满足Keras的训练方式

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模型需要“目标”,即使这些目标不是“标签”,而是实现预期结果的数学技巧
在这种情况下,您只需要一个只有嵌入层@desertnaut的模型,谢谢链接。这绝对是一篇有趣的文章。但据我所知,他们仍在处理提供标签的分类问题。如果我错了,请纠正我,但我认为这是另一种情况。我试着做同样的事情,从语料库中创建嵌入。在凯拉斯身上找不到任何东西。但我发现了这个博客,他们使用Tensorflow从一个巨大的语料库中创建嵌入。谢谢你的回答。我相信嵌入层的底层算法类似于Word2Vec(或者手套)。如果是这样的话,学习Word2Vec不需要数据就可以有标签。Word2Vec还有其他的实现(在其他编程语言中),它们都是这样的。此外,我还研究了算法。Word2Vec依赖于文本中单词的接近程度,它不用于标签。在所有使用嵌入层的示例中,标签都是针对其他层的,而不是针对嵌入层的。请阅读本文。它指出我的请求是有效的,但它并没有提供解决方案:您所说的是“预训练”嵌入。标签也适用于嵌入,除非嵌入是预训练的,并且您明确告诉模型您不希望它是可训练的。您可以使用预训练的嵌入层这一事实表明,训练嵌入层并不依赖于标签。想想看。如果嵌入层是基于某个特定问题进行训练的,那么您将无法在其他问题中使用它们。预训练映射工作的唯一原因是它们只依赖于语料库而不是任何特定的问题。请相信我。Word2Vec只依赖于文本中单词的接近程度,不涉及标签。也许这就是为什么嵌入必须是Kersa的第一层。这其实不是训练的一部分相信我Keras的事。嵌入层是为特定目的而训练的。这句话是错误的:“事实上,你可以使用一个预训练的嵌入层,这表明训练一个嵌入层并不依赖于标签。”-它表明一个可以用于许多问题的预训练嵌入是在一个非常普遍的问题中训练的。