Подгонка данных с помощью неглубокой нейронной сети

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

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

Решить эту задачу можно двумя способами:

Обычно лучше начать с графический интерфейс пользователя, а затем использовать графический интерфейс пользователя для автоматической генерации скриптов командной строки. Перед использованием любого из методов сначала определите проблему, выбрав набор данных. Каждый графический интерфейс пользователя имеет доступ ко многим наборам выборочных данных, которые можно использовать для экспериментов с тулбоксом (см. Выборочные данные наборы для мелких нейронных сетей). Если у вас есть конкретная проблема, которую вы хотите решить, вы можете загрузить свои собственные данные в рабочую область. В следующем разделе описывается формат данных.

Определение задачи

Чтобы задать задачу аппроксимации для тулбокса, расположите набор Q входных векторов как столбцы в матрице. Затем расположите другой набор Q целевых векторов (правильных выходных векторов для каждого из входных векторов) во вторую матрицу (см. «Структуры данных» для подробного описания форматирования данных для статических данных и данных временных рядов). Для примера можно задать задачу аппроксимации для логического элемента AND с четырьмя наборами двухэлементных векторов входа и одноэлементными целями следующим образом:

inputs = [0 1 0 1; 0 0 1 1];
targets = [0 0 0 1];

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

Использование приложения Neural Network Fitting

  1. Откройте приложение Neural Network Fitting используя nftool.

    nftool

  2. Для продолжения нажмите кнопку Далее.

  3. Щелкните Загрузка Набора данных примера в окне Выбор данных. Откроется окно Выбор набора данных модели (Fitting Data Set Chooser).

    Примечание

    Используйте опции Inputs и Targets в окне Select Data, когда необходимо загрузить данные из MATLAB® рабочей области.

  4. Выберите «Химикат» и нажмите «Импорт». Это возвращает вас в окно Select Data.

  5. Нажмите Next, чтобы открыть окно Validation and Тестовые Данные, показанное на следующем рисунке.

    Каждый из наборов валидации и тестовых данных устанавливается на 15% от исходных данных.

    С этими настройками входные векторы и целевые векторы будут случайным образом разделены на три набора следующим образом:

    • 70% будут использованы для обучения.

    • 15% будет использоваться, чтобы подтвердить, что сеть обобщает, и остановить обучение перед сверхподбором кривой.

    • Последние 15% будут использоваться как полностью независимый тест обобщения сети.

    (Для получения дополнительной информации о процессе деления данных см. деление данных».)

  6. Нажмите кнопку Далее.

    Стандартная сеть, которая используется для подбора кривой функции, является 2-х слойной сетью прямого распространения с передаточной функцией сигмоида в скрытом слое и линейной передаточной функцией в выход слое. Количество скрытых нейронов по умолчанию установлено в 10. Вы, возможно, захотите увеличить это количество позже, если производительность обучения будет низкой.

  7. Нажмите кнопку Далее.

  8. Выберите алгоритм настройки, затем щелкните Обучить. Левенберг-Марквардт (trainlm) рекомендуется для большинства задач, но для некоторых шумных и небольших задач Байесовская Регуляризация (trainbr) может занять больше времени, но получить лучшее решение. Однако для больших задач масштабированный сопряженный градиент (trainscg) рекомендуется, так как использует градиентные вычисления, которые более эффективны для памяти, чем вычисления Якобиана, которые используют два других алгоритма. Этот пример использует Левенберг-Марквардт по умолчанию.

    Обучение продолжается до тех пор, пока ошибка проверки не перестанет уменьшаться в течение шести итераций (остановка валидации).

  9. В разделе Графики (Plots) нажмите кнопку Регрессия (Regression). Это используется для проверки эффективности сети.

    Следующие регрессионные графики отображают выходы сети относительно целей для наборов обучения, валидации и тестов. Для идеальной подгонки данные должны падать вдоль линии 45 степеней, где выходы сети равны целям. Для этой задачи подгонка является достаточно хорошей для всех наборов данных со значениями R в каждом случае 0,93 или выше. Если требовались еще более точные результаты, можно переобучить сеть, нажав Retrain в nftool. Это изменит начальные веса и смещения сети и может привести к улучшению сети после переобучения. Другие опции доступны на следующей панели.

  1. Смотрите гистограмму ошибки, чтобы получить дополнительную верификацию эффективности сети. На панели Графики (Plots) щелкните Гистограмма ошибки (Error Histogram).

    Синие полосы представляют обучающие данные, зеленые - данные валидации, а красные - данные проверки. Гистограмма может дать вам указание на выбросы, которые являются точками данных, где подгонка значительно хуже, чем большинство данных. В этом случае можно увидеть, что хотя большинство ошибок падает между -5 и 5, существует точка обучения с ошибкой 17 и точки валидации с ошибками 12 и 13. Эти выбросы также видны на проверку регрессионном графике. Первый соответствует точке с целью 50 и выходом около 33. Рекомендуется проверить выбросы, чтобы определить, являются ли данные плохими, или эти точки данных отличаются от остальной части набора данных. Если выбросы являются допустимыми точками данных, но отличаются от остальных данных, то сеть экстраполирует для этих точек. Необходимо собрать больше данных, похожих на точки выбросов, и переобучить сеть.

  2. Нажмите Next в приложении Neural Network Fitting, чтобы оценить сеть.

    На данной точке можно протестировать сеть на соответствие новым данным.

    Если вы недовольны эффективностью сети на оригинальных или новых данных, то можете сделать одно из следующего:

    • Обучи его снова.

    • Увеличьте количество нейронов.

    • Получите больший набор обучающих данных.

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

  3. Если вы удовлетворены эффективностью сети, нажмите кнопку Далее.

  4. Используйте эту панель, чтобы сгенерировать функцию MATLAB или Simulink® схема для симуляции вашей нейронной сети. Можно использовать сгенерированный код или схему, чтобы лучше понять, как ваша нейронная сеть вычисляет выходы от входов, или развернуть сеть с помощью инструментов MATLAB Compiler™ и других инструментов генерации кода MATLAB.

  5. Используйте кнопки на этом экране, чтобы сгенерировать скрипты или сохранить результаты.

    • Можно щелкнуть Простой скрипт или Расширенный скрипт, чтобы создать код MATLAB, который можно использовать для воспроизведения всех предыдущих шагов из командной строки. Создание кода MATLAB может быть полезным, если вы хотите узнать, как использовать функциональность командной строки тулбокса для настройки процесса обучения. В разделе Использование функций Command-Line вы исследуете сгенерированные скрипты более подробно.

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

  6. После создания кода MATLAB и сохранения результатов нажмите кнопку Готово.

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

Самый легкий способ научиться использовать функциональность командной строки тулбокса - сгенерировать скрипты из графические интерфейсы пользователя, а затем изменить их, чтобы настроить сетевое обучение. В качестве примера рассмотрим простой скрипт, который был создан на шаге 14 предыдущего раздела.

% Solve an Input-Output Fitting problem with a Neural Network
% Script generated by NFTOOL
%
% This script assumes these variables are defined:
%
%   houseInputs - input data.
%   houseTargets - target data.
 
inputs = houseInputs;
targets = houseTargets;
 
% Create a Fitting Network
hiddenLayerSize = 10;
net = fitnet(hiddenLayerSize);

% Set up Division of Data for Training, Validation, Testing
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
 
% Train the Network
[net,tr] = train(net,inputs,targets);
 
% Test the Network
outputs = net(inputs);
errors = gsubtract(outputs,targets);
performance = perform(net,targets,outputs)
 
% View the Network
view(net)
 
% Plots
% Uncomment these lines to enable various plots.
% figure, plotperform(tr)
% figure, plottrainstate(tr)
% figure, plotfit(targets,outputs)
% figure, plotregression(targets,outputs)
% figure, ploterrhist(errors)

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

  1. Скрипт принимает, что входные векторы и целевые векторы уже загружены в рабочую область. Если данные не загружены, их можно загрузить следующим образом:

    load bodyfat_dataset
    inputs = bodyfatInputs;
    targets = bodyfatTargets;
    

    Этот набор данных является одним из выборочных наборов данных, который является частью тулбокса (см. Выборочные данные Наборы для мелких нейронных сетей). Список всех доступных наборов данных можно увидеть путем ввода команды help nndatasets. The load команда также позволяет вам загружать переменные из любого из этих наборов данных с помощью собственных имен переменных. Для примера используйте команду

    [inputs,targets] = bodyfat_dataset;
    

    загрузит входы жира тела в массив inputs и жир тела нацелен в массив targets.

  2. Создайте сеть. Сеть по умолчанию для задач подбора кривой (или регрессии) функций, fitnet, является сеть прямого распространения с передаточной функцией тан-сигмоида по умолчанию в скрытом слое и линейной передаточной функцией в выход слое. Вы назначили десять нейронов (несколько произвольных) одному скрытому слою в предыдущем разделе. Сеть имеет один выходной нейрон, потому что с каждым входным вектором сопоставлено только одно целевое значение.

    hiddenLayerSize = 10;
    net = fitnet(hiddenLayerSize);
    

    Примечание

    Больше нейронов требуют больших расчетов, и у них есть тенденция перегружать данные, когда число установлено слишком высоким, но они позволяют сети решать более сложные задачи. Больше слоев требуют больших расчетов, но их использование может привести к тому, что сеть решит сложные задачи более эффективно. Чтобы использовать несколько скрытых слоев, введите скрытые размеры слоев как элементы массива в fitnet команда.

  3. Настройте деление данных.

    net.divideParam.trainRatio = 70/100;
    net.divideParam.valRatio = 15/100;
    net.divideParam.testRatio = 15/100;
    

    С этими настройками входные векторы и целевые векторы будут случайным образом разделены: 70% используются для обучения, 15% для валидации и 15% для проверки. (Для получения дополнительной информации о процессе деления данных см. деление данных».)

  4. Обучите сеть. Сеть использует алгоритм Левенберга-Марквардта по умолчанию (trainlm) для обучения. Для задач, при которых Левенберг-Марквардт не дает столь точных результатов, как требуется, или для больших задач с данными, рассмотрите установку функции сетевого обучения на байесовскую регуляризацию (trainbr) или масштабированный сопряженный градиент (trainscg), соответственно, с любым

    net.trainFcn = 'trainbr';
    net.trainFcn = 'trainscg';

    Для обучения сети введите:

    [net, tr] = train(net, inputs, targets);
    

    Во время обучения открывается следующее окно обучения. Это окно отображает процесс обучения и позволяет вам прервать обучение в любой точке, нажав Остановить обучение.

    Это обучение остановилось, когда ошибка валидации увеличилась в течение шести итераций, которые произошли на итерации 20. Если в окне обучения щелкнуть Эффективность (Performance), отобразится график ошибок обучения, ошибок валидации и тестовых ошибок, как показано на следующем рисунке. В этом примере результат является разумным из-за следующих факторов:

    • Конечная среднеквадратичная ошибка является маленькой.

    • Ошибка тестового набора и ошибка набора валидации имеют аналогичные характеристики.

    • Не произошло значительного сверхподбора кривой при итерации 14 (где происходит лучшая эффективность валидации).

  5. Протестируйте сеть. После обучения сети ее можно использовать для вычисления выходов сети. Следующий код вычисляет выходы сети, ошибки и общую эффективность.

    outputs = net(inputs);
    errors = gsubtract(targets, outputs);
    performance = perform(net, targets, outputs)
    
    performance =
    
       19.3193
    
    

    Также можно вычислить сетевую эффективность только на тестовом наборе, с помощью индексов проверки, которые находятся в обучающей записи. (Полное описание обучающей записи смотрите в Analyze Shallow Neural Network Performance After Training.)

    tInd = tr.testInd;
    tstOutputs = net(inputs(:, tInd));
    tstPerform = perform(net, targets(tInd), tstOutputs)
    
    tstPerform =
    
       53.7680
    
    
  6. Выполните некоторый анализ сетевого отклика. Если вы нажимаете Регрессия в окне обучения, можно выполнить линейную регрессию между выходами сети и соответствующими целями.

    Следующие рисунки показывают результаты.

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

    • Сбросьте начальные веса и смещения сети к новым значениям с init и train еще раз (см. «Инициализация весов» (init)).

    • Увеличьте количество скрытых нейронов.

    • Увеличьте количество обучающих векторов.

    • Увеличьте количество значений входа, если доступна более важная информация.

    • Попробуйте другой алгоритм настройки (см. «Алгоритмы настройки»).

    В этом случае сетевой ответ удовлетворителен, и теперь можно поместить сеть на новые входы.

  7. Просмотрите сетевую схему.

    view(net)
    

Чтобы получить больше опыта в операциях командной строки, попробуйте некоторые из следующих задач:

  • Во время обучения откройте окно plot (такое как график регрессии), и посмотрите, как оно анимируется.

  • Постройте график из командной строки с такими функциями, как plotfit, plotregression, plottrainstate и plotperform. (Для получения дополнительной информации об использовании этих функций см. их страницы с описанием.)

Также дополнительные опции см. в расширенном скрипте, при обучении из командной строки.

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

Существует несколько других методов улучшения начальных решений, если желательна более высокая точность. Для получения дополнительной информации см. «Улучшение обобщения неглубоких нейронных сетей» и «Избегайте избыточного оснащения».