- •Об авторе
- •Предисловие
- •Для кого эта книга
- •О чем эта книга
- •Что вам потребуется при чтении этой книги
- •Условные обозначения
- •От издательства
- •Глава 1. Обзор алгоритмов
- •Что такое алгоритм
- •Этапы алгоритма
- •Определение логики алгоритма
- •Псевдокод
- •Использование сниппетов
- •Создание плана выполнения
- •Введение в библиотеки Python
- •Библиотеки Python
- •Реализация Python с помощью Jupyter Notebook
- •Методы разработки алгоритмов
- •Параметры данных
- •Параметры вычислений
- •Анализ производительности
- •Анализ пространственной сложности
- •Анализ временной сложности
- •Оценка эффективности
- •Выбор алгоритма
- •«О-большое»
- •Проверка алгоритма
- •Точные, приближенные и рандомизированные алгоритмы
- •Объяснимость алгоритма
- •Резюме
- •Глава 2. Структуры данных, используемые в алгоритмах
- •Структуры данных в Python
- •Список
- •Кортеж
- •Словарь
- •Множество
- •DataFrame
- •Матрица
- •Абстрактные типы данных
- •Вектор
- •Стек
- •Очередь
- •Базовый принцип использования стеков и очередей
- •Дерево
- •Резюме
- •Глава 3. Алгоритмы сортировки и поиска
- •Алгоритмы сортировки
- •Обмен значений переменных в Python
- •Сортировка пузырьком
- •Сортировка вставками
- •Сортировка слиянием
- •Сортировка Шелла
- •Сортировка выбором
- •Алгоритмы поиска
- •Линейный поиск
- •Бинарный поиск
- •Интерполяционный поиск
- •Практическое применение
- •Резюме
- •Глава 4. Разработка алгоритмов
- •Знакомство с основными концепциями разработки алгоритма
- •Вопрос 1. Даст ли разработанный алгоритм ожидаемый результат?
- •Вопрос 2. Является ли данный алгоритм оптимальным способом получения результата?
- •Вопрос 3. Как алгоритм будет работать с большими наборами данных?
- •Понимание алгоритмических стратегий
- •Стратегия «разделяй и властвуй»
- •Стратегия динамического программирования
- •Жадные алгоритмы
- •Практическое применение — решение задачи коммивояжера
- •Использование стратегии полного перебора
- •Использование жадного алгоритма
- •Алгоритм PageRank
- •Постановка задачи
- •Реализация алгоритма PageRank
- •Знакомство с линейным программированием
- •Практическое применение — планирование производства с помощью линейного программирования
- •Резюме
- •Глава 5. Графовые алгоритмы
- •Представление графов
- •Типы графов
- •Особые типы ребер
- •Эгоцентрические сети
- •Анализ социальных сетей
- •Введение в теорию сетевого анализа
- •Кратчайший путь
- •Создание окрестностей
- •Показатели центральности
- •Вычисление показателей центральности с помощью Python
- •Понятие обхода графа
- •BFS — поиск в ширину
- •DFS — поиск в глубину
- •Практический пример — выявление мошенничества
- •Простой анализ мошенничества
- •Анализ мошенничества методом сторожевой башни
- •Резюме
- •Глава 6. Алгоритмы машинного обучения без учителя
- •Обучение без учителя
- •Обучение без учителя в жизненном цикле майнинга данных
- •Современные тенденции исследований в области обучения без учителя
- •Практические примеры
- •Алгоритмы кластеризации
- •Количественная оценка сходства
- •Иерархическая кластеризация
- •Оценка кластеров
- •Применение кластеризации
- •Снижение размерности
- •Метод главных компонент (PCA)
- •Ограничения PCA
- •Поиск ассоциативных правил
- •Примеры использования
- •Анализ рыночной корзины
- •Ассоциативные правила
- •Оценка качества правила
- •Алгоритмы анализа ассоциаций
- •Практический пример — объединение похожих твитов в кластеры
- •Тематическое моделирование
- •Кластеризация
- •Алгоритмы обнаружения выбросов (аномалий)
- •Использование кластеризации
- •Обнаружение аномалий на основе плотности
- •Метод опорных векторов
- •Резюме
- •Глава 7. Традиционные алгоритмы обучения с учителем
- •Машинное обучение с учителем
- •Терминология машинного обучения с учителем
- •Благоприятные условия
- •Различие между классификаторами и регрессорами
- •Алгоритмы классификации
- •Задача классификации
- •Оценка классификаторов
- •Этапы классификации
- •Алгоритм дерева решений
- •Ансамблевые методы
- •Логистическая регрессия
- •Метод опорных векторов (SVM)
- •Наивный байесовский алгоритм
- •Алгоритмы регрессии
- •Задача регрессии
- •Линейная регрессия
- •Алгоритм дерева регрессии
- •Алгоритм градиентного бустинга для регрессии
- •Среди алгоритмов регрессии победителем становится...
- •Практический пример — как предсказать погоду
- •Резюме
- •Глава 8. Алгоритмы нейронных сетей
- •Введение в ИНС
- •Эволюция ИНС
- •Обучение нейронной сети
- •Анатомия нейронной сети
- •Градиентный спуск
- •Функции активации
- •Инструменты и фреймворки
- •Keras
- •Знакомство с TensorFlow
- •Типы нейронных сетей
- •Перенос обучения
- •Практический пример — использование глубокого обучения для выявления мошенничества
- •Методология
- •Резюме
- •Глава 9. Алгоритмы обработки естественного языка
- •Знакомство с NLP
- •Терминология NLP
- •Библиотека NLTK
- •Мешок слов (BoW)
- •Эмбеддинги слов
- •Окружение слова
- •Свойства эмбеддингов слов
- •Рекуррентные нейросети в NLP
- •Использование NLP для анализа эмоциональной окраски текста
- •Практический пример — анализ тональности в отзывах на фильмы
- •Резюме
- •Глава 10. Рекомендательные системы
- •Введение в рекомендательные системы
- •Типы рекомендательных систем
- •Рекомендательные системы на основе контента
- •Рекомендательные системы на основе коллаборативной фильтрации
- •Гибридные рекомендательные системы
- •Ограничения рекомендательных систем
- •Проблема холодного старта
- •Требования к метаданным
- •Проблема разреженности данных
- •Предвзятость из-за социального влияния
- •Ограниченные данные
- •Области практического применения
- •Практический пример — создание рекомендательной системы
- •Резюме
- •Глава 11. Алгоритмы обработки данных
- •Знакомство с алгоритмами обработки данных
- •Классификация данных
- •Алгоритмы хранения данных
- •Стратегии хранения данных
- •Алгоритмы потоковой передачи данных
- •Применение потоковой передачи
- •Алгоритмы сжатия данных
- •Алгоритмы сжатия без потерь
- •Практический пример — анализ тональности твитов в режиме реального времени
- •Резюме
- •Глава 12. Криптография
- •Введение в криптографию
- •Понимание важности самого слабого звена
- •Основная терминология
- •Требования безопасности
- •Базовое устройство шифров
- •Типы криптографических методов
- •Криптографические хеш-функции
- •Симметричное шифрование
- •Асимметричное шифрование
- •Практический пример — проблемы безопасности при развертывании модели МО
- •Атака посредника (MITM)
- •Избежание маскарадинга
- •Шифрование данных и моделей
- •Резюме
- •Глава 13. Крупномасштабные алгоритмы
- •Введение в крупномасштабные алгоритмы
- •Определение эффективного крупномасштабного алгоритма
- •Терминология
- •Разработка параллельных алгоритмов
- •Закон Амдала
- •Гранулярность задачи
- •Балансировка нагрузки
- •Проблема расположения
- •Запуск параллельной обработки на Python
- •Разработка стратегии мультипроцессорной обработки
- •Введение в CUDA
- •Кластерные вычисления
- •Гибридная стратегия
- •Резюме
- •Глава 14. Практические рекомендации
- •Введение в практические рекомендации
- •Печальная история ИИ-бота в Твиттере
- •Объяснимость алгоритма
- •Алгоритмы машинного обучения и объяснимость
- •Этика и алгоритмы
- •Проблемы обучающихся алгоритмов
- •Понимание этических аспектов
- •Снижение предвзятости в моделях
- •Решение NP-трудных задач
- •Упрощение задачи
- •Адаптация известного решения аналогичной задачи
- •Вероятностный метод
- •Когда следует использовать алгоритмы
- •Практический пример — события типа «черный лебедь»
- •Резюме
Практическийпример—проблемыбезопасностиприразвертываниимоделиМО 325
рового сертификата, который пытается получить пользователь). Если подлин ность пользователя подтверждается, он передает центру сертификации откры тый ключ по защищенному каналу. С учетом этой информации создается цифровой сертификат с цифровой подписью центра. После этого пользователь может предъявить свой сертификат любому, кто хочет удостоверить его лич ность. При этом нет необходимости отправлять сертификат по защищенному каналу, поскольку он не содержит никакой конфиденциальной информации. Лицо, получающее сертификат, не обязано напрямую проверять личность поль зователя. Этот человек может просто убедиться в том, что сертификат действи телен, проверив цифровую подпись центра сертификации. Подпись подтверж дает, что открытый ключ, содержащийся в сертификате, действительно принадлежит лицу (или организации), указанному в нем.
Закрытый ключ центра сертификации организации является самым слабым звеном в цепочке доверия PKI. Например, если имитатор завладеет закрытым ключом Microsoft, он сможет установить вредо носное ПО на миллионы компьютеров по всему миру, выдавая себя за центр обновления Windows.
ПРАКТИЧЕСКИЙ ПРИМЕР — ПРОБЛЕМЫ БЕЗОПАСНОСТИ ПРИ РАЗВЕРТЫВАНИИ МОДЕЛИ МО
В главе 6 мы рассмотрели жизненный цикл CRISP-DM, который представляет собой этапы обучения и развертывания модели МО. Как только модель обуче на и оценена, завершающим этапом становится ее развертывание. Если это особо важная модель, необходимо убедиться, что все цели безопасности достиг нуты.
Проанализируем типичные проблемы, с которыми приходится сталкиваться при развертывании подобной модели, и способы их решения с помощью кон цепций, рассмотренных в этой главе. Обсудим стратегии защиты обученной модели от следующих трех угроз:
zz Атака посредника.
zz Маскарадинг (нелегальное проникновение). zzИскажение данных.
Рассмотрим их по очереди.
326 |
Глава 12. Криптография |
Атака посредника (MITM)
Одна из возможных атак, от которой необходимо защитить модель, — это атака посредника, или атака MITM (Man-in-the-Middle — «человек посередине»). Атака MITM происходит, когда злоумышленник пытается перехватить не пред назначенное для него сообщение при внедрении обученной модели МО.
Поэтапно разберем атаку MITM, обратившись к примеру возможного сценария.
Предположим, Боб и Алиса собираются обменяться сообщениями с помощью PKI.
1.Боб использует {PrБоб, PuБоб}, а Алиса — {PrАлисас, PuАлиса}. Боб создал сообще ние МБоб, и Алиса создала сообщение МАлиса. Они хотят безопасно обменять ся этими сообщениями друг с другом.
2.Сначала им необходимо обменяться открытыми ключами, чтобы установить
друг с другом безопасное соединение. Это означает, что Боб использует PuАлиса для шифрования MБоб перед отправкой сообщения Алисе.
3.Предположим, что существует злоумышленник X, который использует {PRX, PuX}. Он может перехватить обмен открытыми ключами между Бобом и Али сой и заменить их собственным открытым сертификатом.
4.Боб отправляет MБоб Алисе, шифруя его с помощью PuX вместо PuАлиса, оши бочно полагая, что это публичный сертификат Алисы. Подслушивающий X перехватывает сообщение MБоб и расшифровывает его с помощью PrБоб.
Эта атака MITM продемонстрирована на следующей диаграмме (рис. 12.14).
{Pu , Pr } |
Pr |
|
|
{Pu |
|
} |
{Pu , Pr } |
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
M |
|
||
|
|||
|
M |
{PuX, PrX}
Рис. 12.14
Практическийпример—проблемыбезопасностиприразвертываниимоделиМО 327
Давайте узнаем, как можно предотвратить атаки MITM.
Предотвращение атаки MITM
Предотвратить атаки MITM возможно путем добавления в систему центра сертификации. Допустим, название этого центра — myTrustCA. Цифровой сер
тификат имеет свой открытый ключ, PumyTrustCA, встроенный в него. myTrustCA отвечает за подписание сертификатов для всех участников системы, включая
Алису и Боба. Это означает, что и Боб, и Алиса имеют сертификаты, подписан ные myTrustCA. Подписывая их сертификаты, myTrustCA проверяет, что они действительно являются теми, за кого себя выдают.
После введения этого условия вернемся к взаимодействию между Бобом и Алисой.
1.Боб использует {PRБоб, PuБоб}, а Алиса использует {PRАлиса, PuАлиса}. Оба от крытых ключа встроены в их цифровые сертификаты, подписанные
myTrustCA. Боб создал сообщение МБоб, а Алиса создала сообщение МАлиса. Они хотят безопасно обменяться этими сообщениями друг с другом.
2.Боб и Алиса обмениваются цифровыми сертификатами, содержащими их открытые ключи. Они примут ключи только в том случае, если те встроены в сертификаты, подписанные myTrustCA. Они должны обменяться откры тыми ключами, чтобы установить безопасное соединение друг с другом.
Таким образом, Боб применит PuАлиса для шифрования MБоб, прежде чем от править сообщение Алисы.
3.Появляется злоумышленник X, который использует {PRX, PuX}. Злоумыш ленник может перехватить открытые ключи Боба и Алисы и заменить их собственным открытым сертификатом PuX.
4.Боб отклоняет попытку X, так как цифровой сертификат злоумышленника не подписан myTrustCA. Безопасное соединение прерывается, попытка ата ки регистрируется с отметкой времени и всеми деталями, и возникает ис ключение безопасности.
При внедрении обученной модели МО вместо Алисы используется сервер раз вертывания. Боб развертывает модель только после установления защищенно го канала, выполнив все упомянутые шаги.
Реализуем это на Python.
Сначала импортируем необходимые библиотеки.
from xmlrpc.client import SafeTransport, ServerProxy import ssl
328 |
Глава 12. Криптография |
Теперь создадим класс, который может проверить сертификат.
class CertVerify(SafeTransport):
def __init__(self, cafile, certfile=None, keyfile=None): SafeTransport.__init__(self)
self._ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1) self._ssl_context.load_verify_locations(cafile)
if cert:
self._ssl_context.load_cert_chain(certfile, keyfile) self._ssl_context.verify_mode = ssl.CERT_REQUIRED
def make_connection(self, host):
s = super().make_connection((host, {'context': self._ssl_context})) return s
# Создаем клиентский прокси-сервер
s = ServerProxy('https://cloudanum.com:15000', transport=VerifyCertSafeTransport('server_cert.pem'), allow_none=True)
Рассмотрим другие угрозы, с которыми может столкнуться развернутая модель.
Избежание маскарадинга
Злоумышленник X притворяется авторизованным пользователем, Бобом, и по лучает доступ к конфиденциальным данным (в нашем случае это обученная модель). Необходимо защитить модель от любых несанкционированных из менений.
Один из способов защиты от маскарадинга — шифрование модели с помощью закрытого ключа авторизованного пользователя. После этого любой может про читать и использовать модель, расшифровав ее с помощью открытого ключа авторизованного пользователя, который содержится в его цифровом сертифи кате. Никто не может вносить какие-либо несанкционированные изменения в модель.
Шифрование данных и моделей
После развертывания модели неразмеченные данные реального времени (предо ставленные в качестве входных) также могут быть изменены. Обученная модель используется для вывода и размечает эти данные. Чтобы обезопасить данные от несанкционированного доступа, необходимо защищать их как в состоянии покоя, так и при передаче. В первом случае для кодирования можно использовать симметричное шифрование. Для передачи данных можно установить защищен ные каналы на основе SSL/TLS, обеспечивающие безопасный туннель. Он ис
Практическийпример—проблемыбезопасностиприразвертываниимоделиМО 329
пользуется для передачи симметричного ключа. Данные расшифровываются на сервере до того, как будут предоставлены обученной модели.
Это один из наиболее эффективных и надежных способов защиты данных от несанкционированного доступа.
Симметричное шифрование также используется для кодирования модели после обучения (перед развертыванием на сервере). Это предотвратит любой несанк ционированный доступ к модели до ее внедрения.
Рассмотрим пошагово кодирование обученной модели в источнике, используя симметричное шифрование, а затем декодируем ее в месте назначения перед использованием.
1. Сначала обучим простую модель, используя набор данных Iris:
import cryptography as crypt from sklearn.linear_model import LogisticRegression from cryptography.fernet
import Fernet from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris iris = load_iris()
X = iris.data y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y) model = LogisticRegression()
model.fit(X_train, y_train)
2. Теперь определим имена файлов, в которых будет храниться модель:
filename_source = 'myModel_source.sav' filename_destination = "myModel_destination.sav" filename_sec = "myModel_sec.sav"
Обратите внимание, что filename_source — это файл, в котором хранится обученная незашифрованная модель в источнике. filename_destination — файл, в котором находится обученная незашифрованная модель в месте назначения, а filename_sec — это зашифрованная обученная модель.
3. Используем pickle для помещения обученной модели в файл:
from pickle import dump
dump(model, open(filename_source, 'wb'))
4.Определим функцию с именем write_key(), которая генерирует симметрич ный ключ и хранит его в файле с именем key.key:
330 |
Глава 12. Криптография |
def write_key(): |
|
key = Fernet.generate_key() |
|
with open("key.key", "wb") as key_file: |
|
key_file.write(key) |
|
5.Теперь определим функцию с именем load_key(); она считывает сохраненный ключ из файла key.key:
def load_key():
return open("key.key", "rb").read()
6.Определим функцию encrypt(), которая шифрует и обучает модель, а также сохраняет ее в файле с именем filename_sec:
def encrypt(filename, key): f = Fernet(key)
with open(filename_source,"rb") as file: file_data = file.read()
encrypted_data = f.encrypt(file_data) with open(filename_sec,"wb") as file:
file.write(encrypted_data)
7.Применим эти функции для генерации симметричного ключа и сохранения его в файле. Затем прочитаем этот ключ и используем его для хранения обу ченной модели в файле с именем filename_sec:
write_key() encrypt(filename_source,load_key())
Модель зашифрована. Она будет передана в место назначения, где будет ис пользоваться для прогнозирования. Для этого проделаем следующие шаги.
8.Определим функцию с именем decrypt() для расшифровки модели из filename_sec в filename_destination с использованием ключа, хранящегося в файле key.key:
def decrypt(filename, key): f = Fernet(key)
with open(filename_sec, "rb") as file: encrypted_data = file.read()
decrypted_data = f.decrypt(encrypted_data) with open(filename_destination, "wb") as file:
file.write(decrypted_data)
9.Теперь используем эту функцию для расшифровки модели и сохраним ее в файле с именем filename_destination:
decrypt(filename_sec,load_key())
10.Далее применим этот незашифрованный файл, чтобы загрузить модель и ис пользовать ее для прогнозирования (рис. 12.15).