Шаг 8.
Основы создания нейросети на Python.
Как работают нейронные сети. Тренировка простого классификатора (окончание)

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

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

    Начнем с линейной функции для классификатора:

    у = Ах

    Нам уже известно, что начальные попытки присвоения пробных значений параметру А привели к неверным значениям у, если ориентироваться на тренировочные данные. Пусть t - корректное целевое значение. Чтобы получить его, мы должны ввести в А небольшую поправку. Для таких поправок в математике принято использовать символ Δ, означающий "небольшое изменение". Запишем соответствующее уравнение:

    t = (А + ΔА)х

    Отобразим это соотношение в графическом виде на диаграмме, на которой показаны линии для двух значений наклона: А и А + ΔА.

    Вспомните, что ошибку Е мы определили как разность между желаемым корректным значением у и расчетным значением, полученным для текущего пробного значения А. Таким образом, Е = t - у.

    Запишем это в явном виде:

    t - у = (А + ΔА)х - Ах

    Раскрыв скобки и приведя подобные члены, получаем:

    E = t - y = Ax + (ΔА)х - Ах
    Е = (ΔА)х

    Это просто замечательно! Ошибка Е связана с ΔА очень простым соотношением. Оно настолько простое, что поначалу даже засомневаешься, не кроется ли где-то ошибка, но оно оказалось действительно верным. Как бы то ни было, это простое соотношение значительно упрощает нашу работу.

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

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

    ΔА = Е / х

    Есть! Это и есть то волшебное выражение, которое мы искали. Теперь мы можем использовать ошибку Е для изменения наклона классифицирующей линии на величину ΔA в нужную сторону.

    Примемся за дело - обновим начальный наклон линии.

    Когда х был равен 3,0, ошибка была равна 0,35. Таким образом, ΔА = Е/х превращается в 0,35 / 3,0 = 0,1167. Это означает, что текущее значение А=0,25 необходимо изменить на величину 0,1167. Отсюда следует, что новое, улучшенное значение А равно (А + ΔА), т.е. 0,25 + 0,1167 = 0,3667. Не составляет труда убедиться в том, что расчетное значение у при новом значении А равно, как и следовало ожидать, 1,1 - желаемому целевому значению.

    Ух ты! У нас получилось! Все работает, и мы располагаем методом для улучшения параметра А, если известна текущая ошибка.

    Давайте поднажмем.

    Закончив с первым примером, потренируемся на втором. Он дает нам следующие истинные данные: х=1,0 и у=3,0.

    Посмотрим, что получится, если вставить х=1,0 в линейную функцию, в которой теперь используется обновленное значение А=0,3667. Мы получаем у = 0,3667 * 1,0 = 0,3667. Это очень далеко от значения у=3,0 в тренировочном примере.

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

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

    Опять обновим А, как делали до этого. Соотношение ΔА=Е/х дает 2,5333 / 1,0 = 2,5333. Это означает, что после очередного обновления параметр А принимает значение 0,3667 + 2,5333 = 2,9. Отсюда следует, что для х=1,0 функция возвращает в качестве ответа значение 2,9, которое и является желаемым целевым значением.

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

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

    Ну что тут сказать? Мы получили то, что просили. Линия обновляется, подстраиваясь под то целевое значение у, которое мы задаем.

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

    Как исправить эту ситуацию?

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

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

    Ну что ж, сделаем перерасчет, на этот раз добавив сглаживание в формулу обновления:

    ΔА = L (Е / X)

    Фактор сглаживания, обозначенный здесь как L, часто называют коэффициентом скорости обучения. Выберем L=0,5 в качестве разумного начального приближения. Это означает, что мы собираемся использовать поправку вдвое меньшей величины, чем без сглаживания.

    Повторим все расчеты, используя начальное значение A=0,25. Первый тренировочный пример дает нам у = 0,25 * 3,0 = 0,75. При целевом значении 1,1 ошибка равна 0,35. Поправка равна

    ΔА = L (Е / х) = 0,5 * 0,35 / 3,0 = 0,0583. 
Обновленное значение А равно 0,25 + 0,0583 = 0,3083.

    Проведение расчетов с этим новым значением А для тренировочного примера при х=3,0 дает у = 0,3083 * 3,0 = 0, 9250. Как видим, расположение этой линии относительно тренировочных данных оказалось неудачным - она проходит ниже значения 1,1, но этот результат не так уж и плох, если учесть, что это была всего лишь первая попытка. Главное то, что мы движемся в правильном направлении от первоначальной линии.

    Перейдем ко второму набору тренировочных данных при х=1,0. Используя А=0,3083, мы получаем у = 0,3083 * 1,0 = 0,3083. Желаемым значением было 2,9, поэтому ошибка составляет (2,9 - 0,3083) = - 2,5917. Поправка ΔА = L (Е / х) = 0,5 * 2,5917 / 1,0 = 1,2958. Теперь обновленное значение А равно 0,3083 + 1,2958 = 1,6042.

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

    Это действительно отличный результат!

    Всего лишь с двумя простыми тренировочными примерами и относительно простым методом обновления мы, используя сглаживание скорости обучения, смогли очень быстро получить хорошую разделительную линию у=Ах, где А=1,6042.

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

    Великолепно!

    Резюме

    На следующем шаге мы поговорим о количестве классификаторов.




Предыдущий шаг Содержание Следующий шаг