разделить на две части, кодировщик и декодировщик, как показано схематически на
рис. 9.10. Первый входной сигнал модели поступает в кодировщик и представляет
собой саму входную строку с датой, имеющую вид последовательности индексов
символов в форме
[numExamples,
INPUT_LENGTH]
.
INPUT_LENGTH
— максимально воз
можная длина среди всех поддерживаемых форматов дат (равная, как оказывает
ся, 12). Входные данные, которые меньше этой длины, дополняются нулями с конца.
Второй входной сигнал поступает в декодировщик и представляет собой результат
преобразования, сдвинутый вправо на один временной шаг, в форме
[numExamples,
OUTPUT_LENGTH]
.
Погодитека, смысл первого входного сигнала понятен — это входная строка
с датой, но зачем модель принимает в качестве дополнительного входного сигнала
еще и результат преобразования? Разве он не должен быть
выходным сигналом
мо
дели? Все дело в сдвиге по времени результата преобразования. Учтите, что второй
входной сигнал —
не совсем
результат преобразования, а его сдвинутая по времени
ровно на один временной шаг версия. Например, если желаемым результатом
374
Часть III • Продвинутые возможности глубокого обучения с TensorFlow.js
Рис. 9.10.
Преобразование входного строкового значения с датой в выходное
в архитектуре типа «кодировщик — декодировщик». ST — специальный токен начала
последовательности для входного и выходного сигналов декодировщика. Блоки A и B
демонстрируют первый и второй шаги преобразования соответственно. На первом шаге
преобразования генерируется первый символ выходного сигнала (2). В ходе второго шага
генерируется второй символ (0). Остальные шаги соответствуют этому же шаблону,
поэтому мы их опустим
преобразования во время обучения было
"2034-07-18"
, то вторым входным сигналом
модели будет
"2034-07-1"
, где
— специальный символ начала последова
тельности. Благодаря этому сдвигу входного сигнала декодировщик знает о том,
какая выходная последовательность уже сгенерирована. Это упрощает отслеживание
декодировщиком хода преобразования.
Этот процесс напоминает человеческую речь. При выражении мысли в словах
основные умственные усилия затрачиваются на две вещи: саму выражаемую идею
и отслеживание уже сказанного. Вторая часть очень важна для обеспечения связ
ности и полноты речи, а также отсутствия повторов. Наша модель функционирует
таким же образом: для генерации каждого из выходных символов используется
информация как о входной строке с датой, так и об уже сгенерированных выходных
символах.
Сдвиг по времени результата преобразования возможен на этапе обучения, по
скольку мы заранее знаем правильный результат преобразования. Но как это воз
можно во время выполнения вывода? Ответ на этот вопрос понятен из двух блоков,
изображенных на рис. 9.10: мы генерируем выходные символы по одному
1
. Как де
монстрирует блок A, сначала мы помещаем символ
ST
в начало входного сигнала
декодировщика. Один шаг вывода (один вызов
Model.predict()
) дает один новый
элемент выходного сигнала (
2
в блоке A). После этого новый выходной элемент до
бавляется в конец входной последовательности декодировщика. Далее переходим
1
Этот алгоритм пошагового преобразования реализует функция runSeq2SeqInference() из
файла dateconversionattention/model.js.
Do'stlaringiz bilan baham: |