Машинное обучение на практике – от модели PyTorch до Kubeflow в облаке для BigData

Евгений Сергеевич Штольц, 2020

В этой книге Главный Архитектор Департамента Архитектуры Управления Технической Архитектуры (Центра Облачных Компетенций Cloud Native и Корпоративного университета архитекторов) и архитектор решения Сбербанка делится знаниями и опытом с читателей в области ML, полученных в работе Школе архитекторов. Автор: * проводит читателя через процесс создания, обучения и развития нейронной сети, показывая детально на примерах * повышает кругозор, показывая, какое она может занимать место в BigData с точки зрения Архитектора * знакомит с реальными моделями в продуктовой среде

Оглавление

* * *

Приведённый ознакомительный фрагмент книги Машинное обучение на практике – от модели PyTorch до Kubeflow в облаке для BigData предоставлен нашим книжным партнёром — компанией ЛитРес.

Купить и скачать полную версию книги в форматах FB2, ePub, MOBI, TXT, HTML, RTF и других

Пишем свою сеть

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

Другой сложностью может быть то, что цифра может быть не в наблюдаемой области, а в произвольной, например, в углу. Для анализа самой цифры нам нужно переместить анализирующее окно в то место, где находится цифра. Для простоты пока будем полагать, что габариты анализирующего окна равны габаритам исследуемой цифры. Для решения этой задачи перед сетью ставят анализирующий слой, образующий карту нахождения цифры. Задача этого слоя определить местоположение цифры на картинке. Для простоты возьмём чёрное изображение на белом листе. Нам нужно пройтись анализатором цифры построчно по всему листку и определить местоположение. В качестве индикатора возьмём площадь чёрного цвета на индикаторе. После прохождения по листку бумаги и определения площади мы получим матрицу с цифрами площадей чёрного цвета. Где площадей чёрного цвета больше — в том месте цифра максимально вписалась в индикатор. Преобразование картинки в матрицу площадей называется операцией свёртки, а если это выполняет нейронный слой — свёрточный слой. Принцип работы был позаимствован у биологического зрительного нерва. Нейронные сети, в которых присутствует свёрточный слой (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).

Оглавление

* * *

Приведённый ознакомительный фрагмент книги Машинное обучение на практике – от модели PyTorch до Kubeflow в облаке для BigData предоставлен нашим книжным партнёром — компанией ЛитРес.

Купить и скачать полную версию книги в форматах FB2, ePub, MOBI, TXT, HTML, RTF и других

Смотрите также

а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ э ю я