Этот раздел является частью рабочего процесса конструирования, описанного в документе Workflow for Neural Network Design.
В этом разделе описываются два различных стиля обучения. При пошаговом обучении веса и смещения сети обновляются каждый раз, когда входные данные представляются сети. В пакетном обучении веса и отклонения обновляются только после представления всех входных данных. Пакетные методы обучения, как правило, более эффективны в среде MATLAB ®, и они подчеркиваются в программном обеспечении Deep Learning Toolbox™, но есть некоторые приложения, в которых дополнительное обучение может быть полезным, так что парадигма также реализована.
Инкрементное обучение может применяться как к статическим, так и к динамическим сетям, хотя чаще используется с динамическими сетями, такими как адаптивные фильтры. В этом разделе показано, как выполняется инкрементное обучение в статических и динамических сетях.
Снова рассмотрим статическую сеть, используемую в первом примере. Требуется пошаговое обучение, чтобы веса и смещения обновлялись после каждого ввода. В этом случае используется функция adaptи входные данные и цели представлены в виде последовательностей.
Предположим, вы хотите обучить сеть созданию линейной функции:
+ p2
Затем для предыдущих входов,
цели будут
Для инкрементного обучения вы представляете входные данные и цели в виде последовательностей:
P = {[1;2] [2;1] [2;3] [3;1]};
T = {4 5 7 7};
Сначала настройте сеть с нулевыми начальными весами и отклонениями. Кроме того, установите начальную скорость обучения равной нулю, чтобы показать эффект инкрементного обучения.
net = linearlayer(0,0);
net = configure(net,P,T);
net.IW{1,1} = [0 0];
net.b{1} = 0;
Вспомним из моделирования с параллельными входами в статической сети, что для статической сети моделирование сети производит те же выходные сигналы, независимо от того, представлены ли входные сигналы в виде матрицы параллельных векторов или в виде массива ячеек последовательных векторов. Однако это не так при обучении сети. При использовании adapt если входные данные представлены в виде массива ячеек последовательных векторов, то весовые коэффициенты обновляются по мере представления каждого входного сигнала (инкрементный режим). Как показано в следующем разделе, если входные данные представлены в виде матрицы параллельных векторов, то веса обновляются только после представления всех входных данных (пакетный режим).
Теперь вы готовы пошагово обучать сеть.
[net,a,e,pf] = adapt(net,P,T);
Сетевые выходы остаются нулевыми, поскольку скорость обучения равна нулю, а веса не обновляются. Ошибки равны целям:
a = [0] [0] [0] [0] e = [4] [5] [7] [7]
Если теперь установить скорость обучения 0,1, можно увидеть, как настраивается сеть при представлении каждого входного сигнала:
net.inputWeights{1,1}.learnParam.lr = 0.1;
net.biases{1,1}.learnParam.lr = 0.1;
[net,a,e,pf] = adapt(net,P,T);
a = [0] [2] [6] [5.8]
e = [4] [3] [1] [1.2]
Первый вывод такой же, как и при нулевой скорости обучения, потому что обновление не производится до тех пор, пока не будет представлен первый ввод. Второй вывод отличается, поскольку веса были обновлены. Веса продолжают изменяться при вычислении каждой ошибки. Если сеть работает, и скорость обучения установлена правильно, ошибка в конечном итоге переводится в ноль.
Можно также пошагово обучать динамические сети. На самом деле это была бы самая распространенная ситуация.
Чтобы пошагово обучать сеть, представляйте входы и цели как элементы массивов ячеек. Вот исходные входные данные Pi и вводы P и целевые показатели T в качестве элементов массивов ячеек.
Pi = {1};
P = {2 3 4};
T = {3 5 7};
Возьмем линейную сеть с одной задержкой на входе, как использовалось в предыдущем примере. Инициализируйте веса до нуля и установите скорость обучения равной 0,1.
net = linearlayer([0 1],0.1);
net = configure(net,P,T);
net.IW{1,1} = [0 0];
net.biasConnect = 0;
Необходимо обучить сеть созданию токового выхода путем суммирования текущего и предыдущего входов. Это та же последовательность ввода, что и в предыдущем примере, за исключением того, что первый член в последовательности назначается в качестве начального условия задержки. Теперь можно последовательно обучать сеть с помощью adapt.
[net,a,e,pf] = adapt(net,P,T,Pi); a = [0] [2.4] [7.98] e = [3] [2.6] [-0.98]
Первый вывод равен нулю, поскольку веса еще не обновлены. Веса изменяются на каждом последующем временном шаге.
Пакетное обучение, при котором веса и отклонения обновляются только после представления всех входных данных и целей, может применяться как к статическим, так и к динамическим сетям. В этом разделе рассматриваются оба типа сетей.
Пакетное обучение может быть выполнено с помощью одного из следующих способов: adapt или train, хотя train как правило, это лучший вариант, поскольку он обычно имеет доступ к более эффективным алгоритмам обучения. Дополнительное обучение обычно проводится с помощью adapt; пакетное обучение обычно проводится с помощью train.
Для пакетного обучения статической сети с adaptвходные векторы должны быть помещены в одну матрицу параллельных векторов.
P = [1 2 2 3; 2 1 3 1]; T = [4 5 7 7];
Начните со статической сети, использованной в предыдущих примерах. Скорость обучения устанавливается равной 0,01.
net = linearlayer(0,0.01);
net = configure(net,P,T);
net.IW{1,1} = [0 0];
net.b{1} = 0;
При звонке adapt, он вызывает trains (функция адаптации по умолчанию для линейной сети) и learnwh (функция обучения по умолчанию для весов и отклонений). trains использует обучение Widrow-Hoff.
[net,a,e,pf] = adapt(net,P,T); a = 0 0 0 0 e = 4 5 7 7
Следует отметить, что выходные данные сети равны нулю, поскольку веса не обновляются до тех пор, пока не будет представлен весь обучающий набор. При отображении весов можно найти
net.IW{1,1}
ans = 0.4900 0.4100
net.b{1}
ans =
0.2300
Это отличается от результата после одного прохода adapt с инкрементным обновлением.
Теперь выполните то же пакетное обучение с использованием train. Поскольку правило Widrow-Hoff можно использовать в инкрементном или пакетном режиме, его можно вызвать с помощью adapt или train. (Существует несколько алгоритмов, которые могут использоваться только в пакетном режиме (например, Levenberg-Marquardt), поэтому эти алгоритмы могут быть вызваны только train.)
В этом случае входные векторы могут быть в матрице параллельных векторов или в матрице ячеек последовательных векторов. Потому что сеть статична и потому что train всегда работает в пакетном режиме, train преобразует любой массив ячеек последовательных векторов в матрицу параллельных векторов. По возможности используется параллельный режим работы, поскольку он имеет более эффективную реализацию в коде MATLAB:
P = [1 2 2 3; 2 1 3 1]; T = [4 5 7 7];
Сеть настроена таким же образом.
net = linearlayer(0,0.01);
net = configure(net,P,T);
net.IW{1,1} = [0 0];
net.b{1} = 0;
Теперь вы готовы тренировать сеть. Тренируйте его только на одну эпоху, потому что вы использовали только один проход adapt. Функция обучения по умолчанию для линейной сети: trainbи функция обучения по умолчанию для весов и отклонений learnwh, поэтому вы должны получить те же результаты, полученные с помощью adapt в предыдущем примере, где функция адаптации по умолчанию trains.
net.trainParam.epochs = 1; net = train(net,P,T);
Если вы отображаете веса после одной эпохи обучения, вы находите
net.IW{1,1}
ans = 0.4900 0.4100
net.b{1}
ans =
0.2300
Это тот же результат, что и при обучении в пакетном режиме в adapt. Со статическими сетями, adapt функция может реализовывать инкрементное или пакетное обучение в зависимости от формата входных данных. Если данные представлены в виде матрицы параллельных векторов, выполняется пакетное обучение. Если данные представлены в виде последовательности, происходит инкрементное обучение. Это неверно для train, который всегда выполняет пакетное обучение, независимо от формата ввода.
Обучение статических сетей является относительно простым. Если вы используете train сеть обучается в пакетном режиме и входные данные преобразуются в параллельные векторы (столбцы матрицы), даже если они первоначально передаются как последовательность (элементы массива ячеек). Если вы используете adaptформат ввода определяет способ обучения. Если входные данные передаются в виде последовательности, то сеть обучается в инкрементном режиме. Если входные данные передаются в виде параллельных векторов, то используется обучение в пакетном режиме.
В динамических сетях обучение в пакетном режиме обычно выполняется с помощью train только, особенно если существует только одна тренировочная последовательность. Чтобы проиллюстрировать это, рассмотрим снова линейную сеть с задержкой. Для обучения используйте коэффициент обучения 0,02. (При использовании алгоритма градиентного спуска обычно используется меньшая скорость обучения для обучения в пакетном режиме, чем для инкрементного обучения, поскольку все отдельные градиенты суммируются перед определением изменения шага к весам.)
net = linearlayer([0 1],0.02);
net.inputs{1}.size = 1;
net.layers{1}.dimensions = 1;
net.IW{1,1} = [0 0];
net.biasConnect = 0;
net.trainParam.epochs = 1;
Pi = {1};
P = {2 3 4};
T = {3 5 6};
Вы хотите обучить сеть той же последовательности, которая использовалась для инкрементного обучения ранее, но на этот раз вы хотите обновить веса только после того, как все входные данные будут применены (пакетный режим). Сеть моделируется в последовательном режиме, поскольку входные данные являются последовательными, но веса обновляются в пакетном режиме.
net = train(net,P,T,Pi);
Веса после одной эпохи тренировок
net.IW{1,1}
ans = 0.9000 0.6200
Эти веса отличаются от веса, полученного с помощью инкрементного обучения, где веса будут обновляться три раза за один проход через набор обучения. Для пакетного обучения веса обновляются только один раз в каждую эпоху.
showWindow параметр позволяет указать, отображается ли окно обучения при обучении. По умолчанию появляется окно обучения. Два других параметра, showCommandLine и showопределите, генерируются ли выходные данные командной строки и количество периодов между отзывами командной строки во время обучения. Например, этот код отключает окно обучения и предоставляет информацию о статусе обучения каждые 35 периодов, когда сеть позже обучается с помощью train:
net.trainParam.showWindow = false; net.trainParam.showCommandLine = true; net.trainParam.show= 35;
Иногда удобно отключить все обучающие дисплеи. Для этого отключите окно обучения и обратную связь командной строки:
net.trainParam.showWindow = false; net.trainParam.showCommandLine = false;
Окно обучения появляется автоматически при обучении. Используйте nntraintool для открытия и закрытия окна обучения вручную.
nntraintool
nntraintool('close')