Как вы имеете в виду «если бы вы делали стохастические партии полностью, вы могли бы это осуществить»?

аюсь реализовать потерю деформации (тип функции попарного ранжирования) с помощью 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.

Любые идеи, реализованные аналогичные примеры, комментарии полезны.

 Roelant26 нояб. 2018 г., 15:40
Что вы в конечном итоге использовали @MpizosDimitris? :)
 Mpizos Dimitris19 сент. 2017 г., 15:08
@ DanielMöller Я немного обновил вопрос на примере из бумаги. Надеюсь, теперь все понятно.
 Daniel Möller19 сент. 2017 г., 14:43
Можете ли вы помочь мне понять, чтоrank, positive item, negative item а такжеuser? Я полностью потерян о том, что это значит.

Ответы на вопрос(1)

я бы сказал, что реализовать WARP в парадигме пакетного обучения невозможно. Поэтому вы не можете реализовать WARP в Керасе. Это связано с тем, что WARP по своей сути последовательный, поэтому он не может обрабатывать данные, разбитые на пакеты, а-ля Керас. Я полагаю, если бы вы делали стохастические партии полностью, вы могли бы это осуществить.

Обычно для WARP вы включаете маржу1Но, как и в статье, вы можете считать это гиперпарамом:

if neg_score > pos_score-1: #margin of 1
  loss = log(num_items / counts) #loss weighted by sample count
  loss = max(1, loss) #this looks like same thing you were doing in diff way

Это превосходит его предшественника BPR, который оптимизирует точность до k вместо средней точности.

 Roelant03 дек. 2018 г., 16:07
Как вы имеете в виду «если бы вы делали стохастические партии полностью, вы могли бы это осуществить»?

Ваш ответ на вопрос