Какую структуру следует использовать для глубокого обучения? Согласно моему онлайн-исследованию, TensorFlow, Keras и PyTorch - самые популярные библиотеки, упоминаемые в сообществе машинного обучения. TensorFlow лучше работает при крупномасштабной реализации, в то время как PyTorch хорошо работает для быстрого прототипирования в исследованиях. Обе структуры обеспечивают максимальную математическую гибкость. Keras, с другой стороны, самый простой в использовании, но не такой гибкий, как TensorFlow или PyTorch.

Когда я только начал изучать глубокое машинное обучение, я реализовал свой самый первый классификатор текста LSTM с Keras. Добавить новые слои в модель было так же просто, как несколько строк кода, с огромной кривой обучения подключению моих входных данных для встраивания слов в модель. Этот классификатор - это то, что команда использовала для классификации предложений с гендерной предвзятостью в нашем первом прототипе.

Когда мы начали стажировку в Mila, один из наших наставников настоятельно рекомендовал нам изучить PyTorch, поскольку это самый популярный фреймворк, используемый в исследовательской сфере. Он дал нам учебные пособия по пониманию моделей глубокого обучения, а также по их реализации с помощью PyTorch. Чтобы лучше понять PyTorch, мы решили создать наши собственные учебные пособия, поскольку обучение - лучший способ учиться!

В этом сообщении блога я представляю краткое введение в структуру и рабочие камни PyTorch для построения моделей нейронных сетей.

Дорожная карта для поста

  1. Краткое введение в PyTorch
  2. Понимание тензоров
  3. PyTorch и мост NumPy
  4. Основные тензорные операции
  5. GPU / CUDA

Что такое PyTorch?

PyTorch - это библиотека машинного обучения с открытым исходным кодом для Python, которая обеспечивает максимальную гибкость и скорость научных вычислений для глубокого обучения. Это замена NumPy, использующая мощь графических процессоров.

Тензоры в PyTorch

Тензор - это n-мерный контейнер данных, который похож на ndarray NumPy. Например, 1d-тензор - это вектор, 2d-тензор - это матрица, 3d-тензор - это куб, а 4d-тензор - это вектор кубов.

Давайте посмотрим на несколько примеров того, как создать тензор в PyTorch. Чтобы инициализировать тензор, мы можем либо присвоить значения напрямую, либо установить размер тензора. torch.Tensor(n,m) инициализирует тензор размером n x m.

import torch
# create a tensor
new_tensor = torch.Tensor([[1, 2], [3, 4]])
# create a 2 x 3 tensor with random values
empty_tensor = torch.Tensor(2, 3)
# create a 2 x 3 tensor with random values between -1and 1
uniform_tensor = torch.Tensor(2, 3).uniform_(-1, 1)
# create a 2 x 3 tensor with random values from a uniform distribution on the interval [0, 1)
rand_tensor = torch.rand(2, 3)
# create a 2 x 3 tensor of zeros
zero_tensor = torch.zeros(2, 3)

Чтобы получить доступ или заменить элементы в тензоре, вы можете использовать индексацию. Например, new_tensor[0][0] вернет тензорный объект, содержащий элемент в позиции 0, 0. К скалярному объекту также можно получить доступ через .item(). Кроме того, нарезка также может использоваться для доступа к каждой строке и столбцу в тензоре.

new_tensor = torch.Tensor([[1, 2], [3, 4]])
# replace an element at position 0, 0
new_tensor[0][0] = 5
print(new_tensor)                 # tensor([[ 5.,  2.],[ 3.,  4.]])
# access an element at position 1, 0
print(new_tensor[1][0])           # tensor([ 3.])
print(new_tensor[1][0].item())    # 3.
## slicing examples
slice_tensor = torch.Tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# elements from every row, first column
print(slice_tensor[:, 0])         # tensor([ 1.,  4.,  7.])
# elements from every row, last column
print(slice_tensor[:, -1])        # tensor([ 3.,  6.,  9.])
# all elements on the second row
print(slice_tensor[2, :])         # tensor([ 4.,  5.,  6.])
# all elements from first two rows
print(slice_tensor[:2, :])        # tensor([[ 1.,  2.,  3.],
                                            [ 4.,  5.,  6.]])

Теперь, как нам получить доступ к тензорной информации? Для проверки типа тензора используется .type(). Для формы тензора можно использовать .shape или .size(). .dim() предназначен для доступа к размерности тензора.

new_tensor = torch.Tensor([[1, 2], [3, 4]])
# type of a tensor
print(new_tensor.type())   # 'torch.FloatTensor'
# shape of a tensor
print(new_tensor.shape)    # torch.Size([2, 2])
print(new_tensor.size())   # torch.Size([2, 2])
# dimension of a tensor
print(new_tensor.dim())    # 2

Чтобы изменить форму тензора, просто используйте код .view(n,m). Это преобразует форму тензора в размер n x m.

reshape_tensor = torch.Tensor([[1, 2], [3, 4]])
reshape_tensor.view(1,4)   # tensor([[ 1.,  2.,  3.,  4.]])
reshape_tensor.view(4,1)   # tensor([[ 1.],[ 2.],[ 3.],[ 4.]])

PyTorch и мост NumPy

Иногда бывает полезно преобразовать Numpy ndarray в тензор Pytorch и наоборот. Используйте .from_numpy() при преобразовании ndarray NumPy в тензор PyTorch. И наоборот, используйте .numpy() для обратного преобразования в ndarray NumPy.

np_ndarray = numpy.random.randn(2,2)
# NumPy ndarray to PyTorch tensor
to_tensor = torch.from_numpy(np_ndarray)
# PyTorch tensor to NumPy array
to_ndarray = to_tensor.numpy()

Основные тензорные операции

Вот несколько основных примеров тензорных операций в PyTorch:

Транспонировать: .t() или .permute(-1, 0)

# regular transpose function
my_tensor.t()
# transpose via permute function
my_tensor.permute(-1,0)

Перекрестное произведение: a.cross(b) или torch.cross(a, b)

tensor_1 = torch.randn(3, 3)
tensor_2 = torch.randn(3, 3)
cross_prod = tensor_1.cross(tensor_2)

Матричный продукт: .mm()

maxtrix_prod = tensor_1.mm(tensor_2)

Поэлементное умножение: .mul()

element_mult = tensor_1.mul(tensor_2)

GPU / CUDA

Тензоры также могут использоваться на графическом процессоре, поддерживающем CUDA, для ускорения вычислений.

if torch.cuda.is_available():
    tensor_1 = tensor_1.cuda()
    tensor_2 = tensor_2.cuda()
    tensor_1 + tensor_2

Сегодня мы узнали об основах PyTorch, изучив основные операции PyTorch с тензорами. В следующем уроке мы продолжим практиковать основы PyTorch с линейными моделями, чтобы лучше освоиться с фреймворком.

Расписание учебного курса PyTorch

  1. Изучите основы PyTorch
  2. Модели линейной и логистической регрессии
  3. Введение в нейронную сеть (прямая связь)
  4. Загрузка данных в PyTorch
  5. Классификатор текста RNN / LSTM
  6. Модель языка RNN / LSTM
  7. Изучение классификации текста с помощью CNN
  8. Может ли языковая модель работать с CNN?