Дэвид Вайнбергер, независимый технический писатель, в настоящее время работает писателем в рамках инициативы Google People + AI Research (PAIR). Во время своей постоянной резидентуры он рассматривает технологии машинного обучения в более широком контексте социальных проблем и идей и документирует свой опыт с использованием новых инструментов машинного обучения, от What-If до Tensorflow.js. Его мнение является его собственным и не обязательно отражает точку зрения Google. (Предыдущие сообщения.)

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

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

Итак, каковы шансы, что я, любитель JavaScripter, который дает имена переменным, такие как thePhotoCounterThatWorks_UseThisOne, смогу преуспеть с TensorFlow.js? Да, JavaScript - это язык, на котором я лучше всего владею - TensorFlow без .js работает с Python, в котором я намного хуже, но лучше всего не означает хорошо. (TensorFlow.js также позволяет пользователям запускать модели машинного обучения прямо в браузере, и, как друг открытого Интернета, я люблю браузеры и сохраняю все локально.)

Однако у меня есть одна секретная сверхдержава. Как временный писатель в Google, я интегрирован в People + AI Research (PAIR) и сижу всего за несколько столов от разработчиков, создавших TensorFlow.js. Это дает мне уникальную возможность напрягать их терпение, задавая им бесконечный поток досадно невежественных вопросов.

И вот первый урок, который я усвоил: они не говорят «TensorFlow Jazz», как я сначала подумал. Это определенно TensorFlow.js.

Лично я предпочитаю то, что я ослышался.

Зачем писать эту серию неучебных пособий?

Целью этой серии публикаций является не написание пошагового руководства по TensorFlow.js. Если это то, что вы хотите, вот один с веб-сайта проекта. А вот и один извне группы.

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

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

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

Серия неудачных идей

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

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

Поэтому я спросил об этой идее Махима Пушкарна, визуального дизайнера из PAIR, которая сидит напротив меня. Она указала на Design Seeds, сайт, который определяет шесть доминирующих цветов в изображении, превращает их в палитру и предоставляет несколько запоминающихся тегов для каждого. На сайте вроде бы около 15 000 палитр. Итак, я подумал, что могу каким-то образом получить их все, запустить их и их теги через TensorFlow.js и заставить машинное обучение (ML) создать палитру цветов на основе любого набора тегов, который пользователь захочет выбрать. Например, вы можете попросить его создать палитру на основе тегов спокойствие, воробей и ох ла ла!, И система предложит шесть оттенков, которые, как она узнала, связаны с этими терминами.

Но столкнулся с некоторыми проблемами. Во-первых, сайт Design Seeds не предоставляет свое содержимое для такого рода повторного использования, что является его правом. Но даже если это так, приложение, которое я предлагал, было глупой идеей. Как пользователь мог определить, действительно ли палитра представляет собой теги спокойствие, воробей и охлала!? (Чтобы увидеть версию этой идеи, которая работает и к тому же очень забавна, см. Раскраски Джанель Шейн, называющие ИИ. Фактически, см. Все, что делает Джанель.)

Итак, я придумал еще худшие идеи. А затем я сменил тактику и в течение нескольких месяцев шел по пути, который, как выяснилось, основывался на некоторых неправильных предположениях, что в какой-то момент привело меня к тому, что я дал этой серии постов подзаголовок «Полное руководство по ошибкам новичков».

Сбор неправильных данных

Я уважаю Flickr за то, что на раннем этапе он создал общие фотографии, которыми можно свободно делиться, плюс я раньше использовал Flickr's API (интерфейс прикладного программирования). API позволяет вам написать программу, которая запрашивает информацию напрямую с сайта; информация возвращается вам в форме, удобной для восприятия программой, а не в красивой веб-странице. Поэтому я решил скачать с сайта несколько тысяч фотографий.

Через API Flickr вы запрашиваете метаданные о фотографиях: заголовок, идентификатор автора Flickr, теги, созданные пользователями, веб-адрес, на котором находятся фотографии, и т. Д. Итак, я загрузил около трех тысяч этих записей метаданных, запросив только фотографии из потока недавних действий, которые помечены как открытые для повторного использования (спасибо, Creative Commons!). Я сохранил эти метаданные и использовал их для загрузки самих фотографий. (Для этого учебного проекта я не публиковал набор данных или модель. Окончательный код доступен для вашего развлечения на GitHub.)

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

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

Итак, я немного почистил данные.

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

Затем я сохранил оставшиеся 200 лучших тегов. Наименее используемые в списке использовались девять раз, поэтому система машинного обучения могла бы изучить как минимум девять фотографий на предмет закономерностей, присущих любому конкретному тегу. (Если вы работали с системами машинного обучения, вы уже понимаете, в чем я ошибаюсь.) Затем я выбросил любую из 3000 фотографий, к которым не было прикреплено хотя бы одного из этих 200 тегов. Осталось 1906 изображений, на которых можно было обучить систему распознавать изображения, на которых она не была обучена.

Затем я выписал файлы, содержащие данные о каждой из фотографий, прошедших процесс фильтрации. Каждая запись содержала имя файла фотографии, сохраненной на моем диске, теги, название, которое фотограф применил к фотографии, информацию о лицензии, атрибуцию и информацию о том, где находится фотография на серверах Flickr. (Я выразил данные как JSON, очевидный выбор.)

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

Как заметил Янник, тег, прикрепленный только к одной фотографии, не сможет научить систему машинного обучения чему-нибудь полезному. Это как если бы 1906 человек с разными именами заполнили стандартную форму о себе. На вопрос: «Итак, что это говорит нам о людях по имени Вивек?» не приведет вас ни к чему, кроме того, что Вивек ввел в эту форму. Это ничего не скажет вам о следующем Вивеке, с которым вы столкнетесь.

Итак, теперь у меня около 2000 фотографий и 200 их самых популярных тегов. Что мне с ними делать? (Рассказчик: Он их выбросит.)

Приложение, версия 0.01

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

Я иду в обратном направлении. Меня не волнует, что я строю. Я просто пытаюсь научиться. Итак, для чего нужны данные, которые у меня есть?

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

Это достигается путем нахождения сходств - шаблонов в пикселях - между загруженной фотографией и теми, на которых я обучал машинное обучение. Анализируя загруженную фотографию, система машинного обучения делает вероятностное суждение о том, какие теги предлагать. Может быть, я назову это WWFT: «Что будет с тегами Flickr?»

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

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

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

Отметьте ML как "странный"

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

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

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

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

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

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

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

Затем Эмили делает более очевидными странности машинного обучения. Во-первых, она отмечает, что вы можете повернуть предыдущую диаграмму на любой градус, и она все равно будет работать, отделяя джунгли от Арктики:

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

А затем Эмили делает следующий шаг в водоворот: мы разделяем изображения с помощью двухмерных диаграмм, но если это все, что нужно, чтобы научиться отличать джунгли от фотографий Арктики, то вам, вероятно, не понадобится машинное обучение. Но не на всех фотографиях Арктики есть два одинаковых блока, и не все эти одинаковые блоки одинаковы. Система машинного обучения рассматривает множество возможных математических соотношений между пикселями. Даже скромный слой нейронной сети заметит их 128. Если бы мы захотели составить из них диаграмму, она была бы 128-мерной. Мы, люди, не можем себе этого представить, но у систем машинного обучения нет воображения. У них просто математика, и эта математика может обрабатывать чертовски много измерений.

* * *

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

Это должно быть просто, правда?

Верно?

Узнайте из следующего сообщения Дэвида, в котором он узнает, насколько сложно определить, какие данные могут использоваться системой машинного обучения…

Схема серии

Часть 1. Плохая идея. Получение первоначального представления о том, как доступность и характер данных могут влиять на создаваемые нами приложения для машинного обучения. Также: ML может быть странным в том, как он «думает» о данных.

Часть 2: Машина меня тренирует. У нас есть изображения и теги. Но какова правильная комбинация для обучения машинному обучению? Изображения с несколькими тегами? Выбрать по одному тегу для каждого изображения? Если да, то какие? Какую информацию мы хотим, чтобы теги передавали?

Часть 3. Как машинное обучение обучает само себя, или это еще один популярный массив! Более подробное описание предоставления данных изображения в соответствии с требованиями выбранных мной алгоритмов. Детские шаги в процессе машинного обучения. Значимые теги становятся бессемантическими «горячими массивами». Также: человеческая интуиция против машинного обучения.

Часть 4. Изучение данных. Ошибки при обучении системы, связанные с монтажом. Точность и достоверность проверки. Переоснащение. Наконец-то: успех!

Часть 5: Настройка данных и обучение. Сверточные сети. Гиперпараметры и множество способов, которыми люди управляют обучением системы искусственного интеллекта. Написание приложения JavaScript, использующего обученную модель.

Часть 6: Плохая идея. Как мы определяем успех? Уроки выучены.