Новости

Viewing posts for the category habrahabr

Пишем бот для рыбалки в игре Albion Online на языке Python

https://habr.com/ru/post/459110/
  • Python
  • Программирование
  • Игры и игровые приставки

Нейросети и глубокое обучение, глава 3, ч.1: улучшение способа обучения нейросетей

https://habr.com/ru/post/458724/
  • Python
  • Программирование
  • Искусственный интеллект



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

Среди техник, которым мы научимся в этой главе: лучший вариант на роль функции стоимости, а именно функция стоимости с перекрёстной энтропией; четыре т.н. метода регуляризации (регуляризации L1 и L2, исключение нейронов [dropout], искусственное расширение обучающих данных), улучшающих обобщаемость наших НС за пределы обучающих данных; лучший метод инициализации весов сети; набор эвристических методов, помогающих выбирать хорошие гиперпараметры для сети. Я также рассмотрю и несколько других техник, чуть более поверхностно. Эти обсуждения по большей части не зависят друг от друга, поэтому их можно по желанию перепрыгивать. Мы также реализуем множество технологий в рабочем коде и используем их для улучшения результатов, полученных для задачи классификации рукописных цифр, изученной в главе 1.

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

Функция стоимости с перекрёстной энтропией


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

В идеале мы ожидаем, что наши нейросети будут обучаться быстро на своих ошибках. Происходит ли это на практике? Для ответа на этот вопрос посмотрим на надуманный пример. В нём участвует нейрон всего с одним входом:



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

Для определённости я выберу изначальный вес 0,6 и изначальное смещение 0,9. Это некие общие величины, назначенные в качестве отправной точки, и я не выбирал их специально. Изначально нейрон на выходе выдаёт 0,82, поэтому нам нужно многому научиться, чтобы он приблизился к желаемому выводу 0,0. В оригинале статьи есть интерактивная форма, на которой можно кликнуть «Run» и наблюдать процесс обучения. Это не записанная заранее анимация, браузер реально вычисляет градиент, а потом использует его для обновления веса и смещения, и демонстрирует результат. Скорость обучения η=0,15, достаточно медленная, чтобы могли видеть, что происходит, но достаточно быстрая, чтобы обучение шло за секунды. Функция стоимости С – квадратичная, введённая в первой главе. Я вскоре напомню вам об её точной форме, поэтому не обязательно возвращаться и рыться там. Обучение можно запускать несколько раз, просто нажимая на кнопку «Run».

Как видите, нейрон быстро выучивает вес и смещение, понижающие стоимость, и даёт на выходе 0,09. Это не совсем желаемый результат 0,0, но достаточно неплохой. Допустим, что мы вместо этого выберем начальные вес и смещение 2,0. В данном случае изначальный выход будет равен 0,98, что совсем неверно. Давайте посмотрим, как в этом случае нейрон будет учиться выдавать 0.

Хотя этот пример использует ту же скорость обучения (η=0,15), мы видим, что обучение проходит медленнее. Порядка 150 первых эпох веса и смещения почти не меняются. Затем обучение разгоняется, и, почти как в первом примере, нейрон быстро движется к 0,0. такое поведение странное, не похожее на обучение человека. Как я сказал в начале, мы часто быстрее всего учимся, когда сильно ошибаемся. Но мы только что видели, как наш искусственный нейрон с большим трудом учится, сильно ошибаясь – гораздо труднее, чем когда он ошибался немного. Более того, оказывается, что такое поведение возникает не только в нашем простом примере, но и в НС более общего назначения. Почему обучение идёт так медленно? Можно ли найти способ избежать данной проблемы?

Чтобы понять источник проблемы, вспомним, что наш нейрон обучается через изменение веса и смещения со скоростью, определяемой частными производными функции стоимости, ∂C/∂w и ∂C/∂b. Так что сказать «обучение идёт медленно», это всё равно, что сказать, что эти частные производные малы. Проблема в том, чтобы понять, почему они малы. Для этого давайте вычислим частные производные. Вспомним, что мы используем квадратичную функцию стоимости, которая задаётся уравнением (6):

$ C = \frac{(y-a)^2}{2} \tag{54} $

Linux-разработка в Windows с WSL и Visual Studio Code Remote

https://habr.com/ru/company/microsoft/blog/458880/
  • Блог компании Microsoft
  • Python
  • Visual Studio
  • Разработка под Linux
  • Разработка под Windows

Заполняем документы в Microsoft Word при помощи Python. Часть 2

https://habr.com/ru/post/459152/
  • Python

Внедрение Airflow для управления Spark-джобами в ivi: надежды и костыли

https://habr.com/ru/company/ivi/blog/456630/
  • Блог компании Онлайн-кинотеатр ivi
  • Python
  • Big Data
  • DevOps

Recent Posts

Archive

2019
2018
2017
2016
2015
2014

Categories

Authors

Feeds

RSS / Atom