Это 14-й день моего участия в Gengwen Challenge.Подробности о мероприятии:Обновить вызов
связать
В предыдущей статье мы представили базовые знания, связанные с RNN, а теперь мы вводим основные принципы генерации текста, в основном для того, чтобы иметь возможность гибко использовать соответствующие знания RNN.Реальный проект генерации текста более сложен, чем этот, с точки зрения практической работы, но основной принцип остается тем же, вот введение. Ссылка на обзор основ RNN:Наггетс.Талант/пост/697234…
принцип
Здесь мы используем RNN для генерации текста, и можно использовать другие модели, которые могут моделировать данные временных рядов, например LSTM. Здесь, если модель RNN была обучена предсказывать следующий символ, если мы ограничим длину ввода до 21, вот пример:
input:“the cat sat on the ma”
21-символьный текст делится на ввод на уровне символов, ввод в модель, RNN используется для накопления входной информации, а конечный вектор выходного состояния h затем преобразуется полносвязным слоем и классифицируется классификатором Softmax. окончательный вывод - это распределение вероятностей символов-кандидатов.
В приведенном выше примере введите «кот сидел на ма» и, наконец, выведите вероятностное распределение 26 английских букв и нескольких других используемых символов (например, знаков препинания, пробелов и т. д.).
"a" --> 0.05
"b" --> 0.03
"c" --> 0.054
...
"t" --> 0.06
...
"," --> 0.01
"。" --> 0.04
В это время прогнозируемый следующий символ «t» имеет наибольшее значение вероятности, поэтому «t» выбирается в качестве следующего символа, а затем мы объединяем «t» с «кот сидел на ма», чтобы получить «кот сидел». на коврике", то берем последние 21 символ "кот сел на коврик" и вводим в модель
input:“he cat sat on the mat”
В это время вероятность добавления «.» к распределению вероятности предсказания следующего символа является наибольшей, поэтому мы берем «.» и соединяем его с «кот сидел на коврике», чтобы получить «кот сидел на коврике». мат.», если необходимо. Если вы продолжите, повторите описанный выше процесс. Если наши требования к генерации текста заканчиваются здесь, мы получаем text
the cat sat on the mat。
Обычно мы используем те же данные, что и цель для обучения. Если вы хотите создать поэзию, вы можете использовать поэзию Тан и поэзию песни для обучения модели.Например, для создания текстов песен вы можете использовать для обучения тексты песен Джея Чоу.
Три способа выбрать предсказанный следующий символ
Как правило, при получении распределения вероятностей и последующем прогнозировании следующего символа существует три метода.
Первый метод заключается в выборе символа с наибольшей вероятностью в распределении вероятностей, как упоминалось выше. Хотя этот метод является самым простым, эффект не самый лучший, потому что почти предсказанные символы являются детерминированными, но он не может достичь разнообразных и интересных результатов символов. Формула выглядит следующим образом:
next_index = np.argmax(pred)
Второй метод случайным образом выбирает полиномиальное распределение и предсказывает вероятность того, что символ будет выбран в качестве следующего символа. В реальных ситуациях значения в распределении вероятностей часто очень малы, и вероятности многих кандидатов не сильно отличаются, так что у всех одинаковая вероятность быть выбранным, а предсказание следующего персонажа очень случайно. Если мы получаем вероятность 0,1 предсказания правильного символа, а вероятность предсказания нескольких других символов лишь немного ниже 0,1, то вероятность того, что эти символы будут выбраны в качестве следующего символа, очень похожа. Этот подход слишком случайный, и сгенерированный текст имеет много грамматических и орфографических ошибок. Формула выглядит следующим образом:
next_onehot = np.random.multimomial(1, pred, 1)
next_index = np.argmax(next_onehot)
Третий метод находится между первыми двумя методами.Следующий сгенерированный символ имеет определенную случайность, но случайность невелика.Это зависит от параметра температуры для настройки.Температура находится между 0 и 1.Если это 1, это то же, что и первый способ, если это другие значения, вероятность может быть увеличена в разной степени, что означает, что персонажи с высокой вероятностью будут выбраны с большей вероятностью, а символы с малой вероятностью будут выбраны с меньшей вероятностью. Выбрано так, чтобы была явная вероятность дискриминации, чтобы не возникала ситуация во втором методе. Формула выглядит следующим образом:
pred = pred ** (1/temperature)
pred = pred / np.sum(pred)
тренироваться
Предположим, у нас есть предложение в качестве обучающих данных:
Machine learning is a subset of artificial intelligence.
Мы устанавливаем два параметра len = 5 и шаг = 3, len - длина ввода, шаг - шаг, мы введем 5 символов в качестве ввода, а затем введем следующий символ в качестве метки, как показано ниже.
input:“Machi”
target:“n”
Затем, поскольку мы установили шаг равным 3, мы перемещаем текст на 3 бита вправо, затем выбираем 5 символов в качестве ввода и следующий символ в качестве метки следующим образом:
input:“hine ”
target:“l”
Таким образом, непрерывно переводите 3 символа вправо и вводите вновь полученные 5 символов и следующий 1 символ в качестве меток в качестве обучающих данных в модель, чтобы модель могла изучить внутренние особенности текста. Обучающие данные на самом деле представляют собой пару ключ-значение (строка, следующий символ). Все тренировочные данные, полученные на данный момент, таковы:
input:'Machi'
target:'n'
input:'hine '
target:'l'
input:'e lea'
target:'r'
...
input:'ligen'
target:'c'
Затем используйте эти обучающие данные для большого количества обучающих моделей, которые можно использовать для генерации новых текстов! .
Суммировать
Процесс обучения модели примерно требует трех процессов:
1.将训练数据整理成(segment,next_char)的组合
2.用 one-hot 将字符编码,segment 编码成 l*v 的向量,next_char 编码成 v*1 的向量,l 是输入长度,v 是字符总个数
3.构建一个网络,输入是 l*v 的矩阵,然后通过 RNN 或者 LSTM 捕捉文本特征,然后将最后的特征进行全连接层进行转换,全连接层用 Softmax 作为激活函数,最后输出一个 v*1 的概率分布,下一个字符的选择方式可以看上面的内容。
Процесс генерации текста примерно требует трех процессов:
一般在已经训练好模型的情况下,我们要输入字符串当作种子输入,让其作为我们接下来要生成文本的开头,然后不断重复下面的过程:
a)把输入使用 one-hot 向量表示,然后输入到模型中
b)在神经网络输出的概率分布中选取一个字符,作为预测的下一个字符
c)将预测的字符拼接到之前的文本后,选取新的输入文本
кейс
Вот два небольших случая, которые я реализовал ранее, которые можно использовать для обзора соответствующих знаний о RNN и LSTM, почувствовать себя хорошо и оставить большой палец вверх.
https://juejin.cn/post/6949412997903155230
https://juejin.cn/post/6949412624215834638
Кроме того, на github есть много проектов генерации текста с открытым исходным кодом.Реализация проекта немного сложнее, но принцип тот же, что я представил.Я представлю здесь два.
https://github.com/wandouduoduo/SunRnn
https://github.com/stardut/Text-Generate-RNN