Как вы имеете в виду «если бы вы делали стохастические партии полностью, вы могли бы это осуществить»?
аюсь реализовать потерю деформации (тип функции попарного ранжирования) с помощью Keras API. Я вроде застрял, как это может быть достигнуто.
Определение потери основы берется изLightFM док.:
Для данного (пользователь, пара положительных элементов), случайным образом выберите отрицательный элемент из всех оставшихся элементов. Вычислить прогнозы для обоих пунктов; если прогноз отрицательного элемента превышает прогноз положительного элемента плюс запас, выполните обновление градиента, чтобы ранжировать положительный элемент выше, а отрицательный - ниже. Если нет нарушения рейтинга, продолжайте отбирать отрицательные элементы, пока нарушение не будет найдено.
Функция деформации используется, например, всемантические вложения #hashtags, опубликованная в Facebook исследование AI. В этой статье они пытаются предсказать наиболее представительные хэштеги для коротких текстов. где'user'
считается кратким текстом,'positive item'
является хэштегом краткого текста, иnegative items
некоторые случайные хэштеги, равномерно выбранные из «поиска хэштегов».
Я следую за имплиментацией очередной потери триплета, чтобы создать варп:GitHub
Насколько я понимаю, для каждой точки данных у меня будет 3 входа. Пример с вложениями (псевдокод 'semi'):
sequence_input = Input(shape=(100, ), dtype='int32') # 100 features per data point
positive_example = Input(shape=(1, ), dtype='int32', name="positive") # the one positive example
negative_examples = Input(shape=(1000,), dtype='int32', name="random_negative_examples") # 1000 random negative examples.
#map data points to already created embeddings
embedded_seq_input = embedded_layer(sequence_input)
embedded_positive = embedded_layer(positive_example)
embedded_negatives = embedded_layer(negative_examples)
conv1 = Convolution1D(...)(embeddded_seq_input)
.
.
.
z = Dense(vector_size_of_embedding,activation="linear")(convN)
loss = merge([z, embedded_positive, embedded_negatives],mode=warp_loss)
.
.
.
гдеwarp_loss
есть (где я предполагаю получить 1000 случайных отрицательных значений вместо того, чтобы взять все из них, и результаты получены по аналогии с косинусом):
def warp_loss(X):
# pseudocode
z, positive, negatives = X
positive_score = cosinus_similatiry(z, positive)
counts = 1
loss = 0
for negative in negatives:
score = cosinus_similatiry(z, negative)
if score > positive_score:
loss = ((number_of_labels - 1) / counts) * (score + 1 - positive_score
else:
counts += 1
return loss
Как вычислить деформацию, описано красиво:Почта
Я не уверен, что это правильный способ сделать это, но я не мог найти способ реализоватьwarp_loss
псевдо-функция. Я могу вычислить косинус, используяmerge([x,u],mode='cos')
но это предполагает те же размеры. Поэтому я не уверен, как использоватьmerge
Режим cos для нескольких отрицательных примеров, поэтому я пытаюсь создать свой собственныйwarp_loss
.
Любые идеи, реализованные аналогичные примеры, комментарии полезны.