Neural network wizard ошибка во входном файле

Обновлено: 07.07.2024

Пример 1. Создание нечеткой системы управления подачей тепла

Исходные данные для моделирования:

Таблица 1
Название терма (Name) Тип функции принадлежности (Type) Диапазон изменения (Params)
Очень низкая трапецеидальная [-30 -20 20 30]
Низкая треугольная [10 30 50]
Средняя треугольная [30 50 70]
Высокая треугольная [50 70 90]
Очень высокая трапецеидальная [70 80 120 130]

Выходная переменная Подача тепла (значения приведены в таблице 2).

Таблица 2
Название терма Тип функции принадлежности Диапазон изменения
Очень малая треугольная [-20 0 20]
Малая треугольная [10 25 40]
Средняя треугольная [30 50 70]
Большая треугольная [60 75 90]
Очень большая треугольная [80 100 120]

Создание нечеткой системы управления подачей тепла:

1.1. Начало работы

В самом начале работы необходимо выполнить команды Fis/New и в поле Name задать имя новой системы. Например, «Управление подачей тепла».

1.2. Задание переменных

Зададим входные (измеряемые) и выходные (вычисляемые) переменные: для этого нужно выполнить команды Fis, Inputs (Outputs), New inputs (New Outputs), в открывшемся окне задаем имя переменной, например, «Температура», открыв меню Range, указываем диапазон изменения значений этой переменной (рис.1).

Диапазон изменения значений переменной «Температура»

Рис.1. Диапазон изменения значений переменной «Температура»

После нажатия кнопки Apply, нужно выполнить команду MFs/New MF, чтобы задать термы и функции принадлежности переменной. Здесь (рис.2) в поле Name указывается название терма, Type - тип функции принадлежности (trapezoidal - трапецеидальная функция принадлежности, triangular - треугольная и т.д.)

Окно Input

Рис.2. Окно Input

Для лингвистической переменной Температура зададим следующие термы в соответствии с табл.1.

Окно редактора функций принадлежности для переменной Температура представлено на рис.3.

Термы и функции принадлежности переменной «Температура»

Рис.3. Термы и функции принадлежности переменной «Температура»

Аналогично задаются термы и определяются функции принадлежности для выходной переменной Подача тепла (рис.4). Исходные данные приведены в табл.2.

Значения выходной переменной

Рис.4. Значения выходной переменной

1.3. Создание базы правил

Чтобы создать базу правил, нужно сначала сформулировать предложения в форме ЕСЛИ - ТО, куда бы входила введенная нами переменная Температура:

ЕСЛИ температура=очень низкая ТО подача воды=очень большая

ЕСЛИ температура=низкая ТО подача воды=большая

ЕСЛИ температура=средняя ТО подача воды=средняя

ЕСЛИ температура=высокая ТО подача воды=малая

ЕСЛИ температура=очень высокая ТО подача воды=очень малая

Чтобы внести эти правила в базу правил необходимо нажать на кнопку Rules в главном окне программы, далее выполнить команду New Rule меню Rules.

На рис.5 изображено окно редактора базы знаний после ввода 5 правил.

Окно редактора базы правил

Рис.5. Окно редактора базы правил

1.4. Логический вывод

После того как база правил создана можно приступить к этапу логического вывода, для этого нужно выполнить команду Infer меню FIS в главном окне программы.

В левой части окна в графической форме представлены функции принадлежности входной переменной Температура, в правой - выходной переменной Подача тепла (рис.6). Изменять значения входной переменной можно передвигая бегунок или же задавать числовые значения непосредственно в поле Температура.

Логический вывод

Рис.6. Логический вывод

1.5. Просмотр поверхности выхода

Для того чтобы перейти к окну просмотра поверхности выхода выполнить команду System Response/Section пункта меню Fis в главном окне.

Просмотр поверхности выхода

Рис.7. Просмотр поверхности выхода

Задание 2. Создать НС для распознавания функции «Исключающее ИЛИ»

Исходные данные для обучения нейронной сети приведены в таблице 3.

Таблица 3
X Y Z
0 0 0
0 1 1
1 0 1
1 1 0

2.1. Создание набора данных

На первом шаге подготовим обучающие примеры. Данные для обучения нейронной сети должны быть представлены в текстовом файле с разделителем (Tab или пробел) (рис.8).

Данные для обучения НС

Рис.8. Данные для обучения НС

Далее в главном окне программы необходимо выбрать файл, содержащий обучающую выборку (рис.9). Информация, содержащаяся в этом файле, используется для обучения сети. Можно открыть txt-файл для обучения или nnw-файл - обученную нейронную сеть.

Содержимое txt-файла

Рис.9. Содержимое txt-файла

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

Задание входных и выходных переменных

Рис.10. Задание входных и выходных переменных

  • Использовать поле как - нейронная сеть состоит из входного, выходного и скрытых слоев. Количество нейронов в первом и последнем слое зависит от того, сколько полей вы определите как входные и выходные. Поля, отмеченные пометкой «не использовать», в обучении и тестировании сети применяться не будут.
  • Нормализовать поле как - на вход сети должна подаваться информация в нормализованном виде. Т.е. это числа в диапазоне от 0 до 1. Можно выбрать один из методов нормализации:
    • (XMIN)/(MAX-XMIN) - линейная нормализация.
    • 1/(1+exp(-ax)) - экспоненциальная нормализация.
    • Авто - нормализация, основанная на статистических характеристиках выборки
    • Без нормализации - нормализация не производится

    Для рассматриваемого примера входными данными являются X и Y, выходной переменной - Z. Нормализация исходных данных не производится.

    2.2. Создание нейронной сети

    На следующем шаге в окне представленном на рис.11 задаем параметры конфигурации нейронной сети.

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

    Окно задания параметров нейронной сети

    Рис.11. Окно задания параметров нейронной сети

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

    2.3. Обучение сети

    После создания нейронной сети необходимо задать параметры обучения в окне на рис.12.

    • Использовать для обучения сети % выборки - все примеры, подаваемые на вход нейросети, делятся на 2 множества - обучающее и тестовое. Этот параметр определяет, сколько процентов примеров будут использоваться в обучающей выборке. Записи, используемые для тестирования, выбираются случайно, но пропорции сохраняются.
    • Скорость обучения - параметр определяет амплитуду коррекции весов на каждом шаге обучения.
    • Момент - параметр определяет степень воздействия i-ой коррекции весов на i+1-ую.
    • Распознана, если ошибка по примеру< - если результат прогнозирования отличается от значения из обучаемого множества меньше указанной величины, то пример считается распознанным.
    • Использовать тестовое множество как валидационное - при выборе этой опции обучение будет прекращено, как только ошибка на тестовом множестве начнет увеличиваться. Это помогает избежать ситуации переобучения сети.
    • Критерии остановки обучения - осуществляется выбор условия завершения процесса обучения нейронной сети.

    Окно задания параметров обучения

    Рис.12. Окно задания параметров обучения

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

    • Пуск обучения/остановка обучения - запуск процесса обучения. В таблице над кнопкой можно наблюдать, как меняется ошибка обучения.
    • Распределение ошибки - на диаграмме отображается распределение ошибки. Зеленые столбцы - ошибка на обучающей выборке, красные - на тестовой выборке. Чем правее столбец, тем выше значение ошибки. Шкала от 0 до 1. Чем выше столбец, тем больше примеров с указанной ошибкой.
    • Распределение примеров в обучающей/тестовой выборке - на этих графиках можно отслеживать насколько результаты, предсказанные нейронной сетью, совпадают со значениями в обучающей (слева) и тестовой (справа) выборке. Каждый пример обозначен на графике точкой. Если точка попадает на выделенную линию (диагональ), то значит, сеть предсказала результат с достаточно высокой точностью. Если точка находится выше диагонали, значит, сеть недооценила, ниже - переоценила. Необходимо добиваться, чтобы точки располагались как можно ближе к диагонали.

    Ход и результаты обучения сети

    Рис.13. Ход и результаты обучения сети

    2.4. Проверка результатов обучения

    После того как сеть обучена, можно проверить результаты обучения (рис.14).

    Проверка обучения

    Рис.14. Проверка обучения

    Результаты обучения представлены в таблице 4

    Таблица 4
    X Y Целевой выход Z Выход сети Ошибка
    0 0 0 0,1 0,1
    0 1 1 0,96 0,004
    1 0 1 0,97 0,003
    1 1 0 0 0

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

    Пользуйся браузерами Yandex, Firefox, Opera, Edge - они правильно отражают формулы, встречающиеся на страницах, как в десктопном, так и в мобильном вариантах.

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

    Программный пакет Neural Network Wizardможет быть использован без предварительной инсталляции.

    Путь к программе: Neural Network Wizard\Bin\Wizard.exe.

    Прежде чем запускать программу, необходимо в любом текстовом редакторе подготовить текстовый файл с обучающей выборкой. Пример такого файла для функции res = s1 + s2 приведен ниже.

    В первой строке файла указываются имена входных/выходных переменных: s1 и s2 – имена входных переменных, res – имя выходной переменной. Далее идут их значения в колонках.

    Файл сохраняется как текстовый с расширением TXT.

    В данном окне (рисунок 7) определяются структура и параметры НС: количество скрытых слоев, количество нейронов в каждом слое, а также вид сигмоидной функции.

    В следующем окне (рисунок 8) задаются параметры обучения и критерии остановки обучения, если она требуется. Кнопка «Далее» показывает краткий предварительный отчет.

    В следующем окне визуализирован процесс обучения (рисунок 9). Чтобы запустить обучение, нажимается кнопка «Пуск обучения». На верхней диаграмме показано распределение ошибки обучения: по горизонтали значение ошибки (чем правее столбец, тем больше ошибка), по вертикали количество примеров из выборки с данной ошибкой. Зеленые столбцы – ошибка на рабочей обучающей выборке, красные – на тестовой. В процессе обучения столбцы должны стремиться в левую часть диаграммы.





    Ниже диаграммы отображается распределение примеров на рабочей и тестовой выборках. Каждый пример изображен здесь точкой. Чем ближе точка к диагонали, тем точнее НС предсказала ее значение.

    Остановка обучения происходит либо по ранее указанному критерию, либо с помощью той же кнопки «Пуск обучения».

    В следующем окне (рисунок 10) представляется возможность оценить точность работы НС в эксплуатационном режиме. Для этого в левом поле указывается произвольное значение входного сигнала. После нажатия на кнопку «Расчет» в правом поле появляется рассчитанное сетью значение выходного.

    Кнопка «Сохранить» позволяет записать параметры обученной сети в виде файла (по умолчанию расширение файла NNW).

    В данном файле кроме прочих параметров указаны:

    Epoch – количество эпох (циклов) обучения,

    Layer_* - количество нейронов в соответствующем слое (нейроны нумеруются от 0 до N-1),

    W_i_j_k – веса синапсов (i = номер слоя - 2, j – номер нейрона, k – номер синапса данного нейрона).

    Цель и содержание: приобретение практических навыков применения нейронных сетей c использованием пакета Neural Network Wizard.

    Теоретическое обоснование

    Neural Network Wizard 1.7 – простейший программный эмулятор нейронных сетей. В Neural Network Wizard реализована многослойная нейронная сеть, обучаемая по алгоритму обратного распространения ошибки (back propagation error). Программа Neural Network Wizard предназначена для проведения исследований с целью выбора оптимальной конфигурации нейронной сети, позволяющей наилучшим образом решить поставленную задачу. Результатом работы системы является файл, который хранит в себе все параметры полученной нейронной сети. Далее, на основе этого файла, можно разрабатывать систему, предназначенную для решения конкретных задач.

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

    1. Собрать статистику по процессу.

    2. Обучить нейросеть на приведенных данных.

    3. Проверять полученные результаты.

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

    Программный пакет Neural Network Wizard может быть использован без предварительной инсталляции.

    Методика и порядок выполнения работы

    Прежде чем запускать программу, необходимо в любом текстовом редакторе подготовить текстовый файл с обучающей выборкой. Например, вычислим косинус. Фрагмент такого файла для функции Res = Cos(x) приведен ниже.

    В первой строке файла указываются имена входных/выходных переменных: Cos – имена входных переменных, Res – имя выходной переменной. Далее идут их значения в колонках.

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

    Файл сохраняется как текстовый с расширением .txt (Косинус.txt).

    После запуска программы в первом окне задается имя файла с обучающей выборкой (рисунок 2.1).


    Рисунок 2.1 – Выбор файла с обучающей выборкой

    На вход нейросети должна подаваться информация в нормализованном виде, т.е. это числа в диапазоне от 0 до 1. Можно выбрать метод нормализации на вкладке Нормализовать поле как.

    (X-MIN)/(MAX-MIN) – линейная нормализация.

    1/(1+exp(ax)) – экспоненциальная нормализация.

    Авто – нормализация, основанная на статистических характеристиках выборки

    Без нормализации – нормализация не производится.


    Рисунок 2.2 – Определение входных и выходных данных

    На вкладке Параметры нормализации задать значения, используемые в формулах нормализации.


    Рисунок 2.3 – Определение параметров структуры нейросети.

    Кнопка «Далее» переводит к следующему окну (рисунок 2.3), где определяются структура и параметры нейросети: количество скрытых слоев, количество нейронов в каждом слое, а также вид сигмоидальнойной функции.

    Нейронная сеть состоит из слоев: входного, выходного и скрытых. Необходимо указать количество скрытых слоев. Общего правила определения количества таких слоев нет, обычно задается 1-3 скрытых слоя. Но считается, что чем более нелинейная задача, тем больше скрытых слоев должно быть у нейронной сети.

    В Neural Network Wizard все элементы предыдущего слоя связаны со всеми элементами последующего. Количество нейронов в первом и последнем слое зависит от того, сколько полей в обучающей выборке указаны как входные и выходные. Необходимо задать количество нейронов в каждом скрытом слое. Общих правил определения количества нейронов нет, но необходимо, чтобы число связей между нейронами было значительно меньше количества примеров в обучающей выборке. Иначе нейросеть потеряет способность к обобщению, а просто «запомнит» все примеры из обучающей выборки (так называемый «эффект переобучения»).

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

    В следующем окне (рисунок 2.4) задаются параметры обучения и критерии остановки обучения, если она требуется.

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


    Рисунок 2.4 – Параметры обучения

    Скорость обучения. Параметр определяет амплитуду коррекции весов на каждом шаге обучения.

    Момент. Параметр определяет степень воздействия i-ой коррекции весов на i+1-ую.

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

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

    Кнопка «Далее» показывает окно с конфигурацией нейросистемы, заданные параметры (рисунок 2.5).


    Рисунок 2.5 – Заданные параметры нейросети

    В следующем окне визуализирован непосредственно сам процесс обучения (рис. 2.6). Чтобы запустить обучение, нажимается кнопка «Пуск обучения». На верхней диаграмме показано распределение ошибки обучения: по горизонтали – значение ошибки (чем правее столбец, тем больше ошибка), по вертикали – количество примеров из выборки с данной ошибкой (чем выше столбец, тем больше примеров с указанной ошибкой). Зеленые столбцы – ошибка на рабочей обучающей выборке, красные – на тестовой. В процессе обучения столбцы должны стремиться в левую часть диаграммы.

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


    Рисунок 2.6 – Обучение системы

    Остановка обучения происходит либо по ранее указанному критерию, либо с помощью той же кнопки «Пуск обучения».


    Рисунок 2.7 – Работа с обученной нейронной сетью

    В следующем окне (рис. 2.7) представляется возможность оценить точность работы обученной нейросети в эксплуатационном режиме. Для этого в левом поле указывается произвольное значение входного сигнала. После нажатия на кнопку «Расчет» в правом поле появляется рассчитанное сетью значение.

    Кнопка «Сохранить» позволяет записать параметры обученной сети в виде файла (по умолчанию расширение файла NNW).

    Сеть обучалась последние 12 часов. Всё выглядело хорошо: градиенты стабильные, функция потерь уменьшалась. Но потом пришёл результат: все нули, один фон, ничего не распознано. «Что я сделал не так?», — спросил я у компьютера, который промолчал в ответ.

    Почему нейросеть выдаёт мусор (например, среднее всех результатов или у неё реально слабая точность)? С чего начать проверку?

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

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

    1. Начните с простой модели, которая точно правильно работает для этого типа данных (например, VGG для изображений). Используйте стандартную функцию потерь, если возможно.
    2. Отключите все финтифлюшки, например, регуляризацию и аугментацию данных.
    3. В случае тонкой настройки модели дважды проверьте препроцессинг, чтобы он соответствовал обучению первоначальной модели.
    4. Удостоверьтесь в правильности входных данных.
    5. Начните с действительно маленького набора данных (2-20 образцов). Затем расширяйте его, постепенно добавляя новые данные.
    6. Начните постепенно добавлять обратно все фрагменты, которые были опущены: аугментация/регуляризация, кастомные функции потерь, пробуйте более сложные модели.

    1. Проверьте входные данные

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

    2. Попробуйте случайные входные значения

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

    3. Проверьте загрузчик данных

    С данными всё может быть в порядке, а ошибка в коде, который передаёт входные данные нейросети. Распечатайте и проверьте входные данные первого слоя перед началом его операций.

    4. Убедитесь, что вход соединяется с выходом

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

    5. Взаимоотношение между входом и выходом слишком случайно?

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

    6. Слишком много шума в наборе данных?

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

    Данный пункт достоин отдельного разговора, потому что эта работа показывает точность выше 50% на базе MNIST при 50% повреждённых меток.

    7. Перемешайте набор данных

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

    8. Снизьте несбалансированность классов

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

    9. Достаточно ли образцов для обучения?

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

    10. Убедитесь в отсутствии партий с единственной меткой

    Такое случается в отсортированном наборе данных (то есть первые 10 тыс. образцов содержат одинаковый класс). Легко исправляется перемешиванием набора данных.

    11. Уменьшите размер партий

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

    Дополнение 1. Используйте стандартный набор данных (например, mnist, cifar10)

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


    12. Откалибруйте признаки

    Вы откалибровали входные данные на нулевое среднее и единичную дисперсию?

    13. Слишком сильная аугментация данных?

    Аугментация имеет регуляризующий эффект. Если она слишком сильная, то это вкупе с другими формами регуляризации (L2-регуляризация, dropout и др.) может привести к недообучению нейросети.

    14. Проверьте предобработку предварительно обученной модели

    Если вы используете уже подготовленную модель, то убедитесь, что используются та же нормализация и предобработка, что и в модели, которую вы обучаете. Например, должен пиксель быть в диапазоне [0, 1], [-1, 1] или [0, 255]?

    15. Проверьте предварительную обработку для набора обучение/валидация/тестирование

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

    Также проверьте на предмет наличия различающейся предварительной обработки каждого образца и партии.

    16. Попробуйте решить более простой вариант задачи

    Это поможет определить, где проблема. Например, если целевая выдача — это класс объекта и координаты, попробуйте ограничить предсказание только классом объекта.

    17. Поищите правильную функцию потерь «по вероятности»

    Снова из бесподобного CS231n: Инициализируйте с небольшими параметрами, без регуляризации. Например, если у нас 10 классов, то «по вероятности» означает, что правильный класс определится в 10% случаев, а функция потерь Softmax — это обратный логарифм к вероятности правильного класса, то есть получается

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

    18. Проверьте функцию потерь

    Если вы реализовали свою собственную, проверьте её на баги и добавьте юнит-тесты. У меня часто бывало, что слегка неправильная функция потерь тонко вредила производительности сети.

    19. Проверьте входные данные функции потерь

    Если вы используете функцию потерь из фреймворка, то убедитесь, что передаёте ей то что нужно. Например, в PyTorch я бы смешал NLLLoss и CrossEntropyLoss, потому что первая требует входных данных softmax, а вторая — нет.

    20. Отрегулируйте веса функции потерь

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

    21. Отслеживайте другие показатели

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

    22. Проверьте каждый кастомный слой

    Вы самостоятельно реализовали какие-то из слоёв сети? Дважды проверьте, что они работают как полагается.

    23. Проверьте отсутствие «зависших» слоёв или переменных

    Посмотрите, может вы неумышленно отключили обновления градиента каких-то слоёв/переменных.

    24. Увеличьте размер сети

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

    25. Поищите скрытые ошибки измерений

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

    26. Исследуйте Gradient Checking

    Если вы самостоятельно реализовали Gradient Descent, то с помощью Gradient Checking можно убедиться в корректной обратной связи. Дополнительная информация: 1, 2, 3.

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

    Переобучите сеть на маленьком наборе данных и убедитесь в её работе. Например, обучите её всего с 1-2 примерами и посмотрите, способна ли сеть различать объекты. Переходите к большему количеству образцов для каждого класса.

    28. Проверьте инициализацию весов

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

    29. Измените гиперпараметры

    Может вы используете плохой набор гиперпараметров. Если возможно, попробуйте grid search.

    30. Уменьшите регуляризацию

    Из-за слишком сильной регуляризации сеть может конкретно недообучиться. Уменьшите регуляризацию, такую как dropout, batch norm, L2-регуляризацию weight/bias и др. В отличном курсе «Практическое глубинное обучение для программистов» Джереми Говард рекомендует в первую очередь избавиться от недообучения. То есть нужно достаточно переообучить сеть на исходных данных, и только затем бороться с переобучением.

    31. Дайте время

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

    32. Переходите от режима обучения в режим тестирования

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

    33. Визуализируйте обучение

    • Отслеживайте активации, веса и обновления для каждого слоя. Убедитесь, что отношения их величин совпадают. Например, отношение величины обновлений к параметрам (весам и смещениям) должно равняться 1e-3.
    • Рассмотрите библиотеки визуализации вроде Tensorboard и Crayon. В крайнем случае, можно просто печатать значения весов/сдвигов/активаций.
    • Будьте осторожны с активациями сетей со средним намного больше нуля. Попробуйте Batch Norm или ELU. указал, на что смотреть в гистограммах весов и сдвигов:
    «Для весов эти гистограммы должны иметь примерно гауссово (нормальное) распределение, спустя какое-то время. Гистограммы сдвигов обычно начинаются с нуля и обычно заканчиваются на уровне примерно гауссова распределения (единственное исключение — LSTM). Следите за параметрами, которые отклоняются на плюс/минус бесконечность. Следите за сдвигами, которые становятся слишком большими. Иногда такое случается в выходном слое для классификации, если распределение классов слишком несбалансировано».
    • Проверяйте обновления слоёв, они должны иметь нормальное распределение.

    34. Попробуйте иной оптимизатор

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

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

    35. Взрыв/исчезновение градиентов

    • Проверьте обновления слоя, поскольку очень большие значения могут указывать на взрывы градиентов. Может помочь клиппинг градиента.
    • Проверьте активации слоя. Deeplearning4j даёт отличный совет: «Хорошее стандартное отклонение для активаций находится в районе от 0,5 до 2,0. Значительный выход за эти рамки может указывать на взрыв или исчезновение активаций».

    36. Ускорьте/замедлите обучение

    Низкая скорость обучения приведёт к очень медленному схождению модели.

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

    Поэкспериментируйте со скоростью обучению, ускоряя либо замедляя её в 10 раз.

    37. Устранение состояний NaN

    Состояния NaN (Non-a-Number) гораздо чаще встречаются при обучении RNN (насколько я слышал). Некоторые способы их устранения:

    Читайте также: