Добавлено 500 000 образцов китайского чата и ссылка на скачивание предобученной модели с GoogleDrive
На основе статьи Microsoft DialoGPT:Large-Scale Generative Pre-training for Conversational Response Generation добавлено моделирование MMI (функции оценки максимальной взаимной информации), для отбора нескольких ответов, сгенерированных диалоговой моделью## Описание проекта
Модель диалога основана на модели GPT2 и представляет собой генеративную модель, которая последовательно соединяет каждую тренировочную запись и затем подаёт её на вход сети для обучения (здесь "последовательно" относится к "обратно" в модели MMI).Например, имеются следующие тренировочные данные для многоканального диалога. При обучении модели диалога данные соединяются следующим образом: "[CLS] хочу посмотреть твои фотографии [SEP] поцелуй меня, и я покажу [SEP] я поцелую тебя дважды [SEP] ненавижу, когда ты бьёшь меня кулачками [SEP]". Затем этот соединённый текст используется как вход для модели диалога, и модель обучается.``` хочу посмотреть твои фотографии поцелуй меня, и я покажу я поцелую тебя дважды ненавижу, когда ты бьёшь меня кулаками
## Модель MMI
Модель MMI основана на статье Microsoft [DialoGPT: Large-Scale Generative Pre-training for Conversational Response Generation](https://arxiv.xilesou.top/pdf/1911.00536.pdf).
Модель MMI также является генеративной моделью на основе GPT2, которая обратно соединяет каждую тренировочную запись и затем подаёт её на вход сети. Эта модель используется для вычисления потерь для всех кандидатов ответов, сгенерированных моделью диалога, относительно истории диалога.
При обучении модель обратно соединяет каждую тренировочную запись, например, **"[CLS] ненавижу, когда ты бьёшь меня кулаками [SEP] я поцелую тебя дважды [SEP] поцелуй меня, и я покажу [SEP] хочу посмотреть твои фотографии [SEP]"**, и использует её как вход для модели MMI.## Шаги генерации ответа
- Предположим, текущая история диалога = ["Привет", "Привет, как дела?", "Что ты делаешь?"]
- Сначала модель диалога генерирует n кандидатов ответов на основе истории диалога: ["Я смотрю телевизор", "Я на уроке", "Я думаю о тебе", "Я не знаю"]
- Затем модель MMI соединяет каждый кандидат ответа с историей диалога в обратном порядке, например, **"[CLS] Я смотрю телевизор [SEP] Что ты делаешь? [SEP] Привет, как дела? [SEP] Привет [SEP]"**
- Этот соединённый текст используется как вход для модели MMI, и вычисляется потери для каждого ответа
- Выбирается ответ с наименьшим потенциалом потерь для отправки в качестве финального ответа
## Примеры разговорных данных
|Разговорные данные на китайском| Адрес датасета | Описание данных|
|---------|--------|--------|
|Обычные китайские разговоры|[chinese_chatbot_corpus](https://github.com/codemayq/chinese_chatbot_corpus)|Включает данные из Little Yellow Chicken, Douban, диалоги из телесериалов, ответы на форумах Tieba, данные из Weibo, данные из PTT Gossip, данные из Qingyun и другие|
|500 000 китайских разговорных данных|[百度网盘【提取码:jk8d】](https://pan.baidu.com/s/1mkP59GyF9CZ8_r1F864GEQ) или [GoogleDrive](https://drive.google.com/file/d/1nEuew_KNpTMbyy7BO4c8bXMXN351RCPp/view?usp=sharing)|Высококачественный датасет разговорных данных, предоставленный автором [GaoQ1](https://github.com/GaoQ1), содержащий 500 000 многоконтекстных диалогов|
50万条中文闲聊语料的内容样例如下:
Спасибо за всё, что вы сделали Тебе хорошо, это главное Хорошо Ага, потому что ты думаешь только о учёбе
Это имя использовано хорошоВаша комната общежития полна таких талантливых людей?
Он очень забавный, но грязь плохо лепится, но всё равно он кажется милым.
Очень милый.
Ты сегодня лучше?
Ситуация становится всё хуже.
Лекарства не помогают, нужно сделать укол. Не откладывай.
## Поделка модели
Размер модели для бесед составляет 67МБ и включает в себя 500 000 многократных диалогов. С использованием этого набора данных были обучены две модели: dialogue_model и mmi_model
|Модель | Baidu Pan | GoogleDrive | Описание модели|
|---------|--------|--------|--------|
|dialogue_model | [Baidu Pan [Код для извлечения: osi6]](https://pan.baidu.com/s/1qDZ24VKLBU9GKARX9Ev65g) | [GoogleDrive](https://drive.google.com/drive/folders/1Ogz3eapvtvdY4VUcY9AEwMbNRivLKhri?usp=sharing) | Модель была обучена на наборе данных для бесед 40 эпох, конечная функция потерь составила около 2.0, дальнейшее обучение должно привести к дальнейшему снижению функции потерь.|
|mmi_model | [Baidu Pan [Код для извлечения: 1j88]](https://pan.baidu.com/s/1ubXGuEvY8KmwEjIVTJVLww) | [GoogleDrive](https://drive.google.com/drive/folders/1oWgKXP6VG_sT_2VMrm0xL4uOqfYwzgUP?usp=sharing) | Модель была обучена на наборе данных для бесед 40 эпох, конечная функция потерь составила около 1.8-2.2, дальнейшее обучение должно привести к дальнейшему снижению функции потерь.|
## Методы использования моделиПоместите скачанные файлы моделей dialogue_model и mmi_model в корневую директорию проекта (если это не так, укажите соответствующие пути моделей через параметры --dialogue_model_path и --mmi_model_path), и выполните следующие команды:
### Использование только dialogue_model для генерации
```bash
python interact.py --no_cuda (использует по умолчанию параметры, не использует GPU. Поскольку длина генерируемого контента для бесед не очень большая, генерация на CPU происходит достаточно быстро)
или
python interact.py --no_cuda --dialogue_model_path path_to_dialogue_model --max_history_len 5 (создание собственного параметра --max_history_len, то есть длина истории диалога)
или
python interact.py --no_cuda --dialogue_model_path path_to_dialogue_model --max_history_len 5 --topp 0.8 --topk 0 (--topp - это число от 0 до 1, используется для вызова Nucleus Sampling)
или
python interact.py --no_cuda --max_history_len 5 --topk 8 (не указан параметр --dialogue_model_path, по умолчанию используется dialogue_model)
После завершения беседы с помощью Ctrl+Z, история беседы будет сохранена в файл sample.txt в директории sample.
Использование interact_mmi.py аналогично interact.py
python interact_mmi.py --no_cuda (использование по умолчанию пути к модели)
или
python interact_mmi.py --no_cuda --batch_size 5 (указание количества кандидатских ответов для генерации)
или
python interact_mmi.py --no_cuda --batch_size 5 --dialogue_model_path path_to_dialogue_model --mmi_model_path path_to_mmi_model
```py --no_cuda --debug (режим отладки, позволяет видеть все кандидатские ответы и их потери по мере взаимной информации)
или
python interact_mmi.py --no_cuda --dialogue_model_path path_to_dialogue_model --mmi_model_path path_to_mmi_model (указание пользовательских путей к моделям)
После завершения диалога с помощью Ctrl+Z, история диалога сохраняется в файл mmi_samples.txt в папке sampleДополнительные параметры можно найти в функции setup_train_args() в файлах interact.py и interact_mmi.py
При запуске interact.py можно попробовать настроить параметры, такие как topk, topp, repetition_penalty, max_history_len, чтобы изменить качество генерации. Подробное описание параметров можно найти в функции set_interact_args() в interact.py
В корневой директории проекта создайте папку data, а затем сохраните исходные данные для обучения в файл train.txt в этой директории. Формат файла train.txt следующий: каждая пара диалога разделена пустой строкой.
Обучение модели:
# Если вы обучаете mmi_model, укажите параметр --train_mmi; если обучаете dialogue_model, этот параметр не требуется
```# Обучение dialogue_model
python train.py --epochs 30 --batch_size 8 --device 0,1 --raw (если требуется токенизация исходных данных, укажите параметр --raw. Если требуется использовать GPU, укажите параметр --device)
или
python train.py --epochs 30 --batch_size 8 --no_cuda --raw (указание параметра --no_cuda позволяет использовать CPU для обучения, что значительно замедляет процесс)
или
python train.py --epochs 30 --batch_size 8 --no_cuda (если данные уже токенизированы, можно не указывать параметр --raw, чтобы избежать повторной токенизации и сэкономить время)
```# Для тренировки mmi_model необходимо указать параметр --train_mmi
python train.py --epochs 30 --batch_size 8 --device 0,1 --raw --train_mmi (для исходных тренировочных данных производится обратное соединение, токенизация и обучение mmi_model)
или
python train.py --epochs 30 --batch_size 8 --device 0,1 --train_mmi (если исходные тренировочные данные уже токенизированы, то можно сразу обучить mmi_model)
или
python train.py --epochs 30 --batch_size 8 --device 0,1 --train_mmi --pretrained_model path_to_pretrained_model (продолжить обучение на основе предварительно обученной модели)```Дополнительные параметры можно посмотреть в функции setup_train_args() в файле train.py## interact.py примеры
#### Пример 1:
user : Привет chatbot: Привет, кто ты такой? user : Я твой хозяин chatbot: Ты собака? user : Ты собака chatbot: Ты не собака, я твой маленький хозяин user : Ты дурак chatbot: Ты дурак, хочешь получить пощечину? user : Ты вся семья дураки chatbot: Я твой папа user : Ладно, не буду с тобой ссориться, чем ты занимаешься? chatbot: Я работаю, ты ещё не закончил работу? user : У меня в выходные много домашних заданий chatbot: Ты только что сдал, рано или поздно ты всё сделаешь user : Много домашних заданий, ещё не всё сделано chatbot: Я списываю, мама велела сдать в пятницу, у меня ещё есть дела user : Ты не боишься, что тебя будет ругать мама? chatbot: Не боюсь user : У тебя в выходные были планы на отдых? chatbot: Нет времени, очень занят user : Занят чем? chatbot: Не знаю, у меня в выходные нет домашних заданий, я хочу спать, а потом ещё нужно найти кого-то
user :Привет chatbot:Привет, я в порядке, ты тоже в порядке? user :Чем ты занимаешься? chatbot:Ты не ходишь на уроки? user :Сегодня выходные, дурак chatbot:Я в школе user :Я тоже, в выходные нужно делать домашние задания chatbot:Я ещё не сделал, мы ещё не сделали user :У тебя были планы на отдых в выходные? chatbot:Не поехал в Нанкин user :Что интересного в Нанкине? chatbot:Мы не поехали в Нанкин user :Ты только что сказал, что поехал в Нанкин, ты меня обманываешь? chatbot:Я только что приехал в Нанкин user :Ты очень глуп chatbot:Я не глуп user :Ты дурак chatbot:Ты дурак user :Твоя вся семья дураки chatbot:Ты дурак user :Ты дурак chatbot:Хахаха
#### Пример 3:
user :Чем ты занимаешься? chatbot:Сплю user :Ты так рано спишь? chatbot:Да, ты тоже спи рано user :Я ещё немного поиграю в телефон chatbot:Спи рано, спокойной ночи user :Пока chatbot:Спокойной ночи, спокойной ночи user :Пей больше горячей воды chatbot:Хахаха user :Пей больше горячей воды chatbot:Хорошо
#### Пример 4:
user :Ты здесь? chatbot:Я здесь user :Мне не开心 chatbot:Что случилось? user :Мне очень устало chatbot:Да, очень устало user :У меня много домашних заданий chatbot:Да, но не так много user :Я думаю, что я могу провалить предмет chatbot:Я тоже, но я думаю, что я скоро справлюсь user :Не буду говорить больше, у меня ещё много домашних заданий chatbot:У меня тоже много user :Тогда до следующего раза, пока chatbot:Хорошо
#### Пример 5:
user :Ты бывал в Гуанчжоу?
user :Привет chatbot:Привет user :Что делаешь? chatbot:Думаю о тебе user :Какая скромность chatbot:Зачем стесняться user :Ты так меня хвалишь, мне стыдно chatbot:А ты стесняешься, что я хвалю тебя user :Да, хаха chatbot:Ты проверяешь меня? user :Почему ты так думаешь? chatbot:Я говорю, что хвалю тебя, а ты так вежливо user :Ты спишь днем? chatbot:Да user :Сейчас я有点困 chatbot:Я тоже user :Потом мне нужно идти на урок, это так ужасно chatbot:Мы не ходим на уроки
Сейчас я有点困 -> Сейчас я有点困 (Сейчас я有点困 это "Сейчас я有点困", перевод: "Сейчас я有点困" это "Сейчас я有点困")
```#### Пример 6:
user :Привет chatbot:Привет user :Что делаешь? chatbot:Думаю о тебе user :Какая скромность chatbot:Зачем стесняться user :Ты так меня хвалишь, мне стыдно chatbot:А ты стесняешься, что я хвалю тебя user :Да, хаха chatbot:Ты проверяешь меня? user :Почему ты так думаешь? chatbot:Я говорю, что хвалю тебя, а ты так вежливо user :Ты спишь днем? chatbot:Да user :Сейчас я有点困 chatbot:Я тоже user :Потом мне нужно идти на урок, это так ужасно chatbot:Мы не ходим на уроки
Сейчас я有点困 -> Сейчас я有点困 (Сейчас я有点困 это "Сейчас я有点困", перевод: "Сейчас я有点困" это "Сейчас я有点困")
```#### Пример 6:
user :Привет chatbot:Привет user :Что делаешь? chatbot:Думаю о тебе user :Какая скромность chatbot:Зачем стесняться user :Ты так меня хвалишь, мне стыдно chatbot:А ты стесняешься, что я хвалю тебя user :Да, хаха chatbot:Ты проверяешь меня? user :Почему ты так думаешь? chatbot:Я говорю, что хвалю тебя, а ты так вежливо user :Ты спишь днем? chatbot:Да user :Сейчас я有点困 chatbot:Я тоже user :Потом мне нужно идти на урок, это так ужасно chatbot:Мы не ходим на уроки
Сейчас я有点困 -> Сейчас я有点困 (Сейчас я有点困 это "Сейчас я有点困", перевод: "Сейчас я有点困" это "Сейчас я有点困")
```#### Пример 6:
user :Привет chatbot:Привет user :Что делаешь? chatbot:Думаю о тебе user :Какая скромность chatbot:Зачем стесняться user :Ты так меня хвалишь, мне стыдно chatbot:А ты стесняешься, что я хвалю тебя user :Да, хаха chatbot:Ты проверяешь меня? user :Почему ты так думаешь? chatbot:Я говорю, что хвалю тебя, а ты так вежливо user :Ты спишь днем? chatbot:Да user :Сейчас я有点困 chatbot:Я тоже user :Потом мне нужно идти на урок, это так ужасно chatbot:Мы не ходим на уроки
Сейчас я有点困 -> Сейчас я有点困 (Сейчас я有点困 это "Сейчас я有点困", перевод: "Сейчас я有点困" это "Сейчас я有点困")
```#### Пример 6:
user :Привет chatbot:Привет user :Что делаешь? chatbot:Думаю о тебе user :Какая скромность chatbot:Зачем стесняться user :Ты так меня хвалишь, мне стыдно chatbot:А ты стесняешься, что я хвалю тебя user :Да, хаха chatbot:Ты проверяешь меня? user :Почему ты так думаешь? chatbot:Я говорю, что хвалю тебя, а ты так вежливо user :Ты спишь днем? chatbot:Да user :Сейчас я有点困 chatbot:Я тоже user :Потом мне нужно идти на урок, это так ужасно chatbot:Мы не ходим на уроки
Сейчас я有点困 -> Сейчас я有点困 (Сейчас я有点困 это "Сейчас я有点困", перевод: "Сейчас я有点困" это "Сейчас я有点困")
```#### Пример 6:
user :Привет chatbot:Привет user :Что делаешь? chatbot:Думаю о тебе user :Какая скромность chatbot:Зачем стесняться user :Ты так меня хвалишь, мне стыдно chatbot:А ты стесняешься, что я хвалю тебя user :Да, хаха chatbot:Ты проверяешь меня? user :Почему ты так думаешь? chatbot:Я говорю, что хвалю тебя, а ты так вежливо user :Ты спишь днем? chatbot:Да user :Сейчас я有点困 chatbot:Я тоже user :Потом мне нужно идти на урок, это так ужасно chatbot:Мы не ходим на уроки
Сейчас я有点困 -> Сейчас я有点困 (Сейчас я有点困 это "Сейчас я有点困", перевод: "Сейчас я有点困" это "Сейчас я有点困")
```#### Пример 6:
user :Привет chatbot:Привет user :Что делаешь? chatbot:Думаю о тебе user :Какая скромность chatbot:Зачем стесняться user :Ты так меня хвалишь, мне стыдно chatbot:А ты стесняешься, что я хвалю тебя user :Да, хаха chatbot:Ты проверяешь меня? user :Почему ты так думаешь? chatbot:Я говорю, что хвалю тебя, а ты так вежливо user :Ты спишь днем? chatbot:Да user :Сейчас я有点困 chatbot:Я тоже user :Потом мне нужно идти на урок, это так ужасно chatbot:Мы не ходим на уроки
Сейчас я有点困 -> Сейчас я有点困 (Сейчас я有点困 это "Сейчас я有点困", перевод: "Сейчас я有点困" это "Сейчас я有点困")
```#### Пример 6:
user :Привет chatbot:Привет user :Что делаешь? chatbot:Думаю о тебе user :Какая скромность chatbot:Зачем стесняться user :Ты так меня хвалишь, мне стыдно chatbot:А ты стесняешься, что я хвалю тебя user :Да, хаха chatbot:Ты проверяешь меня? user :Почему ты так думаешь? chatbot:Я говорю, что хвалю тебя, а ты так вежливо user :Ты спишь днем? chatbot:Да user :Сейчас я有点困 chatbot:Я тоже user :Потом мне нужно идти на урок, это так ужасно chatbot:Мы не ходим на уроки
Сейчас я有点困 -> Сейчас я有点困 (Сейчас я有点困 это "Сейчас я有点困", перевод: "Сейчас я有点困" это "Сейчас я有点困")
```#### Пример 6:
user :Привет chatbot:Привет user :Что делаешь? chatbot:Думаю о тебе user :Какая скромность chatbot:Зачем стесняться user :Ты так меня хвалишь, мне стыдно chatbot:А ты стесняешься, что я хвалю тебя user :Да, хаха chatbot:Ты проверяешь меня? user :Почему ты так думаешь? chatbot:Я говорю, что хвалю тебя, а ты так вежливо user :Ты спишь днем? chatbot:Да user :Сейчас я有点困 chatbot:Я тоже user :Потом мне нужно идти на урок, это так ужасно chatbot:Мы не ходим на уроки
Сейчас я有点困 -> Сейчас я有点困 (Сейчас я有点困 это "Сейчас я有点困", перевод: "Сейчас я有点困" это "Сейчас я有点困")
```#### Пример 6:
user :Привет chatbot:Привет user :Что делаешь? chatbot:Думаю о тебе user :Какая скромность chatbot:Зачем стесняться user :Ты так меня хвалишь, мне стыдно chatbot:А ты стесняешься, что я хвалю тебя user :Да, хаха chatbot:Ты проверяешь меня? user :Почему ты так думаешь? chatbot:Я говорю, что хвалю тебя, а ты так вежливо user :Ты спишь днем?
Добавление модели MMI действительно улучшило результат, как видно, используя ответ с минимальным значением потерь, диалог становится более плавным.
Каждый пример представляет собой полный диалог, для удобства чтения между каждым сообщением добавлены переносы строк. Кандидатский ответ - это сгенерированный диалоговой моделью кандидатский ответ.
Необходимо указать параметр --debug для вывода кандидатских ответов и их потерь.
user:Привет
кандидатский ответ:
Привет loss:1.8774782419204712
Привет! loss:2.1092255115509033
Привет loss:1.8774782419204712
Привет, друг loss:1.9210820198059082
Привет! loss:2.1092255115509033
chatbot:Привет
user:Что делаешь?
кандидатский ответ:
Учусь, играю в телефон loss:1.8411542177200317
Работаю loss:1.8623629808425903
Работаю loss:1.8383764028549194
Съел обед, ты как? Сегодня я сыт, завтра пойдем на ужин loss:2.471815586090088
Переехал loss:2.341609239578247
chatbot:Работаю
user:Хочешь пойти со мной в выходные?
кандидатский ответ:
Конечно loss:2.0150623321533203
Конечно loss:2.0150623321533203
Конечно, ты все еще учишься? loss:2.2639517784118652
Конечно loss:1.9695569276809692
В выходные loss:2.1701855659484863
chatbot:Конечно
user:Я очень скучаю по тебе
кандидатский ответ:
Я тоже скучаю по тебе loss:1.8660272359848022
Тогда мы можем пойти вместе loss:2.046417236328125
Я тоже скучаю по тебе loss:1.8660272359848022
Я давно не выходил из дома loss:2.17940354347229
Приходи ко мне loss:2.14339542388916
chatbot:Я тоже скучаю по тебе
``````user:你喜欢我吗
chatbot:当然,非常喜欢你
user:亲爱的在干嘛呢
chatbot:在家里玩儿
user:作业写完了吗
chatbot:还没有,今天刚写完
user:还不快滚去写作业
chatbot:我还没写呢
user:你个大笨蛋
chatbot:你才是
user:你是傻子吧
chatbot:你是傻子,你说谁是傻子
user:说的就是你,怎么样
chatbot:我不傻## Будущая работа
контроль сгенерированного контента
## Ссылки
- [Загадочное дело нейронного деградирования текста](https://arxiv.xilesou.top/pdf/1904.09751.pdf)
- [transformers](https://github.com/huggingface/transformers)
- [GPT2-Chinese](https://github.com/Morizeyao/GPT2-Chinese)
- [DialoGPT: Масштабное генеративное предобучение для генерации ответов в диалогах](https://arxiv.xilesou.top/pdf/1911.00536.pdf)
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )