Это 15-й день моего участия в Gengwen Challenge.Подробности о мероприятии, пожалуйста, проверьте:Обновить вызов
Множественные результаты моделей RNN
Модели, построенные с использованием RNN, можно разделить на различные типы механизмов из-за разных входных и выходных данных, и разные структуры могут применяться к разным задачам.
Как показано на рисунке выше, обычно существует четыре структуры.
- В случае «один к одному» вводом является вектор, а выводом также является структура векторных результатов, таких как ввод изображения, а затем вывод прогнозируемой категории.
- В функции «один ко многим» вход представляет собой вектор, а выход представляет собой структуру из нескольких векторных результатов.Эта структура может использоваться для описания сцены на изображении с текстом для входного изображения.
- Многие к одному — это структура, в которой вход — несколько векторов, а выход — векторный результат.Эта структура может использоваться для анализа тональности текста, ввода текста и оценки того, является ли он отрицательной или положительной эмоцией.
- многие ко многим — это структура, в которой входные данные представляют собой несколько векторов, а выходные данные — результат нескольких векторов.Эта структура может использоваться в сценариях машинного перевода или диалогов в чате.
- Synchronous many to many похожа на предыдущую структуру, но это классическая структура rnn.Состояние предыдущего ввода будет переведено в следующее состояние, и каждому входу будет соответствовать выход.Мы наиболее знакомы с ним для символа предсказание. , который также можно использовать для классификации видео для маркировки видеокадров.
Seq2Seq
Машинный перевод — это задача «многие ко многим».В качестве примера возьмем задачу перевода с французского на английский, количество вводимых французских слов не является фиксированным, а количество выводимых английских слов также не является фиксированным. Хотя существует множество моделей машинного перевода, наиболее классической является модель Seq2Seq, которая также представляет собой структуру «многие ко многим».
тренировочный процесс
Модель Seq2Seq в основном разделена на две части: кодировщик Encoder слева и декодер Decoder справа.
-
Кодировщик - это LSTM или другой RNN и его варианты, которые используются для извлечения признаков из входных французских предложений.Вывод кодировщика - это вектор состоянияh и состояние ячейки c в последний момент LSTM.Вывод в другое время не используется , поэтому на рисунке Не показывать.
-
Декодер также представляет собой LSTM или другой RNN и его варианты, используемые для перевода с французского на английский, что похоже наПредыдущая статьяПринцип генерации текста, упомянутый в, в основном такой же, единственное отличие состоит в том, что начальным состоянием генерации текста в предыдущей статье является вектор со всеми нулями, а начальным состоянием Декодера является вектор состояния h, выдаваемый Энкодером. в последний момент. Процесс декодирования выглядит следующим образом:
а) Декодер может узнать содержимое входного текста, получив вектор состояния h в последний момент, выдаваемый кодировщиком.
б) Начните вводить первое слово для начала обучения, первый ввод декодера должен быть начальным символом, установите начальный символ декодера на «
» (может быть любая другая строка, не существующая в текущем словаре) чтобы указать Начать трансляцию, в это время у Декодера есть начальный вектор) h и вход " " в текущий момент, Декодер выдаст предсказанное распределение вероятности слова, так как мы знаем, что вход в следующий момент является «the», поэтому используйте следующее. Вход момента используется в качестве метки, и нам нужно обучить модель, чтобы значение потерь между выходом декодера и меткой в текущий момент было как можно меньше. c) С помощью функции потерь мы можем обратно распространять градиент, градиент будет передаваться из функции потерь в декодер, затем из декодера в кодировщик, а затем использовать градиентный спуск для обновления параметров кодировщика и декодера.
d) Затем введите второе слово, чтобы начать обучение. В этот момент вводом являются существующие два слова "
" и "the". Декодер выведет предсказанное распределение вероятности слова для второго слова. Мы знаем слово в следующий момент — «плохой», который используется как метка, поэтому нам нужно сделать значение потерь выхода Декодера и метки в текущий момент как можно меньше. e) Продолжить обратное распространение и обновить параметры кодировщика и декодера.
f) Затем введите третье слово, чтобы начать обучение, аналогично предыдущему, ввод в это время представляет собой существующие три слова «
», «the» и «poor», и декодер выведет третье слово. прогнозируемое распределение вероятности слова, мы знаем, что слово в следующий момент будет «не», и используем его в качестве метки, поэтому мы хотим сделать значение потери выхода декодера и метки в текущий момент как как можно меньше. g) Продолжить обратное распространение и обновить параметры кодировщика и декодера.
h) Повторяйте описанный выше процесс до последнего момента. В это время все предложение «у бедных нет денег» используется в качестве входных данных для текущего момента. В это время у нас нет контента для следующего момента. , поэтому мы определяем, что это было переведено сейчас. В конце используйте «
» в качестве метки, поэтому мы хотим сделать значение потерь вывода Декодера и метки в текущий момент как можно меньше . i) Продолжить обратное распространение и обновить параметры кодировщика и декодера.
j) Обучите эту модель на большом наборе французских и английских двоичных данных.
процесс прогнозирования
Когда модель обучена, мы можем использовать ее для перевода.Если сейчас у нас есть французский «les pauvres sont demunis», процесс перевода на английский аналогичен принципу обучения. Процесс выглядит следующим образом:
а) Введите каждое слово французского языка в кодировщик, в последний момент аккумулируйте признаки в вектор признаков h и передайте его в декодер в качестве начального состояния.
б) предсказание первого слова, работу декодера иПредыдущая статьяТак же, как и при генерации текста, мы введем в Декодер начальное состояние h и начальное слово «
в) Для предсказания второго слова используем вектор состояния h, полученный в предыдущий момент0И предсказанное слово «the» вводится в декодер, и декодер будет генерировать текущий вектор состояния h1И распределение вероятности слова, вы можете использовать описанный выше метод, чтобы выбрать слово с наибольшей вероятностью или слово, выбранное в соответствии с вероятностью, в качестве текущего результата прогнозирования.Если наша модель действительна, она должна быть предсказана как «плохая» на этом время.Если модель недействительна, это может быть Предсказания называются другими словами.
г) Для предсказания третьего слова используем вектор состояния h, полученный в предыдущий момент1И предсказанное слово «бедный» вводится в декодер, и декодер будет генерировать вектор текущего состояния h2И распределение вероятности слова, вы можете использовать вышеуказанный метод, чтобы выбрать слово с наибольшей вероятностью или слово, выбранное в соответствии с вероятностью, в качестве текущего результата прогнозирования.Если наша модель действительна, она должна быть предсказана как «не надо» в это время.Если модель недействительна, то можно предсказать другие слова, называемые.
e) Повторяем вышеописанный процесс до тех пор, пока окончательно не получим вектор состояния h, полученный в предыдущий момент5И предсказанное слово «деньги» подается на вход Декодера, и Декодер будет генерировать текущий вектор состояния h6И распределение вероятности слова, вы можете использовать описанный выше метод, чтобы выбрать слово с наибольшей вероятностью или слово, выбранное в соответствии с вероятностью, в качестве текущего результата прогнозирования.Если наша модель действительна, она должна быть предсказана как «
Советы по оптимизации кодировщика 1
Поскольку основная функция кодировщика заключается в извлечении функций ввода, иногда ввод слишком длинный, и эффект извлечения функций будет плохим.В настоящее время мы можем использовать Bi-LSTM для замены LSTM или RNN, которые мы используем. , Такой кодировщик начнет с прямого направления.Входные функции извлекаются в обратном направлении и накапливаются до последнего момента, когда функции более многочисленны.
[Примечание] Это применимо только к Encoder, Decoder может быть только односторонним преобразованием слева направо.
Советы по оптимизации кодировщика 2
В общем, мы используем слова в качестве ввода вместо символов в качестве ввода, потому что средняя длина слов составляет 4 символа.Если в качестве ввода используются слова вместо символов, длина ввода может быть сокращена почти в 4 раза, поэтому также можно использовать Encoder для извлечения функций. , не так просто забыть передний контент.
Однако, если вы хотите использовать слова в качестве входных данных, если количество используемых слов не превышает 100, вы можете использовать горячие векторы для их представления, но обычно есть тысячи часто используемых слов, В настоящее время мы должны использовать встраивание слов для получения низкоразмерных векторов слов.
В слое Embedding слишком много параметров. Если вы не тренируетесь с большим набором данных, произойдет переобучение или слой Embedding будет предварительно обучен.
Советы по оптимизации кодировщика 3
Мы также можем в полной мере использовать корреляцию между переводами на разных языках и использовать многозадачное обучение для повышения производительности модели.Здесь мы вводим только перевод с французского на английский.Мы также можем использовать кодировщик здесь для обучения французскому языку Немецкий перевод, используя французский перевод на китайский язык, потому что независимо от того, сколько задач добавляется, наш кодировщик всегда один и тот же, а обучающие данные в два раза больше, после обучения кодировщик значительно оптимизируется языковой логикой, а затем мы выполняем наша задача перевода с французского на английский, эффект будет значительно улучшен.
Советы по оптимизации кодировщика 4
Самый лучший способ улучшить машинный перевод — использовать механизм «Внимание», о котором мы подробно расскажем в следующей статье.
кейс
Вот небольшой кейс, который я реализовал сам, переводя слово в другое слово с противоположными значениями, кейс простой, просто для иллюстрации смысла Seq2Seq, есть подробные комментарии, не стесняйтесь ставить лайк.nuggets.capable/post/694941…