В настоящее время объем данных в домене кибербезопасности быстро растет. Однако большая его часть представляет собой текстовые неструктурированные данные, которые не подходят для непосредственного использования автоматизированными системами безопасности. Автоматическая и real-time трансформация информации о защищенности системы из неструктурированных текстовых источников в структурированные представления может помочь аналитикам лучше отслеживать ситуацию кибербезопасности. Существует много подходов к решению данной проблемы и некоторыми из них являются модели, основанные на трансформерах, во главе с BERTом. В этом эссе я хочу пролить свет на магию этих четырех букв в контексте защиты информации. Перед тем, как говорить про такие методы решения задач в кибербезе, хочется дать возможность не искушенным датасаенсом читателям получить некоторое представление о том, что находится «под капотом» BERTа и трансформеров в целом. Если Вы ознакомлены с этим или просто не хотите долго разбираться, то можете смело пропускать следующий раздел. Все трансформеры базируются на self-attention блоках, давайте поговорим о них. Главная задача этих блоков – понять, как связаны между собой слова из куска текста, поданного на вход.  Достигается это путем обычных линейных операций сложения и умножения: пусть на вход подано предложение, состоящее из слов x1, x2, ..., x6, причем каждое из них мы будем считать вектором – набором чисел, который как-то описывает слово (подробнее о том, как такое сделать, можно почитать здесь). Пусть далее нам хочется узнать зависимость третьего слова от всех остальных – обозначим ее  y3 - вектором той же размерности. Для этого сложим каждое слово xi c некоторым весом w3i, то есть Веса эти есть ни что иное как скалярное произведение слова x3 cо словом xi. Таким образом мы смотрим, какое «внимание» оказывает каждое слово xi на слово x3, отсюда и «attention» в названии. Softmax, изображенный на картинке, интерпретирует все веса как вероятности, дающие в сумме единицу. Получается, каждое вектор-слово домножается на вероятность того, что третье слово зависит от него.  Чтобы получить чуть больше интуиции в данном вопросе, рассмотрим пример с оценкой ресторанов. Нам хочется по отзыву понять, положительный он или отрицательный. Казалось бы, «увидев» в предложении слово terrible, компьютер должен сразу пометить отзыв отрицательным, однако на этом моменте на сцену выходит self-attention и говорит: «У нас в предложении еще есть слово not, которое имеет значение отрицания». Получается, «минус на минус дает плюс», и terrible на самом деле уже и не terrible, а очень даже ничего. Теперь как из self-attention блока сделать трансформер? Если по-простому – повторить несколько раз: с каждым блоком мы выходим на все высший уровень абстракции относительно исходных слов и все больше понимаем об их связи между собой. Если же быть почестнее: определим transformer блок (в который входит self-attention) и повторим несколько раз уже его. Как устроен transformer блок: на вход он получает векторные представления слов (эмбеддинги), далее делает нормализацию слоя для стабилизации сети, после чего идет self-attention. Затем идет опять нормализация и нейросетевой слой с прямой связью, для преобразования полученных attention векторов в форму, которую можно подать в следующий transformer block. Дальше хочется уметь при обучении зависимостей учитывать позицию слова в предложении, т.к. она очевидно влияет на смысл. До сих пор в трансформере, который мы построили, можно было поменять порядок входных слов и ничего не изменилось бы: модель точно также бы учла влияние слов друг на друга. Давайте это исправим, добавив во входные эмбеддинги информацию о позиции слов в предложении. Например, это можно сделать, просто прибавив в самом начале к каждому слову-вектору вектор такой же размерности, соответствующий позиции слова. Таким образом, трансформер получает на вход слова и для каждого слова генерирует вектор, заключающий в себе значение этого слова. Похожие слова имеют более близкие числовые значения внутри таких векторов. По сути, модель в некоторой степени учится отвечать на вопросы «Что такое язык?»; «Что такое грамматика?» и главное «Что такое контекст?» Что ж, self-attention и трансформеры позади, давайте теперь перейдем к финальной части нашего ликбеза и наконец-то поговорим про BERT. BERT расшифровывается как Bidirectional Encoder Representation from Transformers. Разберемся, что значат эти слова. На самом деле, в оригинальной статье про трансформеры [1] сам трансформер состоял из двух частей: энкодера (encoder) и декодера (decoder). Я намеренно не стал говорить про декодер, т.к. это не нужно для дальнейшего понимания и только бы усложнило объяснение. Все, что было написано выше, относится к энкодеру. Это хорошая новость, потому что получается, что мы уже знаем, что такое ERT. Перед тем, как раскрыть смысл Bidirectional, поставим задачи, для решения которых используется BERT и обозначим шаги которые для этого предпринимаются. Машинный перевод, ответы на вопросы, рекомендательные системы, краткое изложения текста – для осуществления всего этого компьютер должен понимать язык. Отсюда первый шаг BERTа – предобучиться на большом объеме данных, чтобы понимать язык в целом. Однако у каждой из поставленных выше задач есть своя специфика, свои термины и обозначения, которые модель также должна уловить. Поэтому на втором шаге предобученный BERT дообучается на данных конкретной задачи. Может возникнуть вопрос «А почему бы нам сразу не обучиться на данных задачи? Так модель обучится только на нужном и лучше уловит зависимости.» Есть 2 момента: во-первых, BERT довольно сложная модель, поэтому ему нужен очень большой объем входных данных (авторы BERTа [2] использовали ни много ни мало английскую википедию, в которой больше 2,5 миллиарда слов). Во-вторых, даже если у вас есть солидный набор данных, процесс обучения занимает довольно много времени (предобучение BERTа заняло 4 дня на 16 облачных тензорных процессорах Гугла), и все получается далеко не с первого раза (боль автора). Далее разберем каждый из шагов подробнее. Начнем с первого шага и поговорим про смысл bidirectional. Вспомним, что на вход в transformer блок, подавалось предложение. Мы использовали модель, чтобы научиться связи всех слов между собой, а что если нам хочется научиться генерировать текст? В таком случае во время обучения каждому слову мы должны предоставлять информацию только о словах, которые были до него. То есть обучение происходит в одном направлении и называется unidirectional. Такое используется, например, в декодере оригинального трансформера.  Оба подхода хороши для своих задач, поэтому авторы BERTа делают акцент на bidirectional. Единственная проблема в таком подходе – при подсчете зависимости слова от остальных в self-attention блоке слово будет «видеть само себя», что может привести к слабому улавливанию зависимостей от других слов. Поэтому был придуман следующий подход: во входных данных случайные 10% слов маскируются (то есть модель не видит их значение при обучении), и обучение заключается в правильном предсказании замаскированных слов по имеющемуся контексту - всех остальных слов (задача Masked Language Model). Кроме того, помимо зависимостей слов внутри предложений, хочется научиться понимать зависимость между предложениями. Поэтому в модель подавались пары предложений, идущие друг за другом с 50% вероятностью (задача Next Sentence Prediction). Таким образом, на входе мы имеем токены - суммы эмбеддингов слова, эмбеддингов позиции в предложении и эмбеддингов принадлежности к предложению. Дальше эти токены подаются в BERT, который есть ни что иное как последовательность transformer блоков. На выход мы получаем набор слов-векторов для задачи MLM и бинарный индикатор следующего предложения для задачи NSP. После этого с помощью softmax мы переводим полученные слова-векторы, соответствующие замаскированным словам, в векторы изначальной размерности. По сути такой вектор есть распределение вероятности замаскированного слова быть каждым из возможных слов. Далее полученное представление сравнивается с реальным словом, которое тоже можно понимать, как распределение вероятности – в его векторном представлении 1 стоит в признаке, соответствующему этому слову (то есть это слово со 100% вероятностью есть это слово), а в остальных 0 (такое представление слов называется one hot encoding). В ходе этого сравнения считается ошибка (cross entropy loss), которая в ходе обучения минимизируется. На этапе дообучения мы подаем в BERT данные, характерные для решаемой нами задачи. Таким образом, предобученные параметры модели корректируются, и добавляются новые зависимости. В следующем разделе мы поговорим про это подробнее. Конечно мое объяснение максимально упрощено, чтобы передать самые важные моменты для дальнейшего понимания, не заняв много времени. Однако, если хочется понять все поглубже, вот ссылка на часовой мини-курс лекций по теме self-attention, трансформеров и  BERTа. Хорошо, теперь, когда мы получили представление о таких сущностях, как трансформеры и BERT поговорим наконец о задачах безопасности, а именно о распознавании именованных сущностей (Named Entity Recognition – далее NER) в домене кибербезопасности. В первую очередь надо понять, что это такое. Именованные сущности – это предопределенные категории, выбранные в соответствии с вариантом использования, такие как имена людей, названия организаций, обозначение времени и т.д. Задача NER - присвоение класса каждому токену во входной последовательности. Приведу пример: модель NER получает на вход предложение «Jim bought 300 shares of Acme Corp. in 2006.» и возвращает его же с аннотацией для именнованных сущностей – «[Jim]Person bought 300 shares of [Acme Corp.]Organization in [2006]Time.». Мы поняли, что такое NER, и пора разобраться, как его применять в контексте кибербезопасности. Информация о киберугрозах ежедневно публикуется в онлайн-источниках, включая базы данных уязвимостей, социальные сети, а также на форумах и веб-страницах Surface и Dark Web. Методы NER могут быть использованы для извлечения вышеупомянутой информации в доступной форме из таких источников. Коллеги [3] применили BERT и его улучшенную версию BERT with whole world masking (BERTwwm) для решения задачи NER в домене кибербезопасности. Посмотрим, как они это сделали. Была построена архитектура, состоящая из 3 этапов. На вход модель получает предложение, в котором надо определить термины из домена кибербезопасности, и присвоить каждому из них соответствующий класс. На первом этапе используется предобученный BERT для отображения каждого слова в векторное пространство слов. На втором этапе с помощью BiLSTM извлекаются признаки векторов-слов, полученных на предыдущем шаге, которые потом формируют выходной вектор. На третьем шаге, используя CRF, декодируется последовательность векторов с предыдущего этапа, и на выход мы получаем тэги классов для каждого слова.   Обсудим первый этап, т.к. эссе посвящено BERTу. Авторы немного поменяли описанную ранее классическую архитектуру BERTа, изменив этап маскирования: в домене кибербезопасности некоторые слова встречаются вместе (например “buffer-overflow” и “SQL-injection”), поэтому при обучении модель опиралась на более длительные контексты. Далее, предобученная таким образом модель, дообучалась на эталонном сборнике кибербезопасности (benchmark cybersecurity corpus), про который расскажу чуть позже. Свою интерпретацию BERTа авторы назвали BERT with whole world masking (BERTwwm). Методы, реализованные на 2 и 3 этапах, широко используются для решения данной задачи, и я не хочу заострять внимание на них в этом эссе (авторы ссылаются на статью [4]). В упомянутый сборник входят: National Vulnerability Database (NVD), Microsoft Security Bulletin и Metasploit framework. В наборе данных рассматривается около 40 типов сущностей, включая операционные системы, приложения, файлы, версии и т.д. Например, предложению “The Microsoft Time component in DATIME.DLL in Microsoft Windows XP SP2” будут сопоставлены тэги “O B-vendor B-application O O B-file O B-vendor B-os I-os B-update”. Весь набор данных разделен на три выборки: обучение (80%), валидация (10%) и тест (10%). Далее в работе сравниваются результаты, полученные генерацией векторных представлений слов с помощью Word2Vec и двумя версиями BERTа (классической и описанной выше). Как видно из таблицы, предложенное решение превосходит классические по метрикам precision и recall, а также по F1 Score (метрики, часто используемые в классификации), что можно расценивать, как успешный вклад в развитие трансформер-подходов для решения задач кибербезопасности. Ashish Vaswani et al. “Attention is All you Need”. In: Advances in Neural Information Processing Systems 30. Ed. by I. Guyon et al. Curran Associates, Inc., 2017, pp. 5998–6008. URL: http://papers.nips.cc/paper/7181-attention-is-all-you-need.pdf. Jacob Devlin et al. “BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding”. In: arXiv preprint arXiv:1810.04805 (2018). S. Zhou, J. Liu, X. Zhong and W. Zhao, "Named Entity Recognition Using BERT with Whole World Masking in Cybersecurity Domain," 2021 IEEE 6th International Conference on Big Data Analytics (ICBDA), 2021, pp. 316-320, doi: 10.1109/ICBDA51983.2021.9403180. Qin, Ya, et al. "A network security entity recognition method based on feature template and CNN BiLSTM-CRF." Frontiers of Information Technology & Electronic Engineering 20.6 (2019): 872-884. MIPT student