Hecc
@Hecc
Frontend. Дизайн. Шрифт.

Насколько целесообразно использовать нейронную сеть для выбора объекта из коллекции таких же объектов по N параметров?

Доброй ночи!
Решил немного поиграться в тестовые проекты и попробовать решить задачу, при помощи нейросети.
Скажу сразу, что да, я понимаю, что эту задачу можно решить просто алгоритмически - написав скрипт который будет давать в целом тот же результат. Но это же не так интересно + хочется изучить какую-то новую технологию :)

Я хочу научить сеть выбирать оптимального пользователя для задачи.
Так как, работаю я обычно с JS - реализовывать тоже буду на нем же. Brain.js показался самым простым и доступным решением, которым я и воспользовался. Если есть альтернативы, с радостью рассмотрю ссылочки на них.

Задачу я себе поставил вот такую: Сеть должна выбрать из коллекции пользователей того, который максимально будет подходить к выполнению задачи по 8 параметрам.

Собственно пользователь выглядит примерно так:
const user = {
    // Данные юзера
    id: 1,
    name: 'Вася Пупкин',
    // Тип пользователя
    type: 'Content',
    // Категория его работы
    category: 'Games',
    // Основные направления по тегам
    tags: ['tag1', 'tag2'],
    // Количество всех заявок
    allApplications: 31,
    // Количество закрытых заявок
    doneApplications: 28,
    // В каких заявках уже участвует
    alreadyChoosen: [1,2,3],
    // Сообщил о конфликтах
    conflicts: [1,2],
    // Был снят с таких заявок
    fierd: [3],
}


Дальше у меня приходит объект к которому, собственно сеть и должна выбрать исполнителя. Он будет выглядеть вот так:

const application = {
    // Данные заявки
    id: 1,
    name: 'И как ты до такого докатился?!',
    data: '...',
    // Собственно поля которые есть у каждого пользователя
    type: 'Content',
    category: 'Games',
    tags: ['tag1', 'tag2', 'tag3']
}


Соответственно, дальше стоит вопрос обучения сети.
Если я правильно понимаю механику работы, то мне нужно составить коэффициенты по каждому из параметров и на выход дать бал в виде нужного юзера.
Примерно так:
const users = [...];
const applications = [...]
const trainingData = applications.map( application => {
    return {
        input: {
            users: users.map( user => ({
                // Каждый метод возвращает совпадение юзера по данному условию от 0 до 1
                type: getTypeCoefficient( user, application), 
                category: getCategoryCoefficient( user, application ),
                tags: getTagsCoefficient( user, application ),
                allApplications: getAppAppsCoefficient( user ),
                doneApplications: getDoneAppsCoefficient( user ),
                alreadyChoosen: isAlreadyChoosen( user, application),
                conflicts: isHaveConflicts( user, application),
                // Насколько вообще возможно объяснить сети, что если например пользователь сам себя удалил с заявки
                // что дальше все остальные пункты не особо имеют значения? Просто передавать только одно условие в 
                // инпут этого юзера?
                fired: isFired( user, application )
            }))
        },
        output: {
            // Допустим, что для обучения есть массив данных в которых уже выбран релевантный юзер
            [getValidUserForApplication( application )]: 1
        }
    }
});

net.train( trainingData );
// Пока не работает :)
net.run({
    users: [...users]
});

Если получится этот пункт, хочу сюда еще прикрутить БД, чтобы пользователь сам мог научить сеть выбирать правильного исполнителя. И посмотреть насколько хорошо оно будет работать при выборке, например в 1000 правильных комбинаций?

Собственно, насколько вообще релевантно использовать нейронные сети для таких задач и в правильном ли направлении я двигаюсь?)
  • Вопрос задан
  • 95 просмотров
Пригласить эксперта
Ответы на вопрос 3
Robur
@Robur
Знаю больше чем это необходимо
хочется

Если хочется - то вопрос о целесообразности не стоит. Хочется - делайте, кто ж вам запретит.
Если вопрос "в общем" - зависит от задачи. Но в целом я бы не стал делать нейросети на js, если только не нужно это делать на клиенте зачем-то.
Ответ написан
@rPman
Решение задач с помощью нейросети, это как в соседнюю булочную за хлебом летать на самолете через соседнюю страну и имеет смысл только если хлеб, который вы желаете приобрести, в вашей стране не производят.

Да уже готовая нейросеть способна решать сложнейшие задачи очень эффективно и быстро, но проблема в самом процессе обучения сети - это требует невероятно большого количества вычислительных ресурсов. Использовать процессор (и уж тем более виртуальную машину той же javascript, которая в разы медленней) для этого не целесообразно, слишком долго будете искать решение. Поэтому при выборе инструментария (языка программирования и библиотеки) заранее сверяйтесь с совместимостью с вашим железом.

То что реализация нейронных сетей существует для процессоров и интерпретируемых языков говорит только о том что это может быть оправдано чтобы вычислять значение готовой сети для решения задачи и возможно дообучить уже готовую сеть, если это потребует изменяющиеся условия.

p.s. гугл например состряпал лично для себя тензорный процессор, который для задач именно обучения нейросетей, а точнее для использования в библиотеке tensorflow, работает на порядок быстрее (энергоэффективнее) чем видеокарта,.. т.е. логично обучаться заранее на тех библиотеках, чтобы в будущем минимизировать свои затраты. Правда гугл не собирается продавать свои мегажелезки на сторону, но позволяет использовать их в облаке (все еще за очень дорого, если сравнивать с себестоимостью, но все же дешевле чем использование GPU, лично это не проверял но слышал)
Ответ написан
Комментировать
@fsfdg
Добавить required на поля в форме
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы