Как стать автором
Обновить

Комментарии 5

Спасибо, очень интересно. Давно хотел понять как применяют глубокое обучение в рекомендательных системах. У Вас есть результаты сравнения со стандартными подходами?
Можно ссылку на исходное описание этого подхода?
Здравствуйте! Я новичок в ML, было бы интереснее, если бы Вы снабжали текстовые описания примерами.
Допустим, для описания работы autoencoder-ов — что подаем, что получаем на выходе.
Спасибо.
1) Запустите (или проанализируйте) исходный код. В начале подготовку данных, затем само обучение. Посмотрите какие данные как задаются/используются, проследите потоки данных. Код — наиболее точное описание подхода. Код написан, несколько не оптимально, но старался, чтобы демонстрация хорошо показывала потоки данных. (Не переписывал многие операции на GPU, чтобы в простом отладчике можно было наблюдать потоки данных.)
2) Задавайте вопросы. Объясню. Меня можно найти во вконтакте, по gmail.com.

Вот код, который инициализирует один из autoencoder-ов

            user_idx1 = self.rng.randint(low=0 ,high = len(self.ratings_by_user_idx))
            # получили случайный индекс данных из рейтингов отсортированных по пользователю 
            # фактически, выбрали пользователя, чтобы работать с ним
            curr_user_idx_index = curr_user_idx_index = self.ratings_by_user_idx[user_idx1,0]
            # получили индекс на начало блока сгрупированных пользователей в векторах идентификаторов пользователей и в данных о пользователе
            values = []
            user_id = self.ratings_by_item_ids[curr_user_idx_index,self.user_indice] - 1
            # получили идентификатор пользователя (не вектор из N значений, а просто индекс)
            for k in numpy.arange(self.encoder_elements_count):
                # задаем K значений (5) данных о продукте для одного пользователя
                item_idx1 = self.rng.randint(low = 0,high = self.ratings_by_user_idx[user_idx1,1]-curr_user_idx_index)
                # получили случайный индекс
                rating_by_user_offs = curr_user_idx_index+item_idx1
                # получили смещение в групировке рейтингов по пользователям
                #user_id = self.ratings_by_user_ids[rating_by_user_offs,0] - 1
                item_id = self.ratings_by_user_ids[rating_by_user_offs,self.movie_indice] - 1
                # получаем индекс продукта для уже выбранного пользователя (пользователь оценил данный продукт и в системе есть рейтинг продукта)
                values.append((self.items_ids[item_id,],self.itemsids_data[item_id,],self.ratings_by_user[rating_by_user_offs,]))
            # добавили в значения 1) вектор идентификаторов; 2) вектор данных о продукте; 3) данные о рейтингах и сам рейтинг данного продукта выбранным пользователем
            values = sorted(values,key = lambda x : x[2][0])
            # отсортировали список по рейтингу (в начале минимальный рейтинг, далее больше)
            for k in numpy.arange(self.encoder_elements_count):
                i0 = (self.itemsids_data.shape[1]+self.item_id_size+self.ratings_by_user.shape[1])*k #
                i1 = i0 + self.item_id_size
                x_value[j,i0:i1] = values[k][0]
                i0 = i1;
                i1 = i1 + self.itemsids_data.shape[1]  
                x_value[j,i0:i1] = values[k][1]
                i0 = i1
                i1 = i1 + self.ratings_by_item.shape[1]
                x_value[j,i0:i1] = values[k][2][0]
                # это код копирования данных в один вектор, который задается на вход autoencoder-а.


Посмотрите комментарии к коде, которые описывают то, как происходит заполнение входов autoencoder-а.

Ссылка на исходник, фрагмент которого приведен выше (строка 320 и далее, функция def train_encoders(...)).
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории