Содержание статьи
Обучение нейронных сетей: проклятие размерности
Заключение
При погружении в мир нейронных систем мы обнаруживаем, что существует множество архитектур, отражающих их разнообразие и способности. Выделяются два ключевых типа: простые и глубокие нейросети. Оба вида имеют свои преимущества и ограничения. Чтобы получить хороший результат, важно научиться находить баланс между ними.
Нейронные сети могут быть использованы и без четкого понимания, как именно они обучаются, так же как вы используете фонарик без четкого понимания, как работает микросхема внутри него. Современные библиотеки машинного обучения значительно автоматизируют процесс обучения нейронных сетей. Хотя обычно хочется пропустить математическую часть и поскорее приступить к практике, все же стоит внимательно прочитать об этом, так как это конвертируется в значительное преимущество при перенастройке и конфигурации сетей. Более того обучение нейросетей было описано много лет назад, но только сейчас оно стало доступным, став новой вехой в развитии DS.
Есть множество методов «тренировки» нейронных сетей, но все они основываются на двух ключевых принципах: с помощью учителя и без него. Это происходит точно так же, как и у человека: можно приобретать новые знания под руководством наставника, который подскажет и скорректирует отдельные моменты, а можно заниматься самообразованием. В последнем случае человек опирается только на свой личный опыт и наблюдения.
Прежде чем мы закончим, я хочу кратко обсудить технику обучения, которая, я считаю, является важным инструментом для тех, кто работает с нейронными сетями. Первое, что нужно признать, это то, что скорость обучения не обязательно должна быть постоянной на протяжении всей процедуры обучения. Скорость обучения используется каждый раз, когда с помощью правила обучения обновляются веса; таким образом, если скорость обучения изменяется во время обучения, то тут же будет изменен и эволюционный путь нейросети к ее окончательной форме.
Так, а что же со второй сетью? Теперь нам нужно подобрать уже 3 веса и, следовательно, работать в трехмерном пространстве. Проделаем такие же операции 10*10*10 = 1000 вариантов и 100*100*100 = 1,000,000 вариантов соответственно при разных вариантах разбиения. Миллион вариантов — не так уж и страшно, но рост пугающий. И что же произойдет, когда мы перейдем к реальным сеткам?
В эпоху информационных технологий и научных открытий для решения сложных задач все чаще применяется искусственный интеллект. Среди множества его инструментов и методов особое место занимают нейронные сети — интеллектуальные роботы, имитирующие работу человеческого мозга. Однако для того чтобы нейросети смогли решать сложные задачи, их сначала необходимо обучить.
Машинное обучение и нейронные сети связаны между собой, однако это все же разные области искусственного интеллекта. В первом случае речь идет о широком термине, который означает использование алгоритмов для анализа данных, обучения на их основе и прогнозирования или принятия решений. Здесь могут использоваться разные способы: статистические методы, деревья решений и т. д.
Давайте начнем с самого наивного метода: случайный перебор. Установим веса случайным образом и подсчитаем результаты. Повторить много раз, сохранить все результаты, выбрать наиболее точные. На первый взгляд это кажется не таким уж плохим подходом. И действительно, компьютеры уже очень мощные, может быть мы можем получить решение брутфорсом? Для небольших нейронок (~30 нейронов) это и вправду работает. Но для задач из реального мира, где нейронов под 12,000 , случайный перебор теряет свою актуальность. Попробуйте найти иголку в 12000-мерном стоге сена методом простого перебора.
Алгоритмы обучения нейронных сетей
Нейронные сети — это подмножество машинного обучения, которое использует архитектуру, вдохновленную биологическими нейросетями. Это означает, что они состоят из слоев «нейронов», которые передают и преобразуют информацию. Они хорошо подходят для обработки сложных данных (изображения, звук).
Обучение с учителем (Supervised Learning) — это наиболее распространенный подход, при котором нейросеть обучается на основе предварительно размеченных данных. Эти данные включают в себя входные значения и соответствующие им целевые (ответы). Нейросеть обучается предсказывать последние на основе входных данных.
Если ваша нейросеть может быстро обрабатывать обучающие данные, вы можете просто выбрать несколько разных скоростей обучения и сравнить полученные веса (если вы знаете, какими они должны быть) или ввести свежие данные и оценить взаимосвязь между скоростью обучения и точностью классификации.
В первом случае нужно найти всего два веса. Как много попыток нужно сделать, чтобы угадать идеальный набор? Один из подходов — представить двумерное пространство возможных весов и до изнеможения искать нужную комбинацию при некотором разбиении. Возможно, мы можем разбить каждую ось на 10 частей. Тогда попыток всего будет 10^2 = 100. Не так уж и плохо, но давайте сделаем разбиение более мелким, чтобы подобрать веса корректнее, например на 100 частей. Тогда уже комбинаций может быть 10,000. Достаточно маленькое число, компьютер сможет обработать его меньше, чем за секунду.
Более сложный подход, который был бы более практичным для нейросетей, требующих длительного времени обучения, заключается в анализе изменений в ошибках во время обучения сети. Ошибка должна уменьшаться в направлении минимума, а изменения в ошибке должны быть достаточно малыми, чтобы избежать «прыгающего» поведения, показанного выше, но не настолько маленькими, чтобы нейросеть обучалась крайне медленно. Как и многие другие вещи в жизни, скорость обучения зависит от баланса.
Обучение нейронной сети — это процесс, в ходе которого модель искусственного интеллекта (в данном случае нейронная сеть) учится выполнять определенные задачи на основе предоставленных ей данных. Это может быть, например, распознавание образов или предсказание тенденций.
Влияние скорости обучения
Каждый раз, когда мы применяем это правило обучения, вес переходит в новую точку на кривой ошибки. Если \(\delta\) велика, эти скачки также могут быть довольно большими, и нейросеть может обучаться неэффективно, потому что веса не сходятся постепенно к минимальной ошибке. Вместо этого они хаотично прыгают, как показано ниже.
Если наша стратегия наугад найти веса, то логично задаться вопросом, сколько нужно сделать попыток для получения приемлемого набора весов. Интуитивно мы ожидаем, что сделав достаточно попыток мы покроем все пространство и найдем идеальный набор весов. Без априорных знаний веса могут быть в любой точке пространства, поэтому имеет смысл рассматривать как можно больше разных весов из пространства.
Представьте, что вы альпинист на вершине горы и наступает ночь. Вам нужно добраться до лагеря, что внизу скалы, но в свете тусклого фонарика вы можете видеть лишь на несколько метров. Так как же спуститься вниз? Одна из стратегий — оглядеться и понять, какой склон наиболее крутой, но не слишком, и сделать шаг туда. Повторить данный процесс много раз и постепенно вы доберетесь до подножья горы. Если вы застрянете в долине, это немного замедлит вас.
В предыдущей статье была представлена концепция чаши ошибки, то есть трехмерной поверхности, которая помогает нам визуализировать процесс, посредством которого ошибка узла постепенно уменьшается до нуля по мере того, как его входные весовые коэффициенты изменяются во время обучения.
В машинном обучении данная проблема носит название “проклятие размерности”. Каждое измерение, которое мы добавляем, экспоненциально увеличивает количество требуемых для обобщения образцов. Проклятие размерности чаще всего применяется к наборам данных: чем больше столбцов или переменных, тем экспоненциально больше выборок в этом датасете нам нужно проанализировать. В нашем случае мы говорим о весах, а не о входных данных, но принцип остается неизменным — многомерное пространство огромно!
Во-первых, давайте проясним, что мы подразумеваем под «обучением». В контексте нейронных сетей «учиться» по значению более или менее эквивалентно «тренироваться», но с другой стороны это разные вещи. Инженер обучает нейронную сеть, предоставляя обучающие данные и выполняя процедуру обучения. В то время как это происходит, сеть учится – или, более конкретно, она учится аппроксимировать связь вход-выход, содержащуюся в обучающих данных. Проявлением обучения является изменение веса, а скорость обучения влияет на способ этого изменения.
Если у нас есть точка, местоположение которой определяется значениями двух весов и выходной ошибкой узла, каждая модификация весов заставляет точку перескакивать в другое место где-нибудь на этой поверхности ошибки. Эти прыжки стремятся к нижней части чаши, где ошибка сводится к минимуму; они не приводят напрямую к минимальной ошибке, потому что каждая обучающая выборка – это только маленький кусочек математической головоломки.
Не существует универсального правила, которое говорит вам, как выбрать скорость обучения, и нет даже точного и аккуратного способа определить оптимальную скорость обучения для заданного приложения. Обучение – это сложный и изменчивый процесс, и когда дело доходит до скорости обучения, вы должны полагаться на интуицию и эксперименты.