Create README.md
Browse files
README.md
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: apache-2.0
|
| 3 |
+
language:
|
| 4 |
+
- "ru"
|
| 5 |
+
pipeline_tag: summarization
|
| 6 |
+
base_model: ai-forever/FRED-T5-large
|
| 7 |
+
---
|
| 8 |
+
|
| 9 |
+
Это абстрактивный суммаризатор для статей с Habr, обученный на данных тестового задания в рамках [GPT Week](https://shad.yandex.ru/gptweek).
|
| 10 |
+
В качестве базовой модели выступает [ai-forever/FRED-T5-large](https://huggingface.co/ai-forever/FRED-T5-large).
|
| 11 |
+
|
| 12 |
+
## Использование
|
| 13 |
+
|
| 14 |
+
[<img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"/>](https://colab.research.google.com/drive/1bREOX9RFwRZH0A3b2UsWwUBdEvBczteW?usp=sharing)
|
| 15 |
+
|
| 16 |
+
Использование подразумевает пред- и постобработку текста, как в этом примере:
|
| 17 |
+
|
| 18 |
+
```python
|
| 19 |
+
import re
|
| 20 |
+
from transformers import pipeline
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
clean_expr = re.compile(r"[\xa0\x1a\x16\x1b\x17\x15\u2004]")
|
| 24 |
+
spaces_expr = re.compile(r"\s{2,}")
|
| 25 |
+
|
| 26 |
+
def process_text(text: str) -> str:
|
| 27 |
+
"""Осуществляет пред- и постобработку текста."""
|
| 28 |
+
text = clean_expr.sub(" ", text)
|
| 29 |
+
text = spaces_expr.sub(" ", text)
|
| 30 |
+
|
| 31 |
+
if "." in text:
|
| 32 |
+
index = text.rindex(".")
|
| 33 |
+
text = text[:index + 1]
|
| 34 |
+
|
| 35 |
+
return text
|
| 36 |
+
|
| 37 |
+
|
| 38 |
+
summarizer = pipeline("summarization", model="basic-go/FRED-T5-large-habr-summarizer", device=0)
|
| 39 |
+
|
| 40 |
+
ARTICLE = """
|
| 41 |
+
Трогательный инженерный бизиборд, Новый Год и волонтеры / Хабр
|
| 42 |
+
|
| 43 |
+
31-12-2019
|
| 44 |
+
Зачем нужен бизиборд, когда у папы много интересных инструментов? Опасные убраны, а пассатижами пусть ребенок играет, шуруповерт нажимает, ручки осциллографа крутит. Но наступил момент и сделан инженерный бизиборд. Таким каким он должен быть, в противоположность фабричному изделию – красивому, глянцевому, красочному, со всеми закругленными углами и краями. Разноцветному для глаз, но однородному и скучному на ощупь. С чего все началось Началось с объявления чуть больше года назад в социальной сети, что московскому психоневралогическому интернату (ПНИ) требуются бизиборды: Что это такое Что такое ПНИ трудно представить, но можно посмотреть в youtube. И если волонтеры пишут, что в ПНИ проблема дефицита сенсорных впечатлений, значит это ОЧЕНЬ большая проблема. Мы, взрослые, ходим по строительному гипермаркету и крутим в руках железки, щупаем трубки, проводим рукой по оплетке и т.д. Женщины в магазине трогают вообще всё. Я инженер, регулярно покупаю какие-то детали, чтобы на столе лежали, и я достаточное количество раз их потрогал и постепенно понял – смогу ли применить как задумал. Каждый в детстве лежал на кровати и бесконечно долго разглядывал и щупал ковер. Или, провинившись, стоял в углу и ковырял обои. Щупать – это способность и потребность человека. Когда мы с товарищем увидели бизиборды, которые планируется купить для ПНИ, решили сделать максимально трогательный бизиборд сами. Трогательный в прямом смысле. Куплены парные раскручивающиеся фитинги из пластика, никелированной стали, бронзы, чугуна оцинкованного и черного чугуна. Медные трубки, гофрированная трубка из нержавеющей стали, по которой со звоном долго спускается шайба, если ее поднять и отпустить. Самый красивый материал, конечно, никелированная сталь. Но красота не главное, главное контраст. Поэтому рядом с никелированной деталью висит деталь из черного чугуна, и трудно сказать – какой материал даст больший чувственный опыт. «Чугунные игрушки» из анекдота – не насмешка, а необходимость; ребенку важно почувствовать тяжесть и грубую фактуру материала. Все фитинги по-разному закручиваются, интересней других крутить сложные составные фитинги для труб ПНД. Гофра для унитаза удивляет диаметром, и ее можно растягивать. Пеньковая веревка впечатляюще колюча. Отрезной диск красивый, брутальный, и на ощупь грубый. Образцы керамики вдали выглядят обычно, но красивые, если рассматривать их многослойное покрытие вблизи, проводя по рельефу пальцами. Как это сделано За основу взят лист фанеры 1500×1000×10 мм. В строительном гипермаркете есть услуга пила в размер, к основному листу дополнительно нарезали ребер жесткости. С размером листа ошибся, лист чуть-чуть не влез в автомобиль, а гипермаркет уже закрылся и пришлось в ночь идти с этим листом домой пешком – не надо так. Ребра жесткости прикручены шурупами 16 мм – стянут оба листа, но не выйдут с другой стороны. Всюду, где можно, использован детский труд. Детский труд экономит деньги – не нужно покупать очередной конструктор. Вон папе купили новое кресло, иди распаковывай и собирай, нужна будет помощь — позовешь. И детский труд – это педагогично, ребенок вырастет умеющим не только работать руками, но и делегировать задачи. Дети учатся не тому, чему их учат взрослые, а тому что взрослые при детях делают. Покрасили на лестничной площадке, постелив полиэтилен. Закрепили детали тросами в ПВХ-оплетке. Стальные тросы в ПВХ-оплетке — прекрасный материал, только пришлось отдельно ехать в магазин за кусачками, которые этот трос смогут перекусить. На обратной стороне тросы затянули узлами, а узлы залили термоклеем. Термоклей имеет хорошую адгезию к ПВХ, залитый узел сам не распустится и выдернуть его с лицевой стороны стенда невозможно. Чем все закончилось В «наш» ПНИ уже успели закупить готовые бизиборды, меня переправили к волонтерам другого ПНИ. Там фотографии посмотрели и сказали – а давайте отправим ваш стенд в Азовский интернат для умственно отсталых детей. Сказали – и отправили. В новогоднюю ночь приехала еще одна бригада волонтеров, погрузили стенд в огромный прицеп к АЗЛК 2141 уже забитый коробками с подарками интернату, и в метель уехали. Очень романтично. Дальше я долго пытался получить какую-то обратную связь от волонтеров, но смог лишь узнать телефон интерната. Там звонку удивились, обрадовались, сказали, что не поняли, что это им привезли и отдали в уголок труда. И сказали, что примут любую помощь, и чтобы я приходил и помогал. Я посмотрел фотографии интерната, посмотрел на детей и увидел, что стенд отправили совершенно не туда. Ситуация в интернате по сравнению с ПНИ роскошная, проблемы запертости в своем теле и на своей кровати у детей нет. Жил бы рядом с интернатом – приходил бы по субботам, учил бы этих детей программировать Ардуино. Опыт преподавания робототехники в школе есть, справился бы и в интернате. Но между нами 1100 км. А стенд все же нужен был в ПНИ. Выводы Все сделано правильно, только нужно самому говорить с тем, для кого что-то делаешь. Самому изучать потребность, самому получать обратную связь и самому делать следующий шаг. Стенд делается относительно легко, технология «фанера + тросы в пвх + термоклей» рабочая, предлагаю использовать наш опыт.
|
| 45 |
+
"""
|
| 46 |
+
|
| 47 |
+
ARTICLE = process_text(ARTICLE)
|
| 48 |
+
|
| 49 |
+
response = summarizer(ARTICLE, max_new_tokens=360, num_beams=2, do_sample=True, top_k=100,
|
| 50 |
+
repetition_penalty=2.5, length_penalty=1.0)
|
| 51 |
+
|
| 52 |
+
summary = process_text(response[0]["summary_text"])
|
| 53 |
+
|
| 54 |
+
print(summary)
|
| 55 |
+
|
| 56 |
+
# Трогательный инженерный бизиборд, сделанный для московского психоневралогического интерната, был сделан самим автором. Он использовал парные раскручивающиеся фитинги из пластика, никелированной стали, бронзы, чугуна оцинкованного и черного чугуна, а также детские труд и инструменты. В новогоднюю ночь стенд был отправлен в Азовский интернат для умственно отсталых детей. Автор выражает благодарность волонтерам, которые помогли сделать этот стенд, и предлагает использовать их опыт для улучшения ситуации в интернате.
|
| 57 |
+
```
|
| 58 |
+
|
| 59 |
+
## История подходов
|
| 60 |
+
|
| 61 |
+
Метрики на тестовом датасете в зависимости от подхода представлены в таблице ниже.
|
| 62 |
+
|
| 63 |
+
| \# | extra | SFT | DPO | post-processing | Метрика |
|
| 64 |
+
|-|-|-|-|-|-|
|
| 65 |
+
| 1| | ✓ | | | 0.5168 |
|
| 66 |
+
| 2| | ✓ | | ✓ | 0.5525 |
|
| 67 |
+
| 3| | ✓ | ✓| ✓ | 0.5664 |
|
| 68 |
+
| 4| ✓ | ✓ | | ✓ | 0.6075 |
|
| 69 |
+
|
| 70 |
+
На начальном этапе у модели выявлены следующие проблемы, негативно влияющие на метрику:
|
| 71 |
+
- *Генерация байт-последовательностей*.
|
| 72 |
+
|
| 73 |
+
Проблема решена пред- и постобработкой.
|
| 74 |
+
|
| 75 |
+
- *Модель часто не завершала последнее предложение.*
|
| 76 |
+
|
| 77 |
+
Решено через постобработку отрезанием незавершённой части. Для итоговой модели постобработка даёт небольшой вклад в метрику.
|
| 78 |
+
|
| 79 |
+
- *Повторение и перефразирование фрагментом текста.*
|
| 80 |
+
|
| 81 |
+
В итоговой модели проблема значительно нивелирована, однако повторы могут встречаться.
|
| 82 |
+
|
| 83 |
+
### 1. SFT
|
| 84 |
+
|
| 85 |
+
- Делаем срез из обучающего набора данных по правилу `metric > 0.65`.
|
| 86 |
+
- Разбиваем полученный срез на обучающую и валидационную часть в соотношении 4 : 1.
|
| 87 |
+
- Обучаемся 4 эпохи с уменьшающимся шагом, начиная с 1e-4.
|
| 88 |
+
|
| 89 |
+
### 2. SFT + post-processing
|
| 90 |
+
|
| 91 |
+
- Применяем функцию `process_text` из примера к текстовому ответу модели.
|
| 92 |
+
|
| 93 |
+
### 3. SFT + DPO + post-processing
|
| 94 |
+
|
| 95 |
+
- Инференс на обучающем срезе SFT-моделью.
|
| 96 |
+
- Одна эпоха DPO на полученных кандидатах с шагом 1e-7.
|
| 97 |
+
|
| 98 |
+
### 4. Extra + SFT + post-processing
|
| 99 |
+
|
| 100 |
+
Extra означает обучаться больше на большем датасете.
|
| 101 |
+
|
| 102 |
+
- Инференс полученной на предыдущем шаге моделью на половине *исходного* обучающего датасета.
|
| 103 |
+
- Объединение с предыдущими генерациями и отбор лучшего кандидата для каждой статьи.
|
| 104 |
+
- Делаем новый срез кандидатов по правилу `metric > 0.65`, получаем увеличение набора данных на 30%.
|
| 105 |
+
- Обучаемся с нуля 8 эпох с уменьшающимся шагом, начиная с 1e-4.
|
| 106 |
+
|
| 107 |
+
## Что не получилось
|
| 108 |
+
|
| 109 |
+
Не удалось завести конфигурацию `extra + SFT + DPO [+ post-processing]`: нестабильное обучение, с некоторого момента модель начинала деградировать.
|
| 110 |
+
|
| 111 |
+
## Возможные улучшения
|
| 112 |
+
|
| 113 |
+
В четвёртом подходе (extra and etc.) получилось использовать примерно 20% от всего исходного обучающего датасета. Меняя только параметры генерации и запуская снова инференс, можно добиться большего числа кандидатов, проходящих порог `metric > 0.65`. Предполагается, что обучение модели на датасете с большим числом качественных кандидатов (за счёт выросшего разнообразия) должно приводить к увеличению целевой метрики.
|