簡體   English   中英

如何在Keras中僅嵌入層的情況下訓練模型

[英]How to train a model with only an Embedding layer in Keras and no labels

我有一些沒有標簽的文字。 只是一堆文本文件。 我想訓練一個嵌入層,將單詞映射到嵌入向量。 到目前為止,我看到的大多數示例都是這樣的:

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_trainy_train (如上面給出的示例)。

如何訓練僅具有嵌入層且沒有標簽的模型?

[UPDATE]

根據我從@DanielMöller那里得到的答案,Keras的Embedding層正在實現一種監督算法,因此如果沒有標簽就無法進行訓練。 最初,我以為它是Word2Vec的變體,因此不需要訓練標簽。 顯然不是這樣。 我個人最終使用了與Keras或Python無關的FastText

在沒有標簽/目標的情況下這樣做是否有意義?

如果沒有目標,您的模型將如何確定向量中的哪些值對任何事物都有利?

所有嵌入都是出於特定目的而經過“訓練”的。 如果沒有目標,就沒有目標,如果沒有目標,就沒有培訓。

如果您真的想在沒有任何目的/目標的情況下轉換向量中的單詞,則有兩種選擇:

  • 制作一鍵編碼的向量。 您可以to_categorical使用to_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)

現在我們的模型直接輸出一個單詞距離,我們的標簽將為“零”,它們並不是真正意義上的有監督訓練的標簽,但它們是模型的預期結果,這對於Keras來說是必需的。

例如,我們可以將mae (平均絕對誤差)或mse (平均平方誤差)作為損失函數。

model.compile(optimizer='adam', loss='mse')

然后訓練word2作為word1之后的單詞:

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

model.fit([xTrain1,xTrain2], yTrain, .... more params.... ) 

盡管就Word2Vec的實際功能而言這可能是完全錯誤的,但它顯示了以下要點:

  • 嵌入層沒有特殊屬性,它們只是可訓練的查找表
  • 創建嵌入的規則應由模型和預期輸出定義
  • Keras模型將需要“目標”,即使這些目標不是“標簽”,而是獲得預期結果的數學技巧。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM