Время прочтения: 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])
Вот так довольно быстро можно сделать простую рекомендательную систему. Модель будет рекомендовать не только внутренние курсы, но и из интернета, что на наш взгляд является плюсом. Время придётся потратить только на составление файлика для дообучения.