如何在 Keras 中仅使用嵌入层且没有标签来训练模型

Meh*_*ran 4 python machine-learning keras word-embedding

我有一些没有任何标签的文本。只是一堆文本文件。我想训练一个嵌入层将单词映射到嵌入向量。到目前为止我见过的大多数例子都是这样的:

\n\n
from keras.models import Sequential\nfrom keras.layers import Embedding, Flatten, Dense\n\nmodel = Sequential()\nmodel.add(Embedding(max_words, embedding_dim, input_length=maxlen))\nmodel.add(Flatten())\nmodel.add(Dense(32, activation=\'relu\'))\nmodel.add(Dense(1, activation=\'sigmoid\'))\nmodel.summary()\nmodel.compile(optimizer=\'rmsprop\',\n    loss=\'binary_crossentropy\',\n    metrics=[\'acc\'])\nmodel.fit(x_train, y_train,\n    epochs=10,\n    batch_size=32,\n    validation_data=(x_val, y_val))\n
Run Code Online (Sandbox Code Playgroud)\n\n

他们都假设嵌入层是试图预测标签的更大模型的一部分。但就我而言,我没有标签。我并不是想对任何东西进行分类。我只想训练从单词(更准确地说是整数)到嵌入向量的映射。但fit模型的方法要求x_trainy_train(如上面给出的示例)。

\n\n

如何训练仅具有嵌入层且没有标签的模型?

\n\n

[更新]

\n\n

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

\n

Dan*_*ler 5

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

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

所有嵌入都是为了某种目的而“训练”的。没有目的就没有目标,没有目标就没有训练。

如果您确实想在没有任何目的/目标的情况下转换向量中的单词,您有两个选择:

  • 制作 one-hot 编码向量。您可以使用 Kerasto_categorical函数来实现此目的。
  • 使用预训练的嵌入。有一些可用的,例如手套、来自 Google 的嵌入等(所有这些都在某个时刻出于某种目的进行了训练)。

基于我们的聊天,考虑单词距离的非常幼稚的方法

警告:我对 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)
Run Code Online (Sandbox Code Playgroud)

现在我们的模型直接输出单词距离,我们的标签将是“零”,它们并不是真正的监督训练标签,但它们是模型的预期结果,是 Keras 工作所必需的。

例如,我们可以将mae(平均绝对误差)或(均方误差)作为损失函数。mse

model.compile(optimizer='adam', loss='mse')
Run Code Online (Sandbox Code Playgroud)

并用 word2 作为 word1 之后的单词进行训练:

xTrain = entireText
xTrain1 = entireText[:-1]
xTrain2 = entireText[1:]
yTrain = np.zeros((len(xTrain1),))

model.fit([xTrain1,xTrain2], yTrain, .... more params.... ) 
Run Code Online (Sandbox Code Playgroud)

尽管这对于 Word2Vec 的真正用途可能是完全错误的,但它显示了以下要点:

  • 嵌入层没有特殊属性,它们只是可训练的查找表
  • 创建嵌入的规则应由模型和预期输出定义
  • Keras 模型需要“目标”,即使这些目标不是“标签”,而是预期结果的数学技巧。