Время прочтения: 2 мин.

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

Нам было бы интересно, если бы человек написал «Меня интересует: python, java, », и получил список курсов, которые ему стоит пройти.

Для этого мы сделаем тонкую настройку уже обученной модели по имеющимся у нас курсам и поменяем гиперпараметры, если потребуется.

Для дообучения текстовый файл такого содержания:

<s>Меня интересует: python, java, (<-пробел после запятой)

Рекомендуемые курсы: Основы python, Машинное обучение и CUDA, Python, продвинутый курс, Python для анализа данных, Java, Современный Java, Java для начинающих {и т. п.}</s>

То есть по основным топикам формируем список основных курсов.

Список разобьём на train и valid.

После этого скачаем модель, дообучим и сохраним модель с тонкой настройкой (мы работали в google colab, при необходимости нужно будет установить и другие зависимости).

!pip install torch==1.4.0
!pip3 install transformers==3.5.0
!git clone  https://github.com/sberbank-ai/ru-gpts
!mkdir models/
!export PYTHONPATH=${PYTHONPATH}:/ru-gpts/

!CUDA_VISIBLE_DEVICES=0 python ru-gpts/pretrain_transformers.py \
    --output_dir=models/recommendations \
    --model_type=gpt2 \
    --model_name_or_path=sberbank-ai/rugpt3medium_based_on_gpt2 \
    --do_train \
    --train_data_file=train.txt \
    --do_eval \
    --eval_data_file=valid.txt \
    --per_gpu_train_batch_size 128 \
    --gradient_accumulation_steps 1 \
    --num_train_epochs 5 \
    --block_size 2048 \
    --overwrite_output_dir

Названия интересующих курсов можно оформить на сайте через checkbox и передавать текст в затравку.

Далее просто загружаем модель и генерируем текст.

import numpy as np
import torch
np.random.seed(42)
torch.manual_seed(42)
from transformers import GPT2LMHeadModel, GPT2Tokenizer
tok = GPT2Tokenizer.from_pretrained("models/recommendations")
model = GPT2LMHeadModel.from_pretrained("models/recommendations")
model.cuda()
text = "<s> Меня  интересует: python, java, "
inpt = tok.encode(text, return_tensors="pt")
out = model.generate(inpt.cuda(), max_length=250, repetition_penalty=5.0, do_sample=True, top_k=5, top_p=0.95, temperature=1, num_beams = 2)
tok.decode(out[0])

Вот так довольно быстро можно сделать простую рекомендательную систему. Модель будет рекомендовать не только внутренние курсы, но и из интернета, что на наш взгляд является плюсом. Время придётся потратить только на составление файлика для дообучения.