[БЕЗ_ЗВУКА] Есть
много разных способов выбора структуры нейронной сети.
Вы можете, например, взять сначала заведомо недостаточное
число нейронов в скрытом слое, потом их потихоньку добавлять,
если вы видите, что качество нейронной сети недостаточно.
Вот такой вот процесс постепенного добавления или постепенного удаления
нейронов, он обычно очень неплохо сходится к таким интересным решениям,
которые дают структуру нейронной сети нетривиально,
и если бы вы взяли структуру, полученную с самого начала и запустили
бы метод backpropagation, то возможно вы бы не пришли к тому же самому решению,
то есть встраивание каких-то структурных модификаций в нейронную сеть, в сам
алгоритм обратного распространения ошибок, может давать очень интересные результаты.
Ну и эмпирический опыт использования таких алгоритмов говорит, что после того,
как вы что-то поменяли в сети: удалили нейрон, добавили нейрон,
вырезали какие-то связи, для сети это шок — происходит резкое ухудшение качества
классификации, но если эти изменения были локальные и не очень большие,
сеть очень быстро восстанавливает качество классификации за счет того,
что основная масса коэффициентов уже неплохо настроена и она осталась.
И таким образом можно,
вот такими хирургическими вмешательствами в нейронную сеть,
постепенно приводить ее к той желаемой структуре, которую мы хотим иметь в конце.
И один из таких методов имеет смешное название Optimal Brain Damage
(оптимальная порча мозга или нейронной сети).
Значит, здесь идея заключается в том,
чтобы выбрать те коэффициенты,
которые наименьшим образом влияют на значение функционала,
они незначимые, тогда их можно обнулить и использовать оставшиеся коэффициенты,
то есть это способ перейти от полносвязной сети к неполносвязной.
В чем здесь заключается математика?
Если мы считаем, что мы уже пришли в локальный минимум функционала,
то тогда функционал можно рассматривать как… приближенно,
как параболическую поверхность в окрестности этой точки минимума,
то есть использовать приближение второго порядка.
Члены первого порядка здесь уходят, потому что мы считаем,
что в точке минимума первые производные уже равны 0.
Здесь опять-таки фигурирует гессиан, матрица,
которую мы решительным образом считать не хотим,
поэтому снова можно попользоваться вот такой грубой эвристикой,
что недиагональные элементы гессиана равны 0, и используются только диагональные.
Итак, если гессиан диагонален, то тогда вот эта квадратичная
форма по весам, а точнее по отклонениям дельта
значения весов от их значения в точке минимума функционала.
Вот по дельте мы получаем квадратичный функционал и коэффициенты
при вот этих дельтах, они показывают нам, насколько
значения функционала чувствительно к изменению соответствующего коэффициента.
Теперь давайте задумаемся.
А что значит, что коэффициент, например Wjh, мы хотим обнулить,
но это означает, что сейчас его значение ненулевое,
а мы выбираем такую дельту, чтобы оно стало нулевым.
Но это означает, что Wjh-тая = – Δ Wjh-тая.
И давайте посмотрим, а как тогда изменится значение функционала,
и увидим очень простую вещь, что приращение значения функционала при
обнулении коэффициента есть не что иное, как произведение квадрата этого
коэффициента на вторую производную функционала по этому коэффициенту.
Получилась некая величина, которая очень важна, и она называется «значимость»,
но причем английское слово имеет два значения, и они оба подходят: с одной
стороны — это «значимость», а с другой стороны — это «выпуклость».
Мы действительно и померили степень выпуклости функционала по данной
переменной Wjh.
И вот эта вот величина salience или значимость, она и показывает,
какие коэффициенты в первую очередь мы могли бы обнулить в нейронной сети.
И дальше процесс можно построить так,
что мы считаем все коэффициенты в той точке,
где значение функционала стабилизировалось, да?
Мы посчитаем, что мы уже пришли в точку локального экстремума и
применим там вычисление вот этих значимостей коэффициентов.
Для этого нам понадобятся, конечно,
вторые производные функционала по всем параметрам сети.
Здесь я не выписываю формулы, но поверьте, они очень легко выписываются в методе
обратного распространения ошибок, точно так же, как мы считаем первые производные,
эффективно пользуясь промежуточными величинами ошибок на скрытом слое,
точно так же можно посчитать и вторые производные,
то есть это делается не сложно, но просто надо аккуратно выписать формулы.
И теперь, если процесс минимизации пришел в минимум,
то мы можем решить, сколько коэффициентов мы обнуляем.
Конечно, сеть почувствует некоторый стресс, после того как мы обнулим эти
коэффициенты, но мы сделаем еще несколько итераций обратного распространения ошибки,
когда сеть снова придет в локальный экстремум, мы снова обнулим немного весов.
И таким образом, делая вот такие вот обнуления
раз за разом через нужное число итераций,
мы будем постепенно упрощать сеть, пока не приведем ее в такое состояние,
когда она уже не сможет работать, и число степеней свободы в нейронах уже будет
недостаточно для качественного решения задачи, и тогда мы остановимся.
То есть мы можем осуществить вот такое вот вырезание ненужных весовых коэффициентов
без ущерба для точности работы нейронной сети.
Ну и еще один специальный способ применения этого метода,
Optimal Brain Damage, — это отбор признаков.
Мы можем посчитать значимость salience не только для отдельного весового
коэффициента, но и для входного признака, j-того признака,
и оценить, действительно ли нам так необходим j-тый признак для того,
чтобы сеть имела хорошее качество.
И если действительно мы можем, упорядочив признаки по величинам их значимости,
обнулить все веса, которые используют значения этого признака,
то мы тем самым удаляем признак из модели.
Если это получается, то мы получаем модель,
которая используем меньшее число признаков.
Она и работать будет быстрее, и, возможно, меньше переобучаться,
если у нас эти удаленные признаки были шумовыми и неинформативными.
И здесь так же есть интересный эмпирический опыт, который показывает,
что такое вот постепенное, в процессе итерации и метода обратного
распространения, постепенное прореживание сети, обычно работает лучше,
чем если бы мы, зная изначально оптимальную структуру сети,
какие нейроны какими связями связаны, где не нулевые коэффициенты, вот если бы мы на
этой неполносвязной сети запустили бы back propagation, то, возможно,
мы не получили бы такого хорошего решения, как при постепенном упрощении сети.
В этом сила этого метода, Optimal Brain Damage.
Итак, резюмируя: отдельный нейрон мы
научились моделировать линейными классификаторами.
Нейронная сеть — это суперпозиция большого числа отдельных линейных нейронов.
Мы строим такие модели с надеждой на то, что их работа будет чем-то напоминать
работу нашего с вами мозга, и если мы много слоев
нейронной сети будем использовать, то мы получим систему, которая способна
обучаться по прецедентам и восстанавливать сколь угодно сложные функции.
И один из методов, который используется,
несмотря на то, что он был придуман в середине 80-х годов, до сих пор,
в том числе и для построения глубоких сетей, Deep Learning,
это один из распространенных способов обучения сетей.
Ну и наконец, мы с вами рассмотрели всевозможные эвристики для ускорения
сходимости и улучшения качества нейронной сети, их действительно
много и их совместное применение составляет, ну, некоторое искусство.
Вам нужно попробовать решить несколько достаточно сложных задач: регрессия,
классификация с помощью многослойных нейронных сетей,
прежде чем вы начнете чувствовать, какие именно из этих эвристик
и в какие моменты надо использовать.
[БЕЗ_ЗВУКА]