Звуковая логика и монотонные модели ИИ
Опубликовано: 2022-03-11ИИ быстро становится удивительным активом, достигнув сверхчеловеческого уровня производительности в таких областях, как распознавание изображений, го и даже покер. Многие в восторге от будущего ИИ и человечества. В то же время есть общее ощущение, что ИИ страдает одним досадным недостатком: ИИ в его нынешнем состоянии может быть непредсказуемо ненадежным.
Классический пример — Jeopardy! IBM Challenge , во время которого Ватсон, ИИ IBM, с легкостью очистил доску, только чтобы пропустить «Последнюю опасность!» вопрос, относящийся к категории городов США : «Самый большой аэропорт назван в честь героя Второй мировой войны; это второе по величине сражение Второй мировой войны». Уотсон ответил: «Что такое Торонто?????» — дополнительные вопросительные знаки (и низкая ставка) указывали на его сомнения.
Таким образом, несмотря на то, что ИИ способен работать как волшебная сказка в течение больших периодов времени — месяцев, лет, даже десятилетий , — всегда существует мучительная вероятность того, что внезапно он совершит загадочную ошибку.
Нас, людей, больше всего беспокоит не то, что ИИ совершит ошибку, а то, насколько «нелогичной» будет эта ошибка. В случае с Уотсоном тот, кто не знает ответа на вопрос, «логически» попытается хотя бы угадать крупный город США. Я считаю, что это одна из основных причин, по которой у нас пока нет публичного принятия беспилотных автомобилей: даже если беспилотные автомобили могут быть статистически более безопасными, мы опасаемся, что лежащий в их основе ИИ может неожиданно ошибиться в том же смысле, что и Watson. , но с гораздо более серьезными последствиями.
Это заставило меня задуматься, может ли правильная модель ИИ решить эту проблему? Может ли правильный ИИ принимать правильные решения в критические моменты, даже если у него нет ответов на все вопросы? Такой ИИ сможет изменить ход развития технологий и даст нам сказочные преимущества ИИ…
Я верю, что ответ на эти вопросы – да. Я считаю, что ошибок, подобных ошибке Уотсона, можно избежать, используя улучшенные, более логически ограниченные модели, ранние прототипы которых называются монотонными моделями машинного обучения . Пока не вдаваясь в подробности, с правильной монотонной моделью ИИ:
- Беспилотный автомобиль был бы безопаснее, поскольку обнаружения даже самого незначительного человеческого сигнала всегда было бы достаточно, чтобы активировать протокол безопасности даже при наличии большого количества других сигналов.
- Системы машинного обучения (МО) будут более устойчивы к атакам со стороны противника и непредвиденным ситуациям.
- Производительность машинного обучения была бы более логичной и понятной по-человечески.
Я считаю, что мы переходим от эпохи значительного роста вычислительной и алгоритмической мощности ИИ к эре утонченности, эффективности и понимания ИИ, и монотонные модели машинного обучения — первый шаг в этом захватывающем путешествии. Монотонные модели делают ИИ более «логичным».
Примечание редактора. Читателям, которые хотят сделать первый шаг в понимании основ ML, рекомендуется прочитать нашу вводную статью о ML.
Теория монотонных моделей ИИ
Так что же такое монотонная модель? Грубо говоря, монотонная модель — это модель ML, которая имеет некоторый набор функций ( монотонных функций ), увеличение которых всегда приводит к увеличению выхода модели.
Технически...
... есть два места, где приведенное выше определение является неточным.
Во-первых, признаки здесь монотонно возрастают . Мы также можем иметь монотонно убывающие признаки, увеличение которых всегда приводит к уменьшению модели. Эти два могут быть преобразованы друг в друга простым отрицанием (умножением на -1).
Во-вторых, когда мы говорим, что выпуск увеличивается, мы не подразумеваем, что он строго увеличивается — мы имеем в виду, что он не уменьшается , потому что выпуск может оставаться прежним.
В реальной жизни многие пары переменных демонстрируют монотонные отношения. Например:
- Цена бензина за поездку монотонно возрастает по мере увеличения пройденного расстояния.
- Вероятность получения кредита выше с лучшей кредитной историей.
- Ожидаемое время вождения увеличивается с интенсивностью движения.
- Доход увеличивается пропорционально количеству кликов по объявлению.
Хотя эти логические отношения достаточно ясны, для модели машинного обучения, которая интерполирует с использованием ограниченных данных и без знания предметной области, они могут быть не такими. На самом деле модель может интерполировать их неправильно, что приведет к нелепым и дурацким предсказаниям. Модели машинного обучения, которые фиксируют такие знания, лучше работают на практике (избегая переобучения), их легче отлаживать и легче интерпретировать. В большинстве случаев монотонная модель должна использоваться в сочетании с обычной моделью как часть ансамбля учащихся.
Единственное место, где монотонные модели ИИ действительно блестят, — это устойчивость к состязаниям. Монотонные модели — это «защищенные» модели машинного обучения, что означает, что они устойчивы к атакам злоумышленников. Злоумышленники, которые могут манипулировать только немонотонными функциями, не могут обойти монотонную модель ИИ, потому что они не могут изменить метку примера по отношению к монотонной модели ИИ.
Примеры использования монотонных моделей ИИ
До сих пор это обсуждение было чисто теоретическим. Давайте обсудим некоторые примеры использования в реальной жизни.
Вариант использования № 1: Обнаружение вредоносных программ
Одним из самых крутых вариантов использования монотонных моделей ИИ является их использование для обнаружения вредоносных программ. Реализованная как часть Защитника Windows, монотонная модель присутствует в каждом современном устройстве Windows, незаметно защищая пользователей от вредоносных программ.
В одном сценарии авторы вредоносного ПО выдавали себя за законные зарегистрированные предприятия, чтобы обмануть центры сертификации, успешно подписывая код своего вредоносного ПО доверенными сертификатами. Наивный классификатор вредоносных программ, скорее всего, будет использовать подпись кода в качестве функции и укажет, что такие образцы являются безопасными.
Но это не так в случае с монотонной моделью искусственного интеллекта Защитника Windows, чьи монотонные функции — это только функции, указывающие на вредоносное ПО. Независимо от того, сколько «доброкачественного» контента авторы вредоносных программ внедряют в свои вредоносные программы, монотонная модель искусственного интеллекта Защитника Windows будет продолжать захватывать образцы и защищать пользователей от повреждений.
В своем курсе «Машинное обучение для хакеров Red Team» я обучаю нескольким методам обхода классификаторов вредоносных программ на основе машинного обучения. Один из методов состоит в том, чтобы наполнить вредоносный образец «безобидным» содержимым/функциями, чтобы обойти наивные модели машинного обучения. Монотонные модели устойчивы к этой атаке и заставляют злоумышленников работать гораздо усерднее, если они хотят иметь хоть какую-то надежду обойти классификатор.
Вариант использования № 2: фильтрация содержимого
Предположим, команда создает фильтр контента для веб-серфинга для школьных библиотек. Монотонная модель ИИ — отличный кандидат для использования здесь, потому что форум, содержащий неприемлемый контент, может также содержать много приемлемого контента.
Наивный классификатор может сопоставить наличие «подходящих» признаков с наличием «неподходящих» признаков. Но это не сработает, поскольку мы не хотим, чтобы наши дети имели доступ к неприемлемому контенту, даже если он составляет лишь небольшую часть контента.
Вариант использования № 3: ИИ для беспилотных автомобилей
Представьте себе создание алгоритма беспилотного автомобиля. Он смотрит на изображение и видит зеленый свет. Он также видит пешехода. Должен ли он взвешивать сигналы каждого относительно друг друга? Точно нет. Присутствия пешехода достаточно для принятия решения об остановке автомобиля. Присутствие пешеходов следует рассматривать как монотонный признак, и в этом сценарии следует использовать монотонную модель ИИ.
Вариант использования № 4: Механизмы рекомендаций
Механизмы рекомендаций — отличный вариант использования монотонных моделей ИИ. В общем, у них может быть много входных данных о каждом продукте: звездный рейтинг, цена, количество отзывов и т. д. При прочих равных условиях, таких как звездный рейтинг и цена, мы бы предпочли продукт, у которого больше отзывов. Мы можем реализовать такую логику, используя монотонную модель ИИ.
Вариант использования № 5: Фильтрация спама и фишинга
Этот вариант использования аналогичен варианту использования для обнаружения вредоносных программ. Злоумышленники могут вводить в спам или фишинговые электронные письма кажущиеся безобидными термины, чтобы обмануть фильтры спама. Монотонная модель ИИ будет невосприимчива к этому.
Реализация и демонстрация
Когда дело доходит до свободно доступных реализаций монотонных моделей ИИ, три из них выделяются как наиболее поддерживаемые: XGBoost, LightGBM и TensorFlow Lattice.
Учебное пособие по монотонному ML XGBoost
XGBoost считается одним из самых эффективных алгоритмов для структурированных данных на основе многолетних эмпирических исследований и конкуренции. Кроме того, в XGBoost реализована монотонность.
Следующий демонстрационный учебник XGBoost о том, как использовать монотонные модели ML, имеет сопроводительный репозиторий Python.
Начните с импорта нескольких библиотек:
import random import numpy as np import matplotlib.pyplot as plt %matplotlib inline from sklearn.metrics import confusion_matrix import seaborn as sns sns.set(font_scale=1.4)
Сценарий, который мы собираемся смоделировать, представляет собой фильтрацию контента или базу данных вредоносных программ. У нас будут benign_features
, которые моделируют, например, количество контента, связанного с «наукой», «историей» и «спортом», или, в случае вредоносного ПО, «подпись кода» и «признанные авторы».
Кроме того, у нас будут malicious_features
, которые моделируют, например, количество контента, связанного с «насилием» и «наркотиками», или, в случае вредоносного ПО, «количество обращений к криптобиблиотекам» и «числовую меру сходство с известным семейством вредоносных программ».
Мы смоделируем ситуацию с помощью генеративной модели. Мы генерируем большое количество точек данных случайным образом, примерно наполовину безопасных и наполовину злонамеренных, используя функцию:
def flip(): """Simulates a coin flip.""" return 1 if random.random() < 0.5 else 0
Каждая точка данных будет случайным образом генерировать свои функции. «Безобидная» точка данных будет иметь большее смещение в отношении безобидных функций, в то время как «вредоносная» точка данных будет иметь более высокое смещение в отношении вредоносных функций.
Мы будем использовать треугольное распределение, например:
bins = [0.1 * i for i in range(12)] plt.hist([random.triangular(0, 1, 1) for i in range(50000)], bins)

Мы будем использовать эту функцию для захвата приведенной выше логики:
def generate(): """Samples from the triangular distribution.""" return random.triangular(0, 1, 1)
Затем мы приступим к созданию нашего набора данных:
m = 100000 benign_features = 5 malicious_features = 5 n = benign_features + malicious_features benign = 0 malicious = 1 X = np.zeros((m, n)) y = np.zeros((m)) for i in range(m): vec = np.zeros((n)) y[i] = flip() if y[i] == benign: for j in range(benign_features): vec[j] = generate() for j in range(malicious_features): vec[j + benign_features] = 1 - generate() else: for j in range(benign_features): vec[j] = 1 - generate() for j in range(malicious_features): vec[j + benign_features] = generate() X[i, :] = vec
X
содержит векторы случайно сгенерированных признаков, а y
содержит метки. Эта проблема классификации не является тривиальной.
Вы можете видеть, что доброкачественные образцы обычно имеют больший вес в первых нескольких функциях, тогда как вредоносные образцы обычно имеют больший вес в последних нескольких функциях.
Когда данные готовы, давайте выполним простое разделение обучения и тестирования:
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
Мы будем использовать функцию для подготовки данных для использования в нашем руководстве по XGBoost:
import xgboost as xgb def prepare_for_XGBoost(X, y): """Converts a numpy X and y dataset into a DMatrix for XGBoost.""" return xgb.DMatrix(X, label=y) dtrain = prepare_for_XGBoost(X_train, y_train) dtest = prepare_for_XGBoost(X_test, y_test) dall = prepare_for_XGBoost(X, y)
Теперь давайте обучим и протестируем простую (немонотонную) модель XGBoost на данных. Затем мы распечатаем матрицу путаницы, чтобы увидеть числовую разбивку правильно помеченных положительных примеров, правильно помеченных отрицательных примеров, неправильно помеченных положительных примеров и неправильно помеченных отрицательных примеров.
params = {"n_jobs": -1, "tree_method": "hist"} model_no_constraints = xgb.train(params=params, dtrain=dtrain) CM = predict_with_XGBoost_and_return_confusion_matrix( model_no_constraints, dtrain, y_train ) plt.figure(figsize=(12, 10)) sns.heatmap(CM / np.sum(CM), annot=True, fmt=".2%", cmap="Blues") plt.ylabel("True Label") plt.xlabel("Predicted Label") plt.title("Unconstrained model's training confusion matrix") plt.show() print() CM = predict_with_XGBoost_and_return_confusion_matrix( model_no_constraints, dtest, y_test ) plt.figure(figsize=(12, 10)) sns.heatmap(CM / np.sum(CM), annot=True, fmt=".2%", cmap="Blues") plt.ylabel("True Label") plt.xlabel("Predicted Label") plt.title("Unconstrained model's testing confusion matrix") plt.show() model_no_constraints = xgb.train(params=params, dtrain=dall)
Глядя на результаты, мы видим, что существенного переобучения нет. Сравним эти результаты с результатами монотонных моделей.
С этой целью давайте обучим и протестируем монотонную модель XGBoost. Синтаксис, в котором мы передаем монотонные ограничения, представляет собой последовательность ( f 0 , f 1 , …, f N ), где каждый f i является одним из -1, 0 или 1, в зависимости от того, хотим ли мы, чтобы функция i была монотонно убывающей, неограниченной или монотонно возрастающей соответственно. В данном случае мы указываем, что вредоносные функции монотонно возрастают.
params_constrained = params.copy() monotone_constraints = ( "(" + ",".join([str(0) for m in range(benign_features)]) + "," + ",".join([str(1) for m in range(malicious_features)]) + ")" ) print("Monotone constraints enforced are:") print(monotone_constraints) params_constrained["monotone_constraints"] = monotone_constraints model_monotonic = xgb.train(params=params_constrained, dtrain=dtrain) CM = predict_with_XGBoost_and_return_confusion_matrix(model_monotonic, dtrain, y_train) plt.figure(figsize=(12, 10)) sns.heatmap(CM / np.sum(CM), annot=True, fmt=".2%", cmap="Blues") plt.ylabel("True Label") plt.xlabel("Predicted Label") plt.title("Monotonic model's training confusion matrix") plt.show() print() CM = predict_with_XGBoost_and_return_confusion_matrix(model_monotonic, dtest, y_test) plt.figure(figsize=(12, 10)) sns.heatmap(CM / np.sum(CM), annot=True, fmt=".2%", cmap="Blues") plt.ylabel("True Label") plt.xlabel("Predicted Label") plt.title("Monotonic model's testing confusion matrix") plt.show() model_monotonic = xgb.train(params=params_constrained, dtrain=dall)
Понятно, что производительность монотонной модели такая же, как и у модели без ограничений.
Теперь мы собираемся создать состязательный набор данных. Мы возьмем все образцы вредоносных программ и «наполним» их безопасными функциями, установив для них значение 1. Затем мы посмотрим, как две модели работают параллельно.
X_adversarial = X[y == malicious] y_adversarial = len(X_adversarial) * [malicious] for i in range(len(X_adversarial)): vec = X_adversarial[i, :] for j in range(benign_features): vec[j] = 1 X_adversarial[i, :] = vec
Давайте преобразуем их в форму, которая будет принята XGBoost:
dadv = prepare_for_XGBoost(X_adversarial, y_adversarial)
На последнем этапе нашего руководства по XGBoost мы протестируем два типа моделей машинного обучения:
CM = predict_with_XGBoost_and_return_confusion_matrix( model_no_constraints, dadv, y_adversarial ) plt.figure(figsize=(12, 10)) sns.heatmap(CM / np.sum(CM), annot=True, fmt=".2%", cmap="Blues") plt.ylabel("True Label") plt.xlabel("Predicted Label") plt.title("Unconstrained model's confusion matrix on adversarial dataset") plt.show()
CM = predict_with_XGBoost_and_return_confusion_matrix( model_monotonic, dadv, y_adversarial ) plt.figure(figsize=(12, 10)) sns.heatmap(CM / np.sum(CM), annot=True, fmt=".2%", cmap="Blues") plt.ylabel("True Label") plt.xlabel("Predicted Label") plt.title("Monotonic model's confusion matrix on adversarial dataset") plt.show()
Как видите, монотонная модель ИИ была примерно в 2500 раз более устойчивой к атакам со стороны противника.
СветGBM
Синтаксис использования монотонных функций в LightGBM аналогичен.
Решетка TensorFlow
TensorFlow Lattice — это еще один фреймворк для преодоления ограничений монотонности, представляющий собой набор готовых оценщиков TensorFlow, а также операторов TensorFlow для создания собственных моделей решетки. Решетки — это многомерные интерполированные справочные таблицы, то есть они представляют собой точки, равномерно распределенные в пространстве (например, сетка), вместе со значениями функций в этих точках. Согласно блогу Google AI:
«… значения справочной таблицы обучаются, чтобы свести к минимуму потери на обучающих примерах, но, кроме того, соседние значения в справочной таблице ограничены для увеличения в заданных направлениях входного пространства, что приводит к увеличению выходных данных модели в те направления. Важно отметить, что поскольку они интерполируют между значениями справочной таблицы, решетчатые модели являются гладкими, а прогнозы ограниченными, что помогает избежать ложных больших или малых прогнозов во время тестирования».
Учебники по использованию TensorFlow Lattice можно найти здесь.
Монотонные модели ИИ и будущее
Монотонные модели ИИ, от защиты устройств от вредоносных атак до предоставления логичных и полезных рекомендаций по ресторанам, оказались большим благом для общества и прекрасным инструментом для освоения. Монотонные модели призваны открыть нам новую эру безопасности, изящества и понимания ИИ. И поэтому я говорю, за монотонные модели ИИ, за прогресс.