Новости

Viewing posts for the category habrahabr

Создание todo mvc на Htmlix часть 2 — добавление вариантов шаблона в todo container

https://habr.com/ru/post/456874/
  • JavaScript
  • Программирование

Почему Math.Round открывает окно печати из браузера в Try .NET

https://habr.com/ru/post/456880/
  • JavaScript
  • .NET
  • Отладка

13 полезных однострочников на JavaScript

https://habr.com/ru/company/ruvds/blog/456338/
  • Блог компании RUVDS.com
  • Разработка веб-сайтов
  • JavaScript

Нейросети и глубокое обучение: онлайн-учебник, глава 1

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


Примечание


Michael NielsenПеред вами – перевод свободной онлайн-книги Майкла Нильсена «Neural Networks and Deep Learning», распространяемой под лицензией Creative Commons Attribution-NonCommercial 3.0 Unported License. Мотивацией к его созданию послужил успешный опыт перевода учебника по программированию, "Выразительный JavaScript". Книга по нейросетям тоже достаточно популярна, на неё активно ссылаются авторы англоязычных статей. Её переводов я не нашёл, за исключением перевода начала первой главы с сокращениями.

Желающие отблагодарить автора книги могут сделать это на её официальной странице, переводом через PayPal или биткоин. Для поддержки переводчика на Хабре есть форма «поддержать автора».

Введение


Этот учебник подробно расскажет вам о таких понятиях, как:

  • Нейросети — прекрасная программная парадигма, созданная под влиянием биологии, и позволяющая компьютеру учиться на основе наблюдений.
  • Глубокое обучение – мощный набор техник обучения нейросетей.

Нейросети (НС) и глубокое обучение (ГО) на сегодня дают наилучшее решение многих задач из областей распознавания изображений, голоса и обработки естественного языка. Этот учебник научит вас многим ключевым концепциям, лежащим в основе НС и ГО.

О чём эта книга


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

Автоматическое обучение на основе данных звучит многообещающе. Однако до 2006 года мы не знали, как обучать НС так, чтобы они могли превзойти более традиционные подходы, за исключением нескольких особых случаев. В 2006 были открыты техники обучения т.н. глубоких нейросетей (ГНС). Теперь эти техники известны, как глубокое обучение (ГО). Их продолжали разрабатывать, и сегодня ГНС и ГО достигли потрясающих результатов во многих важных задачах, связанных с компьютерным зрением, распознаванием речи и обработки естественного языка. В крупных масштабах их развёртывают такие компании, как Google, Microsoft и Facebook.

Цель этой книги – помочь вам овладеть ключевыми концепциями нейросетей, включая и современные техники ГО. Поработав с учебником, вы напишете код, использующий НС и ГО для решения сложных задач распознавания закономерностей. У вас появится фундамент для использования НС и ГО в подходе к решению собственных задач.

Подход с упором на принципы


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

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

Практический подход


Мы изучим основные принципы на примере конкретной задачи: обучения компьютеру распознавания рукописных цифр. Используя традиционные подходы к программированию, такую задачу решить чрезвычайно тяжело. Однако мы сможем достаточно неплохо решить её при помощи простой НС и нескольких десятков строчек кода, без всяких специальных библиотек. Более того, мы будем постепенно улучшать эту программу, последовательно включая в неё всё больше и больше ключевых идей о НС и ГО.

Такой практический подход означает, что вам потребуется некий опыт в программировании. Но вам не обязательно быть профессиональным программистом. Я написал код на python (версии 2.7), который должен быть понятным, даже если вы не писали программ на python. В процессе изучения мы создадим свою библиотечку для НС, которую вы сможете использовать для экспериментов и дальнейшего обучения. Весь код можно скачать по ссылке. Закончив книгу, или в процессе чтения, вы сможете выбрать одну из более завершённых библиотек для НС, приспособленных для использования в настоящих проектах.

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

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

Упражнения и задачи


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

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

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

Задачи – дело другое. Они сложнее упражнений, и с некоторыми вам придётся тяжело. Это раздражает, но, конечно, терпение перед лицом такого разочарования – это единственный способ по-настоящему понять и усвоить предмет.

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

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

Глава 1


Зрительная система человека – одно из чудес света. Рассмотрим следующую последовательность рукописных цифр:



Большинство людей без труда прочтут их, как 504192. Но эта простота обманчива. В каждом полушарии мозга у человека есть первичная зрительная кора, также известная, как V1, в которой содержится 140 млн нейронов и десятки миллиардов связей между ними. При этом в зрении человека участвует не только V1, но целая последовательность участков мозга — V2, V3, V4 и V5 – которые занимаются всё более сложной обработкой изображений. Мы носим в своей голове суперкомпьютер, настроенный эволюцией в течение сотен миллионов лет, и прекрасно адаптированный для понимания видимого мира. Распознавать рукописные цифры не так-то легко. Просто мы, люди, потрясающе, удивительно хорошо распознаём то, что показывают нам наши глаза. Но почти вся эта работа проводится бессознательно. И обычно мы не придаём значения тому, какую сложную задачу решают наши зрительные системы.

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

НС подходят к решению задачи по-другому. Идея в том, чтобы взять множество рукописных цифр, известных, как обучающие примеры,



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

В этой главе мы напишем компьютерную программу, реализующую НС, обучающуюся распознавать рукописные цифры. Программа будет всего в 74 строки длиной, и не будет использовать специальных библиотек для НС. Однако эта короткая программа сможет распознавать рукописные цифры с точностью более 96%, не требуя вмешательства человека. Более того, в дальнейших главах мы разработаем идеи, способные улучшить точность до 99% и более. На самом деле лучшие коммерческие НС настолько хорошо справляются с задачей, что используются банками для обработки чеков, и почтовой службой – для распознавания адресов.

Мы концентрируемся на распознавании рукописного текста, поскольку это прекрасный прототип задачи для изучения НС. Такой прототип идеально подходит для нас: это сложная задача (распознать рукописные цифры – дело непростое), но не настолько сложная, чтобы для неё требовалось чрезвычайно сложное решение или необъятные вычислительные мощности. Более того, это прекрасный способ для разработки более сложных техник, таких, как ГО. Поэтому в книге мы будем постоянно возвращаться к задаче распознавания рукописного текста. Позже мы обсудим, как эти идеи можно применить к другим задачам компьютерного зрения, к распознаванию речи, обработке естественного языка и другим областям.

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

Перцептроны


Что такое нейросеть? Для начала я расскажу об одном типе искусственного нейрона, который называется перцептрон. Перцептроны придумал в 1950-60-х учёный Фрэнк Розенблатт, вдохновившись ранней работой Уоррена Мак-Каллока и Уолтера Питтса. Сегодня чаще используются другие модели искусственных нейронов – в данной книге, и большинстве современных работ по НС в основном используют сигмоидную модель нейрона. Мы вскоре с ней познакомимся. Но чтобы понять, почему сигмоидные нейроны определяются именно так, стоит потратить время на разбор перцептрона.

Так как же работают перцептроны? Перцептрон принимает на вход несколько двоичных чисел x1,x2,… и выдаёт одно двоичное число:



В данном примере у перцептрона есть три числа на входе, x1, x2, x3. В общем случае их может быть больше или меньше. Розенблатт предложил простое правило для вычисления результата. Он ввёл веса, w1, w2, вещественные числа, выражающие важность соответствующих входных чисел для результатов. Выход нейрона, 0 или 1, определяется тем, меньше или больше некоего порога [threshold] взвешенная сумма $\sum_j w_jx_j$. Как и веса, порог – вещественное число, параметр нейрона. Говоря математическими терминами:

$ output = \begin{cases} 0 ~ if ~ \sum_j w_jx_j \leq threshold \\ 1 ~ if ~ \sum_j w_jx_j > threshold \end{cases} \tag{1} $

3 практических примера использования деструктурирования в JavaScript

https://habr.com/ru/post/456944/
  • JavaScript
  • Программирование
  • Совершенный код


Пишем код чище, используя паттерны деструктурирования



Вы, наверное, уже знакомы с деструктурированием в JavaScript. Оно пришло к нам в 2015 году в спецификации ES6, но если вам нужно освежить знания, то на сайте Mozilla можно почитать большую подробную статью, как это всё работает.

Recent Posts

Archive

2019
2018
2017
2016
2015
2014

Categories

Authors

Feeds

RSS / Atom