Читать онлайн Машинное обучение на практике – от модели PyTorch до Kubeflow в облаке для BigData бесплатно
О книге
Книга построена как учебник – от простого к сложному. Читатель сможет:
* в первых трёх главах создать простейшую нейронную сеть распознавания и классификации изображений,
* в последующих – углубиться в устройство и архитектуру для оптимизации,
* далее расширить понимание экосистемы как компании в целом, в которой работают нейронные сети, как её составная часть, способы ее взаимодействия с окружающими технологиями и их использование,
* закончить изучение развёртыванием полномасштабной производственной системы в облаке полного цикла.
Фактически каждая глава в начале даёт общую информацию, необходимую для последующей практической части. В практической части:
* демонстрируется процесс подготовки окружения, но чаще используются бесплатные готовые облачные сервисы,
* демонстрируется процесс написания совместно с разбором написанного и обзором альтернативных решений,
* проводится анализ результата и формирование способов дальнейшего развития.
Книга состоит из разделов:
* Введение в Машинное обучение. Это единственная глава без практической части, созданная для того, чтобы дать начальное представление о границах применимости машинного обучения, преимуществах перед другими методами и об общем устройстве нейронных сетей для начинающих. Также производится классификация нейронных сетей по принципам, заложенных в них, и разделение на группы, о которых будет говориться в книге.
* Основы для написания сетей. Здесь даются базовые знания, необходимые для написания первой сети на PyTorch, знакомство со средой разработки Jupyter в облачном сервисе Google Colab, которая является упрощенным вариантом облачной платформы Google ML, запуск кода в нём и использование фреймворка на написания нейронных сетей PyTorch.
* Создаём первую сеть. Автор демонстрирует для практики читателя создание простой нейронной сети на PyTorch в Colab с детальным разбором написанного кода, обучение её на DataSet изображений MNIST и запуском.
* Улучшаем распознавание нейросети на сложных изображениях. Здесь автор для читателя демонстрирует на практике обучение нейронным сетям для цветных картинок, методы повышения качества предсказаний сети. Детально разбирается устройство, подводные камни при написании и обучении эффективных нейронных сетей.
* Современные архитектуры нейронных сетей. Приводятся архитектурные принципы, используемые в современных нейронных сетях для повышения качества предсказаний. Приводится разбор различных архитектур нейронных сетей, сделавших прорыв в качестве обучения и принёсших новые подходы. Рассматриваются различные архитектурные универсальные паттерны увеличения качества, такие как создание ансамблей нейронных сетей.
* Использование предобученных сетей. Демонстрируется использование в своих сетях уже обученных слоёв.
* Масштабирование ML. Приводятся примеры подготовки окружения для запуска их в облачной инфраструктуре.
* Получение данных от BigData. Рассказывается, как можно из Jupyter подключаться к различным источникам данных, в том числе BigData, для обучения моделей.
* Подготовка больших данных. В этом разделе описываются BigData технологии, такие как Hadoop и Spark, которые являются источниками данных для обучения моделей.
* ML в промышленной среде. В этом разделе рассказываются о таких системах, как Kubeflow и MLflow. Читатель может попробовать развернуть платформу, настроить процесс обучения и запустить в облачной среде модель, как это делается в компаниях.
Об авторе. Автор является корпоративным (главным) архитектором крупного подразделения (трайба) компании Сбер. Сбер лидер по объёмам накопленных данных в России и обладатель вычислительного центра для обучения моделей Кристофари, занимающей 39 место в ТОП500 мира и самый мощный в России и СНГ (первое место в ТОП50 СНГ), в нём разработано более 5000 моделей более тысячью DataSience учёных. Автор проходил обучение (Sber AI Architect, Sber Certified Architect) в Сбер в области искусственного интеллекта, создавал внутренние курсы по этой тематике для других архитекторов, разрабатывал предиктивную аналитику на машинном обучении в нейронных сетях для универсальных облачных систем, участвовал в качестве ментора (команда заняла 2 место среди всех команд Сбер) и оценщиком на соревнованиях Сбер.
Введение в машинное обучение
Искусственный интеллект (Artificial Intelligence, AI) – это область науки, созданная на стыке многих академических наук. Терми бы введён в 1956 году, в эпоху попыток эмитировать работу человеческого мозга. Один из способов его достижения – машинное обучение (Machine Learning). Дисциплина машинное обучение (ML) строится на трёх составляющих: данных (разнородные данные), алгоритмах и признаках. Другие, смежные дисциплины, строятся на двух сущностях. Так, классическое программирование строится на алгоритмах, применяемых к конкретным признакам, Data Scienes – на данных и получаемых из них фичах, Data Mining – на обработке алгоритмах и данных. ML с помощью алгоритмов и фич предоставляет новые данных. Так, как ML использует фичи, которые подаются как основа для обучения, то он использует результаты Data Scienes. Для разработки самих сетей используются языки программирования.
Когда мы подаём нейронные сети данных, на их основе происходит обучение нахождению решений и выявление закономерностей и данных, ранее которых не было. Для обучения могут использоваться статистические алгоритмы, например, на языке R, поиск в глубину на языке Prolog или поиск в ширину на Refal, а также подстраивающиеся структуры – нейронные сети. Нейронные сети, в зависимости от задач, строятся по разным принципам, имеют структуру и по–разному обучаются. В последнее время наибольший прорыв получили нейронные сети представления данных (Representation learning), занимающиеся выявлением в информации закономерностей, так как саму информацию из–за её размеров они не могут запомнить. Большой эффект дают глубокие нейронные сети, имеющие множество уровней признаков, признаки на последующих уровнях строятся на основании признаков с предыдущих уровней, о них и пойдёт речь в этой главе.
Под Machine Learning (ML) понимается адаптация преобразования входных данных в выходные данные в зависимости от истории решений. Такой класс задач решается или алгоритмическим способом, или с помощью нейронных сетей. О том, где какое решение и в какой ситуации лучше применять далее и пойдёт речь. Для практического примера мы возьмём классификацию изображений с помощью обучения глубокой нейронной сети с учителем. Посмотрим её местоположение в классификации.
Типы построения:
* Классическое обучение (экспертное);
* Нейронные сети.
Типы обучений:
* С учителем (регрессия, классификация, порождающие, seq2seq);
* Без учителя (кластеризация, поиск правил, обобщение, ассоциация).
По способу улучшения результата:
* Ансамбли нейронных сетей;
* Глубокие нейронные сети.
В эволюции нейронных сетей, обычно, выделяют три эпохи:
* Экспертные системы (rule based модели) – системы, основанные на правилах. Недостатком является слабая актуализируемость, если эксперт закончил работать, то система начинает устаревать;
* Машинное обучение – с помощью статистических методов по указанным признакам (фичам) система находит правила. Сами фичи должен определить эксперт предметной области из всех имеющихся параметров данных, то есть выделить из сотни или тысячи параметров данных важные, например, столбцы в таблице базы данных. Это сложная задача, так как факторов для разных групп может быть переменное число и определить все группы и для них все факторы – крайне трудоёмкий процесс. При этом излишек факторов вносит шум в результат предсказания. Современные нейронные сети превосходят для большинства случаев статистические по вероятности;
* Нейронные сети позволяют самим выбрать признаки, но для этого требуется гораздо больше данных, обычно больше миллиона экземпляров. Эти данные требуются, чтобы пройти через все её слои и на последующих слоях усилить важность нужных признаков и уменьшить не важных.
Этапы эволюции нейронных сетей:
* 1950-е годы – исследование мозга и его имитирование;
* 1960-е годы – собеседник ELIZA (1956 год) на общие вопросы, генетические алгоритмы основанные на переборе всех возможных изменений и выбора лучшего;
* 1970-е годы – экспертные системы основанные на правилах и данных от экспертов, например MYCIN и DENDRAL;
* 1980-е годы – коммерческое внедрение экспертных систем;
* 2010-е годы – решение подготовленных задач нейронными сетями и статистическими алгоритмами;
* 2010-е годы – глубокое обучение в соревнованиях с человеком и реальном мире (автопилотах, переводчиках, ассистентах).
Последние годы:
* 1994 год – выигрыш Chinook в шашки у чемпиона мира,
* 1997 год – выигрыш Deep Blue в настольную игру шахматы у чемпиона мира,
* 2005 год – беспилотные автомобили на площадках (соревнование DARPA Grand Challenge),
* 2011 год – IBM Watson выиграла в телевизионной игре Jeopardy,
* 2012 год – Google X Lab распознаёт цветные изображения животных,
* 2016 год – Google Translate основан на нейронных сетях, выигрыш Google DeepMind AlphaGo у чемпиона мира по Go,
* 2017 год – выигрыш у чемпионов в коллективную 3D игру Dota2,
* 2018 год – беспилотные такси Alphabet Waymo на общих дорогах в Аризоне,
* 2019 год – победа Libratus чемпионов в покер,
* 2020 год – чат-бот на GPT-3 был не распознан собеседниками в социальной сети, видео-интерьвью с авотаром я не отличил от естественного,
* 2021 год – OpenAI Codex создаёт программы по детальному описанию задачи на естественном языке.
Достижения последнего времени:
* распознавание речи по движению губ;
* выигрыши в в 2D игры и 3D игры;
* выигрыши в настольные игры: шахматы, Go;
* синхронный перевод в Skype: разговор между людьми без знания языков друг друга;
* автопилот в автомобилях;
* FindFace распознаёт лица;
* описание изображение текстом и наоборот.
Достижения на 2019 год:
* чтение по губам лучше профессионала (DeepMind Lip Reading);
* изображения: фотореалистичная генерация изображений (Google bigGAN), трансформация видео (NVIDEA vid-to-vid), создание изображений по макетам (NVIDEA gauGAN), обучение беспилотников по виртуальным маршрутам (NVIDEA Drive);
* текст: GPT, BERT, BART, T5, ELMo и другие архитектуры развиваются, расширяют свою сферу применения, эволюционируют;
* звук: умные колонки, с умением автоответчика вести разговор;
* соревнования: AlphaZero обыграла чемпионов в Go и шахматы, другие сети обыграли в StartCraft, Dota-2, покер;
* медицина: визуализация снимков;
* автоматизация: AliBaba автоматизировала Ханджоу (светофоры, инфраструктура), Google автоматизировал охлаждение своих Data центров, автопилоты и другие Edge AI;
* доступность: дообучение готовых моделей в Cloud.
Достижения на 2020 год:
* Intel создал нейроморфную машину Loihi с 1024 нейронами и IBM TrueNorth с миллионом нейронов;
* модель MuZero сама учится играть в неизвестные ей игры (Atari + Go + шахматы + японские шахматы) без начальных знаний, обучающих партий людей и программ и выигрывает у узкоспециализированной AlphaZero, традиционных программ Stockfish и людей в шахматы;
* модель mT5 обучена на более 100 языках для переводов;
* GPT-3 и ruGPT умеют писать программы;
* Модель GPT-3 написала передовицу для газеты Гардиан;
* Модель NVidia StyleGAN2 генерирует правдоподобные лица людей.
Достижения на 2021 год:
* создание ML с несколькими навыками, таких как GPT-3;
* генерация изображения по текстовому описанию: нейронная сеть OpenAI DALL-E (GPT-3 13 + автоинкодер) от OpenAI;
* генераторы музыки: Pod Music Transformet (нотная модель), OpenAI Jukebox (звуковая модель: голос и музыка);
* нейронная сеть создаёт Atari игры по образцу;
* OpenAI Codex создаёт программы по детальному описанию задачи на естественном языке.
Но, в 2021 году более интересны проекты, которые имеют применение нейронных сетей в бизнесе:
* генерация генотипа человека для обхода закона о запрете экспериментов над необезличенным генотипом;
* Яндекс выпустил беспилотных доставляющих роботов;
* одна из нейронных сетей одержала победу над реальным пилотом истребителя и бедет внедряться в боевые беспилотники;
* Яндекс продемонстрировал работу беспилотного такси Yandex Self-Driving Car на дрогах общего пользования города после снегопада;
* чат-бот от Microsoft имитирующий старшеклассница Tay долгое время оставался нераспознанным к бот;
* генерация изображения по текстовому описанию: нейронная сеть Николай Иронов от студии дизайна Студии Артемия Лебедева генерит коммерческие логотипы.
* внедрены системы управления бизнес процессами на основе обучения с подкреплением (игрового принципа обучения);
* многие страны создали стратегии развития AI на государственном уровне, так в России принята стратегия указом №490 "О развитии искусственного интеллекта в Российской Федерации";
* на законодательном уровне формируется экосистема для AI: в России принят закон посвящённых AI (Закон об искусственном интеллекте 123-ФЗ).
* обучение на малых датасетах: копирование голоса по записи длительностью в 4 часа как SaaS продукт.
* виртуальная ведущая Елена от Сбербанка эмулирует мимику во время разговора, но не очень естественно, на мой взгляд.
Но не стоит забывать про стандартные задачи:
* Intelligent document processing – извлечение структурированных данных из неструктурированных бумажных документов;
* Process Mining – описание реальных процессов по цифровым следам, определение узких мест и зацикливаний и возможных решений.
Достижения это хорошо, но это демонстрация потенциальных возможностей. Давайте посмотрим, что добились нейронные сети в индустрии на основании отчёт об искусственном интеллекте Artificial Intelligence Index Report 2021.
Посмотрим на качественный прогресс в IMAGENET Calange. Это соревнование по распознаванию картинок нейронными сетями. Создана очень большая база изображений (датасет). В этот датасет входят разные изображения по 200 категориям. В категории TOP-1 accuracy нейронная сеть должна с одной попытки угадать категорию, например, это самолёт или туфли. В категории TOP-5 accuracy нейронная сеть должна с пятью попыток угадать категорию. Как мы увидим, прогресс постепенно выходит на плато:
год – TOP-1 – TOP-5 2013 – 65% – 85% 2014 – 74% – 87% 2015 – 79% – 92% 2016 – 83% – 95% 2017 – 84% – 97% 2018 – 85% – 97.5% 2019 – 86% – 97.6% 2020 – 86% – 97.7% 2021 – 86.5% – 97.9%
Давайте посмотрим другие показатели. Так до 2017 года дополнительные данные не давали преимущества, а лишь ухудшали результат. В 2017 году результаты сравнялись, а после с дополнительными данными результаты линейно обгоняют простого обучения на датасете. Сейчас TOP-1 = 90.2%, TOP-5 = 98.8. Возможно, именно в них и будет прогресс.
Также скорость обучения выросла: 2018 – 6.2…10 минуты, 2019 – 1.3…9 минуты, 2020 – 47 секунд до 1 минуты. Время всё же снижается кратно, хоть и по убывающей, а ресурсы увеличиваются экспоненциально, но и сложность нейронных сетей возрастает, чтобы показывать результаты более высокие. Но, хоть и ресурсов требуется гораздо больше, но в реальности нас интересует стоимость, а она постоянно снижается: 2018 – 500$, 2019 – 10$, 2020 – 8$, хоть и затухающе.
Может быть ситуация связан с утиханием интереса среди учёных к искусственному интеллекту? Но, нет, доля публикаций в AI со времени прорыва в распознавании изображений относительно всех публикаций экспоненциально растёт:
год – % 2011 – 1.4 2012 – 1.2 2013 – 1.2 2014 – 1.3 2015 – 1.5 2016 – 1.8 2017 – 2.0 2018 – 2.5 2019 – 3.8
Общее число публикаций тоже растёт, причём экспоненциально:
2011 – 0.1 тысяч 2012 – 0.2 тысяч 2013 – 0.3 тысяч 2014 – 0.5 тысяч 2015 – 1.1 тысяч 2016 – 1.9 тысяч 2017 – 3.0 тысяч 2018 – 3.5 тысяч 2019 – 5.8 тысяч 2020 – 6.5 тысяч
Рассмотрим США, так как она занимает лидирующее место по публикациям (36,3%) в AI от других стран в совокупи, что не удивительно, ведь доля PHD полученных в США от всех стран в совокупи в AI составляет 81,8%. PHD по компьютерным наукам специализация на ML/AI лидирует с долей 25% от всех направлений по компьютерным наукам, отрываясь от Теории алгоритмов с долей 8%. При этом скорость роста популярности за год у ML/AI самая высокая: 9%. А подробнее про рост с 2019 по 2020 (остальные показывают снижение популярности):
Artificial Intelligence/Machine Learning 9% Robotics/Vision 2.6% Human-Computer Interaction 2% Security/Information Assurance 2% Computing Education 1.4% Databases/Information Retrieval < 1% High Performance Computing < 1% Theory and Algorithms < 1% Information Science < 1% Social Computing/Social Informatics/CSCW < 1%
При этом с каждым годом, получившие степень PhD (Doctor of Philosophy) в США, всё больше находят работу в частных компаниях, что подтверждает, что компании оценивают потенциал AI, который они смогут применить.:
год % 2010 – 44 2011 – 41 2012 – 50 2013 – 50 2014 – 58 2015 – 58 2016 – 60 2017 – 58 2018 – 61 2019 – 65
При этом важно заметить, что растут публикации не только издаваемые государственными учреждениями, такими как институтами и государством при написании докторских работ, но и корпоративные, то есть те, которые предполагается использовать в реальном бизнесе и тенденция показывает экспоненциальный рост:
год Китай США 2010 – 0,2 тысяч 0,7 тысяч 2011 – 0,2 тысяч 0,7 тысяч 2012 – 0,2 тысяч 0,8 тысяч 2013 – 0,3 тысяч 0,9 тысяч 2014 – 0,3 тысяч 1,0 тысяч 2015 – 0,4 тысяч 1,3 тысяч 2016 – 0,5 тысяч 1,5 тысяч 2017 – 0,7 тысяч 2,0 тысяч 2018 – 1,1 тысяч 2,7 тысяч 2019 – 1,6 тысяч 3,6 тысяч
Раз есть публикации, значит есть и исследования, а наиболее полезные обычно (зависит от страны) патентуют. При этом рост экспоненциальный числа патентов в IA и доля IA патентов постепенно растёт от общего числа патентов:
год – тысяч патентов 2009 – 39 2010 – 42 2011 – 49 2012 – 56 2013 – 60 2014 – 60 2015 – 60 2016 – 57 2017 – 61 2018 – 78 2019 – 102
Ориентируясь на сегментацию AI публикаций на сайте arXiv можно косвенно провести с общей ситуацией по росту направлений в AI. В приведённой ниже статистике они все показывают рост и при том линейный. Наибольший рост показали Computer Vision (31% от общего) и нейронные сети (32% от общего):
область AI публикаций Нейронный Machine Learning 11.098 Computer Vision 11.001 Языки 5.573 Robotics 2.571 Общий AI 1.923 Статистический ML 1.818
Также косвенно можно посмотреть по распределению конференций:
International Conference on Intelligent Robots and Systems (IROS) 25,719 Conference and Workshop on Neural Information Processing Systems (NIPS) 22,011 International Conference on Machine Learning (ICML) 10,800 The Conference on Computer Vision and Pattern Recognition (CVPR) 7,500 Association for the Advancement of Artificial Intelligence (AAAI) 4,884 International Joint Conference on Artificial Intelligence (IJCAI) 3,015
Безусловно, достигать больших результатов всё сложнее, но и важно, что распознавание мелких картинок довольно старая задача, которая уже не столь актуальна. Рассмотрим другие перспективные области, в которых устраиваются соревнования:
* распознавание речи, используемый для субтитров видео;
* генерация изображений лиц людей: Fréchet Inception Distance (DID) – c 01/2018 по 07/2020 уменьшился с 40 до 25.4;
* распознавание фейковых изображений, которые могут использоваться при фильтрации в социальных сетях и новостях: Deepfake Detection Challenge, Логистическая функция ошибки с 0.7 до 0.19 за 4 месяца;
* распознавание расположения ключевых точек и суставов на изображении человека, которые могут использоваться в кинематографе и магазинах без касс, таких как Amazon.Go: Keypoint Detection Challenge в Common Objects in Context (COCO) – увеличение с 62% до 80.8% за 4 года;
* альтернативная задача по распознаванию контуров человека – DensePose Challenge в Common Objects in Context (COCO) с 55% до 72% за полтора года;
* сегментация изображения по областям (выделение объектов: дорога, человек, здание, пешеходная зона), которое может применяться для автопилотов, для создания коллажей, смена фона в кинематографе, дополненной реальности: PIXEL-LEVEL SEMANTIC LABELING TASK в CITYSCAPES CHALLENGE с 63% до 85% за 5 лет;
* распознавание типа действия на видео, которое може использоваться полицией или службами безопасности: Temporal Action Localization Task в датасете ActivityNet с вероятностью угадывания с 18% до 42.8% за 4 года;
* распознавание объектов на фото, которое может использоваться в автопилотах: MEAN AVERAGE PRECISION в датасете You Only Look Once (YOLO);
* распознавание людей по лицам, которые используется авторизации по лицу (банки, магазины, метро): Face Recognition Vendor Test (FRVT) в National Institute of Standards and Technology (NIST) с ошибкой до 0.22% за 3 года;
* понимание текста в датасете Stanford Question Answering Dataset (SQuAD) с 45% до 90.3% за полтора года (лучше человека);
* опрос по картинке на соревновании Visual Question Answering (VQA) Challenge в задаче Visual Commonsense Reasoning (VCR) Task с 68% до 95.4% для версии SQuAD v1.1 (лучше человека);
* рассуждения по тексту или картинке на соревновании Visual Question Answering (VQA) Challenge за 4.5 года с точностью с 55% до 76.4%;
* распознавание речи по датасету LibriSpeech в задаче Transcribe Speech – количество ошибок уменьшилось за четыре года без шумов 5.3%..1.4%, а с шумами 13.3%..2.6%;
* распознавание какому человеку принадлежит реч: 0,6% ошибок;
* предсказание структуры белка с 2016 года обогнала физически модели с точностью 40% и на 2020 год достигли точности 84%;
* решение проблем и доказательство теорем: с 2017 года имеет линейный тренд без прорывов;
Целесообразность применения машинного обучения используется там, где много данных, на которых их можно обучить. А это зачастую или корпорации, или иногда применение самих обученных нейронных сетей осуществляется как краевые вычисления (IoT).
Сейчас с Microsoft в непосредственной области ML и AI, и интеграции этих наработок в продукты работают более 7000 специалистов. На примере продуктов компании Microsoft посмотрим на внедрение ИИ в больших компаниях:
* 1995 – Помощник MS BOB;
* 1996 – Ассистент MS Office Clippy и корректор грамматики;
* 2002 – Распознавание рукописного ввода Windows XP;
* 2011 – Классификатор снимков в Windows Live Photo Gallery;
* 2013 – Помощник Contana;
* 2014 – Синхронный перевод в Skype;
* 2015 – Аутентификация с помощью видеокамеры Windows Hello;
* 2016 – Чат-боты и распознавание образов статистически лучше человека;
* 2017 – Распознавание речи статистически лучше человека;
* 2018 – Выполнение тестов статистически лучше человека.
Сама компания развивает AI в областях: консалтинг, образование, программные сервисы (SaaS), фреймворки, инструменты для разработчиков, программная (облака) и аппаратная (процессоры) инфраструктура.
Если же брать в общем индустрии, то применяться они могут для нахождения точек продаж (воронки), классификации звонков (предварительный разговор), выявления фрода, предиктивная аналитика (поломок).
Глубокое обучение, начавшееся как тренд в 2012 году, сейчас переходит в плато и начинает находить применение. Для применения ищутся способы определения, на основе каких признаков было принято конкретное решение, например, при отказе выдать кредит законодательство обязывает предоставлять клиенту причину отказа. Одновременно в компаниях или внедряются уже наработки в продукты, или отлаживаются для большего уровня интеграции.
Посмотрим на рост глобальных инвестиций корпораций и стартапов в AI:
2015 – 12 и 8 Mil.$ 2016 – 17 и 12 Mil.$ 2017 – 44 и 22 Mil.$ 2018 – 43 и 37 Mil.$ 2019 – 49 и 39 Mil.$ 2020 – 67 и 42 Mil.$
Посмотрим частный пример, на рост индустрии на примеров увеличения количества сервисов машинного перевода:
2017 – 7 2018 – 10 2019 – 21 2020 – 24
Теперь, собственно, настало поговорить о вакансиях. Количество вакансий с 2016 по 2020 год выросла 1.3..2.7 раз, при этом число вакансий от общего числа составляют от 0.2% до 2.4%:
США – 210% Канада – 270% Австралия – 210% Сингапур – 250% Германия – 220% Италия – 170% Франция – 160% Китай – 130%
В курсах по AI доля Machine Learning составляет 42%.
Если же говорить об рабочих местах и о смещении на технологические рабочие места. Часто, компании, которые автоматизируют рабочие места, заявляют, что сотрудники которые их занимали могут переквалифицироваться и начать управлять этими автоматизированными системами. Обычно, люди со стороны относятся к этому с недоверием, так как непонятно, зачем автоматизировать и потом оставляют тоже количество людей, ведь автоматизация подразумевает в их понятие автономность. Но, это не так, так как автоматизация подразумевает наличие огромного количества людей, разрабатывающих и обслуживающих эти системы. Так, в одной из крупнейших компаний России есть план, который подразумевает освобождение нескольких тысяч мест продавцов, кассиров и других операторов, но вместе с тем запланирован найм большего количества тысяч рабочих мест специалистов обслуживающих системы AI. Ожидается качественный и масштабируемый прирост показателей услуг, предоставляемых компанией, а большей степени отрытие новых ниш развития компании. Количество в среднем останется таким же, так как большой набор проектный (единичный), а отток – плановый (ежегодный). Но, конечно, продавцы и кассиры маловероятно, что переквалифицируются в разработчиков, аналитиков и учёных с сфере ИИ. Хотя, большими компаниями делаются попытки в этом направлении – создаются курсы и очное обучение на несколько месяцев для переквалификации сотрудников. Обычно, люди с умирающих профессий переквалифицируются в другие умирающие профессии, у которых умирание произойдёт с небольшим запозданием. Это связано с тем, что люди бегут с простых работ на работы чуть сложнее, чем были до этого, ожидая быструю и разовую переквалификацию. Например, продавцы могут переквалифицироваться в таксистов, где требуется чуть больше технических навыков, чем их прежняя работа, и автоматизация, чуть сложнее и чуть менее эффективна. Такая ситуация была всегда, и связана она с любой автоматизацией, не только компьютерной. Общей чертой профессий, подлежащих автоматизации является рентабельность, то есть они достаточно массовы и легко автоматизируются, чтобы это стало выгодным. Популярность профессии для перехода с умирающей и является, что она скоро станет массовой, а лёгкость переквалификации связана со стандартизацией. Так, курсы по переквалификации уже говорят, что есть алгоритм и он будет применён многократно, пока только на этапе переквалификации, а не на этапе постоянной работы. Отсюда вытекает следствия, что столь популярная профессия как Web программист с понятными навыками, понятными заданиями может быть автоматизирована. Не секрет, что в разработке формализован стиль кода, фреймворки, подходы, постановка задач. И действительно, современные готовые (предобученные) нейронные сети могут генерировать работающий программный код, но об этом позже в этой книге. Но, программисты, гораздо ближе к эффективной переквалификации, если он если они не занимаются простым кодированием. Но, только 2020, нейронные сети могут формировать только простой код на языке программирования, а насколько – в соответствующем разделе. Поэтому программисты разделяются на два лагеря – программисты пишущие типовой код, которым сложно адаптироваться, но которых это коснётся и программистов, которых могут переквалифицироваться, который понемногу будут вытеснять первая группа программистов, и которым, скорее всего интереснее и перспективнее это будет сделать. Правда тут не всё так однозначно, так с 2018 года, нейронные сети уже умеют проектировать другие специализированные нейронные сети с помощью технологии AutoML.
Что, касается самой профессии Data scines – это аналитик данных, который на основе понимания предметной области может с помощью статистических методов используя инструменты (языки, системы) получить предсказания. Более подробно о навыках:
* математическая статистика и теория вероятностей, чтобы мог выбрать статистические методы, где ML не нужен;
* алгоритмы ML: регрессия, классификация, кластеризация, порождения (генерации), сопоставление;
* программирование: аналитика на R, написание моделей на Python и подключение данных из Java+SQL (Hadoop, Hive, Spark, Pig), управление жизненным циклом модели (DevOps, SRE);
* мягки навыки: понимание предметной области (ориентация на бизнес результат), проектное управление (коммуникация для построения запуска модели), аналитика для проверки гипотез.
Пишем свою сеть
Для примера возьмём прописные числа от нуля до девяти, которые мы будет сопоставлять с печатными. Если прописные точно попадают в контур – то всё просто, нам нужно просто перебрать контура печатных и получить подходящий вариант. Такая задача не относится к задачам машинного обучения. Теперь усложним задачу – числа у нас не точно попадают под шаблон. Если прописные числа немного не вписываются в контур – мы просто находим какое–то отклонение. И тут возникает сложность при категоризации прописного числа на ноль и девятку, когда размер хвостика отделяет небрежное написание нуля от девятки. Другой момент в категоризации восьмёрки и девятки. Так, если кончик отгибается – это десятка, а если загибается и прикасается – то восьмёрка. Для решения подобной ситуации нужно разделить цифру на области и в зависимости и присвоить им разные коэффициенты. Так, соединение хвостика нижней части имеет очень высокое значение, нежели форма самих окружностей в классификации на восьмёрки и девятки. Определить помогут статистические данные по заранее данной выборке соответствия фигур восьмёркам и девяткам, где исследователь сможет определить, когда уже можно высчитать нижнее кольцо замкнутым и говорить о соответствии восьмёрке фигуры, а когда нет, говорить о соответствии девятке. Такой метод сортировки, основанный на выделении отдельных компонент, на различии которых и принимается решение о сортировке, называется методом главных компонент. Но мы можем программным способом разделить цифры на сектора и присвоить им коэффициенты.
Другой сложностью может быть то, что цифра может быть не в наблюдаемой области, а в произвольной, например, в углу. Для анализа самой цифры нам нужно переместить анализирующее окно в то место, где находится цифра. Для простоты пока будем полагать, что габариты анализирующего окна равны габаритам исследуемой цифры. Для решения этой задачи перед сетью ставят анализирующий слой, образующий карту нахождения цифры. Задача этого слоя определить местоположение цифры на картинке. Для простоты возьмём чёрное изображение на белом листе. Нам нужно пройтись анализатором цифры построчно по всему листку и определить местоположение. В качестве индикатора возьмём площадь чёрного цвета на индикаторе. После прохождения по листку бумаги и определения площади мы получим матрицу с цифрами площадей чёрного цвета. Где площадей чёрного цвета больше – в том месте цифра максимально вписалась в индикатор. Преобразование картинки в матрицу площадей называется операцией свёртки, а если это выполняет нейронный слой – свёрточный слой. Принцип работы был позаимствован у биологического зрительного нерва. Нейронные сети, в которых присутствует свёрточный слой (Conv Layers) называются свёрточными нейронными сетями (Convolutional Neural Network, CNN). Такие сети используют при распознавании изображения, а после при должном развитии их адаптировали для распознавания речи и текстов. Классически, CNN применяется для решения трёх задач при работе с изображениями:
* классификация изображений, например, фотографий собак и кошек по роду животных; * определение объекта на изображении, например, определение нахождения и положения пешехода при пилотировании беспилотным автомобилем; * сегментации изображения, например, определение на рентгенах контуров опухолей.
Если изображение находится в произвольном месте, или имеются другие изображения, то для определения потребуется несколько слоёв нейронной сети, и результатом будет являться также карта расположения цифры, но принятие решения о её нахождения нужно её идентифицировать. Таким образом, первый слой будет иметь количество нейронов отображающих карты, что по горизонтали и вертикали будет соответствовать ширине и высоте листка минус соответствующую ширину и высоту анализирующего экрана, делённую на шаг сдвига анализирующего окна. Размерность второго же слоя в нейронах равна размерности анализируемого окна, чтобы иметь возможность идентификации цифры. Если мы проведём связи от всех нейронов слоя поиска к слою анализирующего окна, то на выходе мы получим набор снимков влитых вместе. Следующий слой будет иметь размерность, равную количеству анализируемых элементов цифр. К примеру, цифру можно представить в виде не полностью закрашенной восьмёрки, тогда, закрашиваемых сегментов будет семь. Все нейроны свёрточного слоя будут связаны со всеми нейронами слоя анализа сегментов цифры. Задача нейрона этого слоя быть связанным с нейронами предыдущего, ответственными за данный сегмент и выдать результат наличия или отсутствия данного сегмента в цифре. Следующий слой имеет состоит из десяти нейронов, соответствующие цифрам от нуля до девяти. Всего его нейроны связаны с предыдущим слоем и активируются при получении сигналов от них. Так, нейрон, ответвленный за цифру один будет активироваться, если получит информацию, что два крайних правых сектора будут активны и не активны все остальные. Описанный алгоритм детектирования искомого изображения называется R–CNN (Region–based Convolutional Network) и использовался долгое время. Далее он был сменён Fast R–CNN, а ныне применяется YOLO (Real–Time Object Detection) из–за большего качества и скорости работы.
На выходе мы получим активацию того выходного нейрона, который соответствует определённой цифре. Он это делает на основе данных, получаемых от нейронов с предыдущего слоя, ответственных за сектора цифры, а именно от каких нейронов пришли сигналы, а от каких нет. Обозначим приходящие сигналы от нейронов по связям за ноль, то есть сектор не закрашен, а единице будет соответствовать случай, когда сектор закрашен. Тогда, вес у связей от правых секторов – положительный, что даст единицу, а у остальных – отрицательный, что не даст получить на выходе единицу если ещё какой–то сектор активирован. На выходе нейрона стоит нормализатор, который отвечает за принятие решения. Ему необходимо решить, на основе входных данных и весов, отдавать единицу или ноль. Для этого он перемножает входные данные на веса, складывает их, и по пороговому значению выдаёт единицу или ноль. Этот нормализатор нужен для того, чтобы после суммирования информации приходящей с нейронов, он передал на следующий слой нейронов логическую информацию, степень важности которой будет определяться весами на принимающем нейроне. Для этого используются функции, которые преобразуют весь диапазон уровней входных сигналов в диапазон от нуля до единицы. Такая функция носит название функций активации и подбирается для всей нейронной сети. Есть множества функций, которые всё, что меньше единицы считают нулём. Сами веса не кодируются, а подбираются во время обучения. Обучение бывает с учителем (supervised) и без (ansupervised) и они пригодны для разного класса задач. При обучении без учителя (автоматические кодировщики и порождающие сети) мы даём данные на вход нейронов сети и ожидаем, когда она сама найдёт какие-нибудь закономерности, при этом данные не размечены (не имеют каких–то меток с указанием результата), что позволяет выявить ранее неизвестные особенности, сходства и различия, и классифицирует по ещё ненайденным признакам, но как это будет происходить, предсказать сложно. Самые распространённые типы задач при обучении с учителем: классификация (имеющееся данные нужно отнести к одной из групп) и регрессия (к указанной группе нужно сгенерировать данные). Такие сети применяют в маркетинге. Задачей без учителя являются задача кластеризации, в которую входит определение в наборе данных группировки этих данных по каким-то ещё не выявленным признакам. Задача кластеризации используются в рекомендательных системах, когда нужно выявить группу товаров, которые нравится определённым людей со схожими параметрами. Получив группу товаров и параметры людей, можно новым посетителям на основании этих параметров рекомендовать подходящую им группу (кластер) товаров. Сама кластеризация многомерна, а для отображения на графике применяют метод понижения размерности, который хоть и утрачивает информацию, но позволяет дать какое-то наглядное визуальное представление с заметными границами и точек сгруппированных внутри полигонов (кластеров). Кластеризация нужна для выявления групп, которым можно предложить персонализированные (таргетированные) рекомендации, а мы рассмотрим в книге кластеризацию слов в языке (эмбеддинги). Методы кластеризации: k-Means кластеризации по точному числу кластеров с единым выраженным центром, Density-Based Spatial Clustering of Applications with Noise (DBSCAN) кластеризации по уровню схожести в кластере, Agglomerative clustering для вложенной кластеризации. Все их поддерживает библиотека Scikit-learn. Пример алгоритмов без учителя: Apriori, Euclat, FP–growth. Для большинства задач нам нужно получить классификацию по заданным группам, для чего мы на вход подаём обучающую выборку с размеченными данными, содержащими метки о правильном решении (например, классификации), и стараемся добиться совпадения с этой тестовой выборкой. Также может быть с подкреплением (reinforcement), при котором сеть пытается найти наилучшее решение на основе стимулов, например, при игре добиться превосходства перед соперником, в роботе пылесосе всосать в себя как можно больше мусора, в самоуправляемых машинах доставить как можно быстрее, в торгах на биржах получить максимальную выгоду, при управлении процессами предприятия – достигнуть максимальной эффективности. При этом закладываются правила, например, пылесосу не нужно загонять кота на шкаф во имя чистоты, машина не должна нарушать правила чтобы улучшить результат, на бирже нельзя излишне рисковать без статистики и тому подобное. Это может быть тоже использовано при обучении, например в сетях Deep Q–Network (DQN). Рассмотрение такой стратегии обучения как обучение с подкреплением, пока, отложим на потом. При обучении с учителем требуется гораздо меньше попыток подобрать вес, но всё же это от нескольких сотен до десятков тысяч, при этом сама сеть содержит огромное количество связей. Для того чтобы найти веса, мы подбираем их направленным уточнением. С каждым проходом мы уменьшаем ошибку, и когда точность нас устроила, мы можем подавать тестовую выборку для валидации качества обучения (сеть могла плохо обучиться или переобучиться), после этого можно использовать сеть. В нашем примере, это могут быть немного искривлённые цифры, но благодаря тому, что мы выделяем области, это не сильно сказывается на точности.
При обучении нейрона с учителем мы подаём обучающие сигналы и получаем на выходе результаты. Но при каждом сигнале, входном и выходном, мы получаем результат о степени ошибки в предсказании. Когда мы прошли все обучающие сигналы, мы получили набор (вектор) ошибок, который может быть представлен в виде функции ошибок. Эта функция ошибок зависит от входных параметров (весов) и нам нужно найти веса, при которых эта функция ошибок становится минимальной. Для определения этих весов применяется алгоритм Градиентного спуска, суть которого заключается в постепенном движении к локальному минимуму, а направление движения определяется производной от этой функции и функции активации. В качестве функции активации обычно выбирают сигмойду для обычных сетей или усечённую ReLU для глубоких сетей. Сигмойда на выходе даёт диапазон от нуля до единицы всегда. Усечённая ReLU всё же позволяет при очень больших числах (очень важной информации) на входе передать больше единицы на выход, и тем самым повлиять на слои, идущие после непосредственно следующих. К примеру, точка над чёрточкой отделяет букву L от буквы i, а информация одного пикселя влияет на принятия решения на выходе, поэтому важно не потерять этот признак и передать его на последний уровень. Разновидностей функций активации не так много – их ограничивает требование к простоте обучения, когда требуется взять производную. Так сигмойда f после произвольно превращается в f(1–f), что эффективно. С Leaky ReLu (усечённая ReLu c утечкой) ещё проще, так как она при "x < 0" принимает значение 0, то её проводная на этом участке тоже равна 0, а при "x >=0" она принимает 0,01*x, что при производной будет 0,01, а при x > 1 принимает 1+0,01*x, что для производной даёт 0,01. Вычисление тут вообще не требуется, поэтому обучение происходит намного быстрее, обычно, в пять раз. До сигмойды ещё использовался тангенс, но, он был вытеснен сигмойдой.
Так как на вход функции активации мы подаём сумму произведений сигналов на их веса, то зачастую, нам нужен другой пороговый уровень, отличный от 0,5. Мы можем сместить его на константу, прибавляя её к сумме на входе в функцию активации, используя нейрон смещения для её запоминания. Он не имеет входов и выдаёт всегда единицу, а само смещение задаётся весом связи с ним. Но, для многонейронных сетей он не требуется, так как сами веса предыдущим слоями подгоняются такого размера (меньшими или отрицательными), чтобы использовать стандартный пороговый уровень – это даёт стандартизацию, но требует большего количества нейронов.
При обучении нейрона нам известна ошибка самой сети, то есть на входных нейронах. На их основе можно рассчитать ошибку в предыдущем слое и так далее до входных – что носит название метода обратного распространения ошибки.
Сам же процесс обучения можно разделить на этапы: инициализация, само обучение и предсказание.
Если же у нас цифра может быть различного размера, то применяется pooling слои, которые масштабируют изображение в меньшую сторону. По какому алгоритму будет вычисляться то, что будет записано при объединении, зависит от алгоритма, обычно это функция “max” для алгоритма «max pooling» или «avg» (среднеквадратичные значение соседних ячеек матрицы) – average pooling.
У нас уже появилось несколько слоёв. Но в применяемых на практике нейронных сетях их может быть очень много. Сети с количеством слоёв больше четырёх слоёв принято называть глубокими нейронными сетями (DML, Deep ML). Их может быть очень много, что приводит к сложности. С улучшением архитектур, позволяющих уменьшить или обойти такие ограничения, появляются сети с сотнями слоёв. Например, блоки Residual Connect, позволяющие сохранить градиенты и ставшие стандартом для глубоких сетей, появились впервые в ResNet с количеством слоёв 152 штуки и это далеко не самая глубокая сеть. Но, как вы уже заметили, количество слоёв не берётся, по принципу, чем больше, тем лучше, а прототипируется. Излишнее количество ухудшает качество за счёт затухания, если для этого не применять определённые решения, такие как проброс данных с последующим суммированием. Примерами архитектур нейронных сетей могут быть ResNeXt, SENet, DenseNet, Inception–Res Net–V2, Inception–V4, Xception, NASNet, MobileNet V2, Shuffle Net и Squeeze Net. Большинство из этих сетей предназначены для анализа изображений и именно изображения, зачастую, содержат наибольшее количество деталей, и на эти сети возлагается наибольшее количество операций, чем и обуславливается их глубина. Одну из подобных архитектур мы рассмотрим при создании сети классификации цифр – LeNet–5, созданную в 1998.
Если же нам нужно не просто распознать цифру или букву, а их последовательность, заложенный в них смысл, то нам нужна связь между ними. Для этого нейронная сеть после анализа первой буквы отравляет на свой вход вместе со следующей буквой результат анализа текущей. Это можно сравнить с динамической памятью, а сеть реализующую такой принцип, называют рекуррентной (RNN). Примеры таких сетей (с обратными связями): сеть Кохонена, сеть Хопфилда, ART– модели. Рекуррентные сети анализируют текст, речь, видео информацию, производят перевод с одного языка на другой, генерируют текстовое описание к изображениям, генерируют речь (WaveNet MoL, Tacotron 2), категоризируют тексты по содержанию (принадлежность к спаму). Основным направлением, в котором работают исследователи в попытке улучшить в подобных сетях является определение принципа, по которому сеть будет решать, какую, на сколько долго и на сколько сильно будет сеть учитывать предыдущую информацию в будущем. Сети, приминающие специализированные инструменты по сохранению информации, получили название LSTM (Long–short term memory).
Не все комбинации удачны, какие то позволяют решать только узкие задачи. С ростом сложности, всё меньший процент возможных архитектур является удачным, и носит своё названия.
В общем, имеются сети принципиально отличающиеся устройством и принципами:
* сети прямого распространения;
* свёрточные нейронные сети ;
* рекуррентные нейронные сети;
* автоматический кодировщик (классический, разряженный, вариационный, шумоподавляющий) ;
* сети доверия ("deep belief");
* генеративно состязательные сети – противостояние двух сетей: генератора и оценивателя;
* нейронные машины Тьюринга – нейронная сеть с блоком памяти;
* нейронные сети Кохонена – для обучения без учителя;
* различные архитектуры кольцевых нейронных сетей: нейронная сеть Хопфилда, цепь Маркова, машина Больцмана.
Рассмотрим более подробно наиболее часто применяемые сети, а именно, сети прямого распространения, свёрточные и рекуррентные:
Нейронные сети прямого распространения:
* два входа и один выход – Percetron (P);
* два входа, два нейрона полносвязных с выходом и один выход – Feed Forward (FF) или Redial Basics Network (RBN);
* три входа, два слоя по четыре полносвязных нейрона и два выхода Deep Feed Forward (DFF);
* глубокие нейронные сети;
* сеть экстремального распространения – сеть со случайными связями (нейронная эхо–сеть).
Cвёрточные нейронные сети:
* традиционные свёрточные нейронные сети (CNN) – классификация изображений;
* развёртывающие нейронные сети – генерация изображений по типу;
* глубинные свёрточные обратные графические сети (DCEGC) – соединение свёрточной и развёртывающей нейронных сетей для преобразования или объединения изображений.
Рекуррентные нейронные сети:
* рекуррентные нейронные сети – сети с памятью у нейронов для анализа последовательностей, в которых последовательность имеет значение, таких как текст, звук и видео;
* сети с долгой краткосрочной памятью (LSTM) – развитие рекуррентных нейронных сетей, в которых нейроны могут классифицировать данные, какие стоит запомнить в долгоживущую память от тех, которые стоит забыть и удалить информацию из памяти о них;
* глубокие остаточные сети – сети со связями между слоями (по работе сходны с LSTM);
* управляемые рекуррентные нейроны (GRU).
Основы для написания сетей.
До 2015 года с большим отрывом лидировала scikit–learn, которую догонял Caffe, но с выходом TensorFlow он сразу стал лидером. Со временем только набирая отрыв с двухкратного на трёхкратный к 2020 году, когда на GitHub набралось более 140 тысяч проектов, а у ближайшего конкурента чуть более 45 тысяч. На 2020 году по убывающей расположились Keras, scikit–learn, PyTorch (FaceBook), Caffe, MXNet, XGBoost, Fastai, Microsoft CNTK (CogNiive ToolKit), DarkNet и ещё некоторые менее известные библиотеки. Наиболее популярными для отрытых проектов на GitHub можно выделить библиотеку PyTorch и TenserFlow. Если смотреть на количество звёздочек на GitHub по библиотекам, то на 2020 год тысяч звёздочек:
* TenserFlow: 153 * Keras: 51 * PyTorch: 46 * Sckit-learn: 45 * Caffe: 31 * MXNet: 19 * CNTK: 17 * Theane: 9 * Caffe2: 8
PyTorch хорошо для прототипирования, изучения и испробования новых моделей. TenserFlow популярен в производственной среде, а проблема низкого уровня описания решается с помощью Keras:
* FaceBook PyTorch – хороший вариант для обучения и прототипирования из–за высокого уровня и поддержки различных сред, динамический граф, может дать преимущества при обучении. Используется в Twitter, Salesforce.
* Google TenserFlow – имел изначально статический граф решения, ныне поддерживается и динамический. Используется в Gmail, Google Translate, Uber, Airbnb, Dropbox. Для привлечения использования в облаке Google под него внедряется аппаратный процессор Google TPU (Google Tensor Processing Unit).
* Keras является высокоуровневой настройкой, обеспечивающей больший уровень абстракции для TensorFlow, Theano или CNTK. Хороший вариант для обучения. К примеру, он позволяет не указывать размерность слоёв, вычисляя её сам, позволяя разработчику сосредоточиться на слоях архитектуры. Обычно используется поверх TenserFlow. Код на нём поддерживается Microsoft CNTK.
Так же имеются более специализированные фреймворки:
* Apache MXNet (Amazon) и высокоуровневая надстройка для него Gluon. MXNet – фреймворк с акцентом на масштабирование, поддерживает интеграцию с Hadoop и Cassandra. Поддерживается C++, Python, R, Julia, JavaScript, Scala, Go и Perl.
* Microsoft CNTK имеет интеграции с Python, R, C#, благодаря тому что большая часть кода написана на С++. То, что вся основа написана на С++, не говорит о том, что CNTK будет обучать модель на C++, а TenserFlow на Python (который медленный), так как TenserFlow строит графы и уже его выполнение осуществляется на C++. Отличается CNTK от Google TenserFlow и тем, что он изначально был разработан для работы в кластерах Azure с множеством графических процессоров, но сейчас ситуация выравнивается и TenserFlow поддерживает кластера.
* Caffe2 – фреймворк для мобильных сред.
* Sonnet – надстройка DeepMind поверх TensorFlow для обучения сверх глубоких нейронных сетей.
* DL4J (Deep Learning for Java) – фреймворк с акцентом на Java Enterprise Edition. Высока поддержка BigData на Java: Hadoop и Spark.
Со скоростью доступности новых предобученных моделей ситуация разнится и пока лидирует PyTorch. По поддержке сред, в частности публичных облаков, лучше у Фреймворках, продвигаемых вендерами этих облаков, так лучше поддержка TensorFlow лучше в Google Cloud, MXNet – в AWS, CNTK – в Microsoft Azure, D4LJ – в Android, Core ML – в iOS. По языкам общая поддержка в Python практически у всех, в частности TensorFlow поддерживает JavaScript, C++, Java, Go, C# и Julia.
Многие фреймворки поддерживают визуализацию TeserBodrd. Он представляет собой комплексный Web интерфейс многоуровневой визуализации состояния и процесса обучения и его отладки. Для подключения нужно указать путь к модели "tenserboard –logdir=$PATH_MODEL" и открыть localhost:6006. Управление интерфейсом основано на навигации по графу логических блоков и открытию интересующих блоков, для последующего повторения процесса.
Для экспериментов нам понадобится язык программирования и библиотека. Часто в качестве языка берут простой язык с низким порогом входа, такой как Python. Могут быть также и другие языки общего назначения, такие как JavaScript или специализированные, такие как язык R. Мы возьмём Python. Для того чтобы не ставить язык и библиотеки, воспользуемся бесплатным сервисом colab.research.google.com/notebooks/intro.ipynb, содержащим Jupyter Notebook. Notebook содержит в себе возможность не просто писать код с комментариями в консольном виде, а оформлять его в виде документа. Испробовать возможности Notebook можно в учебном плейбуке https://colab.research.google.com/notebooks/welcome.ipynb, такие как оформление текста на языке разметки MD, с формулами на языке разметки TEX, запуск скриптов на языке Python, вывод результатов их работы в текстовом виде и в виде графиков, используя стандартную библиотеку Python: NumPy(НамПай), matplotlib.pyplot. Сам Сolab представляет графическую карту Tesla K80 на 12 часов за раз (на сессию) бесплатно. Она поддерживает различные фреймворки глубокого машинного обучения, в том числе, Keras, TenserFlow и PyTorch. Цена же составляет GPU в Google Cloud:
Tesla T4: 1GPU 16GB GDDR6 0.35$/час Tesla P4: 1GPU 8GB GDDR5 0.60$/час Tesla V100: 1GPU 16GB HBM2 2.48$/час Tesla P100: 1GPU 16GB HBM2 1.46$/час
Попробуем. Перейдём по ссылке colab.research.google.com и нажмём кнопку "создать блокнот". У нас появится пустой Notebook. Можно ввести выражение:
10**3 / 2 + 3
и нажав на воспроизведение – получим результат 503.0. Можно вывести график параболы, нажав кнопку "+Код" в введя в новую ячейку код:
def F(x): return x*x import numpy as np import matplotlib.pyplot as plt x = np.linspace(–5, 5, 100) y = list(map(F, x)) plt.plot(x, y) plt.ylabel("Y") plt.xlabel("X")
Или выведя ещё и изображение:
import os !wget https://www.python.org/static/img/python–logo.png import PIL img = PIL.Image.open("python–logo.png") img
Популярные фреймворки:
* Caffe, Caffe2, CNTK, Kaldi, DL4J, Keras – набор модулей для конструирования;
* TensorFlow, Theano, MXNet – программирование графа;
* Torch и PyTorch – прописать основные параметры, а граф будет построен автоматически.
Рассмотрим работу библиотеки PyTorch (NumPy+CUDA+Autograd) из–за её простоты. Посмотрим на операции с тензорами – многомерными массивами. Подключим библиотеку и объявим два тензора: нажмём +Code, введём код в ячейку и нажмём выполнить:
import torch a = torch.FloatTensor([ [1, 2, 3], [5, 6, 7], [8, 9, 10] ]) b = torch.FloatTensor([ [–1, –2, –3], [–10, –20, –30], [–100, –200, –300] ])
Поэлементные операции, такие как "+", "–", "*", "/" над двумя матрицами одинаковых габаритов производят операции с соответствующими их элементами:
a + b tensor([ [ 0., 0., 0.], [ –5., –14., –23.], [ –92., –191., –290.] ])
Другим вариантом поэлементной операции является применение одной операции ко всем элементом по одиночке, например умножение на –1 или применение функции:
a tensor([ [ 1., 2., 3.], [ 5., 6., 7.], [ 8., 9., 10.] ]) a * –1 tensor([ [ –1., –2., –3.], [ –5., –6., –7.], [ –8., –9., –10.] ]) a.abs() tensor([ [ 1., 2., 3.], [ 5., 6., 7.], [ 8., 9., 10.] ])
Также имеются операции свёртки, такие как sum, min, max, которые на входе дают сумму всех элементов, самый маленький или самый большой элемент матрицы:
a.sum() tensor(51.) a.min() tensor(1.) a.max() tensor(10.)
Но нам будут больше интересны постолбцовые операции (операция будет производиться над каждым столбцом):
a.sum(0) tensor([14., 17., 20.]) a.min(0) torch.return_types.min( values=tensor([1., 2., 3.]), indices=tensor([0, 0, 0]) ) a.max(0) torch.return_types.max( values=tensor([ 8., 9., 10.]), indices=tensor([2, 2, 2]) )
Как мы помним, нейронная сеть состоит из слоёв, слои состоят из нейронов, а нейрон содержит на входе связи с весами в виде простых чисел. Вес задаётся обычным числом, тогда входящие связи в нейрон можно описать последовательностью чисел – вектором (одномерным массивом или списком), длина которого и есть количество связей. Так как сеть полносвязная, то все нейроны этого слоя связаны с предыдущим, а, следовательно, демонстрирующие их вектора имеют тоже одинаковую длину, создавая список равных по длине векторов – матрицу. Это удобное и компактное представление слоя, оптимизированное для использования на компьютере. На выходе нейрона имеется функция активации (сигмойда или, ReLU для глубоких и сверхглубоких сетей), которая определяет, выдаст на выходе нейрон значение или нет. Для этого необходимо применить её к каждому нейрону, то есть к каждому столбцу: мы уже видели операцию к столбцам.
Способы ускорения обучения
Пробежимся по истории развития вычислительных систем которая давала вычислительную основу для развития искусственного интеллекта:
* 1642 – механические вычислительные машины, * 1940 – ламповые вычислительные машины, * 1955 – транзисторные вычислительные машины, * 1965 – компьютеры на интегральных схемах, * 1980 – компьютеры с центральными процессорами, * 1995 – многоядерные видеокарты, * 2006 – компьютеры с многоядерными процессорами, * 2017 – компьютеры с матричными процессорами.
На универсальных процессорах можно выделить три пути обеспечения ускорения вычислений, в частности, ускорения обучения нейронных сетей, – распараллеливание вычислений, увеличение количества операций за единицу времени и увеличение объёма вычислений за операцию. Рассмотрим с самой однозначной и имеющей богатую историю способа повышения производительности – увеличение количества операций за единицу времени. Достигается это за счёт увеличения тактовой частоты процессора. Исторически мы можем проследить её историю на примерах процессоров компании Intel серии Pentium для домашних рабочих станций и игровых персональных компьютеров, которые сделали ставку именно в том числе на неё и сильно продвинулись в этом направлении. Важно заметить, что Intel имела время (история от процессоров Intel Pentium 1 100 Мегагерц до Intel Pentium 4 5600 Мегагерц), средства (эта ниша на была лидером по объёму продаж и были популярны компьютерные игры) и необходимость (имела конкурента AMD, который имел архитектурные преимущества в виде разрядности шины в 64 вместо 32, и в случае смены лидера мог договориться адаптировать программное обеспечение под эту разрядность) для того, чтобы реализовать это направление по максимуму. Процессора Intel Pentium 1 100 Мегагерц работали с охлаждающим модулем, Intel Pentium 2 400 Мегагерц – с радиатором, выше уже требовался, как минимум, вентилятор. Начиная с частоты 3200, пользователи ставили вместо полностью алюминиевого радиатора, сперва алюминиевого с медной подложкой, потом полностью медные, так как теплоёмкость у алюминия 904 Дж/(кг*град), а у менди кратно меньше 381 Дж/(кг*град), что позволяет ему быстрее отдавать тепло дальше. Большие показатели дают другие металлы не слишком мягкие и не слишком легкоплавкие, такие как серебро (250) и золото (130), поэтому пошли не по теплопроводности самого материала, а по забору тепла при плавлении материала в тепловых трубках. Пепловые трубки отходят от подложки и ведут через закреплённые на них пластины, обдуваемые двумя вентиляторами, образуя прямой поток воздуха. Тепловые трубки оказывают хороший результат (100 Вт для 3 штук, 180 Вт для 6 штук), перенос тепла которыми осуществляется за счёт испарения жидкости в них находящийся в испарительной камере у радиатора, но большая площадь меди и большая разность температуры водяного охлаждения предоставило большую популярность, а вот в ноутбуках – наоборот, тепловые трубки очень популярны, а движение возврат конденсата обусловлен капиллярной структурой в самих трубках. А для поддержки больших частот продавались процессоры, которые выбирались из партии экспериментальным путём по возможности стабильно работать на этих частотах, и требовали, зачастую, водяного охлаждения и вынесенным радиатором из их системного блока персонального компьютера. Экстремальные же частоты достигались индивидуально и требовали криогенных установок, иногда в несколько контуров. При всём при этом, с каждым 100 Мегагерц повышение частоты достигалось большими затратами с высокими рисками повреждения процессора и не получало стабильную вычислительную производительность. На 2021 проверяются решение по литографии капилляров для охлаждающей жидкости внутри процессора, что может быть особенно актуально для многослойных процессоров. Приведу процессоры без бюджетных вариантов и серверных версий компании Intel с лидирующей архитектурой x86 в CISC:
1971, 4004: 500—740 кГц 1972, 4040: 500—740 КГц 1972, 8008: 200—800 кГц 1974, 8080: 2—4 МГц 1976, 8085: 3—6 МГц 1978, 8086: 4—16 МГц 1979, 8088: 5—16 МГц 1982, 80188: 6—20 МГц 1982, 80286: 6—20 МГц 1985, 80386: 12—40 МГц 1991, 80486: 16—150 МГц 1993, Pentium: 60—300 МГц 1995, Pentium Pro: 133—200 МГц 1997, Pentium MMX: 166—233 МГц 1997, Pentium II: 233—450 МГц 1999-2003, Pentium III: 0.4—1.4 ГГц 2000-2008, Pentium 4: 1.3—3.8 ГГц 2006-2011, Core 2 Extreme: 2.3—3.2 ГГц 2008-2013, Core i3: 2.4—4.2 ГГц 2008-2020, Core i7: 1.0—4.7 ГГц 2017-2021, Core i9: 2.1—5.3 ГГц
С Pentium III ситуация не так однозначна, так как имеются пересечения по времени и в один год выходят процессоры начального уровня и топового, поэтому детализируем из отрытых источников:
год процессор i7 Base/Boost GHz 2008 Core i7-965 EE 3.2 2009 Core i7-975 EE 3.3 2010 Core i7-980X 3.3 2011 Core i7-990X 3.5 2012 Core i7-3820 3.6 2013 Core i7-4820K 3.7 2014 Core i7-4790K 4.0 / 4.4 2015 Core i7-6700K 4.0 / 4.2 2016 Core i7-7700K 4.2 / 4.5 2017 Core i7-7740X 4.3 / 4.5 2018 Core i7-8086K 4.0 / 5.0 2019 Core i7-9700KF 3.6 2020 Core i7-10700K 3.8 2021 Core i7-11700KF 3.6 год процессор i9 GHz / Boost 2017 Core i9-7900X 3.3 / 4.3 2018 Core i9-9900X 3.5 / 4.5 2019 Core i9-9990XE 4.0 / 5.1 2020 Core i9-11900KF 3.5 / 5.2 2021 Core i9-12900KF 3.5 / 5.3
И видно, что до 2017 года тенденция сохранялась. Понятно, что, конкурентом крупнейшего производителя в первую очередь является он сам и вывод последних разработок менеджментом в гарантированном горизонте их работы в должности. Но и никто не отменял, что отлаживать нужно технологические процессы и архитектуры. С другой стороны, эстафету гонки в Boost за максимальную частоту продолжается тенденция роста максимальной частоты. Boost – это повышение частоты процессора до максимума в текущих условиях. Максимум определяется стабильностью процессора (отсутствием ошибок), которая зависит от стабильности электропитания, качества охлаждения, окружающей температуры и качества процессора, величина которая плавает в определённых пределах. Процессор определяет, не наступили пограничные ли параметры, а если нет – то повышает свою частоту. Технология используется как в процессорах от Intel (Intel Turbo Boost Technology 2.0), так и в процессора от AMD (Precession Boost 2 Curve).
Ускорить вычисления можно разными способами и самый простой в начале оказался за счёт ускорения выполнения отдельных операций. Сами операции состоят из простейших оперций – И, ИЛИ и НЕ, которые реализуются транзисторами. Эти транзиторы переключаются управляющим сигналом, переходя к слудующему сигналу, тем самым простейшие опрерации сдвигаются ("проталкиваются") управляющим сигналом. Этот упрвляющий сигнал позволяет синхронизировать все операции в процессоре и поэтому его частотм назвается опорной частотой центрального процессора. Для других систем, скорость которых не зависит от процессора могут применяться отдельные кварцевые генераторы опорной частоты, например, для шины PCI-Express и мостов. В современных процессорах контрукцией их заложено выполнение нескольлких операций за один тактовый такт. И действительно, задав в два раза большую частоту мы можем произвести в два раза больше операций. Так в 1971 процессор Intel 4004 работал на чистоте 500—740 кГц, а в 1993 процессор Intel Pentium на частотах 60—300 МГц, что больше в 120 раз на минимуме и 400 на максимуме. Проблемой является то, что токи с большими частотами имеют высокое тепловыделение. Так Intel 8008 с частотой 2—4 МГц получил стальную крышку, а размеры стальной крышки росли с ростом подложки, а на Intel Pentium II с частотами 233—450 появился алюминиевый радиатор, на Intel Pentium III с частотами 0.4—1.4 ГГц уже появился кулер (вентилятор) над радиатором, а с Pentium 4 более 3 ГГц уже шли массивные радиаторы 83х68 мм с большим вентилятором 60х60 мм и зачастую с медно-алюминиевыми рёбрами и основанием, при частотах выше 4 ГГц требовалось водяное охлаждение с внешним радиатором. Безусловно, не только при увеличении частоты из-за выделения теплоты требуется уменьшения технологического процесса, но и других физических процессов. Но это всё на десктопных рабочих станциях, а для переносных – единственным решениям оставалось уменьшать частоты до примерно 2.5 ГГц. Посмотрим на тех. процессы: сравнивать имеет смысл только в рамках одной компании, ориентируясь на абсолютные единицы в начале таблицы, а ближе к концу – на относительные:
год, модель: технол. процесс 1971, 4004: 10 мкм 1972, 4040: 10 мкм 1972, 8008: 10 мкм 1976, 8085: 3 мкм 1978, 8086: 3 мкм 1979, 8088: 3 мкм 1982, 80188: 3 мкм 1985, 80386: 1.5 мкм 1991, 80486: 1.0 мкм 1993, Pentium: 0.8 мкм 1997, Pentium II: 0.35 мкм 1999, Pentium III: 0.13 мкм 2000, Pentium 4: 0.18 мкм 2006, Core 2: 0.065 мкм 2008, Core i7: 0.045 мкм 2017, Core i9: 0.014 мкм 2021, Core i9-11: 0.010 мкм
Для Apple:
2017, Apple A11: 0.010 мкм 2018, Apple A12: 0.007 мкм 2020, Apple A15: 0.005 мкм 2022, Apple A16: 0.003 мкм (планы Apple) 2027, 0.002 мкм (тестовый образец от IBM) 2029, 0.0014 мкм (предсказания)
Первыми устройствами были лампы, увеличение числа которых в устройстве ограничивалось их размером и их энергопотреблением. Сделать лампу очень маленькой довольно сложно, так нужно сделать её герметичной и закачать в неё инертный газ. Производители пытались упростить производство делая сборки из лам, когда выплавлялась не одна лампа разом, а несколько – по сути одна лампа, разделённая перегородками. Другими попытками было помещение в одну лампу несколько триодов. Но так или иначе, из-за размера, дороговизны изготовления и потребления электроэнергии их начали заменять транзисторами начиная 1950 в виде отдельных транзисторов, как в то время называли "кристаллических триодов". Долгое время барьером применения в серийного производство для транзисторов было возможность переключить своё состояние за счёт накопления потенциала из-за внешнего радиоактивного фона альфа-частицами – для избежания этого в используются корректоры в процессорах и памяти (error-correcting code memory). В мелко серийном производстве ламповые усилители звука давали определённые искажения, которые были более привычны музыкантам эпохи ламповых усилитей – сейчас подобные искажения эмулируются алгоритмически. Транзисторы 1950 годов представляли из себя отдельные электронные устройства в отдельном корпусе с выводами для впайки на лату, сходных с теми, что сейчас используются в блоках питания. Размеры транзисторов уменьшались и начали выпускать микросборки, представляющий плату в корпусе интегральной схемы, в которую вручную помещались под лупами с помощью пинцетов бескорпусные микроминиатюрные транзисторы и другие элементы поверхностного монтажа, такие как резисторы и транзисторы. Позже, часть этих элементов, таких как транзисторы и конденсаторы эмулировалось самими дорожками в силу сниженной величины токов и напряжений, в которых они работали. Для чего проводилось сужение дорожек лазером для увеличения сопротивления и созданием широкой дрожки по верх другой методом вакуумного напыления (толстопленочной технологии) с последующем заливкой корпуса. В 1960 годах начала развиваться планарная технология для создания монолитных интегральных схем, заключающаяся в том, что не создаются отдельные транзисторы, которые необходимо помещать на печатную плату, а выращиваются прямо "плате" из полупроводника, являющаяся основой всех этих транзисторов. Технология изготовление таких интегральных схем унаследовало литографию, применяющуюся в производстве дороже у печатных плат, только в данном случае формируются не только токопроводящие дрожки, но и полупроводниковые и изолирующие участки (транзисторы). Принцип сводится в равномерном нанесении требуемого покрытия и удаление его с ненужных мест различными методами. Нанесение проводящего слоя осуществляется осаждением, а на полупроводниковой подложке – выращиванием. Для удаления применяют растворители (щёлочи, кислоты), от действие которых в нужных местах защищает предварительно наносимое защитное покрытие, которое можно удалить в последствии специальными растворителями защитных покрытий. Расположение защитного покрытия и определяет расположение требуемого покрытия. Механически наносить покрытие на нужные участки чипа, как это делается на печатных платах, уже не позволяла точность нанесения и количество брака, поэтому тотально применяется фотолитография. Первый опытный образец, произведённой по этой технологии был продемонстрирован в 1959 году. Фотолитография заключается в том, что защитное покрытие наносится равномерно, в нужных местах утверждаются светом, а после промывки незатвердевшие покрытие смывается. Для проекции света его пропускают через маску (трафарет) и фокусируют линзами до нужного масштаба и силы светового потока. Маска в нужных местах пропускает свет, а линзы объектива фокусирую свет более мелкий масштаб. Таким образом точность рисунка защитного покрытия определяется точностью засвечиванием светом ещё незатвердевшего защитного покрытия. В начале века это был обычный свет, но позже длина волны не позволяла достичь необходимой точности и она смещалась в торону более коротковолнового излучения, делая стремясь к более узкому излучению, и соответственно, более точному. Так в 1971 году применялся красный свет 700 нм, в 1975 фиолетовый в 400 нм, ультраиолет с 436 нм от лампы с плазмой из ртути, с 1970 ультрафиолет в 248 нм с помощью плазмы криптона и фтора, далее применяется глубокий ультрафиолетовый (Deep Ultra Violet, DUV) с помощью фторидаргнового лазера в 193 нм, затем 150 нм и 80 нм. В 2001 году был получен экстремальноглубокий ультрафиолет (Extreme Ultra Violet, EUV) с помощью плазмы олова в 13 нм. При такой длине волны свет поглощается воздухом, для чего процесс производится в вакууме, и линзами, для чего фокусируют его специальными зеркала из слоёв кремния и слоёв молибдена. Стоимость и сложность оборудования не позволяет производить его несколькими компаниями поэтому производителями процессоров профинансирована компания ASML, ставшая монополистом. Спросс есть на него есть и он не удовлетворён полностью, так как в 2020 году выпущено всего 31 штука. Разработки аналога ведутся в Китае. Такой лазер обеспечивает точность достаточную для технологических процессов в 1.5 нм. Далее начали вступать квантовые ограничения. Сперва приделом считался процесс 14 нм, потом его отодвинули на 5 нм, сейчас ведётся освоение 3 нм для 2023-2024 года, 2 нм для 2025-2027 года и 1.4 нм для 2029 года, но с каждым разом отодвигание происходит с меньшим шагом, а сложность перехода без брака возрастает. В 2021 году процессоры на 5 нм уже есть в массовом производстве от Apple, процессоры на 3 нм в тестовом у TSMC.