*Рабочее название

Когда в 1995 г. г-н Гартнер навязал миру свой цикл ажиотажа, я сомневаюсь, что он думал о глубоком обучении, глубоких нейронных сетях, машинном обучении и искусственном интеллекте (хотя, если вы проверите мои факты, а не должны, вы обнаружите, что интеллектуальные Агенты и Распознавание рукописного ввода были с самого начала). Некоторые люди с оптимизмом смотрят на то, что мы прошли Пик ИИ и можем вернуться к разведению наших змей для следующего продавца нефти, который появится. Почему мы вздрагиваем, когда люди упоминают методы интеграции машинного обучения на основе облака, это риторический вопрос — ответ очевиден, люди пытались продать нам свои полусырые идеи, и мы обожглись слишком много раз. Очевидно, я принял решение, и мы должны пропустить эту идею и перейти к квантовому увлечению. За исключением того, что за последние пять лет подходы машинного обучения превзошли предыдущую современную производительность традиционных методологий статистического моделирования в таких важных областях, как распознавание изображений и обработка естественного языка. Так что, возможно, мне нужно вложить свои деньги в то, что я говорю, прыгнуть и построить что-то самому, чтобы развить интуитивное понимание того, что на самом деле возможно и как это делается. По крайней мере, этот процесс должен помочь мне вооружиться против следующего кибер-продажного шарлатана, который постучится.

Проблема: я не могу отличить руки от ног

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

Убери это

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

pip install google_images_download

googleimagesdownload -k hands -l 100
googleimagesdownload -feet -l 100

Цель здесь состоит в том, чтобы собрать некоторые необработанные данные, мы собрали [-l(imit)] 100 изображений рук и столько же ног из Google Images. Это те же изображения, которые появятся, если вы просматриваете Google Images и выполняете поиск по ключевому слову [-k(eywords)].

Часть «Очистить» — это то, где мы проходим и выбрасываем как можно больше неправильно помеченных данных, вы получите гораздо лучшие результаты, если сделаете это.

Тренируйся

Я собираюсь использовать библиотеку python под названием Fastai, она действительно хороша. Это своего рода оболочка над PyTorch (фреймворк глубокого обучения, созданный/поддерживаемый Facebook и используемый исследователями машинного обучения по всему миру. На данный момент его крупным конкурентом является Tensorflow, поддерживаемый Google). Fast.AI придерживается принципа программируй быстро — оставь математику на потом, который я с радостью перенял. (Они приняли его для своих курсов, потому что рецензируемая наука показывает, что это более эффективная педагогика обучения, я просто ленив и не хочу объяснять здесь теорию — для этого у нас есть Google).

Я пытался дать вам точные инструкции, чтобы вы могли следовать учебному стилю, если вы застряли, я, вероятно, пропустил шаг установки или вы используете немного другую среду, Fastai docs - это место идти.

Вы никогда не слышали о Google Colab, возьмите его. Это ноутбуки в стиле Jupyter, которые живут в облаке, могут поддерживаться графическим процессором (и вашим хранилищем на диске Google), все бесплатно, но вам нужно войти в свою учетную запись (я думаю, из-за телеметрии).

Все нижеследующее предполагает, что вы работаете в Google Colab, но это в равной степени применимо независимо от того, где вы получаете свои вычисления:

!pip3 install fastai
from fastai.vision import *
classes = ['feet', 'hands']
path = Path('/content/downloads')
for c in classes:
  print(c)
  # remove corrupt/incompatible files from our dataset
  verify_images(path/c, delete=True)

Далее мы собираемся загрузить наши данные в класс fastai под названием ImageDataBunch, наши данные помечены на основе имен исходных папок, поэтому мы будем использовать метод .from_folder(). Этот шаг необходим, поскольку впоследствии он становится входными данными для модели глубокого обучения. Есть много вариантов конфигурации, но опять же документы действительно полезны.

np.random.seed(42)
data = ImageDataBunch.from_folder(path, train=".", valid_pct=0.2,
        ds_tfms=get_transforms(), size=224, num_workers=4).normalize(imagenet_stats)

Мы хотим знать, будет ли наша модель делать точные прогнозы при представлении данных/футов, которых она раньше не видела. Это означает, что нам нужно придержать часть нашего набора данных для последующего тестирования. Это называется проверочным набором. Метод «ImageDataBunch.from_folder()» удобен тем, что он автоматически резервирует случайную часть ваших данных для этой цели (установлено значением valid_pct=0,2 до 20% по умолчанию). Вот почему нам нужно установить случайное начальное число. Это может быть любое значение, его просто нужно знать, это означает, что если нам нужно перезагрузить наши данные, один и тот же «случайный» выбор изображений окажется в наборах для обучения и проверки во второй раз. вокруг. Это важно, потому что мы не хотим, чтобы наша модель когда-либо обучалась на проверочном наборе, иначе у нас не будет возможности измерить наши результаты.

data.classes
>> ['feet, 'hands']
data.show_batch(rows=3, figsize=(7,8))
>>

learn = cnn_learner(data, models.resnet34, metrics=error_rate)

cnn_learner — сверточная нейронная сеть, отлично подходящая для задач компьютерного зрения

resnet34 — Архитектура/модель/функция, которую мы подгоним под наши данные.

метрика — мера того, насколько мы близки к тому, что хотим

Давайте сохраним этот высокий уровень (т.е. если я углублюсь в детали, я, вероятно, совершу ошибку), но архитектура resnet34 использовалась в сочетании с большой базой данных фотографий под названием ImageNet для обучения модели, которая хороша в классификации. изображение в одну из многих категорий. Идея такова: эта модель много знает об изображениях, она уже понимает общие формы, узоры, цвета, элементы и т. д. изображений. У нас менее 200 фотографий ног. Это не очень много. ImageNet содержит миллионы изображений. Единственная строка кода выше позволяет нам использовать эту существующую работу, библиотека fastai загрузит предварительно обученную модель и применит (или изменит, не на 100% уверен, какой именно) последний слой (глубокое обучение в основном луковица), так что вместо предсказания одного из 1000 классов он будет предсказывать 1 из 2; рука или нога.

# Train the final layer of the model with our foot/hand dataset
learn.fit_one_cycle(4)

error_rate*100 — это процент изображений, которые модель предсказала неправильно. Он начался с 24% (ужасно), улучшился до 10,8% (лучше, чем у человека!), а затем начал ухудшаться. Модель «видит» каждое изображение в тренировочном наборе один раз за эпоху. Поскольку набор данных настолько мал, я думаю, что наша модель переоснащается, запоминая изображения в наборе, поэтому производительность ухудшается с дополнительными эпохами, она неправильно предсказывает изображения, которые она не видела. Мы можем предотвратить это и повысить производительность, предоставив модели больше данных, дополнив данные, которые у нас уже есть, или просто обучая меньшее количество эпох.

Есть и другие методы обучения, которые стоит изучить. Я предположил, что предварительно обученные веса действительно хороши, и использовал свои данные только для точной настройки модели и обучения окончательного слоя классификации. Мы можем «разморозить» более ранние слои и обучить их также с нашими данными. В зависимости от приложения это может значительно улучшить вашу производительность. Чем «более отличается» ваш набор данных от данных в ImageNet, тем важнее это будет. Чтобы понять, зачем искать в Google «визуализацию dnn-слоев», в основном более ранние слои в сети изучают более простые структуры. Маловероятно, что наши ‹ 200 футов/ладоней могут добавить что-то, чего модель еще не узнала из миллионов других изображений. Но если бы мы смотрели на спектрограммы, аэрофотоснимки или что-то еще, действительно отличающееся от изображений ImageNet, возможно, мы могли бы внести что-то новое в эти слои. Вы также можете разбить модель на части и обучать разные части с разной скоростью, часто вам нужно обучать более ранние слои с очень низкой скоростью обучения, а более поздние слои — с более высокой.

interp = ClassificationInterpretation.from_learner(learn)
interp.plot_confusion_matrix()

Развернуть это

Оставим пока это здесь. Я хочу изучить методы сбора большего количества данных, лучшей очистки данных и повышения точности модели. Затем я хочу развернуть модель как веб-приложение. Часть меня хочет использовать всю инфраструктуру как код и построить конвейер непрерывной интеграции/непрерывного развертывания (CI/CD). Где я могу нажать на GitHub и автоматически повторно развернуть веб-приложение (очевидно, dev = prod, и модульное тестирование определенно будет существовать). Когда все это работает хорошо, мы можем использовать его в качестве основы для модели, направленной на решение реальной проблемы #infosec. У меня есть несколько идей, но если вы читаете это и у вас есть идеи, не стесняйтесь ими поделиться.

Вопросы-Ответы

В. Это так просто

А. Да

В. Это не имеет ничего общего с Threat Hunting или Infosec.

А. Да

В. Собираетесь ли вы сначала заняться развертыванием веб-приложений CI/CD, Deep Learning, очисткой данных или Velociraptor? Потому что меня действительно волнует только Ψ.

О. Да (Редактировать: оказывается, ответ заключается в развертывании модели машинного обучения в качестве веб-приложения, часть 2 можно найти здесь: Развертывание: использование Heroku для непрерывной сборки и развертывания веб-приложения на основе глубокого обучения.)