Это абстрактивный суммаризатор для статей с Habr, обученный на данных тестового задания в рамках GPT Week. В качестве базовой модели выступает ai-forever/FRED-T5-large.

Использование

Open In Colab

Использование подразумевает пред- и постобработку текста, как в этом примере:

import re
from transformers import pipeline


clean_expr = re.compile(r"[\xa0\x1a\x16\x1b\x17\x15\u2004]")
spaces_expr = re.compile(r"\s{2,}")

def process_text(text: str) -> str:
    """Осуществляет пред- и постобработку текста."""
    text = clean_expr.sub(" ", text)
    text = spaces_expr.sub(" ", text)

    if "." in text:
        index = text.rindex(".")
        text = text[:index + 1]
    
    return text


summarizer = pipeline("summarization", model="basic-go/FRED-T5-large-habr-summarizer", device=0)

ARTICLE = """
Трогательный инженерный бизиборд, Новый Год и волонтеры / Хабр                

31-12-2019
Зачем нужен бизиборд, когда у папы много интересных инструментов? Опасные убраны, а пассатижами пусть ребенок играет, шуруповерт нажимает, ручки осциллографа крутит. Но наступил момент и сделан инженерный бизиборд. Таким каким он должен быть, в противоположность фабричному изделию – красивому, глянцевому, красочному, со всеми закругленными углами и краями. Разноцветному для глаз, но однородному и скучному на ощупь. С чего все началось Началось с объявления чуть больше года назад в социальной сети, что московскому психоневралогическому интернату (ПНИ) требуются бизиборды: Что это такое Что такое ПНИ трудно представить, но можно посмотреть в youtube. И если волонтеры пишут, что в ПНИ проблема дефицита сенсорных впечатлений, значит это ОЧЕНЬ большая проблема. Мы, взрослые, ходим по строительному гипермаркету и крутим в руках железки, щупаем трубки, проводим рукой по оплетке и т.д. Женщины в магазине трогают вообще всё. Я инженер, регулярно покупаю какие-то детали, чтобы на столе лежали, и я достаточное количество раз их потрогал и постепенно понял – смогу ли применить как задумал. Каждый в детстве лежал на кровати и бесконечно долго разглядывал и щупал ковер. Или, провинившись, стоял в углу и ковырял обои. Щупать – это способность и потребность человека. Когда мы с товарищем увидели бизиборды, которые планируется купить для ПНИ, решили сделать максимально трогательный бизиборд сами. Трогательный в прямом смысле. Куплены парные раскручивающиеся фитинги из пластика, никелированной стали, бронзы, чугуна оцинкованного и черного чугуна. Медные трубки, гофрированная трубка из нержавеющей стали, по которой со звоном долго спускается шайба, если ее поднять и отпустить. Самый красивый материал, конечно, никелированная сталь. Но красота не главное, главное контраст. Поэтому рядом с никелированной деталью висит деталь из черного чугуна, и трудно сказать – какой материал даст больший чувственный опыт. «Чугунные игрушки» из анекдота – не насмешка, а необходимость; ребенку важно почувствовать тяжесть и грубую фактуру материала. Все фитинги по-разному закручиваются, интересней других крутить сложные составные фитинги для труб ПНД. Гофра для унитаза удивляет диаметром, и ее можно растягивать. Пеньковая веревка впечатляюще колюча. Отрезной диск красивый, брутальный, и на ощупь грубый. Образцы керамики вдали выглядят обычно, но красивые, если рассматривать их многослойное покрытие вблизи, проводя по рельефу пальцами. Как это сделано За основу взят лист фанеры 1500×1000×10 мм. В строительном гипермаркете есть услуга пила в размер, к основному листу дополнительно нарезали ребер жесткости. С размером листа ошибся, лист чуть-чуть не влез в автомобиль, а гипермаркет уже закрылся и пришлось в ночь идти с этим листом домой пешком – не надо так. Ребра жесткости прикручены шурупами 16 мм – стянут оба листа, но не выйдут с другой стороны. Всюду, где можно, использован детский труд. Детский труд экономит деньги – не нужно покупать очередной конструктор. Вон папе купили новое кресло, иди распаковывай и собирай, нужна будет помощь — позовешь. И детский труд – это педагогично, ребенок вырастет умеющим не только работать руками, но и делегировать задачи. Дети учатся не тому, чему их учат взрослые, а тому что взрослые при детях делают. Покрасили на лестничной площадке, постелив полиэтилен. Закрепили детали тросами в ПВХ-оплетке. Стальные тросы в ПВХ-оплетке — прекрасный материал, только пришлось отдельно ехать в магазин за кусачками, которые этот трос смогут перекусить. На обратной стороне тросы затянули узлами, а узлы залили термоклеем. Термоклей имеет хорошую адгезию к ПВХ, залитый узел сам не распустится и выдернуть его с лицевой стороны стенда невозможно. Чем все закончилось В «наш» ПНИ уже успели закупить готовые бизиборды, меня переправили к волонтерам другого ПНИ. Там фотографии посмотрели и сказали – а давайте отправим ваш стенд в Азовский интернат для умственно отсталых детей. Сказали – и отправили. В новогоднюю ночь приехала еще одна бригада волонтеров, погрузили стенд в огромный прицеп к АЗЛК 2141 уже забитый коробками с подарками интернату, и в метель уехали. Очень романтично. Дальше я долго пытался получить какую-то обратную связь от волонтеров, но смог лишь узнать телефон интерната. Там звонку удивились, обрадовались, сказали, что не поняли, что это им привезли и отдали в уголок труда. И сказали, что примут любую помощь, и чтобы я приходил и помогал. Я посмотрел фотографии интерната, посмотрел на детей и увидел, что стенд отправили совершенно не туда. Ситуация в интернате по сравнению с ПНИ роскошная, проблемы запертости в своем теле и на своей кровати у детей нет. Жил бы рядом с интернатом – приходил бы по субботам, учил бы этих детей программировать Ардуино. Опыт преподавания робототехники в школе есть, справился бы и в интернате. Но между нами 1100 км. А стенд все же нужен был в ПНИ. Выводы Все сделано правильно, только нужно самому говорить с тем, для кого что-то делаешь. Самому изучать потребность, самому получать обратную связь и самому делать следующий шаг. Стенд делается относительно легко, технология «фанера + тросы в пвх + термоклей» рабочая, предлагаю использовать наш опыт.
"""

ARTICLE = process_text(ARTICLE)

response = summarizer(ARTICLE, max_new_tokens=360, num_beams=2, do_sample=True, top_k=100,
    repetition_penalty=2.5, length_penalty=1.0)

summary = process_text(response[0]["summary_text"])

print(summary)

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

История подходов

Метрики на тестовом датасете в зависимости от подхода представлены в таблице ниже.

# extra SFT DPO post-processing Метрика
1 0.5168
2 0.5525
3 0.5664
4 0.6075

На начальном этапе у модели выявлены следующие проблемы, негативно влияющие на метрику:

  • Генерация байт-последовательностей.

    Проблема решена пред- и постобработкой.

  • Модель часто не завершала последнее предложение.

    Решено через постобработку отрезанием незавершённой части. Для итоговой модели постобработка даёт небольшой вклад в метрику.

  • Повторение и перефразирование фрагментом текста.

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

1. SFT

  • Делаем срез из обучающего набора данных по правилу metric > 0.65.
  • Разбиваем полученный срез на обучающую и валидационную часть в соотношении 4 : 1.
  • Обучаемся 4 эпохи с уменьшающимся шагом, начиная с 1e-4.

2. SFT + post-processing

  • Применяем функцию process_text из примера к текстовому ответу модели.

3. SFT + DPO + post-processing

  • Инференс на обучающем срезе SFT-моделью.
  • Одна эпоха DPO на полученных кандидатах с шагом 1e-7.

4. Extra + SFT + post-processing

Extra означает обучаться больше на большем датасете.

  • Инференс полученной на предыдущем шаге моделью на половине исходного обучающего датасета.
  • Объединение с предыдущими генерациями и отбор лучшего кандидата для каждой статьи.
  • Делаем новый срез кандидатов по правилу metric > 0.65, получаем увеличение набора данных на 30%.
  • Обучаемся с нуля 8 эпох с уменьшающимся шагом, начиная с 1e-4.

Что не получилось

Не удалось завести конфигурацию extra + SFT + DPO [+ post-processing]: нестабильное обучение, с некоторого момента модель начинала деградировать.

Возможные улучшения

В четвёртом подходе (extra and etc.) получилось использовать примерно 20% от всего исходного обучающего датасета. Меняя только параметры генерации и запуская снова инференс, можно добиться большего числа кандидатов, проходящих порог metric > 0.65. Предполагается, что обучение модели на датасете с большим числом качественных кандидатов (за счёт выросшего разнообразия) должно приводить к увеличению целевой метрики.

Downloads last month
40
Safetensors
Model size
820M params
Tensor type
F32
·
Inference Examples
This model does not have enough activity to be deployed to Inference API (serverless) yet. Increase its social visibility and check back later, or deploy to Inference Endpoints (dedicated) instead.

Model tree for basic-go/FRED-T5-large-habr-summarizer

Finetuned
(2)
this model