Этой темой является часть рабочего процесса проекта, описанного в Рабочем процессе для Проекта Нейронной сети.
Эта тема описывает два различных стиля обучения. В инкрементном обучении веса и смещения сети обновляются каждый раз, когда вход представлен сети. В пакетном обучении только обновляются веса и смещения после того, как все входные параметры представлены. Пакетные методы обучения обычно более эффективны в среде MATLAB®, и они подчеркнуты в программном обеспечении Deep Learning Toolbox™, но там некоторые приложения, где инкрементное обучение может быть полезным, так, чтобы парадигма была реализована также.
Инкрементное обучение может быть применено и к статическим и к динамическим сетям, несмотря на то, что оно чаще всего используется с динамическими сетями, такими как адаптивные фильтры. Этот раздел иллюстрирует, как инкрементное обучение выполняется и в статических и в динамических сетях.
Считайте снова статическую сеть используемой для первого примера. Вы хотите обучить его инкрементно, так, чтобы веса и смещения были обновлены после того, как каждый вход представлен. В этом случае вы используете функцию adapt
, и входные параметры и цели представлены как последовательности.
Предположим, что вы хотите обучить сеть, чтобы создать линейную функцию:
Затем для предыдущих входных параметров,
цели были бы
Для инкрементного обучения вы представляете входные параметры и цели как последовательности:
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
использование приобретение знаний Видроу-Хофф.
[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
. Поскольку правило Видроу-Хофф может быть использовано в инкрементном или пакетном режиме, оно может быть вызвано adapt
или train
. (Существует несколько алгоритмов, которые могут только использоваться в пакетном режиме (e.g., 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')