Задайте текстовую функцию модели декодера

В этом примере показано, как задать текстовую функцию модели декодера.

В контексте глубокого обучения декодер является частью нейронной сети для глубокого обучения, которая сопоставляет собственный вектор с некоторым выборочным пространством. Можно использовать, декодируют векторы для различных задач. Например,

  • Текстовая генерация путем инициализации текущей сети закодированным вектором.

  • Перевод от последовательности к последовательности при помощи закодированного вектора как вектор контекста.

  • Отобразите ввод субтитров при помощи закодированного вектора как вектор контекста.

Загрузка данных

Загрузите закодированные данные из 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'));

Функция декодера модели Define

Создайте функциональный modelDecoder, перечисленный в разделе Decoder Model Function примера, который вычисляет выход модели декодера. modelDecoder функция, берет в качестве входных последовательностей словарей, параметров модели и длин последовательности, и возвращает соответствующий скрытый характеристический вектор.

Используйте функцию модели в функции градиентов модели

Когда обучение модель глубокого обучения с пользовательским учебным циклом, необходимо вычислить градиенты потери относительно настраиваемых параметров. Это вычисление зависит от выхода прямой передачи функции модели.

Существует два общих подхода к генерации текстовых данных с декодером:

  1. Замкнутый цикл — Для каждого временного шага, сделайте предсказания с помощью предыдущего предсказания, как введено.

  2. Разомкнутый контур — Для каждого временного шага, сделайте входные параметры использования предсказаний из внешнего источника (например, учебные цели).

Генерация замкнутого цикла

Генерация замкнутого цикла состоит в том, когда модель генерирует данные один такт за один раз и использует предыдущее предсказание, как введено для следующего предсказания. В отличие от генерации разомкнутого контура, этот процесс не требует никакого входа между предсказаниями и подходит лучше всего для сценариев без контроля. Например, модель перевода языка, которая генерирует синтезируемый текст сразу.

Использовать замкнутый цикл

Инициализируйте скрытое состояние сети 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

Смотрите также

| |

Похожие темы