0x00 Предисловие
Недавно я прочитал несколько статей, в которых рассказывалось о применении алгоритмов глубокого обучения в области безопасности.Это может значительно повысить эффективность обнаружения продуктов безопасности.Я решил посвятить свою энергию изучению этих знаний. Вчера я только что видел, как большой парень поделился учебником по глубокому обучению. В процессе изучения урока я кое-что записал, поэтому у меня есть эта заметка.
Поскольку я только начинаю соприкасаться с этим содержанием, ошибки в написании неизбежны, и я надеюсь, что вы меня во многом поправите.
0x01 Первое знакомство с глубоким обучением
В начале заметки сначала поймите 3 вопроса:
Что такое искусственный интеллект?
Что такое машинное обучение?
Что такое глубокое обучение?
Давайте сначала поговорим об определении искусственного интеллекта.Искусственный интеллект используется для имитации мыслительного поведения людей.Вообще говоря, он предназначен для решения некоторых нечетко определенных задач с помощью некоторых алгоритмов.
Как насчет машинного обучения? Машинное обучение — это отрасль искусственного интеллекта, которая в основном использует некоторые статистические методы для сжатия и обучения данных для получения упрощенной модели, а также использует обученную модель для обработки неизвестного контента.
Глубокое обучение — это подмножество машинного обучения, которое можно проследить до развития нейронных сетей.По сравнению с нейронными сетями, глубокое обучение может сделать модели более глубокими и сложными. Объем данных также будет больше, а с более мощными вычислительными ресурсами можно будет добиться лучшего эффекта обучения.
0x02 Сценарии приложений глубокого обучения
Технология глубокого обучения широко используется в различных областях, вот несколько известных сценариев, в которых применяется технология глубокого обучения:
1. АльфаГо
AlphaGo использует алгоритм обучения с подкреплением.Благодаря большому количеству симуляций, обучения и вычислений он, наконец, может победить людей в соревновании по го.
2. Распознавание объектов
Беспилотная камера автомобиля может идентифицировать людей, объекты и т. д. впереди. Соответствующей технологией является распознавание объектов в области компьютерного зрения.
3. Распознавание голоса
В этой области есть много контактов, таких как голосовые помощники различных мобильных телефонов, умные колонки, выпущенные различными производителями IoT, и т. д.
4. Машинный перевод
На основе алгоритмов глубокого обучения можно повысить точность машинного перевода.
5. Система рекомендаций
Большинство веб-сайтов электронной коммерции рекомендуют продукты, которые пользователи могут захотеть купить, на основе обычных привычек пользователей при просмотре и поиске в сочетании с алгоритмами глубокого обучения.
6. Нажмите, чтобы предсказать
В соответствии с обычными привычками пользователя при просмотре и поиске поисковая система сочетает алгоритмы глубокого обучения, чтобы рекомендовать рекламные объявления и повышать рейтинг кликов и коэффициент конверсии рекламных объявлений.
0x03 Введение в глубокое обучение
Автор учебника упоминает, что поясняет в последующих уроках «Контент и промышленные приложения по сравнению только с существенной разницей между размером и сложностью модели данных». В этой серии руководств будут объясняться отраслевые практики, обычно используемые в сочетании с глубиной изучения алгоритмов, что ничего другого, я всегда буду следить за примечаниями к обновлениям, ища заламывающие руки руки :)
Общие рамки глубокого обучения
Я должен сказать, что Factory A также усердно работала над продвижением своей системы глубокого обучения, ха-ха.
Установка MXNet/Gluon
Согласно официальной документации, сначала установите Miniconda, соответствующий адрес загрузки:repo.continuum.IO/mini-con-big/m….
wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
Загрузите соответствующий учебник и код:
git clone https://github.com/mli/gluon-tutorials-zh
cd gluon-tutorials-zh
bash
conda env create -f environment.yml
source activate gluon
Установка завершена.
Вы можете активировать и выйти из виртуальной среды с помощью следующих команд:
source activate gluon
source deactivate
Установите плагин notedown, запустите Jupyter Notebook и загрузите плагин:
pip install https://github.com/mli/notedown/tarball/master
jupyter notebook --NotebookApp.contents_manager_class='notedown.NotedownContentsManager' --allow-root
Наконец, сопоставьте удаленный порт 8888 с локальным, и тогда вы сможете получить к нему доступ через браузер.
ssh -L 8888:localhost:8888 root@myserver
http://localhost:8888/notebooks/chapter_crashcourse/introduction.md
0x04 Как использовать NDArray для обработки данных
Официальная документация NDArray уже подробно описана, в этой статье не будет лишнего, нужно лишь знать, что NDArray мощнее NumPy.Обеспечивает асинхронные операции для CPU и GPU,в то же времяПоддержка автоматического вывода.
Остается только следовать документации.
Несколько разных методов создания NDArray
Пункт 1: Импорт nd из mxnet
Пункт 2: Используйте функцию arange() для создания вектора-строки длиной 12
NDArray содержит 12 элементов (элементов), значения которых равны 0-11 и определяются arange(12). Свойство
Пункт 3: Используйте функцию reshape(), чтобы изменить форму x и преобразовать x в матрицу с 3 строками и 4 столбцами.
Пункт 4: Создайте тензор с элементами 0 и формы (2,3,4). PS: И матрицы, и векторы являются особым видом тензора.
Пункт 5: Аналогичным образом создайте тензор с каждым элементом, равным 1.
Пункт 6: Укажите значение каждого элемента в NDArray через список Python (список).
Пункт 7: С помощью метода nd.random.normal() значение каждого элемента NDArray генерируется случайным образом, и создается NDArray формы (3,4). Каждый элемент случайным образом выбирается из нормального распределения со средним значением 0 и дисперсией 1.
Пункт 8: Получите фигуру через атрибут shape и получите количество элементов в NDArray через атрибут size.
Операции на NDARRAY
Пункт 1: элемент-мудрый дополнение
Пункт 2: Поэлементное умножение
Пункт 3: Поэлементное деление
Пункт 4: Поэлементное возведение в степень, exp
Пункт 5: Транспонируйте матрицу b, выполните операцию умножения матриц над матрицами a и b, a имеет 3 строки и 4 столбца, а b — 4 строки и 3 столбца, поэтому в результате получится матрица с 3 строками и 3 столбцами. точка
Пункт 6: Суммируйте элементы NDArray (результат — скаляр, но все еще в формате NDArray, который можно преобразовать в число в Python с помощью функции norm().asscalar()), sum()
широковещательный механизм
Операции на уровне элементов между двумя NDArray, упомянутыми выше, основаны на одинаковой форме двух NDArray.Если формы двух NDArray различаются, во время операции будет запущен механизм вещания, то есть два NDArray будут первыми сделать в ту же форму, а затем выполнить операцию.
Механизм широковещательной передачи понимается просто как копирование между строками и столбцами для достижения одинаковой формы между разными NDArray.
Накладные расходы памяти, генерируемые NDArray в процессе работы
Пункт 1: Каждая операция открывает новое пространство памяти для хранения результата операции после операции.
Пункт 2: Результат вычисления может быть записан в пространство памяти, созданное предыдущей переменной через [:]. Метод nd.zeros_like(x) создает NDArray той же формы, что и x, но с нулевыми элементами.
Пункт 3: В операции пункта 2, несмотря на то, что адрес памяти переменной z одинаков до и после вычисления, по сути, его принцип работы по-прежнему заключается в том, чтобы поместить значение x + y во вновь открытое пространство памяти, а затем скопируйте результат в память z.
Чтобы избежать накладных расходов памяти во время этого вычисления, можно использоватьпараметр out в функции полного имени операторарешить проблему.
Видно, что адреса памяти до и после одинаковы, и этих накладных расходов также удалось избежать.
Пункт 4: Существующие значения NDArray не будут повторно использоваться в последующих программах, а следующие методы можно использовать напрямую для уменьшения накладных расходов на память. х+=у, х[:]=х+у
Индекс NDArray
По аналогии с индексом списка (списка) в Python, индекс NDArray можно понимать как позицию каждого элемента. Значение индекса начинается с 0 и постепенно увеличивается.
Например, матрица с 3 строками и 2 столбцами имеет индексы строк 0, 1, 2 и индексы столбцов 0, 1.
Пункт 1: Создайте матрицу x с 3 строками и 3 столбцами, через x[1:3], в соответствии с принципом открытия-закрытия Python, можно узнать, что взятое значение — это данные с индексами 1 и 2 строки.
Статья 2: Через вид x[1,2] указанный элемент можно убрать и переназначить.
Пункт 3: Несколько элементов в NDArray могут быть удалены таким образом [1:2,1:3], и эти элементы могут быть переназначены.
Преобразование между форматами NDArray и NumPy
Вы можете преобразовать numpy в ndarray с помощью функции array() и преобразовать ndarray в numpy с помощью функции asnumpy().
резюме
NDArray — основной инструмент для хранения и преобразования данных в MXNet, под которым можно понимать структуру данных, реализованную MXNet.
В этом разделе вы можете узнать, как создавать, работать, индексировать и преобразовывать формат numpy в NDArray.
0x05 Кратко опишите функцию автоматической деривации, предоставляемую MXNet
Многие фреймворки глубокого обучения должны компилировать граф расчета для вывода, но MXNet в этом нет необходимости.Функция автоматического вывода может быть реализована с помощью встроенного пакета autograd.
Давайте рассмотрим два примера.
Первый: Вывод простых математических функций
Дифференцировать функцию y=2x^2
Подробностей немного:
1. Чтобы найти производную переменной x, вам нужно сначала вызвать функцию x.attach_grad(), чтобы создать необходимое пространство памяти.
2. Чтобы уменьшить накладные расходы на вычисления и память, по умолчанию MXNet не будет записывать график вычислений, используемый для нахождения обратной величины.Нам нужно вызвать функцию autograd.record(), чтобы позволить MXNet записать соответствующий график вычислений.
3. Вычислите обратное значение с помощью функции y.backward(), и результатом будет x.grad.
Второй: вывод потока управления Python
Получите следующую функцию:
def f(a):
b = a * 2
while b.norm().asscalar() < 1000:
b = b * 2
if b.sum().asscalar() > 0:
c = b
else:
c = 100 * b
return c
Окончательное выходное значение c функции f(a) определяется входным значением a, то есть c=xa, и производной x=c/a.
резюме
Автоматическая деривация через MXNet делится на 3 шага:
1. Освободить место в памяти для хранения производных a.attach_grad()
2. Запишите график расчета через функцию autograd.record() и реализуйте соответствующую функцию
3. Вызовите функцию c.backward() для вывода
0x06 Как реализовать простую линейную регрессию с помощью ndarray и autograd
В качестве отступления, поскольку я занимаюсь сетевой безопасностью, вместо того, чтобы тратить много времени на изучение основных математических теорий, лучше сначала понять, как реализовать эти алгоритмы с помощью некоторых зрелых фреймворков глубокого обучения и применить их в области безопасности ( таких как анализ трафика), анализ вредоносных образцов, уничтожение веб-оболочки и т. д.). Во-первых, легче создать ценность, а во-вторых, это также может стимулировать интерес к углубленному обучению.
Линейная регрессия — это тип контролируемого обучения, самая простая и полезная однослойная нейронная сеть.
Насколько я понимаю, для некоторого набора данных X, в соответствии с обученной моделью (введение набора данных X в модель), ему соответствует определенное значение y. Обучить эту модель — это все, что нам нужно сделать.
Тогда линейная регрессия будет y=ax+b, все, что нам нужно сделать, это определить значение наклона a и смещения b.
Шаг 1: Создание набора данных
В производственной среде промышленного уровня наборы данных часто извлекаются из реальных бизнес-сценариев (анализ поведения атак в веб-журналах, прогнозирование цен на жилье и т. д.) Это демонстрация, поэтому пока мы будем использовать случайно сгенерированные данные.
В первом примере автор использует набор искусственно сгенерированных данных, и соответствующая формула генерации выглядит следующим образом.
y[i] = 2*X[i][0] - 3.4*X[i][1] + 4.2 + noise
Шум подчиняется нормальному распределению со средним значением 0 и дисперсией 0,1.
Соответствующий код выглядит следующим образом:
>>> from mxnet import ndarray as nd
>>> from mxnet import autograd
>>> num_inputs = 2
>>> num_examples = 1000
>>> true_w = [2,-3.4]
>>> true_b = 4.2
>>> X = nd.random_normal(shape=(num_example,num_inputs))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'num_example' is not defined
>>> X = nd.random_normal(shape=(num_examples,num_inputs))
>>> y = true_w[0]*X[:,0]+true_w[1]*X[:,1]+true_b
>>> y += .01*nd.random_normal(shape=y.shape)
Шаг 2: чтение
Когда у нас есть определенный набор данных, нам нужно сделать, это прочитать данные. Продолжайте читать эти блоки данных, для обучения нейронной сети.
Соответствующая функция выглядит следующим образом:
>>> def date_iter():
... idx = list(range(num_examples))
... random.shuffle(idx)
... for i in range(0,num_examples,batch_size):
... j = nd.array(idx[i:min(i+batch_size,num_examples)])
... yield nd.take(X,j),nd.take(y,j)
Создайте итератор с помощью ключевого слова yield и по очереди извлекайте разные образцы данных (10).
Данные в итераторе извлекаются через непрерывный обход цикла for.
>>> for date,label in adte_iter():
... print(date,label)
... break
...
Далее прочитанные данные будут переданы в заданный нами алгоритм обучения.
Шаг 3: Определите модель
Давайте случайным образом инициализируем параметры модели.
Создайте градиенты параметров:
После инициализации параметров мы можем определить модель:
>>> def net(X):
... return nd.dot(X,w)+b
Шаг 4: Определите функцию потерь
Функция потерь используется для измерения разрыва между прогнозируемой целью и истинной целью.
def square_loss(yhat,y):
return (yhat - y.reshape(yhat.shape))**2
Шаг 5: Оптимизация
Решите, используя градиентный спуск.
def SGD(params,lr):
for param in params:
param[:] = param - lr * param.grad
Шаг 6: Обучение
>>> epochs = 5
>>> learning_rate = .001
>>>
>>> for e in range(epochs):
... total_loss = 0
... for data,label in adte_iter():
... with autograd.record():
... output = net(data)
... loss = square_loss(output,label)
... loss.backward()
... SGD(params,learning_rate)
... total_loss += nd.sum(loss).asscalar()
... print("%d,loss: %f" % (e,total_loss/num_examples))
...
0,loss: 0.130911
1,loss: 0.002628
2,loss: 0.000150
3,loss: 0.000102
4,loss: 0.000101
Ознакомьтесь с результатами обучения (как мы и ожидали)
0x07 Линейная регрессия с использованием глюона
Шаг 1: Создание набора данных
Шаг 2: Чтение данных
Шаг 3: Определите модель
Шаг 4: Определите функцию потерь
Шаг 5: Оптимизация
Шаг 6: Обучение
0x08 Сводка
Эта статья предназначена в основном для заключительных заметок автора о документе + видео, когда он впервые столкнулся с глубоким обучением.
После нескольких дней изучения я изучил рабочий процесс этой части:
1. Подтвердите набор данных для обучения (разработка функций)
2. Считайте данные после разработки функций в память.
3. Определите модель и инициализируйте параметры модели
4. Определите функцию потерь и алгоритм оптимизации
5. Модель обучения и результаты проверки
В процессе обучения модели необходимо постоянно корректировать параметры модели по результатам обучения для достижения идеального решения.
0x09 Справочная ссылка
NDArray API - mxnet documentation
Практика глубокого обучения — Практика работы с документацией Deep Learning 0.6