Краткое знакомство с Tensor Flow. Обучение учебной нейросети. Изучение того, что лежит под капотом Dialog Flow
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Тема 2.1. Краткое знакомство с
TensorFlow. Обучение учебной
нейросети. Изучение того, что лежит
под капотом DialogFlow
Душкин Р. В.
(
roman.dushkin@gmail.com
)
Привет, коллеги. Меня по прежнему зовут Роман Душкин, и это наш курс по основам
Искусственного Интеллекта в РАНХиГС. Мы начинаем вторую неделю и переходим к
практике. Если на прошлой неделе мы погрузились в теоретические основы Искусственного
Интеллекта и изучили парадигмы и подходы к построению искусственных интеллектуальных
систем, а также рассмотрели две прикладные задачи и методы их решения, то на этой
неделе нас ждёт практика. Мы будем создавать чат-бота, который «понимает» обращённую
к нему речь и выполняет какие-то простые задачи. Заинтригованы? Тогда вперёд.
Для разработки такого чат-бота мы воспользуемся замечательным инструментарием,
который называется DialogFlow. Это надстройка для распознавания смысла в
естественно-языковом тексте над прекрасной нейросетевой библиотекой компании Google
— TensorFlow. Так что сегодня я хотел бы немного погрузить вас именно в TensorFlow, и
давайте мы руками пощупаем, как работают нейронные сети.
Давайте я напомню вам, как работают нейронные сети и как они обучаются.
Искусственная нейронная сеть состоит из нейронов, которые сгруппированы в слои. Каждый
нейрон — это простой вычислитель, который принимает множество входных значений,
перемножает каждое на некоторый вес, а результаты этих произведений складывает. Если
итоговая сумма выше некоторого проекта, то нейрон отдаёт своё выходное значение. И
сама нейронная сеть работает тактами — пока информация от входного слоя не дойдёт до
выходного, нейронная сеть как бы замерла, и нейроны первых слоёв ждут окончания
прохождения информации по сети.
Мы будем заниматься задачей классификации. Что это такое? На входе у нас есть
множество каких-то объектов, на выходе мы должны разложить их по корзинкам, на каждой
из которых написан какой-то идентификатор, название класса этих объектов. И
искусственная нейронная сеть — это прекрасный инструмент именно для решения задачи
классификации. На вход подаётся описание объекта в том или ином виде. На выходном
слое нейронной сети нейроны активизируются таким образом, чтобы так или иначе указать
на класс. Обычно одному классу соответствует один нейрон, и при определении класса
объекта на выходе активируется именно этот нейрон. Есть варианты, когда нейросеть на
выходе возвращает степени принадлежности объекта разным классам, а определённый
класс выбирается по максимальной степени принадлежности.
Ну вот, вроде бы всё. Давайте всё это теперь рассмотрим на примере. Для этого
воспользуемся игровой песочницей библиотеки TensorFlow, которая находится по адресу
playground.tensorflow.org. Вам надо будет зайти по этому адресу и изучить документацию,
которая там представлена. Там совсем немного текста, и он очень по делу, так что
действительно заходите на этот сайт и внимательно прочитайте то, что там написано. После
этого поиграйтесь с той нейронной сетью, которая там представлена — изучите интерфейс,
почитайте про все параметры, которые там представлены. Как только вы поймёте, что там
происходит и почему, перезагружайте страницу, чтобы вернуть все параметры к
первоначальному виду, и после этого давайте выполним несколько упражнений.
Теперь убедитесь, что вы находитесь в разделе «Classification» (классификация). Тут
есть четыре набора данных, которые надо классифицировать на два класса. Выходной
нейрон этой нейросети, фактически, осуществляет бинарную классификацию — если он
активируется, то входной элемент оранжевый, а если нет — синий. И нашей задачей
сегодня будет являться построение минимально возможной нейронной сети для
классификации входного набора. Критерий минимальности нейронной сети означает, что
нейронная сеть содержит минимальное количество входных фич, минимальное количество
промежуточных слоёв и нейронов в них.
Давайте я расскажу, что такое «фича». Вот у нас есть два класса входных данных в
тестовой выборке — оранжевые (это минус один) и синие (это плюс один). У каждого
объекта есть три свойства — цвет и координаты на плоскости. Фичей, которую воспринимает
один входной нейрон, мы назовём некоторую функцию от этих трёх свойств. Например,
фича X-один — это разделение на положительные и отрицательные числа по оси абсцисс.
Фича Х-два — это такое же разделение на положительные и отрицательные числа по оси
ординат. А если мы перемножим Х-один и Х-два, то мы получим два квадранта
положительных чисел и два квадранта отрицательных. В общем, в этой песочнице можно
использовать семь разных фич.
Перед тем, как вы начнёте решать поставленную задачу, давайте сделаем пару
настроек. Давайте установим в качестве функции активации ReLU — это максимум от нуля и
заданного значения. То есть в области отрицательных чисел функция ReLU возвращает
ноль, а в области положительных чисел она возвращает свой аргумент. Эта функция очень
проста для вычисления, поэтому сегодня её начали широко использовать в нейронных сетях
глубокого обучения. Из всех функций активации именно ReLU справляется с
классификацией быстрее всех других функций. Остальные настройки менять не надо.
Впрочем, если ваша нейронная сеть будет обучаться слишком медленно, то можно
поиграться параметром Learning Rate.
В нейронной сети имеются скрытые слои. Можно использовать от нуля до шести
скрытых слоёв, и это очень важно для обучения. В каждом слое может быть до восьми
нейронов, то есть всего в скрытых слоях может быть 48 нейронов. И, наконец, справа
большое поле представляет собой один выходной нейрон, который для заданной точки на
координатной плоскости показывает степень соответствия этой точки оранжевому или
синему классу. В принципе, если навести мышку на любой нейрон в сети, то на диаграмме
выходного нейрона будет показано, как выбранный нейрон классифицирует точки плоскости.
Ну что ж, начнём. Первый набор данных представляет собой синие точки в центре в
окружении оранжевого кольца. Для этого набора минимальной нейросетью, которая
получилась у меня, является сеть с активированными фичами X-один и X-два и одним
скрытым слоем с тремя нейронами. В среднем выходной нейрон начинал верно
классифицировать вход через 50 итераций обучения. При этом заметьте, что если
перезапускать обучение, то «тепловая карта» выходного нейрона каждый раз будет разной
даже на одних и тех же данных. Это происходит из-за того, что в обучающую выборку
каждый раз попадают разные точки в разном порядке.
Для трёх других наборов данных вы должны построить минимальную
классифицирующую нейронную сеть самостоятельно. По результатам построения вам надо
написать что-то типа отчёта, в котором описать параметры обучения вашей нейронной сети,
какие фичи был использованы для обучения, сколько скрытых слоёв и нейронов в них было
использовано, как быстро, то есть за сколько шагов «сошлась» нейронная сеть при
обучении, также нужно описать характеристику областей классификации и причины, почему
произошло именно так, а не иначе.
Что я хочу дополнительно рассказать? Давайте посмотрим четвёртый набор данных —
он самый сложный. Это две спирали, которые входят друг в друга. И построить области
классификации совсем непросто. Но если мы построим нейронную сеть со всеми семью
фичами и максимальным количеством скрытых слоёв и максимальным количеством
нейронов в них, то такая нейронная сеть будет довольно быстро классифицировать этой
непростой набор данных.
А теперь изучите тепловые карты нейронов в скрытых слоях. Тут видна крайняя
избыточность. Например, не менее полутора десятка нейронов активируются на кольцо
отрицательных данных. Это значит, что при построении таких нейронных сетей важно
находить баланс между количеством нейронов и, стало быть, скоростью обучения,
гладкостью областей классификации и избыточностью.
Для чего мы всё это изучили? Ну во-первых, теперь вы сами попробовали то, как
строить нейронные сети. Можно сказать, что вы притронулись к одной из сторон науки о
данных. Это здорово. Но во-вторых, эта библиотека TensorFlow лежит в основе инструмента
DialogFlow для классификации смысла естественно-языковых фраз. Нейронная сеть будет
получать на вход фразу на естественном языке, а на выходе эта нейронная сеть будет
возвращать номер того правила генерации ответа, которое необходимо активировать.
На этом, пожалуй, всё. Мы подготовились к работе над чат-ботами, так как сегодня мы
погрузились во внутренний процесс работы нейронных сетей TensorFlow. Мы поигрались с
четырьмя наборами данных и успешно построили минимальные нейросети для
классификации. А со следующего занятия мы начнём создавать нашего чат-бота. С вами
был Роман Душкин. До новых встреч и пока.