Как это сделать и научить этому тоже

Примечание: этот пост был написан совместно Грегом Бенедис-Грабом и Элиссой Леви, чтобы показать, как мы преподаем математику машинного обучения старшеклассникам и учителям старших классов.

Введение

Мы (Грег и Элисса) познакомились во время обучения кодированию старшеклассников с помощью Upperline Code. Примерно через год Грег разрабатывал семинары по вычислительному мышлению для STEMteachersNYC, а Элисса изучала математику, лежащую в основе машинного обучения. Ни один из нас не нашел в Интернете материалов, которые были бы достаточно сложными, чтобы иметь смысл, но при этом были бы понятны для старшеклассников (или широкой публики). Мы собрались вместе и создали семинар для учителей по машинному обучению. Мы оба делимся своим опытом преподавания и обучения на Medium, и мы подумали, что, раз уж мы провели совместный семинар, возможно, имеет смысл вести совместный блог. Этот пост представляет собой интеграцию наших стилей ведения блога и размещен в обоих наших блогах. Чтобы узнать больше о том, что мы написали, посетите страницу Грега Бенедис-Граба и страницу Элиссы Леви.

Что такое машинное обучение?

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

На первом слайде материалов семинара для учителей говорилось:

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

Итак, давайте изучим машинное обучение!

На вкус: черный ящик

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

Лучший инструмент, который мы нашли для быстрого интерактивного вступления, - Обучаемая машина Google. Щелкните проект изображения стандартная модель изображения , а затем загрузите фотографии из двух классов (категорий). Элисса сделала несколько фотографий своих наушников и еще несколько фотографий своей бутылки с водой. Она обучила алгоритм, а затем показала ему несколько изображений, и алгоритм отлично справился с предсказанием класса, к которому принадлежит изображение! Обратите внимание, что алгоритм был неопределенным, когда не было наушников или бутылки с водой - потому что мы не создали класс для предметы, которые не были ни наушниками, ни бутылками с водой.

Играя с этим и другими проектами на сайте Teachable Machine, вы почувствуете всю мощь и ограничения машинного обучения. Найдите время, чтобы изучить сайт и создать свой собственный классификатор изображений. На нашем семинаре участники изучили инструменты и заметили закономерности. Изучение черного ящика - ключевая часть исследовательского процесса, потому что оно позволяет нам развить интуицию и играть, прежде чем пытаться разработать модель происходящего. (Аналогично, на научных курсах, основанных на NGSS студенты сначала изучают явления, а затем находят объяснение.) Итак, теперь давайте займемся математикой, лежащей в основе машинного обучения.

Выполнение фактических вычислений

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

Представьте, что вы отвечаете за алгоритм, который включает и выключает уличные фонари на вашем участке. Вас попросили убедиться, что свет выключен днем ​​и включен ночью. У вас есть доступ к датчику освещенности, который записывает значения от 0 до 100. Вы устанавливаете датчик поблизости и записываете его измерения в случайное время в течение следующих нескольких недель, когда бы вы ни проходили мимо: вы можете поиграть с данными здесь . Если бы вы могли запрограммировать компьютер для освещения уличного фонаря на основе выходного сигнала датчика, какое правило вы бы использовали? (Подумайте, прежде чем читать дальше.)

Когда мы задаем ученикам или учителям этот вопрос, обычно есть две категории ответов: (а) разделение данных с помощью порогового значения и (б) установка определенных значений на «включено» и определенных значений на «выключено». Можете ли вы вспомнить плюсы и минусы каждого ответа?

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

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

К счастью для вас, в этом гипотетическом сценарии всего в квартале от вас был еще один датчик освещенности, который записывал данные каждый раз, когда вы нажимали кнопку «запись» на своем первом датчике. Как удачно! Если вы нанесете данные с датчика 1 на горизонтальную ось, а данные с датчика 2 на вертикальную ось, и вы используете цвет точки, чтобы представить дневное и ночное время, вырисовывается четкая картина.

Примечание: если бы этот пример был реальным, можно было бы ожидать, что значения датчика 1 и датчика 2 будут коррелированы, потому что они оба измеряют количество света на одной и той же улице. Участники нашего семинара для учителей справедливо ожидали, что данные будут лежать в основном на прямой линии с положительным наклоном, а не разбросаны повсюду. В этом сценарии мы попросили учителей прекратить свое недоверие и представить, что два датчика действительно не коррелированы. В ML чем более некоррелированными (но все же в целом точными) будут наши входные данные, тем точнее будут наши прогнозы. Мы работаем над примером получше, чтобы в следующий раз провести этот семинар.

Точки красного и синего цвета - это наши данные обучения. Глядя на этот график, если бы кто-то дал вам новую точку (не в наборе обучающих данных), смогли бы вы определить, должна ли точка быть красной (днем) или синей (ночью)? Например, каким цветом вы бы отметили точку (70, 10)? А как насчет (90, 90)? Какое правило вы используете для этого определения?

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

Давайте пока проведем линию, чтобы разделить две категории. (Позже мы вернемся к значению других кривых, которые мы могли бы нарисовать.) Давайте напишем уравнение этой линии так, чтобы оно соответствовало форме ax + by - c = 0. Простой способ сделать это - выбрать две точки на линии, а затем найдите уравнение линии.

Наклон этой прямой составляет (40–100) / (80–40) = -3/2. Пересечение оси y находится с использованием y = -3/2 x + b с одной из подключенных точек: 40 = -3/2 (80) + b → b = 40 + 120 = 160. Линия y = - 3/2 x + 160. Перемещая все члены в одну сторону, получаем 3/2 x + y - 160 = 0.

Давайте подумаем о физическом значении этого уравнения. Если бы все красные точки были справа, а синие точки слева, то линия была бы намного круче. Коэффициент перед y был бы близок к 0, что является еще одним способом сказать, что данные с датчика 2 не имеют значения. Если бы вместо этого все красные точки были сверху, а синие снизу, линия была бы плоской. Коэффициент перед x будет близок к 0, что означает, что данные датчика 1 бесполезны при определении дня и ночи. Вместо этого у нас есть промежуточный случай, когда полезны входы обоих датчиков, хотя влияние датчика 1 немного сильнее (коэффициент 3/2 больше 1).

-160 сообщает нам, насколько линия сдвинута от точки (0,0). В машинном обучении это называется предвзятостью.

Мы только что построили нашу первую нейронную сеть! Зеленые кружки - наши входные узлы, в данном случае значения датчика 1 и датчика 2. Серый квадрат - наше смещение, которое составляет -160. Если бы нам дали новое значение, скажем, датчик 1 = 70 и датчик 2 = 10, тогда мы бы сделали 70 * 3/2 + 1 * 10 - 160 = -45. Поскольку -45 меньше 0, наша точка находится ниже нашей линии, поэтому это должно быть ночное значение.

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

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

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

Когда профессионалы используют алгоритмы машинного обучения, они редко могут взглянуть на набор данных и увидеть разделение между категориями, как мы это сделали в примере с уличным фонарем. В большинстве случаев имеется более двух входов (датчиков). Возможно, мы пытаемся предсказать кредитоспособность данного человека, поэтому наши входные данные включают его возраст, образование, доход, семейное положение, историю расходов и т. Д. Или, возможно, мы пишем алгоритм распознавания лиц, и наши входные данные - это красный, зеленый , и значения синего для каждого пикселя изображения. Помните, что каждый вход - это отдельная ось; после трех входов мы действительно теряемся, когда дело доходит до визуализации. Вместо этого у нас есть машина перебирать веса, которые работают. Алгоритм предварительно заполняется случайными весами. Каждое известное значение прогоняется через систему, и веса настраиваются так, чтобы выходные данные алгоритма для этого конкретного входа соответствовали известным выходным данным. На то, чтобы рассчитать это вручную, уходит много времени, но это ценное занятие. Если вам интересно, сообщение в блоге Мэтта Мазура проведет вас через все шаги. Когда этот процесс настройки выполняется с тысячами дискретных входов, веса обычно выходят на стабильные значения, что позволяет точно классифицировать будущие входные данные. Этот процесс обновления весов называется обратным распространением.

Машинное обучение для начинающих в p5.js

На нашем семинаре мы показали способ реализации машинного обучения в удобной для новичков среде программирования под названием p5.js. В этом разделе код был разработан Грегом на основе работы Дэна Шиффмана, у которого есть замечательная серия видео по машинному обучению на p5, в которой подробно объясняется концепция и приводится множество примеров.

Библиотека ml5 - это пакет javascript, предназначенный для использования с p5.js. В базовом коде много сложностей, включая TensorFlow, стандартный пакет для реализации многих разновидностей машинного обучения. Вдобавок к этому разработчикам пришлось проделать множество уловок, чтобы заставить все эти вещи работать в браузере, которые в основном являются частью библиотеки tensorflow.js. Суть в том, что с помощью ml5 мы можем создать модель машинного обучения, скормить ей данные, обучить, а затем использовать для прогнозирования. Таким образом, теперь, когда мы лучше понимаем, что происходит в черном ящике, мы возвращаемся к аспекту курса, касающемуся черного ящика. Теоретически эти вычисления можно было бы сделать вручную, но это заняло бы смехотворно много времени; нам действительно нужна вычислительная мощность компьютеров. Это упражнение еще больше укрепляет нашу интуицию о том, как работает машинное обучение, и в то же время полагается на компьютер для выполнения вычислений, которые потребовалось бы слишком много времени для выполнения вручную.

Код для создания экземпляра модели ml5 довольно прост. Самый простой способ включить библиотеку - добавить в свой html-код следующую строку:

<script src=”https://unpkg.com/ml5@latest/dist/ml5.min.js"></script>

Затем вам нужно создать объект ml5.neuralNetwork, который я назвал мозгом.

let brain;
isTrained = false;
let options = {
  inputs: [“mouseX”, “mouseY”],
  outputs: [‘red’,’blue’],
  task: ‘classification’,
  debug: true
}brain = ml5.neuralNetwork(options);

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

if (mouseX > 50 && mouseX < 100 && mouseY > 50 && mouseY<100) {
  // code to change formatting of button
}

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

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

Например

20, 60  no
60, 60  yes
70, 110 no
140,110 no
80, 55  yes
20, 155 no

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

dropdown = createSelect();
dropdown.option(‘red’);
dropdown.option(‘blue’);

Затем нам понадобится код, чтобы добавить точку в модель.

if (!isTrained) {
  let inputs = {
    mouseX, mouseY
  }
  let label = dropdown.value();
  brain.addData(inputs,{label});
}

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

let data = brain.neuralNetworkData.data.raw;
for (let row of data) {
  fill(row.ys.label);
  circle(row.xs.mouseX,row.xs.mouseY,20);
}

Теперь, когда это реализовано, мы можем щелкать по некоторым точкам на экране разными цветами.

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

let trainbutton = createButton(‘train’);
trainbutton.mousePressed(function() {
  brain.normalizeData();
  brain.train({epochs:epochs},()=>{isTrained=true;});
});

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

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

if (isTrained) {
  let inputs = {mouseX,mouseY};
  let outputs = brain.classifySync(inputs);
  background(outputs[0].label);
}

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

Посмотрите эскиз p5.js Грега! Если вам комфортно с p5.js, сделайте ремикс этой работы и посмотрите, как вы можете ее изменить.

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

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

Зачем мы все это сделали?

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

В целом алгоритмы машинного обучения хороши для категоризации будущих данных так же, как и данные для обучения. Например, один алгоритм машинного обучения отлично справился с различением изображений преступников и не преступников, но оказалось, что на самом деле алгоритм распознавал улыбку человека. (Преступники обычно не улыбаются на своих фотографиях.) Это опасно тем, что мы часто не замечаем, что на самом деле выбирает алгоритм, потому что веса в расчетах не имеют интуитивного значения для людей. Серия 3 Blue 1 Brown по нейронной сети с классификатором цифр (видео 1, видео 2 и видео 3) показывает, как можно разработать алгоритм машинного обучения для идентификации рукописной цифры (от 0 до 9). Видео показывают, что веса в алгоритмах не обязательно делают то же самое, что и ваш мозг, чтобы определить, на какую цифру вы смотрите. Поскольку мы не можем легко интерпретировать шаги алгоритма, труднее выявить случаи, когда его прогнозы могут не соответствовать нашим ожиданиям.

Машинное обучение никуда не денется. Слишком эффективно использовать компьютеры вместо людей для принятия миллиардов решений, которые ежедневно принимаются в нашей международной экономике. К счастью, растет число сторонников ответственного подхода к разработке этих алгоритмов. Самая популярная из известных нам книг по этой теме - Оружие математического разрушения - ее обязательно нужно прочитать. Интересные и актуальные статьи включают Техасских (Хьюстон) учителей, несправедливо уволенных из-за ИИ, Макияж, чтобы обмануть распознавание лиц, ИИ отправляет людей в тюрьму и ошибается и Неэтичный чат-бот ИИ в Южной Корее. Рекомендуем следить за Джой Буоламвини и Джорданом Харродом. Чтобы узнать о некоторых уроках, ознакомьтесь с Примеры из практики MIT и Модули отражения этических стандартов CS.

Заключение

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