Использование нейронной сети для предоставления рекомендаций
Поэтому я начал играть с FANN ( http://leenissen.dk/), чтобы создать простой механизм рекомендаций.
Например,
Пользователь X имеет отношение к записям с идентификаторами [1, 2, 3]
Другие пользователи имеют отношение к следующим идентификаторам:
- Пользователь A:
[1, 2, 3, 4]
- Пользователь Б:
[1, 2, 3, 4]
Вполне естественно, что есть шанс, что пользователь X будет заинтересован в записи с идентификатором 4
а также то, что это должен быть желаемый результат работы механизма рекомендаций.
Такое ощущение, что это было бы чем-то, что может сделать нейронная сеть. Тем не менее, судя по всему FANN и прибегая к поиску, кажется, что существует некоторая математическая связь с данными и результатами. Здесь с идентификаторами нет ни одного; идентификаторы также могут быть любыми символами.
Вопрос: возможно ли решить эту проблему с помощью нейронной сети и с чего начать поиск решения?
1 ответ
То, что вы ищете, это какая-то рекуррентная нейронная сеть; сеть, которая так или иначе хранит "контекст". Примерами таких сетей могут быть LSTM и GRU. В общем, вы должны вводить свои данные последовательно. На основе контекста и текущего ввода сеть предскажет, какая метка наиболее вероятна.
кажется, что должна быть некоторая математическая связь с данными и результатами. Здесь с идентификаторами нет ни одного; идентификаторы также могут быть любыми символами.
Существует определенная связь между данными и результатами, и это можно выразить с помощью весов и смещений.
Так как это будет работать? Сначала вы горячо кодируете свои входы и выходы. В общем, вы хотите предсказать, какая метка наиболее вероятна после набора меток, с которыми пользователь уже взаимодействовал.
Если у вас есть 5 меток: A, B, C, D, E, это означает, что у вас будет 5 входов и выходов: [0, 0, 0, 0, 0]
,
Если ваша метка A, массив будет [1, 0, 0, 0, 0]
, если это D, это будет [0, 0, 0, 1, 0]
,
Таким образом, ключ к LSTM и GRU в том, что данные должны быть последовательными. В общем, вы вводите все метки, которые вы просматриваете по очереди. Так что, если пользователь смотрел A, B и C:
activate: [1,0,0,0,0]
activate: [0,1,0,0,0]
// the output of this activation will be the next predicted label
activate: [0,0,1,0,0]
// output: [0.1, 0.3, 0.2, 0.7, 0.5], so the next label is D
И вы должны всегда обучать сеть так, чтобы выход INt был INt + 1