Компания Apple использует технологию машинного самообучения на своих устройствах довольно долго: Siri отвечает на вопросы и развлекает пользователя, iPhoto распознает лица на фото, приложение Mail вычисляет письма, содержащие спам. Как у разработчиков приложений, у нас есть доступ к некоторым возможностям, представленным интерфейсом программирования приложений (API) Apple, например, к распознаванию лиц. А начиная с iOS 10, мы получим высокоуровневый API для распознавания речи и SiriKit.
Возможно, иногда хочется выйти за границы API, встроенных в платформу, и создать что-то уникальное. Часто мы испытываем собственные возможности компьютерного самообучения, используя одну из множества готовых библиотек или базируясь непосредственно на высокой вычислительной мощности интерфейсов Accelerate или Metal.
Например, мои коллеги наладили в нашем офисе входную систему, которая использует iPad для распознавания лица, затем постит гифку в беседе Slack и позволяет пользователям открыть дверь, используя условную команду.
Теперь у нас есть первоклассная поддержка для нейронных сетей: на Международной конференции разработчиков ПО (WWDC) 2016 компания Apple представила не один, а два API, работающих на базе нейронных сетей; они называются Basic Neural Network Subroutines (BNNS) и Convolutional Neural Networks (CNN).
Машинное самообучение и нейронные сети
Основоположник в создании интерфейсов приложений, Артур Самуэль определил машинное самообучение как «область исследований, которая дает компьютерам возможность обучаться без непосредственного процесса программирования». Системы компьютерного самообучения часто используются для работы с данными, которые не могут быть описаны с помощью традиционных моделей.
Например, можно легко написать программу, которая считает площадь дома, если известны данные о размерах и формах всех помещений; но невозможно придумать формулу для расчета стоимости дома. Система машинного самообучения, с другой стороны, отлично подходит для решения подобных задач. Предоставляя программе такие известные данные о реальном мире, как рыночная стоимость, размер дома, количество спален и т.д., можно научить программу рассчитывать примерную стоимость.
Нейронные сети – одна из наиболее типичных моделей для создания систем машинного самообучения. В то время, как математические основы нейронных сетей были описаны уже более полувека назад, в 1940-х гг., параллельная вычислительная обработка сделала их более реальными в 1980-х, а интерес к глубокому изучению привел к возрождению нейронных сетей в 2000-х.
Нейронные сети состоят из нескольких слоев, каждый из которых содержит одну или несколько узловых точек. Самая простая нейронная сеть состоит из трех слоев: входного, скрытого и выходного. Узлы входного слоя могут представлять собой отдельные пиксели изображения или другие параметры. Выходные узлы часто являются результатом классификации, например «собака» или «кошка», если мы пытаемся автоматически определить содержание картинки. Узлы скрытого слоя запрограммированы для того, чтобы произвести операцию на входе или применить активационную функцию нейрона.
Типы слоев
Существует три основных типа слоев: соединительные, свёрточные и полностью взаимосвязанные.
Соединительный слой объединяет данные, уменьшает их объем, как правило, используя максимальное или среднее значение внесенной информации. Последовательность свёрточных и соединительных слоев могут быть объединена, чтобы постепенно перегнать фотографию в сборник с постепенно увеличивающимися признаками более высокого уровня.
Свёрточный слой видоизменяет изображение, применяя матрицу свёртки к каждому его пикселю. Если вы когда-нибудь использовали фильтры Pixelmator или Photoshop, вы наверняка сталкивались с такой матрицей. Как правило, она имеет размеры 3х3 или 5х5 и применяется к пикселям входной картинки, чтобы рассчитать объемы новых пикселей на выходной картинке. Для того, чтобы получить объем выходного изображения, мы перемножим объемы пикселей исходного изображения и посчитаем среднее арифметическое.
Например, следующая матрица сделает изображение размытым:
1 1 1
1 1 1
1 1 1
В то время как эта сделает его более четким:
0 -1 0
-1 5 -1
0 -1 0
Свёрточный слой нейронных сетей использует матрицу свертки для обработки входных данных и генерирования данных для последнего слоя, например, для выделения новых параметров изображения, таких как углы.
Полностью взаимосвязанный слой может быть представлен как свёрточный слой, в котором фильтр будет такого же размера, как и исходное изображение. Другими словами, его можно считать функцией, которая назначает весовые коэффициенты для отдельных пикселей, средние результаты и выдает единый выходной объем.
Обучение нейронной сети и получение выводов
Каждый слой должен быть настроен согласно определенным параметрам. Так, свёрточный слой необходимо снабдить как информацией об исходных и выводимых изображениях (размер, количество каналов и т.д.), так и непосредственно параметрами свёрточного слоя (размер ядра, матрицы и т.д.). Полностью взаимосвязанный слой определяет входные и выходные векторы, функцию активации и нагрузку.
Для правильной работы всех компонентов нейронную сеть необходимо обучить. Процесс обучения представляет собой пропуск входящих данных через нейронную сеть. Одновременно с пропуском происходит определение выходных данных, измерение погрешности (т.е. насколько фактический результат разнится с прогнозируемым), а также корректировка выходного объема за счет обратной передачи ошибки обучения. Для обучения нейронной сети могут потребоваться сотни, тысячи и даже миллионы примеров.
В настоящее время новые API машинного обучения Apple могут быть использованы для создания нейронных сетей, способных только лишь на получение выводов, но не на обучение. И все же образовательный IT-проект Big Nerd Ranch создает классные вещи.
Интерфейс Accelerate: BNNS
Первый новый API является частью системы Accelerate и называется BNNS, что означает Basic Neural Network Subroutines (основные подпрограммы нейронной сети). BNNS является дополнением к BLAS (Basic Linear Algebra Subroutines - базовые подпрограммы линейной алгебры), которые использовались некоторыми сторонними разработчиками в приложениях по машинному обучению.
BNNS определяет слои в классе BNNSFilter. Интерфейс Accelerate поддерживает три типа слоев: свёрточный слой (созданный с помощью функции BNNSFilterCreateConvolutionLayer), полностью взаимосвязанный слой (BNNSFilterCreateFullyConnectedLayer) и соединительный слой (BNNSFilterCreatePoolingLayer).
База данных MNIST database представляет собой популярный набор данных, содержащий десятки тысяч рукописных цифр, которые были отсканированы и подстроены под пиксельное изображение 20 на 20.
Один из подходов к обработке графических данных заключается в преобразовании изображения в векторный формат и передача его через полностью взаимосвязанный слой. В случае с информацией из базы данных MNIST, после такого преобразования изображение 20x20 станет векторным на 400 значений.
Вот каким образом рукописную цифру 1 можно преобразовать в векторное изображение:
Ниже представлен пример кода для настройки полностью взаимосвязанного слоя, который принимает вектор размером 400 в качестве входных данных, использует сигмовидную функцию активации и выводит вектор размером 25:
// input layer descriptor BNNSVectorDescriptor i_desc = { .size = 400, .data_type = BNNSDataTypeFloat32, .data_scale = 0, .data_bias = 0, }; // hidden layer descriptor BNNSVectorDescriptor h_desc = { .size = 25, .data_type = BNNSDataTypeFloat32, .data_scale = 0, .data_bias = 0, }; // activation function BNNSActivation activation = { .function = BNNSActivationFunctionSigmoid, .alpha = 0, .beta = 0, }; BNNSFullyConnectedLayerParameters in_layer_params = { .in_size = i_desc.size, .out_size = h_desc.size, .activation = activation, .weights.data = theta1, .weights.data_type = BNNSDataTypeFloat32, .bias.data_type = BNNSDataTypeFloat32, }; // Common filter parameters BNNSFilterParameters filter_params = { .version = BNNSAPIVersion_1_0; // API version is mandatory }; // Create a new fully connected layer filter (ih = input-to-hidden) BNNSFilter ih_filter = BNNSFilterCreateFullyConnectedLayer(&i_desc, &h_desc, &in_layer_params, &filter_params); float * i_stack = bir; // (float *)calloc(i_desc.size, sizeof(float)); float * h_stack = (float *)calloc(h_desc.size, sizeof(float)); float * o_stack = (float *)calloc(o_desc.size, sizeof(float)); int ih_status = BNNSFilterApply(ih_filter, i_stack, h_stack);
Интерфейс Metal!
Вторая нейронная сеть API является частью системы Metal Performance Shaders (MPS). В то время как Accelerate является основой для выполнения быстрых вычислений на CPU, Metal доводит GPU до предела его возможностей. Основа интерфейса называется CNN (Convolution Neural Network).
MPS поставляется с аналогичным набором APIs. Создание свёрточного слоя требует использования функций MPSCNNConvolutionDescriptor и MPSCNNConvolution. Функция MPSCNNPoolingMax обеспечит параметры соединительного слоя, а полностью взаимосвязанный слой будет создан при помощи функции MPSCNNFullyConnected. Функция активации определяется такими подклассами, как MPSCNNNeuron: MPSCNNNeuronLinear, MPSCNNNeuronReLU, MPSCNNNeuronSigmoid, MPSCNNNeuronTanH, MPSCNNNeuronAbsolute.
Сравнение BNNS и CNN
Таблица представляет собой список функций активации в Accelerate и Metal:
Accelerate/BNNS |
Metal Performance Shaders/CNN |
---|---|
BNNSActivationFunctionIdentity |
|
BNNSActivationFunctionRectifiedLinear |
MPSCNNNeuronReLU |
|
MPSCNNNeuronLinear |
BNNSActivationFunctionLeakyRectifiedLinear |
|
BNNSActivationFunctionSigmoid |
MPSCNNNeuronSigmoid |
BNNSActivationFunctionTanh |
MPSCNNNeuronTanH |
BNNSActivationFunctionScaledTanh |
|
BNNSActivationFunctionAbs |
MPSCNNNeuronAbsolute |
Функции объединения:
Accelerate/BNNS |
Metal Performance Shaders/CNN |
---|---|
BNNSPoolingFunctionMax |
MPSCNNPoolingMax |
BNNSPoolingFunctionAverage |
MPSCNNPoolingAverage |
Accelerate и Metal обеспечивают очень похожий набор возможностей для нейронных сетей, поэтому выбор между ними будет зависеть от используемого приложения. С учетом того, что графические процессоры (GPU) обычно используются для необходимых в машинном обучении вычислений, локальность данных может стать причиной, по которой версия Metal CNN покажет худшие результаты, нежели Accelerate BNNS. Но если нейронная сеть работает на основе данных, которые были загружены в графический процессор при помощи MPSImage или нового MPSTemporaryImage, в таком случае Metal выглядит явным победителем.
Комментарии
Неплохо, особенно по части иллюстрации преобразования растра в вектор. Несколько сумбурно, но это не вина автора перевода.
Если о нейронках, то хороша бы серия популярных статей. Иначе может сложиться впечатление, что нейронки пригодны лишь для графики.
Как уже надоело, что любая поделка яблочников превозносится до небес! Нейронные сети сегодня везде, удивили. Мы в свое время тоже в парсер почты небольшую нейронку встроили - благо, был движок с диссера у руководителя. И что, кричали, что мы лидеры? Любую ерунду возьмите - ах, металлический корпус! Ах, две камеры! Ооо, Apple! А по факту - просто удачное копирование и зомбирование публики.
Хм. Джобс всегда хотел этих копировщиков из Самсунга то "удавить" (С) - Ненавидел их люто просто.