Azure ML туториал: создание простой модели машинного обучения

23 октября 2018
azure ml туториал что это

Azure ML туториал: создание простой модели машинного обучения

Перед вами пошаговое руководство по созданию модели машинного обучения с использованием Microsoft Azure ML, перевод статьи «Tutorial – Build a simple Machine Learning Model using AzureML«. Ссылка на оригинал — в…

Перед вами пошаговое руководство по созданию модели машинного обучения с использованием Microsoft Azure ML, перевод статьи «Tutorial – Build a simple Machine Learning Model using AzureML«. Ссылка на оригинал — в подвале статьи.

Насколько тяжело построить модель машинного обучения на языках программирования R или Python? Для начинающих это геркулесов труд. Программистам среднего уровня и синьорам для этого требуется лишь достаточный объем памяти системы, осознание поставленной задачи и немного времени.

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

Что такое Azure ML?

azure ml туториал

Хорошая новость — освоить машинное обучение сегодня стало намного проще, чем, например, в 2014 году. Как новичок в этом деле, ты можешь начать познавать машинное обучение с помощью фреймворка Microsoft Azure ML.

Azure ML представляет собой реализацию алгоритма машинного обучения через графический интерфейс от Microsoft.

Какие ресурсы доступны на AzureML

Давайте познакомимся с арсеналом этого инструмента.

  1. Примеры датасетов: мне нравится тестировать инструменты, которые имеют множество встроенных наборов данных. Это упрощает процесс тестирования мощности инструмента. Azure ML поставляется с длинным списком встроенных наборов данных. Список датасетов.
  2. Средства машинного обучения: Azure ML имеет в наличии почти все популярные алгоритмы машинного обучения и формулы оценочных показателей.
  3. Преобразование данных: в Azure ML есть все параметры фильтрации, параметры преобразования, параметры суммирования и варианты расчета матрицы.
  4. Параметры преобразования формата данных: А  что если вы хотите добавить свой собственный набор данных? Azure ML имеет несколько опций для добавления наборов данных из вашей локальной системы. Вот эти варианты:

формат экспорта данных из azure ml

Создание модели

Теперь вы знаете потенциал AzureML. Давайте теперь сосредоточимся на способах использования. Я приведу простой пример, чтобы продемонстрировать то же самое. Я предлагаю вам проделать эти шаги со мной, чтобы лучше понять этот урок.

Здесь вы начинаете — нажмите на “Создать новый эксперимент”.

Вы получаете пустую таблицу экспериментов:

поле для экспериментов

Теперь вы можете выбрать pallete:

список датасетов azure ml

Шаг 1. Выберите набор данных. Это могут быть ваши примеры данных или же вы можете загрузить их. В этом уроке я буду использовать «Данные о раке молочной железы» из встроенных наборов данных. Просто перетащите эти данные в главное окно.

машинное обучение с azure ml

Шаг 2. Выберите инструмент деления. Вы можете использовать опцию поиска в палитре, чтобы найти «split data». Поместите «split data» под свой набор данных и присоедините.

датасеты

Теперь вы видите две точки на ячейке «split data». Это означает, что у вас есть два набора данных, готовых к работе. С правой стороны у вас есть возможность выбрать тип деления.

Шаг 3. Обучите модель машинного обучения: Для этого вам понадобятся два узла. Во-первых, это будет тип модели, которую вы хотите построить. Во-вторых, это будет узел тренировки модели. Вы можете обратиться к следующему рисунку:

датасет

Вы можете заметить восклицательный знак в узле тренировки модели. Это означает, что вам нужно указать целевую переменную. Выберем целевую переменную, щелкнув по ней. Теперь вы увидите окно с правой стороны. Выберите «Launch column slector».

тренировка модели

Я выбрал «Класс» в качестве целевой переменной.

Шаг 4. Теперь вы оцениваете модель: см. Следующий рисунок

model training azure ml

Шаг 5. Наконец, производите вычисления

Запускаете модель!

Визуализация датасета и вывода

Чтобы визуализировать любой узел, вы просто переходите к узлу, нажимаете на него правой кнопкой мыши, затем выбираете “визуализировать”.

Вот как выглядят визуальные данные в нашем случае:

визуализация данных в azure ml

Как видно, переменная Класс имеет только два значения. Этот инструмент аккуратно рисует распределение для каждой переменной и позволяет проверить нормальность.

Так выглядит подсчитанная модель:

azure машинное обучение

Как видно, оцененные вероятности в основном близки к нулю и к единице. Функция распределение имеет почти постоянное значение между нулем и единицей.Таким образом, модель выдает сильно разбросанные значения.

Наконец, вот как выглядят графики:

azure ml туториал

azure ml туториал

Заключение

Как можно видеть, модель оказалась очень эффективной, и мне потребовалось меньше минуты, чтобы построить и исполнить задачу. Вычисляемые расчетные матрицы являются довольно полными и, вероятно, содержат значение, которое вы искали. Мне понравился инструмент своей временной эффективностью и удобством для пользователя.

Считаете ли вы эту статью полезной ? Поделитесь с нами своим опытом работы с Azure ML.


Интересные статьи по теме:

TensorFlow туториал. Часть 3: работа с данными

26 сентября 2018
tensorflow анализ и работа с данными

TensorFlow туториал. Часть 3: работа с данными

Пора переходить к работе с реальными данными! Мы будем работать с дорожными знаками Бельгии. Дорожный трафик — понятная тема, но не помешает уточнить, какие данные включены в датасет, перед тем…

Пора переходить к работе с реальными данными! Мы будем работать с дорожными знаками Бельгии. Дорожный трафик — понятная тема, но не помешает уточнить, какие данные включены в датасет, перед тем как приступить к программированию.


Перед прочтением статьи рекомендуем изучить:


В этом разделе вы получите всю необходимую для продолжения изучения туториала информацию:

  • Текст на дорожных знаках в Бельгии обычно приведен на голландском и французском языках. Это полезно знать, но для датасета, с которым вы будете работать, это не слишком важно!
  • В Бельгии шесть категорий дорожных знаков: предупреждающие знаки, знаки приоритета, запрещающие знаки, предписывающие знаки, знаки, связанные с парковкой и стоянкой у дорог, и, наконец, обозначения.
  • 1 января 2017 года с бельгийских дорог было снято более 30 000 дорожных знаков. Это были запрещающие знаки, ограничивающие максимальную скорость вождения.
  • Снятие знаков связано с длительной дискуссией в Бельгии (и во всем Европейском Союзе) о чрезмерном количестве дорожных знаков.

Загрузка датасета

Теперь, когда вы знакомы со спецификой бельгийского трафика, пришло время скачать датасет. Вы должны скачать два zip-файла в разделе «BelgiumTS for Classification (cropped images)» с названиями «BelgiumTSC_Training» и «BelgiumTSC_Testing».

Совет. Если вы скачали файлы или сделаете это после прочтения туториала, взгляните на структуру папок, которые вы загрузили! Вы увидите, что папки тестирования и обучения содержат 61 подпапку, соответствующую 61 типам дорожных знаков, которые вы будете использовать для классификации в этом туториале. Кроме того, вы обнаружите, что файлы имеют расширение .ppm или Portable Pixmap Format. Вы скачали изображения дорожных знаков!

Давайте начнем с импорта данных в рабочую область. Начнем со строк кода, которые отображаются под пользовательской функцией load_data():

  • Сначала установите ROOT_PATH. Этот путь к каталогу, в котором находятся данные для обучения и тестирования.
  • Затем добавьте пути к вашему ROOT_PATH с помощью функции join(). Сохраните эту пути в train_data_directory и test_data_directory.
  • Вы увидите, что после этого можно вызвать функцию load_data() и передать в нее train_data_directory.
  • Теперь сама функция load_data() запускается путем сбора всех подкаталогов, присутствующих в train_data_directory; она делает это с помощью спискового включения, что является естественным способом составления списков — то есть, если вы найдете что-то в train_data_directory, вы проверяете, папка ли это и, если так и есть, добавляете ее в свой список. Помните, что каждый подкаталог представляет собой метку.
  • Затем вам нужно перебрать подкаталоги. Сначала вы инициализируете два списка, labels и images. Затем вы собираете пути подкаталогов и имена файлов изображений, которые хранятся в этих подкаталогах. После этого можно собрать данные в двух списках с помощью функции append().
def load_data(data_directory):

directories = [d for d in os.listdir(data_directory)

if os.path.isdir(os.path.join(data_directory, d))]

labels = []

images = [] for d in directories:

label_directory = os.path.join(data_directory, d)

file_names = [os.path.join(label_directory, f)

for f in os.listdir(label_directory)

if f.endswith(".ppm")]

for f in file_names:

images.append(skimage.data.imread(f))

labels.append(int(d))

return images, labels

ROOT_PATH = "/your/root/path"

train_data_directory = os.path.join(ROOT_PATH, "TrafficSigns/Training")

test_data_directory = os.path.join(ROOT_PATH, "TrafficSigns/Testing")

images, labels = load_data(train_data_directory)

Обратите внимание, что в приведенном выше блоке данные для обучения и тестирования находятся в папках с названиями «training» и «testing», которые являются подкаталогами другого каталога «TrafficSigns». На компьютере это может выглядеть примерно так: «/Users /Name /Downloads /TrafficSigns», а затем две подпапки под названием «training» и «testing».

Исследование данных

Когда данные загружены, пришло время для их исследования! Для начала можно провести элементарный анализ с помощью атрибутов ndim и size массива images:

Обратите внимание, что переменные images и labels являются списками, поэтому вам, возможно, придется воспользоваться np.array() для преобразования переменных в массив в рабочей области. Но здесь это уже сделано для вас!

# Вывести размерность 'images'
print(images.ndim)

# Вывести количество элементов в 'images'
print(images.size)

# Вывести первое значение 'images'
images[0]

Обратите внимание, что значение images[0], которое вы вывели, на самом деле представляют собой одно изображение, представленное массивами в массиве! Это может показаться нелогичным, но вы привыкните к этому, когда будете работать с изображениями в проектах машинного или глубокого обучения.

Далее, обратимся к labels, но на этот раз никаких сюрпризов не будет:

# Вывести размерность 'labels'
print(labels.ndim)

# Вывести число элементов в 'labels'
print(labels.size)

# Вывести длину массива 'labels'
print(len(set(labels)))

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

Совет. Попробуйте добавить в свои массивы следующие атрибуты, чтобы получить дополнительную информацию о распределении памяти: длину одного элемента массива в байтах и ​​общее количество байтов, занимаемых элементами массива: flags, itemsize и nbytes.

Затем можно изучить распределение дорожных знаков по типам:

# Импортировать модуль 'pyplot'
import matplotlib.pyplot as plt

# Построить гистограмму с 64 точками - значениями 'labels'
plt.hist(labels, 62)

# Вывести график
plt.show()

Отлично! Давайте посмотрим на полученную гистограмму:

изучение данных в tensorflow

Хорошо видно, что не все типы дорожных знаков одинаково представлены в датасете. Это то, с чем вы столкнетесь позже, когда будете работать с данными, прежде чем приступать к моделированию нейронной сети. На первый взгляд видно: количество знаков типов 22, 32, 38 и 61 определенно преобладает над остальными. Запомните это, в следующем разделе вам пригодится эта информация.

Визуализация данных

После изучения предыдущего раздела вы уже имеете небольшое представление о данных. Но когда данные — это изображения, их, конечно, нужно визуализировать.

Давайте посмотрим на несколько случайных знаков:

  • Во-первых, убедитесь, что вы импортируете модуль pyplot пакета matplotlib под общепринятым названием plt.
  • Затем создайте список из 4 случайных чисел. Они будут использоваться для выбора дорожных знаков из массива images, загруженного в прошлом разделе. В нижеследующем примере это будут числа 300, 2250, 3650 и 4000.
  • Затем для каждого элемента этого списка, от 0 до 4, вы создаете графики без осей (чтобы они не мешали сосредоточиться на изображениях). На этих графиках вы увидите конкретные изображения из массива images, которые соответствует номеру индекса i. На первом шаге цикла вы получите i = 300, во втором — 2250 и так далее. Наконец, нужно расположить графики так, чтобы между ними было достаточно пространства.
  • Последнее — выведите ваши графики с помощью функции show()!

Код:

# Импорт модуля 'pyplot' 'matplotlib`

import matplotlib.pyplot as plt

# Задание (случайных) номеров изображений, которые вы хотите вывести

traffic_signs = [300, 2250, 3650, 4000]

# Заполнение графиков изображениями

for i in range(len(traffic_signs)):

plt.subplot(1, 4, i+1)

plt.axis('off')

plt.imshow(images[traffic_signs[i]])

plt.subplots_adjust(wspace=0.5)

plt.show()

Как можно догадаться, знаки каждого из 62 типов отличаются друг от друга.

Но что еще можно заметить? Взглянем на изображения ниже:

работа с данными

Эти четыре изображения имеют разный размер!

Конечно, вы могли бы поиграться с числами в списке traffic_signs и более подробно изучить этот вопрос, но, как бы то ни было, это важный нюанс, который придется учитывать, когда вы начнете работать с данными для подачи в нейронную сеть.

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

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

# Импорт 'matplotlib'

import matplotlib.pyplot as plt

# Задание (случайных) номеров изображений, которые вы хотите вывести

traffic_signs = [300, 2250, 3650, 4000]

# Заполнение графиков изображениями и вывод размеров

for i in range(len(traffic_signs)):

plt.subplot(1, 4, i+1)

plt.axis('off')

plt.imshow(images[traffic_signs[i]])

plt.subplots_adjust(wspace=0.5)

plt.show()

print("shape: {0}, min: {1}, max: {2}".format(images[traffic_signs[i]].shape, images[traffic_signs[i]].min(), images[traffic_signs[i]].max()))

Обратите внимание на то, как вы используется метод format() в строке «shape: {0}, min: {1}, max: {2}», чтобы заполнить аргументы {0}, {1} и {2}.

визуализация данных tensorflow

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

# Импорт модуля 'pyplot' 'matplotlib'

import matplotlib.pyplot as plt

# Задание типов

unique_labels = set(labels)

# Инициализация графика

plt.figure(figsize=(15, 15))

# Задание счетчика

i = 1

# Для каждого типа:

for label in unique_labels:

# Выбирается первое изображение каждого типа:

image = images[labels.index(label)]

# Задание 64 графиков

plt.subplot(8, 8, i)

# Выключение осей

plt.axis('off')

# Добавление заголовка каждому графику

plt.title("Label {0} ({1})".format(label, labels.count(label)))

# Увеличить значение счетчика на 1

i += 1

# Вывод первого изображения

plt.imshow(image)

# Вывод всего графика

plt.show()

Обратите внимание, что даже если вы определяете 64 графика, не на всех из них будут изображения (так как есть всего 62 типа знаков!). Обратите также внимание на то, что опять же, вы не выводите оси, чтобы не отвлекаться на них.

анализ данных в Tensorflow

Как было видно из гистограммы, количество фотографий знаков с типами 22, 32, 38 и 61 значительно больше остальных. Эта видно из из графика выше: есть 375 снимков с меткой 22, 316 снимков с меткой 32, 285 снимков с меткой 38 и, наконец, 282 снимка с меткой 61.

Один из самых интересных вопросов, который можно задать сейчас: есть ли связь между всеми этими знаками — может быть, они все являются обозначающими?

Давайте рассмотрим более подробно: видно, что метки 22 и 32 являются запретительными знаками, но метки 38 и 61 являются указательными знаками и знаками приоритета, соответственно. Это означает, что между этими четырьмя знаками нет непосредственной связи, за исключением того факта, что половина знаков, наиболее широко представленных в датасетах, являются запрещающими.

Извлечение признаков

Теперь, когда вы тщательно изучили свои данные, пришло время засучить рукава! Давайте кратко отметим, что вы обнаружили, чтобы убедиться, что вы не забыли какие-либо моменты:

  • Изображения имеют разный размер;
  • Есть 62 метки (помним, что нумерация меток начинаются с 0 и заканчиваются на 61);
  • Распределение типов знаков трафика довольно неравномерно; между знаками, которые в большом количестве присутствовали в наборе данных, нет никакой связи.

Теперь, когда у вас есть четкое представление о том, с чем нужно разобраться, можно подготовить данные к подаче в нейронную сеть или любую модель, в которую вы хотите их подавать. Начнем с извлечения признаков — нужно сделать одинаковый размер изображений и перевести их в черно-белую гамму. Преобразовать изображения в оттенки серого нужно потому, что цвет имеет меньшее значение при классификации. Однако для распознавания знаков цвет играет большую роль! Поэтому в этих случаях преобразование делать не нужно!

Масштабирование изображений

Чтобы сделать размеры изображений одинаковыми, можно воспользоваться функцией skimage или библиотекой Scikit-Image, которая представляет собой набор алгоритмов для обработки изображений.

Во втором случае случае будет полезен модуль transform, так как в нем есть функция resize(); она снова использует списковое включение, чтобы сделать разрешение снимков равным 28×28 пикселей. Повторюсь: вы увидите, что фактически составляете список — для каждого изображения в массиве image вы выполните операцию преобразования, которую позаимствуете из библиотеки skimage. Наконец, вы сохраняете результат в переменной images28:

# Импорт модуля 'transform' из 'skimage'

import transform

# Масштабирование изображений в 'image'

array images28 = [transform.resize(image, (28, 28)) for image in images]

Выглядит очень просто, не так ли?

Обратите внимание, что изображения теперь четырехмерны: если вы конвертируете images28 в массив и привязываете атрибут shape, видно, что размеры imeges28 равны (4575, 28, 28, 3). Изображения 784-мерные (потому что ваши изображения имеют размер 28 на 28 пикселей).

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

Результат:

результат визуализации данных tensorflow

Обратите внимание, что, поскольку вы изменили масштаб, значения min и max также изменились; сейчас они все лежат в одном диапазоне, что действительно здорово, потому что теперь вам не нужно производить нормировку данных!

Преобразование изображений в оттенки серого

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

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

Как и при масштабировании, вы можете использовать библиотеку Scikit-Image; в этом случае вам понадобится модуль color с функцией rgb2gray().

Это будет просто!

Однако не забудьте преобразовать переменную images28 в массив, так как функция rgb2gray() в качестве аргумента принимает именно массивы.

# Импорт `rgb2gray` из`skimage.color`

from skimage.color import rgb2gray

# Конвертация `images28` в массив

images28 = np.array(images28)

# Конвертация `images28` в оттенки серого

images28 = rgb2gray(images28)

Проверьте результат вашего преобразования в оттенки серого, выведя некоторые из изображений; для этого используйся несколько модифицированный код:

import matplotlib.pyplot as plt

traffic_signs = [300, 2250, 3650, 4000]

for i in range(len(traffic_signs)):

plt.subplot(1, 4, i+1)

plt.axis('off')

plt.imshow(images28[traffic_signs[i]], cmap="gray") plt.subplots_adjust(wspace=0.5)

# Вывод графика

plt.show()

Обратите внимание, что вам обязательно нужно указать цветовую карту или cmap и выставить значение ‘gray’ для вывода изображений в оттенках серого. Это связано с тем, что imshow() по умолчанию использует тепловую цветовую карту.


Совет. Поскольку этот блок используется в туториале несколько раз, будет полезно подумать, как можно сделать его функцией 🙂

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

В следующей частиглубокое обучение c TensorFlow.


Интересные статьи:

Введение в TensorFlow Hub: библиотеку модулей машинного обучения для TensorFlow

14 июля 2018
tensorflow hub библиотека

Введение в TensorFlow Hub: библиотеку модулей машинного обучения для TensorFlow

Репозиторий с общим кодом — одна из фундаментальных идей в разработке программного обеспечения. Библиотеки делают программистов гораздо более эффективными. В некотором смысле они даже меняют сам процесс решения проблем программирования. Как выглядит…

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

Как выглядит идеальная библиотека с точки зрения разработчика алгоритмов машинного обучения?

Мы хотим делиться предобученными моделями. Опубликованная с открытым кодом обученная модель позволит программисту, не имеющему доступа к вычислительным ресурсам или закрытому датасету, настроить ее и использовать в своей задаче. Например, обучение NASNet занимает тысячи GPU-часов. “Поделившись” подготовленными весами, разработчик упростит коллегам настройку модели для работы.

Идея подобной библиотеки для машинного обучения вдохновила нас на создание TensorFlow Hub, и сегодня мы рады поделиться ею с сообществом. TensorFlow Hub — это платформа, где можно публиковать, изучать и использовать модули машинного обучения, написанные в TensorFlow. Под модулем мы подразумеваем самодостаточную и обособленную часть графа TensorFlow (с обученными весами), которая может быть использована в других задачах. С помощью модуля разработчик cможет обучить модель на меньшем датасете, улучшить способность обобщать или просто увеличить скорость обучения.

Image Retraining

В качестве первого примера рассмотрим технику обучения классификатора изображений на небольшом датасете. Современные модели распознавания содержат миллионы параметров и весов, вычисление и разметка данных требует времени. Технология Image Retraining позволит обучить модель в условиях ограниченного набора данных и времени для вычислений. Вот как это выглядит в TensorFlow Hub:

Основная идея в том, чтобы использовать существующую модель распознавания изображений для получения признаков, а затем обучить новый классификатор. Отдельные модули TensorFlow Hub доступны по URL (или в файловой системе), включая модификации NASNet, MobileNet (v. 2), Inception, ResNet и другие. Для использования модуля, нужно импортировать TensorFlow Hub, а затем скопировать и вставить URL модуля в код.

Модули для обработки изображений
Модули для обработки изображений

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

Обратите внимание, что модуль в примере размещен компанией Google и представлен в нескольких версиях (выбирайте стабильную версию для экспериментов). Модули можно применять как обычные функции Python для построения графа. Будучи экспортированным на диск, модуль становится самодостаточным, и его можно использовать без доступа к коду и данным, с помощью которых он был создан и обучен (хотя, разумеется, их тоже можно опубликовать).

Классификатор текста

Давайте взглянем на второй пример. Представьте, что Вы хотите обучить модель для классификации отзывов о фильмах на положительные и отрицательные, но в распоряжении имеется небольшой набор данных (например, 400 отзывов). Поскольку примеров немного, есть смысл задействовать эмбеддинг слов, предварительно обученный на гораздо большем массиве слов. Вот как это выглядит с использованием TensorFlow Hub:

Как и раньше, начинаем с выбора модуля. На TensorFlow Hub вы найдете модули для обработки текста для различных языков (английский, японский, немецкий, испанский), word2vec, обученный на Википедии, а также NNLM эмбеддинг, обученный на Google Новостях:

nnlm

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

how to build a classifier

Если хотите сделать все самостоятельно, а также узнать, как TensorFlow Hub взаимодействует с TensorFlow Estimators, читайте руководство для начинающих.

Универсальный энкодер предложений

Представляем пример использования универсального энкодера предложений. Это эмбеддинг на уровне предложений (sentence-level), обученный на обширном наборе датасетов (отсюда “универсальность”). Среди задач, с которыми он справляется хорошо — семантическое сходство, классификация текста, кластеризация.

method

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

Чтобы узнать больше, посмотрите этот туториал.

Другие модули

TensorFlow Hub — это больше, чем просто классификация текстов и картинок. На сайте вы найдете несколько модулей для Progressive GAN и Google Landmarks Deep Local Features.

Важные замечания

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

Во-вторых, нужно быть объективным, оба примера, которые мы показали выше, используют предварительно подготовленные большие наборы данных. При повторном использовании набора данных важно помнить о том, какие ограничения он содержит, и как это может повлиять на продукт.

Надеемся, что TensorFlow Hub пригодится в вашем проекте! Посетите tensorflow.org/hub, чтобы начать использовать библиотеку.

Оригинал — TensorFlow, перевод — Эдуард Поконечный.

NLP Architect от Intel: open source библиотека моделей обработки естественного языка

25 июня 2018
NLP Architeckt

NLP Architect от Intel: open source библиотека моделей обработки естественного языка

Вы заметили, что всё больше компаний ставят на свой сайт виджет с ботом? Чат-боты сегодня повсюду. И это только один из многих примеров применения технологий обработки естественного языка (Natural Language Processing,…

Вы заметили, что всё больше компаний ставят на свой сайт виджет с ботом? Чат-боты сегодня повсюду. И это только один из многих примеров применения технологий обработки естественного языка (Natural Language Processing, NLP) и понимания естественного языка (Natural Language Understanding, NLU). Потенциал NLP и NLU кажется безграничным. Сейчас ко всем приходит понимание, что мы только в начале длинного пути.

Титаны ИТ-сферы создают специальные исследовательские отделы для изучения этой области. Intel не остался в стороне. Недавно Intel AI Lab выпустила продукт под названием NLP Architect. Это библиотека с открытым исходным кодом, призванная служить основой для дальнейших исследований и сотрудничества разработчиков со всего мира.

Обзор NLP Architect

Команда NLP-исследователей и разработчиков из Intel AI Lab занимается изучением актуальных архитектур глубоких нейросетей и методов обработки и понимания текста. Результатом их работы стал набор инструментов, интересных как с теоретической, так и с прикладной точки зрения.

Вот что есть в текущей версии NLP Architect:

  • Модели, извлекающие лингвистические характеристики текста: например, синтаксический анализатор (BIST) и алгоритм для извлечения именных групп (noun phrases);
  • State-of-the-art модели для понимания языка: например, определение намерения пользователя (intent extraction), распознавание именованных сущностей (named entity recognition, NER);
  • Модули для семантического анализа: например, коллокации, наиболее вероятный смысл слова, векторные представления именованных групп (NP2V);
  • Строительные блоки для создания разговорного интеллекта: например, основа для создания чатботов, включающая в себя систему поддержания диалога, анализатор предложений (sequence chunker), система для определения намерения пользователя;
  • Примеры применения глубоких end-to-end нейросетей с новой архитектурой: например, вопросно-ответные системы, системы понимания текста (machine reading comprehension).

Для всех вышеупомянутых моделей есть примеры процессов обучения и предсказания. Более того, команда Intel добавила скрипты для решения типичных задач, возникающих при внедрении таких моделей — конвейеры для обработки данных и утилиты, часто применяющиеся в NLP.

Библиотека состоит из отдельных модулей, что упрощает интеграцию. Общий вид фреймворка NLP Architect изображён на схеме ниже.

NLP Archtect
Фреймворк NLP Architect

Компоненты для NLP/NLU

Теперь давайте рассмотрим некоторые модули поближе, чтобы лучше понимать, о чём идёт речь.

Анализатор предложений. Анализ предложений (sequence chunking) — одна из базовых задач обработки текста, которая заключается в разделении предложения на синтаксически связанные части. Например, предложение

“Маленькая Саша шла по шоссе”

можно разделить на четыре части: именные группы “Маленькая Саша” и “шоссе”, глагольную группу “шла” и предложную группу “по”.

Анализатор предложений из NLP Architect умеет строить подходящую архитектуру нейросети для разных типов входных данных: токенов, меток частей речи, векторных представлений, символьных признаков.

Семантический сегментатор именных групп. Именная группа (noun phrase) состоит из главного члена — существительного или местоимения — и нескольких зависимых уточняющих членов. Упрощая, можно разделить именные группы на два типа:

  • с описательной структурой: зависимые члены не влияют существенно на семантику главного члена (например, “морская вода”);
  • с коллокационной структурой: зависимые члены существенно изменяют смысл главного члена (например, “морская свинка”).

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

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

Распознаватель именованных сущностей (NER) выделяет в тексте определённые слова или сочетания слов, относящиеся к некоторому интересующему нас классу. К примерам сущностей относятся имена, числа, места, валюты, даты, организации. Иногда сущности можно довольно легко выделить с помощью таких признаков, как форма слов, наличие слова в определённом словаре, часть речи. Однако довольно часто эти признаки нам не известны или даже не существуют. В таких случаях для того, чтобы определить, является ли слово или словосочетание сущностью, необходимо анализировать его контекст.

Модель для NER в NLP Architect основана на двунаправленной LSTM-сети и CRF-классификаторе. Высокоуровневый обзор модели представлен ниже.

Высокоуровневый обзор модели NER
Высокоуровневый обзор модели NER

Алгоритм определения намерения пользователя решает задачу понимания языка. Его цель — понять, о каком действии идёт речь в тексте, и определить все вовлечённые стороны. Например, для предложения

“Сири, пожалуйста, напомни мне забрать вещи из прачечной по пути домой.”

алгоритм определяет действие (“напомнить”), кто должен выполнить это действие (“Сири”), кто просит выполнить это действие (“я”) и сам объект действия (“забрать вещи из прачечной”).

Анализатор смысла слова. Алгоритм получает слово на вход и возвращает все смыслы этого слова, а также числа, характеризующие распространённость каждого из смыслов в языке.

Примеры применения End-to-End нейросетей

Уже было сказано, что в библиотеку NLP Architect входят некоторые end-to-end модели. Давайте вкратце рассмотрим две из них.

Понимание текста. В папке с названием reading_comprehension находится реализация модели понимания языка из статьи Machine Comprehension Using Match-LSTM and Answer Pointer. Идея этого метода заключается в построении векторного представления фрагмента текста с учётом вопроса и подаче этого векторного представления на вход нейросети, которая возвращает позиции начала и конца ответа на вопрос в фрагменте.

Целевой диалог NLP
Целевой диалог

End-to-end нейросеть с памятью для целевого диалога. В папке с названием memn2n_dialogue находится реализация нейросети с памятью (memory network) для поддержания целевого диалога (goal-oriented dialogue).

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

Визуализатор NLP Architect

В библиотеку входит небольшой веб-сервер — NLP Architect Server. Он позволяет легко проверить работу разных моделей NLP Architect. Среди прочего, в сервере есть визуализатор, который стоит довольно красивые диаграммы, демонстрирующие работу моделей. Сейчас визуализацию поддерживают два сервиса — синтаксический анализатор и распознаватель именованных сущностей. Кроме того, есть шаблон, с помощью которого пользователь может добавить визуализацию для других сервисов.

Визуализатор NLP Architect
Визуализатор NLP Architect

Заключение

NLP Architect — открытая и гибкая библиотека с алгоритмами для обработки текста, которая даёт возможность для взаимодействия разработчиков со всего мира. Команда Intel продолжает добавлять в библиотеку результаты своих исследований, чтобы любой мог воспользоваться тем, что они сделали и улучшили.

Для начала работы достаточно скачать код с репозитория на Гитхабе и выполнить инструкции по установке. Здесь можно найти исчерпывающую документацию для всех основных модулей и готовых моделей.

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

Перевод — Николай Кругликов, оригинал — Kateryna Koidan