Negative Sampling 是一种技术,其中不在 Context 中的值只是对其中的一小部分进行采样,而不是减少它们的 Weights 的值。
因此,在我们的实现中,我们使用“Sigmoid”而不是“Softmax”的激活。因此,对于Context 中的单词,我们希望我们的Network 到Output 1 和0 对于不在Context 中的单词。
是的,您的观察是正确的,我们需要使用Functional API 而不是Sequential API。
在Keras中实现Negative Sampling的代码如下所示:
# create some input variables
input_target = Input((1,))
input_context = Input((1,))
embedding = Embedding(vocab_size, vector_dim, input_length=1, name='embedding')
target = embedding(input_target)
target = Reshape((vector_dim, 1))(target)
context = embedding(input_context)
context = Reshape((vector_dim, 1))(context)
# setup a cosine similarity operation which will be output in a secondary model
similarity = merge([target, context], mode='cos', dot_axes=0)
# now perform the dot product operation to get a similarity measure
dot_product = merge([target, context], mode='dot', dot_axes=1)
dot_product = Reshape((1,))(dot_product)
# add the sigmoid output layer
output = Dense(1, activation='sigmoid')(dot_product)
# create the primary training model
model = Model(input=[input_target, input_context], output=output)
model.compile(loss='binary_crossentropy', optimizer='rmsprop')
# create a secondary validation model to run our similarity checks during training
validation_model = Model(input=[input_target, input_context], output=similarity)
更多信息请参考Awesome Article。
希望这会有所帮助。快乐学习!