TensorFlow разочаровывает. Глубокому обучению от Google не хватает «глубины»

Автор оригинальной публикации: Мэттью Майо (Matthew Mayo)

Перевод Станислава Петренко

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

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

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

  2. Не секрет, что я большой поклонник Google, можно сказать даже «фанат», как, например, люди одержимые Apple или помешанные на Microsoft (хотя таких, наверное, немного).

Как было объявлено на прошлой неделе, Google открыла исходный код библиотеки TensorFlow, предназначенной для реализации крупномасштабных систем машинного обучения. Эта библиотека принадлежит ко второму поколению и является наследницей DistBelief.

Созданная командой Google Brain, TensorFlow представляет вычисления в виде графов потоков данных, отслеживающих свое состояние (stateful dataflow graph). Библиотека позволяет реализовывать вычисления на аппаратных средствах широкого спектра, от потребительских устройств под управлением Android до крупных гетерогенных систем с несколькими GPU. По утверждению разработчиков, TensorFlow без существенного изменения кода позволяет перенести выполнение ресурсоемких вычислительных задач из среды с одним CPU в гетерогенную быструю среду с несколькими GPU. Принимая во внимание эти возможности, становится очевидно, что TensorFlow призвана обеспечить массовый параллелизм и высокую масштабируемость машинного обучения для всех.

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

Обзор TensorFlow

Центральным объектом TensorFlow является граф потока данных, представляющий вычисления. Вершины графа представляют операции (operation), а ребра – тензоры (tensor) (многомерные массивы, являющиеся основой TensorFlow). Граф потока данных в целом является полным описанием вычислений, которые реализуются в рамках сессии (session) и выполняются на устройствах (device) (CPU или GPU). Как и многие другие современные системы для научных вычислений и машинного обучения, TensorFlow имеет хорошо документированный API для Python, где тензоры представлены в виде знакомых массивов ndarray библиотеки NumPy. TensorFlow выполняет вычисления с помощью высоко оптимизированного C++, а также поддерживает нативный API для C и C++.

Установка библиотеки осуществляется быстро и безболезненно посредством команды pip install. Далее мы с легкостью можем написать и запустить простейшую программу «Привет, мир тензоров!»:

import tensorflow as tf

# Say hello.
hello = tf.constant('Hello, TensorWorld!')
sess = tf.Session()
print sess.run(hello)
# --> Hello, TensorWorld!

# Some simple math.
a = tf.constant(10)
b = tf.constant(32)
print sess.run(a+b)
# --> 42

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

В следующем примере мы создадим два NumPy массива случайных вещественных чисел. Затем поместим их в объекты TensorFlow и выполним умножение. Обратите внимание на создание сессии и вызовы метода run(). Если граф не задан, TensorFlow использует экземпляр по умолчанию.

import tensorflow as tf
import numpy as np

# Pair of numpy arrays.
matrix1 = 10 * np.random.random_sample((3, 4))
matrix2 = 10 * np.random.random_sample((4, 6))

# Create a pair of constant ops, add the numpy 
# array matrices.
tf_matrix1 = tf.constant(matrix1)
tf_matrix2 = tf.constant(matrix2)

# Create a matrix multiplication operation, pass
# the TensorFlow matrices as inputs.
tf_product = tf.matmul(tf_matrix1, tf_matrix2)

# Launch a session, use default graph. 
sess = tf.Session()

# Invoking run() with ftf_product variable will
# execute the ops necessary to satisfy the request,
# storing result in 'result.'
result = sess.run(tf_product)

# Now let's have a look at the result.
print result

# Close the Session when we're done.
sess.close()

Более подробную информацию по API TensorFlow можно найти в официальной публикации.

Экспериментируем с TensorFlow

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

Я ознакомился с перечисленными ниже руководствами.

Базовая механика Tensor Flow (TensorFlow Mechanics 101)

«В данном руководстве представлена методика обучения и оценки простой нейронной сети прямого распространения (feedforward neural network) для классификации рукописных цифр из классического набора MNIST. Целевой аудиторией для данного руководства являются опытные пользователи машинного обучения, заинтересованные в применении TensorFlow».

Векторное представление слов (Vector Representation of Words)

«В данном руководстве рассматривается модель word2vec [Mikolov et al.]. Эта модель используется для обучения векторных представлений слов (word embedding)».

Глубокое обучение на примере MNIST для специалистов (Deep MNIST for Experts)

«TensorFlow – это мощная библиотека для реализации крупномасштабных вычислений. Одной из задач, с которыми прекрасно справляется данная система, является создание и обучение глубоких нейронных сетей. В этом руководстве мы рассмотрим базовые элементы, необходимые для создания глубокой сверточной нейронной сети (deep convolutional neural network), применяемой для классификации данных MNIST».

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

Обсуждение

По мере того, как я осваивал TensorFlow, у меня возникало все больше сомнений. Хотя я все лучше понимал, как применять TensorFlow, мне было все труднее представить себе, где я буду ее применять. Бегло просмотрев остальные руководства, я узнал, что TensorFlow может быть использована для реализации рекуррентных нейронных сетей (recurrent neural network), сверточных нейронных сетей (convolutional neural network), логистической регрессии (logistic regression) и даже для генерации и визуализации множества Мандельброта (Mandelbrot set) (что, если честно, еще больше смутило меня). Но, при всем этом, библиотека не содержит в себе какую-либо панацею или что-то в этом роде, что мотивировало бы меня выбрать именно TensorFlow для некоторого проекта. Я не понял, в чем состоят преимущества системы.

Поэтому я решил узнать другие мнения.

Порывшись в Интернете, я обнаружил, что был одинок в своих суждениях. Многие люди высоко оценили TensorFlow. Впрочем, их лестные отзывы, по сути, повторяли то, что было написано на официальном сайте проекта. Вероятно, вы думаете, что среди аргументов были, по крайней мере, причины, мотивирующие нас использовать TensorFlow. На самом деле, не много. Я так и не смог найти ни одной практической задачи, для решения которой подходила бы исключительно TensorFlow. «Эксперты» в своем большинстве рассуждали о том, как TensorFlow «изменит все», расплывчато говорили о том, что теперь искусственный интеллект и машинное обучение станут доступны для всех (наконец-то!), и восхищались поддержкой широкого спектра оборудования. Честно говоря, казалось, что множество людей изо всех сил старались не обидеть Google, при этом не совсем понимая, что происходит, и, возможно, впервые услышав про глубокое обучение на прошлой неделе. Несмотря на мои академические склонности, я все же не буду здесь никого цитировать. Я по-прежнему не мог понять, в чем заключаются преимущества.

А что насчет непосредственно глубокого обучения? Здесь в качестве основного достоинства TensorFlow указывается возможность выполнения в гетерогенных средах, оснащенных CPU и GPU. Но этой возможностью обладает любая подобная система (смотрите здесь, здесь, здесь, здесь и здесь [ссылка]). Код (субъективно) также не является более читабельным по сравнению, например, с кодом для Theano. По-прежнему не понимаю.

Кроме того, есть вопросы по поводу масштабируемости (а точнее, ее отсутствия). Название официальной публикации, посвященной TensorFlow, звучит следующим образом: «TensorFlow. Крупномасштабное машинное обучение в гетерогенных распределенных системах» (TensorFlow: Large-Scale Machine Learning on Heterogeneous Distributed Systems). Однако версия с открытым исходным кодом выполняется только на одном узле. Что же это, «самораспределение»? Возможно, я принадлежу к старой школе, но ускорение с помощью GPU не делает систему распределенной. Да, да, я знаю, проприетарная версия действительно является распределенной, и очень вероятно, что будущие релизы с открытым исходным кодом также будут распределенными. Ну а пока… Не понимаю.

Итак, библиотека не делает ничего такого, что нельзя было бы сделать с помощью других систем, но, возможно, она быстрее? Не факт. Данный отчет (непроверенный), содержащий сравнение результатов тестирования TensorFlow и некоторых других популярных систем, говорит не в пользу первой. По слухам, команда TensorFlow работает над решением этой проблемы. (Хотя разве нужны слухи, чтобы убедиться в том, что Google постоянно улучшает свои продукты? Приложения Google на моем Nexus обновляются дважды в день!) Возможно, невысокая скорость является лишь результатом ошибки в исходном коде, которую следует устранить. Если это так, и TensorFlow сможет догнать, а, возможно, и превзойти конкурентов, тогда наше обсуждение будет иметь совершенно другое направление.

Единственным фактическим преимуществом TensorFlow является поддержка множества различных устройств и платформ. Если у меня когда-нибудь возникнет необходимость реализовать нейронную сеть под Android, данная библиотека, вероятно, будет первой кандидатурой. Кроме того, и это не просто слова (это крайне важно!), документация к Python API выполнена очень качественно, что нельзя сказать в отношении многих новых проектов с открытым исходным кодом.

Google находится на переднем крае инноваций, и это никто не может отрицать. Как отмечают различные эксперты, Google более чем на 5 лет опережает всех. Во всем. Всегда. И я буду и дальше нести разноцветный флаг в честь Google (я отказываюсь говорить «Alphabet»). Но, работая с TensorFlow, кажется, будто что-то не так. Это как новая пиццерия, открывшаяся в вашем квартале, в которой очень похожее меню, но не так вкусно готовят, и цены немного выше. Вы можете зайти в нее пару раз, но что-то подсказывает мне, что вы с друзьями скоро вернетесь в ваше любимое заведение.

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

комментария 2

  1. Евгений:

    Спасибо за статью. Подскажите, какую систему вы посоветуете если есть следующая задача.
    Имеем набор текстов и есть оценки текстов по нескольким критериям. Необходимо взять еще один, не оцененный текст и предсказать какие будут оценки.

  2. Хороший перевод. Спасибо!

Добавить комментарий

Ваш e-mail не будет опубликован.

закрыть

Поделиться

Отправить на почту
закрыть

Вход

закрыть

Регистрация

+ =