Искусственный интеллект - это сложно

Ядерная мышеловка

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

Ученые сейчас строят модели с триллионами параметров. Гигантские системы вроде GPT-3 и даже более крупные модели вроде Wu Dao 2.0 сходят с конвейера. Эти поистине огромные модели, их меньшие братья на основе трансформаторов и даже старые добрые нейронные сети, созданные с нуля, очень популярны в средствах массовой информации и в практическом применении. Есть сценарии, в которых эти базуки очень полезны, но многие другие ситуации можно решить с помощью чрезвычайно простых моделей машинного обучения.

Ядерная мышеловка - это мысленный эксперимент, которому меня научили на первом году обучения в инженерной школе. Идея состоит в том, что термоядерный взрыв эффективен при убийстве мыши, но также является очень дорогим способом создания мышеловки. Это перебор. Почему-то физики тоже любят говорить о ядерных мышеловках, но в данном случае речь идет о чрезмерной инженерии решения по сравнению с более простыми приемлемыми решениями. Искусственный интеллект полон огромных решений крошечных проблем. Вы должны быть осторожны, чтобы вас не обмануть, заставив принять лучшую модель в показателях машинного обучения (например, точность, отзывчивость, показатель f1 и т. Д.), А затем осознать, что вы будете платить намного больше денег за оборудование и пропускная способность вашего вывода будет намного ниже. В реальной жизни решение оптимального размера с инженерной точки зрения важнее, чем выжать все до последней капли из метрик машинного обучения.

Давайте рассмотрим один или два примера, чтобы доказать это. Код для этих примеров можно найти здесь.

Пример 1. Определите рукописную цифру «0»

Набор данных MNIST - это хорошо известная коллекция небольших изображений рукописных цифр в оттенках серого. Этот набор данных является примером, который используется для измерения и сравнения эффективности решений машинного зрения. Модели машинного обучения с лучшей производительностью MNIST можно найти здесь. К сожалению, наиболее эффективные решения также дороги в вычислительном отношении и имеют раздражающе долгую задержку, как мы вскоре увидим. Что мы можем сделать, чтобы получить быстрое и дешевое решение для распознавания цифры 0?

Во-первых, давайте вспомним, что уменьшение размерности требует затрат на вычисления во время вывода и влияет на производительность нашей модели. Однако простое удаление размеров и уменьшение их разрешения не связано с этими затратами. Давайте воспользуемся несколькими приемами, чтобы удалить части изображения MNIST и, как сумасшедший, понизить разрешение, чтобы минимизировать наши затраты.

Набор данных разделен на обучающий набор из 60 000 изображений и тестовый набор из 10 000 изображений. Каждое изображение MNIST состоит из 784 пикселей, каждый из которых содержит целочисленное значение от 0 (черный) до 255 (белый). Вот 3 примера того, как выглядят эти изображения.

Чтобы начать упрощать наши данные, мы можем просто объединить каждое изображение в длинный список чисел, полностью игнорируя то, что данные представляют собой изображение. Затем мы конвертируем метки для цифр 0, 1, 2,… 9 в метку, которая равна «1», когда цифра равна нулю, и «0» в противном случае.

На этом этапе мы должны проверить, насколько хорошо такая простая модель, как дерево решений, соответствует нашему набору данных. Модель хорошо соответствует обучающим данным, и дерево решений уловило 94% нулей в данных тестирования. Ниже приводится часть отчета о классификации для этой модели «БЕЗ УСИЛИЙ»:

NO EFFORT
            precision    recall  f1-score   support
Not 0       0.99         0.99    0.99       9020
Was 0       0.92         0.94    0.93       980
accuracy                         0.99       10000

Эта исходная модель использовала все 784 беззнаковых 8-битных чисел (байтов) в каждом изображении. Затем давайте возьмем каждый второй столбец на картинке, а затем отрежем первые 10 и последние 10 пикселей, потому что они нам не нужны для распознавания нулей. Мы также сокращаем каждый пиксель до единицы или нуля. Раньше пиксель имел оттенки серого и мог находиться в диапазоне от 0 до 255. Теперь пиксель либо черный, либо белый. После этих изменений у нас остается 372 пикселя на изображение. Затем мы можем исследовать обучающий набор данных изображений, чтобы уничтожить индексы массива, в которых есть несколько выборок (в основном нули или в основном единицы независимо от записанной цифры). Мы можем только взглянуть на обучающие данные, а затем, когда мы решим, какие пиксели изображения удалить, мы просто применим те же удаления к тестовым изображениям.

После субдискретизации и удаления пикселей с низким разнообразием мы теперь проверяем, какие пиксели имеют низкую корреляцию с созданной нами меткой. Пиксели, которые не соответствуют ответу, мы можем просто удалить. После этого изменения у нас получается 281 пиксель на изображение.

Следующим шагом является определение пикселей, которые сильно коррелируют друг с другом, и удаление одного из двух коррелирующих пикселей из изображения. После этого мы получаем 255 двоичных пикселей на изображение. Теперь весь наш образ умещается в 32 байта вместо исходных 784. Мы не только сэкономили место для хранения. Мы подгоняем дерево решений к этому сжатому набору данных изображений, и следующее является частью отчета о классификации для этой меньшей модели «СРЕДНИЕ УСИЛИЯ»:

MEDIUM EFFORT
            precision  recall  f1-score   support         
Not 0       0.99       0.99    0.99       9020        
Was 0       0.92       0.95    0.94       980      
accuracy                       0.99       10000

Чего ждать? Мы удалили 752 байта из 784 наших данных для каждого изображения! Как модель по-прежнему работает на том же уровне производительности? На самом деле немного лучше, если вы присмотритесь.

Что ж, вот почему мы стараемся сначала упрощать, а потом усложнять… и мы еще не закончили. Мы можем убрать еще 127 функций практически без последствий. Имея только 128 из 255 оставшихся пикселей, мы подгоняем модель дерева решений к обучающим данным и получаем следующие результаты тестирования для этой «TINY» модели:

TINY
         precision    recall  f1-score   support         
Not 0    1.00         0.99    0.99       9020        
Was 0    0.92         0.97    0.94       980

Тем не менее… нет… коллапс!

А теперь давайте посмотрим, что мы получили от этих усилий:

Мы должны подвести итоги того, где мы находимся. Мы нашли более быстрый и эффективный с точки зрения хранения способ обнаружения рукописных символов 0. Но работает ли этот трюк и с другими вещами?

Пример 2: определить сандалии

Показав, что наш тупой подход хорошо работает с рукописными цифрами, работает ли тот же подход с более сложными данными? Некоторое время ученых беспокоило, что MNIST - это слишком простой набор данных, поэтому существует более сложный набор данных под названием Fashion MNIST, который представляет большую проблему, чем рукописные цифры. Хотя Fashion MNIST по-прежнему имеет те же размеры (784 беззнаковых 8-битных чисел, представляющих изображение в оттенках серого 28x28), в нем есть более сложные объекты, чем MNIST, такие как рубашки и кошельки. Объекты в наборе данных: 'T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot'.

Кстати, меня очень развлекает встраивание изображений Fashion MNIST:

Прежде чем мы повторно применим наш подход от MNIST к Fashion MNIST, давайте взглянем на несколько изображений:

Мы видим, что эти объекты действительно намного сложнее рукописных цифр.

Как же наши уловки работают с этим набором данных? Вот результаты:

Выглядит отлично! А как насчет показателей качества? Достаточно ли хорошо модель «работала»?

NO EFFORT FASHION
           precision  recall  f1-score   support    
Not Sandal 0.99       0.99    0.99       9000       
Sandal     0.89       0.89    0.89       1000      
accuracy                      0.98       10000
MEDIUM EFFORT FASHION
           precision  recall  f1-score   support    
Not Sandal 0.99       0.98    0.99       9000       
Sandal     0.87       0.88    0.87       1000      
accuracy                      0.97       10000
TINY FASHION
           precision  recall  f1-score   support    
Not Sandal 0.98       0.99    0.98       9000       
Sandal     0.87       0.85    0.86       1000      
accuracy                      0.97       10000

Как видно из приведенных выше результатов, эти уловки довольно хорошо работают даже в более сложных обстоятельствах. Без изменений в нашем подходе мы создали очень простые деревья решений, которые правильно поймали 89%, 88% и 85% сандалий в тестовой выборке. Мы не совсем исследовали пространство дизайна. На первый взгляд все это было довольно легким. Во многих случаях использования мы можем отклонить выходные данные модели так, чтобы несколько предсказаний одного и того же объекта подряд повысили нашу уверенность в наблюдении, что привело к точности и отзыву выше уровней одиночного кадра, указанных здесь.

Заключение

В этой статье мы увидели, что простые подходы, не требующие больших усилий, и не требующие особой сложности, могут обеспечить разумную производительность с точки зрения качества модели, задержки и требований к хранилищу. Если вы пытаетесь максимизировать скорость своего решения, минимизировать количество параметров модели (для размещения вещей в небольших устройствах или встроенных платформах) или минимизировать затраты на вывод (например, ваш REST API с зарезервированным графическим процессором стоит вам намного больше, чем CPU- на основе зарезервированной вычислительной мощности). Гигантские предварительно обученные модели могут быть просто излишними для решения проблемы, которая вам небезразлична. Не забудьте проверить, является ли ваше «большое» решение ядерной мышеловкой.

Код для этой статьи доступен ЗДЕСЬ.

Если вам понравилась эта статья, то взгляните на некоторые из моих самых читаемых прошлых статей, например, Как оценить проект ИИ и Как нанять консультанта по ИИ. И привет, присоединяйся к рассылке новостей!

До скорого!

-Даниэль
linkedin.com/in/dcshapiro
[email protected]