Улучшите мелкое обобщение нейронной сети и постарайтесь не сверхсоответствовать

Совет

Чтобы изучить, как настроить параметры для нейронной сети для глубокого обучения, смотрите Настроенные Параметры и Обучите Сверточную Нейронную сеть.

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

Следующие данные показывают ответ 1-20-1 нейронной сети, которая была обучена, чтобы аппроксимировать шумную синусоидальную функцию. Базовую синусоидальную функцию показывает пунктирная линия, шумные измерения даны + символы, и ответ нейронной сети дан сплошной линией. Очевидно эта сеть сверхсоответствовала данным и не сделает вывод хорошо.

Один метод для улучшения сетевого обобщения должен использовать сеть, которая является только достаточно большой, чтобы обеспечить соответствующую подгонку. Чем большую сеть вы используете, тем более комплексный функции сеть могут создать. Если вы будете использовать достаточно маленькую сеть, она не будет иметь достаточного количества власти сверхсоответствовать данным. Запустите пример nnd11gn [HDB96] Проекта Нейронной сети, чтобы заняться расследованиями, как сокращение размера сети может предотвратить сверхподбор кривой.

К сожалению, трудно знать заранее, насколько большой сеть должна быть для определенного приложения. Существует два других метода для улучшения обобщения, которые реализованы в программном обеспечении Deep Learning Toolbox™: регуляризация и рано остановка. Следующие разделы описывают эти два метода и стандартные программы, чтобы реализовать их.

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

Переквалификация нейронных сетей

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

Это - хорошая идея обучить несколько сетей, чтобы гарантировать, что сеть с хорошим обобщением найдена.

Здесь набор данных загружается и разделен на две части: 90% для разработки сетей и 10% для тестирования их всех.

[x, t] = bodyfat_dataset;
Q = size(x, 2);
Q1 = floor(Q * 0.90);
Q2 = Q - Q1;
ind = randperm(Q);
ind1 = ind(1:Q1);
ind2 = ind(Q1 + (1:Q2));
x1 = x(:, ind1);
t1 = t(:, ind1);
x2 = x(:, ind2);
t2 = t(:, ind2);

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

net = feedforwardnet(10);
numNN = 10;
NN = cell(1, numNN);
perfs = zeros(1, numNN);
for i = 1:numNN
  fprintf('Training %d/%d\n', i, numNN);
  NN{i} = train(net, x1, t1);
  y2 = NN{i}(x2);
  perfs(i) = mse(net, t2, y2);
end

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

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

Несколько нейронных сетей

Другой простой способ улучшить обобщение, особенно, когда вызвано шумными данными или маленьким набором данных, состоит в том, чтобы обучить несколько нейронных сетей и составить в среднем их выходные параметры.

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

Во-первых, набор данных загружается и разделен на проект и набор тестов.

[x, t] = bodyfat_dataset;
Q = size(x, 2);
Q1 = floor(Q * 0.90);
Q2 = Q - Q1;
ind = randperm(Q);
ind1 = ind(1:Q1);
ind2 = ind(Q1 + (1:Q2));
x1 = x(:, ind1);
t1 = t(:, ind1);
x2 = x(:, ind2);
t2 = t(:, ind2);

Затем обучены десять нейронных сетей.

net = feedforwardnet(10);
numNN = 10;
nets = cell(1, numNN);
for i = 1:numNN
  fprintf('Training %d/%d\n', i, numNN)
  nets{i} = train(net, x1, t1);
end

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

perfs = zeros(1, numNN);
y2Total = 0;
for i = 1:numNN
  neti = nets{i};
  y2 = neti(x2);
  perfs(i) = mse(neti, t2, y2);
  y2Total = y2Total + y2;
end
perfs
y2AverageOutput = y2Total / numNN;
perfAveragedOutputs = mse(nets{1}, t2, y2AverageOutput) 

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

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

Рано остановка

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

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

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

Существует четыре функции, предусмотренные, деля данные на обучение, валидацию и наборы тестов. Они - dividerand (значение по умолчанию), divideblock, divideint и divideind. Можно получить доступ или изменить функцию деления для сети с этим свойством:

net.divideFcn

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

net.divideParam

Индексируйте деление данных (divideind)

Создайте простую тестовую задачу. Для полного набора данных сгенерируйте шумную синусоиду с 201 точкой ввода в пределах от −1 к 1 на шагах 0,01:

p = [-1:0.01:1];
t = sin(2*pi*p)+0.1*randn(size(p));

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

trainInd = 1:3:201
valInd = 2:3:201;
testInd = 3:3:201;
[trainP,valP,testP] = divideind(p,trainInd,valInd,testInd);
[trainT,valT,testT] = divideind(t,trainInd,valInd,testInd);

Случайное деление данных (dividerand)

Можно разделить входные данные случайным образом так, чтобы 60% выборок были присвоены набору обучающих данных, 20% к набору валидации и 20% к набору тестов, можно следующим образом:

[trainP,valP,testP,trainInd,valInd,testInd] = dividerand(p);

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

[trainT,valT,testT] = divideind(t,trainInd,valInd,testInd);

Блокируйте деление данных (divideblock)

Можно также разделить входные данные, случайным образом таким образом, что первые 60% выборок присвоены набору обучающих данных, следующие 20% к набору валидации и последние 20% к набору тестов, можно следующим образом:

[trainP,valP,testP,trainInd,valInd,testInd] = divideblock(p);

Разделите целевые данные соответственно с помощью divideind:

[trainT,valT,testT] = divideind(t,trainInd,valInd,testInd);

Чередованное деление данных (divideint)

Другой способ разделить входные данные состоит в том, чтобы циклически повторить выборки между набором обучающих данных, набором валидации и набором тестов согласно процентам. Можно чередовать 60% выборок к набору обучающих данных, 20% к набору валидации и 20% к набору тестов можно следующим образом:

[trainP,valP,testP,trainInd,valInd,testInd] = divideint(p);

Разделите целевые данные соответственно с помощью divideind.

[trainT,valT,testT] = divideind(t,trainInd,valInd,testInd);

Регуляризация

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

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

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

F=mse=1Ni=1N(ei)2=1Ni=1N(tiαi)2

Возможно улучшить обобщение, если вы изменяете функцию производительности путем добавления термина, который состоит из среднего значения суммы квадратов сетевых весов и смещений msereg=γ*msw+(1γ)*mse, где γ отношение производительности, и

msw=1nj=1nwj2

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

Следующий код повторно инициализирует предыдущую сеть и переобучает ее с помощью алгоритма BFGS с упорядоченной функцией производительности. Здесь отношение производительности установлено в 0,5, который дает равный вес среднеквадратичным погрешностям и среднеквадратические веса.

[x,t] = simplefit_dataset;
net = feedforwardnet(10,'trainbfg');
net.divideFcn = '';
net.trainParam.epochs = 300;
net.trainParam.goal = 1e-5;
net.performParam.regularization = 0.5;
net = train(net,x,t);

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

Автоматизированная регуляризация (trainbr)

Желательно определить оптимальные параметры регуляризации автоматизированным способом. Один подход к этому процессу является Байесовой средой Дэвида Маккея [Макк92]. В этой среде веса и смещения сети приняты, чтобы быть случайными переменными с заданными дистрибутивами. Параметры регуляризации связаны с неизвестными отклонениями, сопоставленными с этими дистрибутивами. Можно затем оценить эти параметры с помощью статистических методов.

Детальное обсуждение Байесовой регуляризации выходит за рамки этого руководства пользователя. Детальное обсуждение использования Байесовой регуляризации, в сочетании с обучением Levenberg-Marquardt, может быть найдено в [FoHa97].

Байесова регуляризация была реализована в функциональном trainbr. Следующий код показывает, как можно обучаться, 1-20-1 сеть с помощью этой функции, чтобы аппроксимировать шумную синусоиду, показанную в фигуре в, Улучшают Мелкое Обобщение Нейронной сети и Стараются не Сверхсоответствовать. (Деление данных отменяется установкой net.divideFcn так, чтобы эффекты trainbr были изолированы от ранней остановки.)

x = -1:0.05:1;
t = sin(2*pi*x) + 0.1*randn(size(x));
net = feedforwardnet(20,'trainbr');
net = train(net,x,t);

Одна функция этого алгоритма - то, что он обеспечивает меру того, сколько сетевых параметров (веса и смещения) эффективно используется сетью. В этом случае финал обучил сеть, использует приблизительно 12 параметров (обозначенный #Par в распечатке) из этой 61 общей массы и смещений в 1-20-1 сети. Это эффективное количество параметров должно остаться приблизительно то же самое, неважно, как большой количество параметров в сети становится. (Это принимает, что сеть была обучена для достаточного числа итераций, чтобы гарантировать сходимость.)

Алгоритм trainbr обычно работает лучше всего, когда сетевые входные параметры и цели масштабируются так, чтобы они упали приблизительно в области значений [−1,1]. Это имеет место для тестовой задачи здесь. Если ваши входные параметры и цели не падают в этой области значений, можно использовать функциональный mapminmax или mapstd, чтобы выполнить масштабирование, как описано в Выбирают Neural Network Input-Output Processing Functions. Сети, созданные с feedforwardnet, включают mapminmax как функцию обработки ввода и вывода по умолчанию.

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

При использовании trainbr важно позволить алгоритму, запущенному, пока эффективное количество параметров не сходилось. Учебная сила останавливает с сообщением "Максимальный достигнутый MU". Это типично, и является хорошей индикацией, что алгоритм действительно сходился. Можно также сказать, что алгоритм сходился, если квадратичная невязка суммы (SSE) и сумма придала весам квадратную форму (SSW) являются относительно постоянными по нескольким итерациям. Когда это происходит, вы можете хотеть нажать кнопку Stop Training в учебном окне.

Сводные данные и обсуждение ранней остановки и регуляризации

Рано остановка и регуляризация может гарантировать сетевое обобщение, когда вы применяете их правильно.

Для ранней остановки необходимо бояться использовать алгоритм, который сходится слишком быстро. Если вы используете алгоритм FAST (как trainlm), установите учебные параметры так, чтобы сходимость была относительно медленной. Например, установите mu на относительно большое значение, такой как 1, и установите mu_dec и mu_inc к значениям близко к 1, такой как 0,8 и 1.5, соответственно. Учебные функции trainscg и trainbr обычно работают хорошо с ранней остановкой.

С ранней остановкой выбор набора валидации также важен. Набор валидации должен быть представительным для всех точек в наборе обучающих данных.

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

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

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

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

Заголовок набора данных

Число точекСетьОписание

ШАР

672-10-1Калибровка двойного датчика для измерения положения шара

СИНУС (5% Н)

411-15-1Синусоида одно цикла с Гауссовым шумом на 5%-м уровне

СИНУС (2% Н)

411-15-1Синусоида одно цикла с Гауссовым шумом на 2%-м уровне

ENGINE (ВСЕ)

11992-30-2Датчик Engine — полный набор данных

ENGINE (1/4)

3002-30-2Датчик Engine — 1/4 набора данных

CHOLEST (ВСЕ)

2645-15-3Измерение холестерина — полный набор данных

CHOLEST (1/2)

1325-15-3Измерение холестерина — 1/2 набор данных

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

Следующая таблица обобщает производительность рано остановки (ES) и Байесовой регуляризации (BR) на этих семи наборах тестов. (Алгоритм trainscg использовался для ранних тестов остановки. Другие алгоритмы обеспечивают подобную производительность.)

Среднеквадратическая ошибка набора тестов

МетодШарEngine (Все)Engine (1/4)Choles (Все)Choles (1/2)Синус (5% Н)Синус (2% Н)
ES1.2e-11.3e-21.9e-21.2e-11.4e-11.7e-11.3e-1
BR1.3e-32.6e-34.7e-31.2e-19.3e-23.0e-26.3e-3
ES/BR925411.55.721

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

Несмотря на то, что производительность обобщения Байесовой регуляризации часто лучше, чем ранняя остановка, это не всегда имеет место. Кроме того, форма Байесовой регуляризации, реализованной в тулбоксе, не выполняет также на проблемах распознавания образов, как это делает на проблемах приближения функций. Это вызвано тем, что приближение к Гессиану, который используется в алгоритме Levenberg-Marquardt, не так точно, когда сетевой вывод насыщается, как имел бы место в проблемах распознавания образов. Другой недостаток Байесового метода регуляризации - то, что обычно занимает больше времени сходиться, чем ранняя остановка.

Постучебный анализ (регрессия)

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

Следующие команды иллюстрируют, как выполнить регрессионный анализ обученной сети.

x = [-1:.05:1];
t = sin(2*pi*x)+0.1*randn(size(x));
net = feedforwardnet(10);
net = train(net,x,t);
y = net(x);
[r,m,b] = regression(t,y)
r =
    0.9935
m =
    0.9874
b =
   -0.0067

Сетевой вывод и соответствующие цели передаются regression. Это возвращает три параметра. Первые два, m и b, соответствуют наклону и свободному члену лучших целей связи линейной регрессии, чтобы объединить выходные параметры в сеть. Если бы была совершенная подгонка (выходные параметры точно равняются целям), наклон был бы 1, и свободный член будет 0. В этом примере вы видите, что числа очень близки. Третья переменная, возвращенная regression, является коэффициентом корреляции (R-значение) между выходными параметрами и целями. Это - мера того, как хорошо изменение в выводе объяснено целями. Если этот номер равен 1, то существует совершенная корреляция между целями и выходные параметры. В примере номер очень близко к 1, который указывает на хорошую подгонку.

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