*Рабочее название
Когда в 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 для непрерывной сборки и развертывания веб-приложения на основе глубокого обучения.)