Для экспериментов нам понадобится язык программирования и библиотека. Часто в качестве языка берут простой язык с низким порогом входа, такой как Python. Могут быть также и другие языки общего назначения, такие как JavaScript или специализированные, такие как язык R. Мы возьмём Python. Для того чтобы не ставить язык и библиотеки, воспользуемся бесплатным сервисом colab.research.google.com/notebooks/intro.ipynb, содержащим Jupyter Notebook. Notebook содержит в себе возможность не просто писать код с комментариями в консольном виде, а оформлять его в виде документа. Испробовать возможности Notebook можно в учебном плейбуке https://colab.research.google.com/notebooks/welcome.ipynb, такие как оформление текста на языке разметки MD, с формулами на языке разметки TEX, запуск скриптов на языке Python, вывод результатов их работы в текстовом виде и в виде графиков, используя стандартную библиотеку Python: NumPy(НамПай), matplotlib.pyplot. Сам Сolab представляет графическую карту Tesla K80 на 12 часов за раз (на сессию) бесплатно. Она поддерживает различные фреймворки глубокого машинного обучения, в том числе, Keras, TenserFlow и PyTorch. Цена же составляет GPU в Google Cloud:
Tesla T4: 1GPU 16GB GDDR6 0.35$/час Tesla P4: 1GPU 8GB GDDR5 0.60$/час Tesla V100: 1GPU 16GB HBM2 2.48$/час Tesla P100: 1GPU 16GB HBM2 1.46$/час
Попробуем. Перейдём по ссылке colab.research.google.com и нажмём кнопку "создать блокнот". У нас появится пустой Notebook. Можно ввести выражение:
10**3 / 2 + 3
и нажав на воспроизведение получим результат 503.0. Можно вывести график параболы, нажав кнопку "+Код" в введя в новую ячейку код:
def F(x): return x*x import numpy as np import matplotlib.pyplot as plt x = np.linspace(5, 5, 100) y = list(map(F, x)) plt.plot(x, y) plt.ylabel("Y") plt.xlabel("X")
Или выведя ещё и изображение:
import os !wget https://www.python.org/static/img/pythonlogo.png import PIL img = PIL.Image.open("pythonlogo.png") img
Популярные фреймворки:
* Caffe, Caffe2, CNTK, Kaldi, DL4J, Keras набор модулей для конструирования;
* TensorFlow, Theano, MXNet программирование графа;
* Torch и PyTorch прописать основные параметры, а граф будет построен автоматически.
Рассмотрим работу библиотеки PyTorch (NumPy+CUDA+Autograd) изза её простоты. Посмотрим на операции с тензорами многомерными массивами. Подключим библиотеку и объявим два тензора: нажмём +Code, введём код в ячейку и нажмём выполнить:
import torch a = torch.FloatTensor([ [1, 2, 3], [5, 6, 7], [8, 9, 10] ]) b = torch.FloatTensor([ [1, 2, 3], [10, 20, 30], [100, 200, 300] ])
Поэлементные операции, такие как "+", "", "*", "/" над двумя матрицами одинаковых габаритов производят операции с соответствующими их элементами:
a + b tensor([ [ 0., 0., 0.], [ 5., 14., 23.], [ 92., 191., 290.] ])
Другим вариантом поэлементной операции является применение одной операции ко всем элементом по одиночке, например умножение на 1 или применение функции:
a tensor([ [ 1., 2., 3.], [ 5., 6., 7.], [ 8., 9., 10.] ]) a * 1 tensor([ [ 1., 2., 3.], [ 5., 6., 7.], [ 8., 9., 10.] ]) a.abs() tensor([ [ 1., 2., 3.], [ 5., 6., 7.], [ 8., 9., 10.] ])
Также имеются операции свёртки, такие как sum, min, max, которые на входе дают сумму всех элементов, самый маленький или самый большой элемент матрицы:
a.sum() tensor(51.) a.min() tensor(1.) a.max() tensor(10.)
Но нам будут больше интересны постолбцовые операции (операция будет производиться над каждым столбцом):
a.sum(0) tensor([14., 17., 20.]) a.min(0) torch.return_types.min( values=tensor([1., 2., 3.]), indices=tensor([0, 0, 0]) ) a.max(0) torch.return_types.max( values=tensor([ 8., 9., 10.]), indices=tensor([2, 2, 2]) )
Как мы помним, нейронная сеть состоит из слоёв, слои состоят из нейронов, а нейрон содержит на входе связи с весами в виде простых чисел. Вес задаётся обычным числом, тогда входящие связи в нейрон можно описать последовательностью чисел вектором (одномерным массивом или списком), длина которого и есть количество связей. Так как сеть полносвязная, то все нейроны этого слоя связаны с предыдущим, а, следовательно, демонстрирующие их вектора имеют тоже одинаковую длину, создавая список равных по длине векторов матрицу. Это удобное и компактное представление слоя, оптимизированное для использования на компьютере. На выходе нейрона имеется функция активации (сигмойда или, ReLU для глубоких и сверхглубоких сетей), которая определяет, выдаст на выходе нейрон значение или нет. Для этого необходимо применить её к каждому нейрону, то есть к каждому столбцу: мы уже видели операцию к столбцам.
Способы ускорения обучения
Пробежимся по истории развития вычислительных систем которая давала вычислительную основу для развития искусственного интеллекта:
* 1642 механические вычислительные машины, * 1940 ламповые вычислительные машины, * 1955 транзисторные вычислительные машины, * 1965 компьютеры на интегральных схемах, * 1980 компьютеры с центральными процессорами, * 1995 многоядерные видеокарты, * 2006 компьютеры с многоядерными процессорами, * 2017 компьютеры с матричными процессорами.