Интерпретируемость, лекция в НГУ


Лекция в рамках спецкурса по машинному обучению на ЭФ НГУ.

slides-interpretation-v5.pdf

Текстовая расшифровка, не вычитана: О чем мы будем говорить? О том, что модели машинного обучения, они людям непонятны и на самом деле в большинстве своем необъяснимы. Все полезные модели необъяснимы. И эта проблема, поговорим почему эта проблема, как к этой проблеме подходит, как быть с этими непонятными моделями. Рассмотрим два основных подхода к работе с непонятными моделями Lime и SHAP. Отдельно коснемся нейронок и метода городкам, которые хорошо для них подходят. Ну и список, что почитать. Примерно так. А какая основная проблема черного ящика моделей? То есть вот у нас есть нейронная сеть или есть у нас какая-нибудь сложная линейная регрессия на 400 признаков или у нас есть какое-нибудь дерево, созданное градиентным бустингом. Вот оно дает ответ, может быть даже хороший ответ, но как он пришел к этой мысли? Может быть это случайное совпадение, на самом-то деле он исходит из каких-нибудь странных предположений. А может быть он дает правильные ответы, а нам бы хорошо понять как он это делает. Но вообще почему мы им можем доверять, этой модели? Проблема эта не простая. То есть представим себе, что у нас модель оценивает больных, которые поступают в госпиталь, делают первичный триаж. Типа этого надо срочно спасать, этот полежит еще денеком и ничего не будет, это вообще домой отправить, там поправится. И от качества этой модели просто зависит сколько у нас будет трупов. Вот так вот. Бывают не такие трагичные модели, но, например, представим себе модель, которая предсказывает инвестиции в недвижимость или модель, которая предсказывает скоринг, то есть вы что-то такое делаете, в результате модель вам что-то предсказывает, вы теряете деньги, вам обидно, вы думаете наверное модель предсказывает плохо. А где она предсказывает плохо? Здесь вроде хорошо, здесь плохо. Она предсказывает, может быть, лучше, чем человек. Но чем она руководствуется? Есть такая проблема, опять же, у сложных моделей, что они переобучаются на входных данных. Предположим, что мы строим модель, которая определяет факт грабежа на видео. И мы ее обучаем на данных, которые запечатлели грабеж, то есть это камера видеонаблюдения, и видеосъемка нормального поведения людей. Только нормальная съемка поведения людей при нормальном освещении, а грабеж у нас обычно в полутьме. К чему это приведет? Она не будет пытаться определить, что там делают люди. Она будет предсказывать, классифицировать уровень освещения. Или, например, есть много ситуаций, когда модели обучаются отличать хорошее от плохих по каким-нибудь второстепенным признакам. Например, все хорошие примеры сняли летом в пустыне, все плохие примеры сняли зимой на улице. Примеров миллион. И для того, чтобы со всем этим жить, очень полезно понимать, что же там внутри модели творится. Если говорить формально, интерпретация модели нужна на всех этапах жизненного цикла модели. Когда мы разрабатываем модель, нам нужно понимать, что творится внутри модели, как она принимает те или иные решения, для того, чтобы отлаживать эту модель, искать в ней ошибки. После того, как мы сделали модель, мы приносим ее пользователю модели, и ему нужно каким-то образом построить модель модели, чтобы доверять ей. То есть он не просто так доверяет модели, он понимает, что она в таких случаях руководствуется вот этим, а вот в этих вот сто. Затем нам, людям, для того, чтобы с чем-то вместе работать, а модель машинного обучения такой же сотрудник, как все остальные, которого мы нанимаем на работу, мы работаем с ним вместе, нам очень важно предсказывать поведение наших коллег. То есть вообще в человеческой культуре есть такой сильный страх непредсказуемых вещей. Например, зомби это человек, который ведет себя неестественно для человека. Он опасен. Человек в темноте боится каких-то предметов, хотя в принципе мы живем в довольно-таки безопасном мире, но просто потому, что вот непонятно, как оно себя поведет. Настогенетически все непонятное нас пугает. И для того, чтобы с чем-то вместе работать, нам нужно построить у себя внутри в голове модель модели, как-то предсказывать поведение. Ну, чтобы использовать знания модели за пределами модели. И чтобы разбирать полеты, искать кто виноват, почему так вышло. То есть давайте последние три момента еще подробнее разберем. Когда нужно предсказание поведения модели? Представим себе разговор двух хирургов, которые рассматривают рентгеновские снимки. Один другому говорит, слушай, вот тут у нас есть модель, она рентгеновским снимком быстро сортирует пациентов, только ее учили на болезнях солдат, а женщин среди солдат не было, поэтому перепроверяй за ней женские рентгеновские снимки. А мужским можно же доверять. То есть вот это пример того, как люди могли бы использовать знания о том, как работает внутри модель, как она обучалась на практике. На самом деле вживую, в недвижимости, в инвестициях, в скоринге, так примерно это происходит, только логически чуть длиннее. Чтобы использовать знания, которые накопила модель, то есть вы потратили кучу денег, вы научили модель, допустим, отличать хорошие инвестиции от плохих, ну и понятно, что хорошо было бы узнать у нее, чему она научилась, чтобы в общем людям тоже это сказать, чтобы люди тоже это знание использовали. Потом иногда, ну почти всегда, наступает момент, когда дела идут не так, как запланировано. И к вам приходят коллеги и говорят, слушай, почему вот эта модель сделала вот такое дурацкое предсказание. Или резко уменьшилось качество работы модели, или вас, к вам пришел разгневанный пользователь и говорит, здравствуйте, вы отказали мне в кредите, а я хотел кредит, я на вас в суд подам. Потом приходит его адвокат и говорит, пожалуйста, объясните, почему вы приняли вот такое решение. Вы говорите, у меня машина, она что-то такое сделала. Не важно, что. В общем, суд это не впечатлит. Также это не впечатлит ваших коллег и начальству. То есть на всех этапах жизненного цикла модели нам нужны какие-то способы, чтобы понимать, что, как она принимает решение. Проблема настолько серьезная, что в свое время американская военщина запустила отдельный проект по разработке Exponable AI, то есть объяснимого искусственного интеллекта. И эта инициатива, по-моему, она в 2018 или в 2016 году была запущена. Ее цель была во всех проектах Министерства обороны и важных для национальной безопасности приложениях все используемые модели должны быть объяснимы. То есть в транспорте, в безопасности, в медицине, в финансах, в юридической сфере и в оборонке. То есть всякий раз, когда у нас есть модель, которая работает в одной из этих отраслей, мы должны понимать, почему она делает это, почему она делает это, а не что-нибудь другое, в каких случаях она будет успешна, а в каких она выдаст неверные предсказания, когда мы ей можем доверять, и самое главное, как исправлять за ней ошибки, как узнать, что она ошибается и исправлять за ней ошибки. Не во всех случаях нам нужна интерпретация моделей машинного обучения. Есть куча случаев, когда наоборот это не нужно или это лишние затраты денег и времени. Например, когда влияния модели мало. Чем больше моделей машинного обучения в нашей жизни, тем больше моделей, которые принимают в общем-то незначимые решения, даже если они время от времени будут ошибаться, ну и бог бы с ним, если чуть лучше случайного уже хорошо. Потом бывает ситуация, когда проблема сложная, модель сложная, но она хорошо разработана и специалистов с самого первого курса учат с этими моделями работать и понимать, как она себя ведет. Бывают целые классы моделей, которые сами по себе очень сложны внутри, но поскольку их постоянно всем объясняют, как они работают, возникает в общем иногда обоснованная даже иллюзия, что все мы понимаем, как они работают. Это относится к линейным моделям. Все говорят, что линейные модели объяснимы, но в общем они до некоторой степени понятны, что они делают. Иногда мы хотим скрыть алгоритм. Например, вот я в начале этого года работал с ребятами, которые занимаются скорингом и мы с ними отработали интерпретируемость и возникла идея, а давайте мы решение скоринговой модели будем объяснять оператору. То есть оператор видит решение по клиентам и по каждому из клиентов видит, почему это решение было принято. Ну и нам начальник отдела, который занимается андеррайтингом, говорит, не-не-не, ребята, вы что. Это мы сейчас каждому, кто у нас работает, расскажем, как наш скоринговый алгоритм принимает решение, они уволятся и будут брать у нас кредиты за... будут у нас фрот расти. И мы же не будем каждого нашего сотрудника, который уволится, всю его жизнь потом отслеживать. Ну вот в скоринговых моделях совсем нежелательно, чтобы все понимали, как она работает. Яндекс прячет свои алгоритмы ранжирования. На самом деле, сейчас он их уже не прячет, когда они стали настолько сложными, что они уже не интерпретируемы. Когда Яндекс перешел на так называемый матрикс нет, вот, Яндекс стал говорить, что ну все, силошники уже не поймут, то есть специалисты по поисковому продвижению, как у нас работает система, то есть Яндекс буквально гордился тем, что его модель стала не интерпретируемой. Ну и модели оценки качества, например, представим себе, что у нас есть модель, которая оценивает качество работы персонала, менеджеров по продаже. Менеджеры по продажам — это такой специальный класс людей, которые легко подстраиваются под любую оценку и максимизируют ее. Вот. Желательно ничего при этом не делать, то есть делать что-нибудь по минимуму, чтобы оценка была максимальной, потому что у них оценки всегда привязаны к деньгам. Вот. И в этом случае хорошо, когда они не понимают, как их оценивают. То есть они понимают, что оценивают их качество работы, но сам KPI сложный, какой-нибудь замученный, чтобы они не могли под него оптимизироваться. Я, кстати, не разделяю подхода, когда мы делаем сложный KPI для оценки людей. Надо KPI хороший искать, чтобы оптимизация его приносила бизнес пользу. Но это отдельная история. Есть некоторые модели, которые все-таки людям понятны. То есть людям непонятно, как работают, обычным людям непонятно, как работают нейронные сети, как работает градиентный бустинг, но как работают линейные модели, люди более-менее умеют. То есть в линейной модели есть веса, и каждый вес, в общем, описывает, насколько у нас изменится предикт модели, если мы изменим соответствующий параметр. Ну, тут тоже есть свои проблемы. На самом деле сравнивать надо не эффекты признаков, а не веса. То есть у нас может быть признак, у которого очень большое вес в линейной модели, но сам этот признак почти не меняется, и на самом деле не оказывает влияния на предсказание модели. То есть что такое сравнивать эффекты? Мы берем вес признака и умножаем его на одно стандартное отклонение этого признака, чтобы посмотреть, какой обычно эффект этот признак в модель вносит. Далее, иллюзия плотности. Про иллюзию плотности представим себе, что у нас есть модель, которая предсказывает стоимость квартиры в зависимости от площади и числа комнат. У нас есть два входных параметра число комнат и площадь, и есть веса при них. Соответственно, мы можем двигать любой из весов и смотреть, как меняется цена. Проблема в том, что в жизни так не работает. То есть у нас площадь обычно связана с числом комнат, и не существует квартиры, у которых было бы тысяча комнат и один квадратный метр, ну и на самом деле не очень много квартир, у которых тысяча квадратных метров, а одна комната. То есть в двумерном случае это еще очевидно, а когда у вас 400 параметров, то, что это пространство четырехсотмерное на самом-то деле в основном пустое и наполнено только в некоторых плотных кусочках, обычно это не очевидно даже специалисту. Человек не умеет представлять себе четырехсотмерное пространство. Затем в линейных моделях часто используются разные схемы кодирования, например, one-hot encoding. One-hot encoding явно подразумевает, что у вас единица может быть выставлена только в одной из... в одном из нескольких признаков. То есть есть группа признаков, у которых только один из них одновременно может принимать значение единицы. Но в линейной модели вам, когда вы смотрите просто на веса, вам это совершенно не очевидно. То есть увеличение этого признака на единицу дает такой прирост этого признака, такой прирост. А то, что эти признаки не могут на самом деле в живой природе изменяться одновременно, это из объяснения выдали неочевидно. Кроме всего прочего, признаки могут взаимодействовать между собой. То есть поскольку у нас задача переопределена, решений у задачи много. Такой пример, опять же, на пальцах. Представим себе, что мы построим модель, которая предсказывает рост человека по длине его ноги. Можно построить простую модель, допустим, длина левой ноги умножить на 2 это рост человека. Такая более-менее нормально работающая модель. А можно построить другую модель. Длина левой ноги умножить на 10 тысяч, минус длина правой ноги умножить на 9998. Зато модель будет выдавать тот же самый результат, но вес на левой ноге у нас будет огромный, вес на правой ноге у нас будет огромный. На самом деле модель ровно такая же. То есть когда у нас признаки взаимодействуют, веса их могут раскладываться очень странным, нелогичным образом. Это вот проблема линейных моделей. Далее интерпретируемая модель дерева. То есть неглубокое дерево глубиной 3. Человек в состоянии не понять. То есть, например, если у нас есть температура, если у нас болит горло, если у нас есть затруднения в дыхании, то вам срочно в больницу у вас коронавирус. Вот. Но с деревьями тоже сложно. То есть если у вас неочевидные разбиения на вот этих вот в узлах, если у вас больше трех уровней в дерево, в голову оно тоже уже дерево не помещается. То есть человек приходится вашу модель интерпретировать глядя в распечатку. Распечатка, допустим, для какого-нибудь градиентного густинга может быть очень-очень большой и сложной. КНМ. Ну, то есть это одна из самых интерпретируемых моделей. То есть вы говорите, ну вот, Васе мы отказали в кредиту, потому что он похож на Петю, а Петя по кредиту не платит. Тут тоже есть две проблемы. Первая это мера, которая задана в пространстве Васи и Пети. То есть почему Вася похож на Петю? Он похож на него ростом, он похож на него уровнем дохода, он похож на него кругом знакомств в социальных сетях. То есть бывает совершенно очевидная мера, но как правило в сложных пространствах мера не очевидна и, соответственно, КНМ тоже спорный. А потом бывают сами по себе точки неинтерпретируемые. То есть, например, людей мы еще можем как-то представить себе, что это такое. Но если у нас не люди, а записи в базе данных, в нашем мире, в нашем мозге, в нашем разуме, который еще недавно был разумом лазающих по деревьям обезьян, нет специального представления для строк баз данных. Ну, если вы, конечно, специалист по базам данных, то у вас может быть. То есть, во-первых, могут быть точки неинтерпретируемые в случае объяснения на примерах. И, во-вторых, у нас может быть сама определение, самая мера определения близости довольно спорная. Ну и какие у нас есть варианты работы с черными ящиками? Как мы их можем объяснить? Один из подходов, которым чаще всего пользуются в зарегулированных областях, то есть, допустим, в каких-нибудь финансах, медицине, мы говорим, хорошо, мы только интерпретируемые модели принимаем, только линейная и логистическая регрессия, только хардкор, все остальное нас не интересует. Это нормальный подход, но только некоторые сложные вещи линейная и логистическая регрессия описывает плохо. Есть другой подход, к которому люди приходят, когда их законодательно ограничивают линейной и логистической регрессией. Они строят линейную и логистическую регрессию поверх эмбеддингов. То есть, выручивают какой-нибудь эмбеддинг, градиентным бустингом, нейронной сетью, чем-то еще, а поверх него у них есть КНН или логистическая регрессия либо линейная регрессия. И формально у них простая интерпретируемая модель, но сами признаки обработаны так, что вся интерпретация уже потерялась. У нас признаки перестают быть интерпретированы. Следующий часто применяемый подход, мы можем посмотреть веса активации модели. Это то, что статистики обычно делают с линейной регрессией. Они смотрят на вес линейной регрессии, на p-value при этом весе. Это все хорошо до тех пор, пока модель простая. Как правило, любой алгоритм, любая библиотека машинного обучения, она считает какую-то важность для признаков. То есть Random Forest выдаст вам важность признаков, градиентный бустинг выдаст вам важность признаков. Проблема тут обычно в том, как эта важность посчитана. И в большинстве случаев важность эта посчитана неправильно. Есть приятные исключения, но как правило важность, особенно в градиентном бустинге, это то, насколько этот признак был полезен для градиентного бустинга, для того, чтобы разделить все случаи по листочкам. То есть, если признак использовался в ветвлении редко, но тем не менее был основополагающим. Почему пушка не стреляла? Потому что пороха не было. Он вовсе не обязательно будет самый важный. Кроме того, поскольку признаки скоррелированы часто, в живых моделях данные обычно содержат много скоррелированных признаков, модель может здесь использовать тот признак, тут использовать этот, и важность между, внутри групп скоррелированных признаков распределяется случайным, произвольным образом. Что приводит к тому, что полагаться на них нельзя. Мы можем построить модель-модели. Так называемые суррогатные модели. То есть, мы можем взять и построить ну, известно, что любую сложную функцию мы можем в точке неплохо интерпретировать как касательной к ней. То есть, линейная функция хорошо описывает любую другую функцию в ближней окрестности точки. То есть, первый элемент ряда Тейлора, это вот как раз у нас линейная функция. И мы можем для каждой точки модели построить линейную функцию, которая объясняет ее ровно в этой точке. То есть, для всей остальной модели это объяснение будет неверно, но вот конкретно в этой точке модель, у нас будет линейная модель, которая объясняет поведение модели здесь. В принципе, мы можем точно так же построить объяснение общей модели. Ну, например, что чем больше у человека доход, тем больше вероятность, что наша скоринговая модель решит выдавать ему кредит. Это глобальная суррогатная модель, то есть, это линейная модель. Она не совсем верна, потому что могут быть случаи, когда у человека высокий доход, высокая кредитная нагрузка, модель откажет в кредите, но тем не менее, это глобальная суррогатная модель. Есть модель из теории игр Shape-Evalues, которая более-менее научно подходит к построению суррогатных моделей и для нейронных сетей тоже есть свои особенности. Сейчас мы все это делаем и обсудим. Как работает LIME, я уже примерно рассказал. То есть, мы для каждой конкретной точки модели мы строим линейную регрессию, которая описывает ее поведение в этой точке. Это локальная модель, то есть, она объясняет поведение в одной точке. Это суррогатная модель, потому что на самом деле она не верна для всей остальной выборки. Она интерпретируемая, потому что нам более-менее понятно, что вот здесь, например, это предсказание, черт, я не помню, чего это предсказание, но оно основывается на температуре и на состоянии погоды. И мы говорим, что температура такая-то, столько-то градусов, такое-то состояние погоды, получаем простую линейную регрессию, которая говорит, хорошая у нас погода, ну, плюс или минус у вас, что у вас должна модель предсказывать. Кроме того, эта модель селективна, то есть, она отбирает некоторые признаки, которые важнее других, и говорит, что ну вот, для объяснения модели в этой точке нужны были именно эти признаки. Не все объяснения селективны. Кроме всего прочего, у LIME, как и вообще у всех суррогатных моделей, есть один интересный подход, которым можно воспользоваться. Мы можем обучить саму модель на одном наборе признаков, например, на имбедингах, а ее интерпретацию построить на другом наборе, так чтобы это объяснение строилось на признаках, которые понятны живым людям. Мы не обязаны объяснять только таблички. Есть решения для текста, например, вот это тоже из статьи, это примеры из научной сети, в которой описывается LIME. Мы берем и строим модель, которая определяет спам в комментариях к YouTube. В данном случае для каждого комментария на канале, мы оцениваем, спам это или нет, и LIME говорит на основании каких признаков он решил, что это спам. Вот, например, вот это он классифицировал как спам, потому что есть слово channel. То есть, совершенно очевидно, что когда в комментариях к видео человек пишет про какие-то другие каналы, ну, наверное, он пытается спамить нас. Вот. LIME можно применять также и к картинкам. Тут очень интересный подход. Картинка разбивается на так называемые суперпикселы, то есть области более-менее одинаково закрашенные. А затем эти суперпикселы по одному выключаются, и мы смотрим, какие суперпикселы повлияли на ответ модели, какие нет, и к каким классам модель относит решение в зависимости от появления и отключения этих суперпикселов. Здесь мы видим человека в собачьей маске, играющего на гитаре, и модель нам говорит, что, ну, вот этот вот кусок B, он отвечает за то, что это гитара электрическая, кусок C за то, что это гитара акустическая, а кусок D за то, что это Labrador. Но, кстати, я когда прошлый раз использовал этот фотографию в презентации, один американский ученый прислал мне сообщение в Фейсбуке, что, знаешь, вообще-то говорит, это даже не Labrador, это золотистый ретривер, просто светлый. Так что здесь модель ошиблась везде. Ну и опять же, на самом-то деле мы, получается, строим линейную модель в точки, но у нас нет никакого, вообще-то говоря, научного обоснования, почему мы так можем делать. То есть, ну просто вот мы решили, что это объясняет, просто это удобно, это практически полезно, но никакой науки под этом нет. Есть кооперативная теория игр, в которой разработана такая вещь, как Shape Your Values. Представим себе, что мы участвуем в какой-нибудь игре, втроем, например. Я, Ваня Комаров, Ваня Бондаренко. И мы в эту игру выиграли, и нам нужно выигрыш каким-то образом поделить. Например, мы на Кегл, в Кегле участвовали и поделили выигрыш. И тут встает вопрос, как делить, поровну, или, допустим, Ване Бондаренко как самому научно заслуженному отдать больше, или мне, например, как, не знаю, потому что я директор, надо отдать мне больше или Ване Комарову, потому что он в ЦФТ работает и больше знает про деньги, надо отдать больше. То есть это вот спор неразрешимый так на пальцах. Но, представим себе, что у нас есть бесконечное количество времени и бесконечное количество и посмотреть результат. Допустим, если мы не пошли на Кегл вовсе, мы заработали ноль рублей. Если я пошел один, я заработал семь тысяч, Ваня Комаров сходил один, заработал четыре тысячи, Ваня Бондаренко сходил один, заработал шесть тысяч. И дальше мы сходили во всех комбинациях на этот несчастный Кегл и построили модель, сколько в среднем я или Ваня Бондаренко, или Ваня Комаров приносим в выигрыш. То есть, например, добавим меня, выигрыш увеличится, например, на семь тысяч долларов, добавим Ваню Бондаренко на восемь тысяч долларов, Ваню Комарову на девять тысяч долларов, ну и просто разделим эту добычу сообразно вот этим вот значением, шепьюэлиус. То есть, шепьюэлиус, повторюсь, это единственный научно обоснованный способ делить добычу. К сожалению, он на практике трудноприменим, потому что обычно у нас нет возможности миллион раз сходить на Кегл. Тем не менее, есть хороший способ аппроксимации шепьюэлиус и есть библиотека для Питона ШАП, которая делает буквально следующее. Она смотрит, какие признаки скорее всего повлияли бы больше или меньше на результат. То есть, точно так же, как здесь с каждым игроком ассоциируется мотожидание добавленного выигрыша, тот же мы с каждым признаком ассоциируем некоторое значение целевой переменной, часть значения целевой переменной, за которую отвечает тот или иной признак. То есть, вот это взятый скриншот из оригинальной статьи про ШАП, они предсказывали вероятность того, что больной под наркозом получит повреждение головного мозга из-за недостаточного его кровоснабжения. И у них такой был бал, типа, кислородный бал. И каждый из жизненных показателей, который снимался у больного, он вносил то или иное значение в общее значение бала. И вот тут описано, что возраст снижает бал, а, допустим, общежизненные показатели его повышают. При этом, поскольку в каждой точке объяснение свое, вот это вот, опять же, тоже живая фотография из статьи, в тот момент, когда у нас резко изменилась картинка, больному дали один тип наркоза. Затем, где на второй раз меняется, его начали выводить из наркоза или дали ему кислород, я не помню, что. То есть в зависимости от того, что происходило в мире, который мы моделируем моделью, наши shape-values меняются. И если мы их группируем, то у нас наши исходные данные естественным образом разбиваются на группы одинаково объясняемых точек. Мы буквально несколько недель назад использовали вот такую примерно диаграмму для объяснения ошибки на работе модели, которая работала, в принципе, нормально, а потом ни с того ни с сего в середине ноября начала сбоить. Отвечал за ее сбой и, в общем, пошли, посмотрели, откуда этот признак берется и сразу все поняли. Это было удобно. Shape-values, в принципе, локальное объяснение, то есть они объясняют поведение модели в каждой конкретной точке. Но если мы посмотрим, как в целом тот или иной признак влиял на поведение модели, во всех точках просуммируем, нарисуем, мы можем построить глобальное значение признаков, то есть допустим, среднее абсолютное значение, среднее влияние на модель, что дает нам правильно посчитанную важность признаков. Опять же, Shape-values считать комбинаторно сложно, поэтому обычно их аппроксимируют, но существуют эффективные техники аппроксимации. Главное, что все это счастье запрятано в пакетах, нам не нужно это делать самому. Точно так же, как мы использовали LIME для объяснения предсказания нейронок, мы можем использовать и SHAP. В данном случае SHAP берет разные комбинации групп пикселов и смотрит, какие из групп пикселов отвечают за классификацию вот этой фотографии верхней как куличка, а нижнюю как суриката. Видно, что в общем суриката опознают по глазам, кулика по носу, но в общем я бы сказал, что вот такие вот методы для анализа нейронных сетей, они все-таки недостаточно хороши. Для нейронных сетей существуют свои собственные методы и лучшие из них на сегодня, по моему мнению, это так называемый GRADCAM. О чем собственно разговор? Первая идея, как объяснять нейронные сети, возникла у людей, давайте посмотрим, пробросим градиент назад через всю нейронную сеть картинки и подсветим его, то есть получим такую карту активации, карту градиента. Но на самом-то деле эти карты градиента, они не показывают нам, какое влияние эта точка в этой конкретной картинке оказала на предсказание модели, они нам показывают совсем другое, они нам показывают насколько эта картинка необычна относительно датасета. То есть представим себе, что вы видите кошку или собачку и в этот момент в комнату заходит горилла, это очень необычная ситуация, но то, что зашла горилла никак по идее не влияет на то, перед вами кошка или собачка. Нейронная сеть подсветит необычные элементы, необычные точки, необычное сочетание цветов, необычная текстура на картинке. Это обычно дает вам такую зашумленную картинку, иногда необычные элементы есть, те элементы, которые послужили основой для предсказания, а иногда нет. Градкам делает немножко иначе. Он для сверточных сетей берет, делает то же самое, но проводит градиент до первого уровня сверточной сети, до первой сверточной сети. После чего есть такой способ по активному сверточному нейрону восстановить карту, то есть какие пикселы, исходные картинки на этот нейрон влияли. И получив возбуждение на первом, на самом деле технически на последнем, на ближнем к полносвязанному слою нейронной сети, мы можем подсветить вот эти вот поля активности на исходной картинке и получить засветку, то есть какие из пикселов исходной картинки повлияли на принятие решения на модели, то есть из чего она исходила, когда принимала решение. И оказывается, что довольно-таки хорошие интерпретируемые картинки получаются. Вот тут посравниваем оригинальное изображение. Изображена кошка и собака. И модель говорит, ну, тут есть кошка, я думаю, вот поэтому, и есть собака. Рассмотрим разные подходы. Первое, пробросим градиент до исходной картинки. Видим, что фактически у нас произошло выделение контуров. То есть там где-то просматривается кошка, где-то просматривается собака. И все, что мы можем сделать из этого, что модель не приняла в расчет окно и шкаф. Ну, в общем, мы ее от этого не ждали. А, кстати, шкаф чуть-чуть приняла, если посмотреть, то контуры шкафа там тоже просматриваются. Вот. Градкам нам отчетливо подсвечивает кошку и собаку в зависимости от того, какой градиент на кошку или градиент на собаку мы пробрасываем. При этом вот C и I это сделано с помощью ВГГ-16, по-моему, а F и L сделаны с помощью Реснет-18. Ну, видно, что Реснет-18 и ВГГ-16, они по-разному немножко считают веса. Ну, и у Реснет-18 гораздо шире рецептивное поле, то есть она более на один конечный нейрон сверточный приходится большая часть картинки. Она дает более расплющенное, ну и более качественное. Интересно, тут предпоследние в ряду вот эти розовые картинки, оклюженные, они получены очень трудоемким алгоритмом, примерно похожим на Шапьевылес, то есть мы берем и перекрываем маленькие патчи картинки и смотрим, как у нас изменился градиент. И, перебирая все комбинации всех патчей, мы получаем, как перекрытие той или иной, ну, не все комбинации всех патчей, перебирая все патчи, мы смотрим, как тот или иной кусочек картинки влиял на предсказание модели. Эта картинка, получается, похожа на ту, которую она возвращает городкам, но она менее качественная, гораздо более трудоемкая в расчетах, она действительно более сложная. Что можно почитать на эту тему? Ну, как всегда, по любому поводу. Следует читать Диакону, у него есть хорошая статья «Интерпретация черных ящиков» Диаконов он голову преподает. Есть прекрасная книга Мольнара «Интерпретируемое машинное обучение» и Бекера «Объяснение моделей машинного обучения». Для моделей LIME и SHAP есть репозитории исходного кода, в которых можно посмотреть, как это все устроено, и есть ссылки на исходные статьи. Ну, и я приложил ссылку на описание алгоритма работы городкам, я думаю, что с ним тоже стоит ознакомиться. Вопросы? Слышу ли я вас, кстати? Или я опять вас не слышу? Ваня? А все хорошо вам было? Все хорошо было? Ну, давай, ты спроси меня, раз все было хорошо. Может быть, ребята спросят что-нибудь хорошее. Да. Слайды лежат в интернете, как обычно. Сейчас я открою. Они будут в группе в ВКонтакте жить. Никому ничего не интересно? Тогда завершаем. Ну, как? Я тогда задам, что ли, один вопрос. Задайте. Мне просто, я уже, наверное, не пропустил практически ни одной твоей презентации по этой теме. Вот. И мне кажется, каждый раз у тебя немножко ты как бы по-новому смотришь. Мне скучно одно и то же рассказывать. Не, это само собой, конечно. Наверное, приходит какое-то понимание. Для меня понимание пришло, что очень важно, что, конечно, интерпретация в голове, собственно, заказчика. Мы обучаем модель в голове заказчика. Мы даем информацию. Ну, да. Или обучаем, да. И, в общем, если мы как-то ему на пальцах, на палках расскажем, что там внутри, и он скажет, ну, окей, считай, дело сделано. Потому что все равно какая-то... Можно, конечно, по-научному все действительно разложить. Ну, вот смотрите, сказать, этот нейрон за это, за это их очень много. Но, конечно, мозгу очень сложно понять. Мозг любит очень простые объяснения, что вот она прошла там, из-за этого я упал. Вот. Все понятно. Как бы одна вещь на меня действует. Ну, вот мы берем сложную модель и сводим ее либо к линейной регрессии, либо к простому решающему правилу или дереву, я шел и упал, либо к объяснению на примерах. Он такой же, как Вася Петров, а Вася Петрова я неналюбливаю. Ну, да. Ну, да. Вот. И и в связи с этим, в связи с этим вот все-таки что, наверное, мне чуть-чуть не хватало всегда, когда ты рассказываешь, хотя ты раньше вообще все-все-все по этой теме разложил. Сейчас, конечно, выделю самое главное. Хотелось бы все-таки какие вот методы, что мы будем как, что мы будем практически как бы, ну, что-то мы построили, какой-то лес, ну, или там градиентный бустинг, тоже кучу, кучу деревьев. Вот теперь, как бы что нам делать? Я смотрел немножко там у Google, рассказывают об этом. Вот. Он говорит, давай замешивать переменные, чтобы понять, ну, вот насколько вот она. А ты на DataFest показывал очень тоже интересно, как интеракцию между переменными, как две переменные между собой, потому что там, допустим, возраст там до сорока никак, да? А после сорока вот он начинает, и ты видишь, что и там, я не знаю, и доход, допустим, у тебя бодрее растет, например. Ну, и еще такое. Смотри, Вань, давай я тебя прерву. На самом деле, надо нарисовать Shape Your Values глобальную, вот эту, и надо найти 10 хороших, самых хороших точек и 10 самых плохих, и для них построить вот такие вот объяснения. Вот. И после этого обычно все понятно. Давайте я расскажу анекдотов еще несколько, например. Сидим, рассматриваем скоринговую модель. Вот. И там какой-то признак и еще один признак. Неожиданно очень большой вес имеют. И тут одна девушка говорит, о, говорит, это я же придумала эти признаки, все остальные. Да, да, это она вот приехала из Москвы и принесла эти признаки. Я ей хоп и премию даю. Вот. То есть, вот это живой случай из истории. Опять же, живой случай из истории это отладка, про которую я рассказывал. То есть, это вот все. Модель стала себя плохо вести, но никто не понимал, почему. Подстроили, как модель объясняет свое решение, сразу стало понятно. Вообще, в интерпретации модели есть одна тонкость, один подводный камень, что не надо интерпретировать модели там, где можно построить интерпретируемую модель. То есть, строить сложную модель, а потом объяснять ее, это неправильно, если есть возможность просто построить простую объяснимую модель. И это особенно важно сейчас, когда мир меняется, поведение потребителей меняется, вы построили что-то, построили модель, она вроде бы, как на тестовых данных хорошо все предсказывает, но хорошо бы посмотреть, на что эта модель обращает внимание, прежде чем выпускать ее в мир. Может быть, те вещи, на которые она ориентировалась, вообще уже не имеют никакого значения. То есть, может быть, она давала большой скорбал владельцу малого бизнеса, потому что он же владелец малого бизнеса, у него же бизнес есть, у него же есть деньги, он приходит к коронавирусу, у всех владельцев малого бизнеса нет денег. Модель в этом неправа. То есть, нам нужно понимать, как работает модель для того, чтобы определить границы применимости. И, как правило, мы не знаем, что спрашивать у модели. И если мы построим глобальную карту признаков, вот эта вот, которая у меня сейчас открыта, и для десяти самых хороших, для десяти самых точных, для десяти самых неточных, мы построим Shapely Values, и мы построим общую карту, как Shapely Values распределены в датасете, и получим достаточную информацию, чтобы дальше полагаться на нашу интуицию. То есть, там бывают специальные случаи, например, когда мне очень понравились два из свежих примеров, которые за последнюю неделю встретились со мной. Первый — это когда мы берем модели и пытаемся определить, насколько они все еще применимы в реальном мире. Так вот, мы можем построить диаграмму по оси Х, отложить то, насколько каждый признак ушел, то есть мы берем распределение этого признака в обучающих данных, распределение этого признака сейчас в новых данных, по которым у нас нет разметки, считаем, допустим, дивергенцию Кульбах-Ливнева считаем, или любой другой показатель, который нам позволяет сравнивать распределение. А по оси, это мы по оси У, а по оси Х вот это shape-value этого признака. И мы сразу видим, на что следует обратить внимание. То есть те признаки, которые сильно сдвинулись и имели большое shape-value, глобальное, да, это и есть те признаки, на которые нам надо обратить внимание. Может быть, их просто выкинуть надо из модели и переобучить заново, потому что опираться на них уже нельзя. Ну, это первый признак. А второй – это забавное использование shape-value вместо metric learning.