В этом примере показано, как задать текстовую функцию модели декодера.
В контексте глубокого обучения декодер является частью нейронной сети для глубокого обучения, которая сопоставляет собственный вектор с некоторым выборочным пространством. Можно использовать, декодируют векторы для различных задач. Например,
Текстовая генерация путем инициализации текущей сети закодированным вектором.
Перевод от последовательности к последовательности при помощи закодированного вектора как вектор контекста.
Отобразите ввод субтитров при помощи закодированного вектора как вектор контекста.
Загрузите закодированные данные из sonnetsEncoded.mat
. Этот файл MAT содержит кодирование слова, мини-пакет последовательностей dlX
, и соответствующие закодированные данные dlZ
выведенный энкодером, используемым в примере, Задают текстовую Функцию Модели Энкодера.
s = load("sonnetsEncoded.mat");
enc = s.enc;
dlX = s.dlX;
dlZ = s.dlZ;
[latentDimension,miniBatchSize] = size(dlZ,1:2);
Цель декодера состоит в том, чтобы сгенерировать последовательности, учитывая некоторые начальные входные данные и сетевое состояние.
Инициализируйте параметры для следующей модели.
Декодер восстанавливает вход с помощью LSTM, инициализировал энкодер выход. Для каждого временного шага декодер предсказывает следующий временной шаг и использует выход для следующих предсказаний такта. И энкодер и декодер используют то же встраивание.
Эта модель использует три операции:
Встраивание сопоставляет словари в области значений 1 хотя vocabularySize
к векторам из размерности embeddingDimension
, где vocabularySize
количество слов в словаре кодирования и embeddingDimension
количество компонентов, изученных встраиванием.
Операция LSTM берет в качестве входа вектор отдельного слова и выходные параметры 1 numHiddenUnits
вектор, где numHiddenUnits
количество скрытых модулей в операции LSTM. Начальное состояние сети LSTM (состояние в первый такт) является закодированным вектором, таким образом, количество скрытых модулей должно совпадать со скрытой размерностью энкодера.
Полностью связанная операция умножает вход на матрицу веса, добавляющую смещение и выходные векторы из размера vocabularySize
.
Задайте размерности параметров. Размеры встраивания должны совпадать с энкодером.
embeddingDimension = 100; vocabularySize = enc.NumWords; numHiddenUnits = latentDimension;
Создайте struct для параметров.
parameters = struct;
Инициализируйте веса встраивания с помощью Гауссова использования initializeGaussian
функция, которая присоединена к этому примеру как к вспомогательному файлу. Задайте среднее значение 0 и стандартное отклонение 0,01. Чтобы узнать больше, смотрите Гауссову Инициализацию.
mu = 0; sigma = 0.01; parameters.emb.Weights = initializeGaussian([embeddingDimension vocabularySize],mu,sigma);
Инициализируйте настраиваемые параметры для операции LSTM декодера:
Инициализируйте входные веса инициализатором Glorot с помощью initializeGlorot
функция, которая присоединена к этому примеру как к вспомогательному файлу. Чтобы узнать больше, см. Инициализацию Glorot.
Инициализируйте текущие веса ортогональным инициализатором с помощью initializeOrthogonal
функция, которая присоединена к этому примеру как к вспомогательному файлу. Чтобы узнать больше, смотрите Ортогональную Инициализацию.
Инициализируйте смещение модулем, забывают инициализатор логического элемента с помощью initializeUnitForgetGate
функция, которая присоединена к этому примеру как к вспомогательному файлу. Чтобы узнать больше, смотрите, что Модуль Забывает Инициализацию Логического элемента.
Размеры настраиваемых параметров зависят от размера входа. Поскольку входные параметры к операции LSTM являются последовательностями векторов слова от операции встраивания, количеством входных каналов является embeddingDimension
.
Входная матрица веса имеет размер 4*numHiddenUnits
- inputSize
, где inputSize
размерность входных данных.
Текущая матрица веса имеет размер 4*numHiddenUnits
- numHiddenUnits
.
Вектор смещения имеет размер 4*numHiddenUnits
- 1.
sz = [4*numHiddenUnits embeddingDimension]; numOut = 4*numHiddenUnits; numIn = embeddingDimension; parameters.lstmDecoder.InputWeights = initializeGlorot(sz,numOut,numIn); parameters.lstmDecoder.RecurrentWeights = initializeOrthogonal([4*numHiddenUnits numHiddenUnits]); parameters.lstmDecoder.Bias = initializeUnitForgetGate(numHiddenUnits);
Инициализируйте настраиваемые параметры для энкодера, полностью соединил операцию:
Инициализируйте веса инициализатором Glorot.
Инициализируйте смещение нулями с помощью initializeZeros
функция, которая присоединена к этому примеру как к вспомогательному файлу. Чтобы узнать больше, смотрите Нулевую Инициализацию.
Размеры настраиваемых параметров зависят от размера входа. Поскольку входными параметрами к полностью связанной операции являются выходные параметры операции LSTM, количеством входных каналов является numHiddenUnits
. Сделать полностью связанные выходные векторы операции с размером latentDimension
, задайте выходной размер latentDimension
.
Матрица весов имеет размер outputSize
- inputSize
, где outputSize
и inputSize
соответствуйте выходу и введите размерности, соответственно.
Вектор смещения имеет размер outputSize
- 1.
Сделать полностью связанные выходные векторы операции с размером vocabularySize
, задайте выходной размер vocabularySize
.
inputSize = numHiddenUnits; outputSize = vocabularySize; parameters.fcDecoder.Weights = dlarray(randn(outputSize,inputSize,'single')); parameters.fcDecoder.Bias = dlarray(zeros(outputSize,1,'single'));
Создайте функциональный modelDecoder
, перечисленный в разделе Decoder Model Function примера, который вычисляет выход модели декодера. modelDecoder
функция, берет в качестве входных последовательностей словарей, параметров модели и длин последовательности, и возвращает соответствующий скрытый характеристический вектор.
Когда обучение модель глубокого обучения с пользовательским учебным циклом, необходимо вычислить градиенты потери относительно настраиваемых параметров. Это вычисление зависит от выхода прямой передачи функции модели.
Существует два общих подхода к генерации текстовых данных с декодером:
Замкнутый цикл — Для каждого временного шага, сделайте предсказания с помощью предыдущего предсказания, как введено.
Разомкнутый контур — Для каждого временного шага, сделайте входные параметры использования предсказаний из внешнего источника (например, учебные цели).
Генерация замкнутого цикла состоит в том, когда модель генерирует данные один такт за один раз и использует предыдущее предсказание, как введено для следующего предсказания. В отличие от генерации разомкнутого контура, этот процесс не требует никакого входа между предсказаниями и подходит лучше всего для сценариев без контроля. Например, модель перевода языка, которая генерирует синтезируемый текст сразу.
Использовать замкнутый цикл
Инициализируйте скрытое состояние сети LSTM с энкодером выход dlZ
.
state = struct;
state.HiddenState = dlZ;
state.CellState = zeros(size(dlZ),'like',dlZ);
Впервые продвиньтесь, используйте массив лексем запуска, как введено для декодера. Для простоты извлеките массив лексем запуска с первого такта обучающих данных.
decoderInput = dlX(:,:,1);
Предварительно выделите декодер выход, чтобы иметь размер numClasses
- miniBatchSize
- sequenceLength
с тем же типом данных как dlX
, где sequenceLength
желаемая продолжительность генерации, например, длина учебных целей. В данном примере задайте длину последовательности 16.
sequenceLength = 16; dlY = zeros(vocabularySize,miniBatchSize,sequenceLength,'like',dlX); dlY = dlarray(dlY,'CBT');
Для каждого временного шага предскажите следующий временной шаг последовательности с помощью modelDecoder
функция. После каждого предсказания найдите индексы, соответствующие максимальным значениям декодера выход, и используйте эти индексы в качестве входа декодера для следующего временного шага.
for t = 1:sequenceLength [dlY(:,:,t), state] = modelDecoder(parameters,decoderInput,state); [~,idx] = max(dlY(:,:,t)); decoderInput = idx; end
Выходом является vocabularySize
- miniBatchSize
- sequenceLength
массив.
size(dlY)
ans = 1×3
3595 32 16
Этот фрагмент кода показывает пример выполнения генерации замкнутого цикла в функции градиентов модели.
function gradients = modelGradients(parameters,dlX,sequenceLengths) % Encode input. dlZ = modelEncoder(parameters,dlX,sequenceLengths); % Initialize LSTM state. state = struct; state.HiddenState = dlZ; state.CellState = zeros(size(dlZ),'like',dlZ); % Initialize decoder input. decoderInput = dlX(:,:,1); % Closed loop prediction. sequenceLength = size(dlX,3); dlY = zeros(numClasses,miniBatchSize,sequenceLength,'like',dlX); for t = 1:sequenceLength [dlY(:,:,t), state] = modelDecoder(parameters,decoderInput,state); [~,idx] = max(dlY(:,:,t)); decoderInput = idx; end % Calculate loss. % ... % Calculate gradients. % ... end
Когда обучение с генерацией замкнутого цикла, предсказывая наиболее вероятное слово для каждого шага в последовательности может привести к субоптимальным результатам. Например, в рабочем процессе ввода субтитров изображений, если декодер предсказывает, первое слово заголовка является "a", когда дали изображение слона, то вероятность предсказания "слона" для следующего слова становится намного более маловероятной из-за чрезвычайно низкой вероятности фразы "слон", появляющийся в английском тексте.
Чтобы помочь сети сходиться быстрее, можно использовать учителя, обеспечивающего: используйте целевые значения в качестве входа к декодеру вместо предыдущих предсказаний. Используя учителя, обеспечивающего, помогает сети узнать о характеристиках из более поздних временных шагов последовательностей, не имея необходимость ожидать сети, чтобы правильно сгенерировать более ранние временные шаги последовательностей.
Чтобы выполнить учителя, обеспечивающего, используйте modelEncoder
функционируйте непосредственно с целевой последовательностью, как введено.
Инициализируйте скрытое состояние сети LSTM с энкодером выход dlZ
.
state = struct;
state.HiddenState = dlZ;
state.CellState = zeros(size(dlZ),'like',dlZ);
Сделайте предсказания с помощью целевой последовательности, как введено.
dlY = modelDecoder(parameters,dlX,state);
Выходом является vocabularySize
- miniBatchSize
- sequenceLength
массив, где sequenceLength
длина входных последовательностей.
size(dlY)
ans = 1×3
3595 32 14
Этот фрагмент кода показывает пример выполнения учителя, обеспечивающего в функции градиентов модели.
function gradients = modelGradients(parameters,dlX,sequenceLengths) % Encode input. dlZ = modelEncoder(parameters,dlX,dlZ); % Initialize LSTM state. state = struct; state.HiddenState = dlZ; state.CellState = zeros(size(dlZ),'like',dlZ); % Teacher forcing. dlY = modelDecoder(parameters,dlX,state); % Calculate loss. % ... % Calculate gradients. % ... end
modelDecoder
функция, берет в качестве входа параметры модели, последовательности словарей и сетевое состояние, и возвращает декодируемые последовательности.
Поскольку lstm
функция с сохранением информации (когда дали временные ряды, как введено, функция распространяет и обновляет состояние между каждым временным шагом), и что embed
и fullyconnect
функции распределяются времени по умолчанию (когда дали временные ряды, как введено, функции работают с каждым временным шагом независимо), modelDecoder
функционируйте поддерживает и последовательность и одни входные параметры такта.
function [dlY,state] = modelDecoder(parameters,dlX,state) % Embedding. weights = parameters.emb.Weights; dlX = embed(dlX,weights); % LSTM. inputWeights = parameters.lstmDecoder.InputWeights; recurrentWeights = parameters.lstmDecoder.RecurrentWeights; bias = parameters.lstmDecoder.Bias; hiddenState = state.HiddenState; cellState = state.CellState; [dlY,hiddenState,cellState] = lstm(dlX,hiddenState,cellState, ... inputWeights,recurrentWeights,bias); state.HiddenState = hiddenState; state.CellState = cellState; % Fully connect. weights = parameters.fcDecoder.Weights; bias = parameters.fcDecoder.Bias; dlY = fullyconnect(dlY,weights,bias); end
dlfeval
| dlgradient
| dlarray