Применение методов машинного обучения для автоматической рекомендации рефакторинга "перемещение метода"
Общая характеристика статьи, описывающей алгоритм рекомендации перемещения метода с помощью машинного обучения. Рассмотрение основных особенностей применения методов машинного обучения для автоматической рекомендации рефакторинга "перемещение метода".
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 01.12.2019 |
Размер файла | 1,0 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Применение методов машинного обучения для автоматической рекомендации рефакторинга "перемещение метода"
Введение
Разработчики используют рефакторинги для улучшения архитектуры разрабатываемых проектов. Однако для поддержания структуры программного обеспечения необходимо тратить дополнительные ресурсы, которые можно было бы использовать для реализации новой функциональности. Решением данной проблемы могут стать системы автоматической рекомендации рефакторингов. На данный момент исследования сконцентрировались вокруг эвристических подходов. В то же время машинное обучение позволяет учесть субъективный аспект применения рефакторингов и то, что видение разных разработчиков может отличаться. Однако на данный момент в области существует очень мало исследований алгоритмов, основанных на машинном обучении. В данной работе была разработана модель для рекомендации рефакторинга «перемещение метода» на основе недавней разработки - code2vec векторизации. Помимо этого в рамках данной работы была разработана утилита для автоматической генерации датасета. Утилита находится в открытом доступе и была представлена на международном воркшопе по рефакторингам как самостоятельный результат.
Неправильная архитектура исходного кода препятствует реализации дополнительного функционала, ухудшает читаемость программ и допускает внесение большого количества ошибок. Фаулер и Бек [1] создали каталог так называемых «запахов кода» - наиболее распространенных архитектурных ошибок, и рефакторингов - стандартных преобразований кода, которые эти ошибки исправляют. При этом программистам необходимо тратить свое рабочее время на поиск плохих решений в архитектуре программы и их исправление. Более того некоторые ошибки разрешаются нетривиальным способом, ведь один рефакторинг можно применить по-разному, а при использовании нескольких преобразований число комбинаций становится еще больше. Таким образом, получается, что разработчики программного обеспечения обладают инструментом для исправления архитектурных изъянов, однако он не всегда оказывается удобным в использовании.
Решением обозначенной проблемы может стать автоматическая рекомендация рефакторингов. Реализовать систему рекомендаций можно разными способами. Можно сделать расширение интегрированной среды разработки (Integrated Development Environment, IDE), которое могло бы в режиме реального времени анализировать код, который пишет программист, и выдавать советы по улучшению архитектуры. Альтернативный способ - анализировать весь проект целиком на сервере непрерывной интеграции (Continuous Integration, CI) и выдавать список преобразований, которые могли бы улучшить архитектуру проекта к следующей версии.
Данная работа нацелена не на реализацию конкретной системы, которой могли бы пользоваться разработчики, а на исследование и улучшение алгоритмов рекомендации, которые составляют списки улучшающих архитектуру преобразований. Более того разные рефакторинги требуют разных подходов, поэтому в данной работе все внимание уделено одному рефакторингу - «перемещение метода». В наиболее часто используемой в разработке объектно-ориентированной парадигме программы состоят из классов, а те в свою очередь содержат методы и поля. Некоторые методы можно перемещать между классами не изменяя функциональности всей программы. Данное преобразование является типичным рефакторингом, и с ним удобно работать.
Первая работа, посвященная рекомендации перемещения метода было опубликована в 2001 году [2]. В 2007 году Николаос Тсанталис опубликовал первую статью о плагине для среды разработки Eclipse, который называется JDeodorant [3]. Плагин использует авторские алгоритмы рекомендации и поддерживает несколько типов рефакторингов. Автор до сих пор поддерживает и развивает свой проект, а многие статьи ссылаются на JDeodorant и называют именно его самым лучшим решением. Все алгоритмы можно разбить на пять направлений: вычисление расстояния, анализ текста, анализ истории, улучшение метрик качества и машинное обучение.
Несмотря на хорошо описанные крайние случаи абсолютно очевидных ошибок, зачастую оказывается сложно выбрать одно правильное архитектурное решение. Мнение разных разработчиков о необходимости применять рефакторинг может различаться. Потенциально методы машинного обучения могли бы учесть этот субъективный аспект рефакторингов и объединить опыт нескольких разработчиков. Однако существует очень мало статей, которые описывают подходы к рекомендации рефакторингов, основанные на машинном обучении [4]. Более того мной была найдена лишь одна статья, в которой описывается алгоритм, основанный на машинном обучении, для рекомендации перемещения метода. Поэтому целью данной работы является разработка алгоритма, который использует машинное обучение для рекомендации перемещения метода.
В предыдущих работах было показано, что методы классического машинного обучения с метриками Чидамбера и Кемерера [5] в качестве признаков плохо справляются с задачей обнаружения «запахов кода» [6]. Задача обнаружения строго вкладывается в задачу о рекомендации исправления, поэтому в этой работе был разработан принципиально другой метод. Единственная статья, описывающая алгоритм рекомендации перемещения метода с помощью машинного обучения, предлагает подход, основанный на глубоком обучении и обучении представлениям [7]. Авторы предлагают использовать word2vec [8] - модель, позволяющую отображать слова в их векторные представления, и сверточную нейронную сеть для получения итогового предсказания. Так как word2vec модель предназначена для анализа естественного текста, в данной работе предлагается подход, который использует недавний результат - code2vec [9] - альтернативную модель, векторизующую исходный код одного метода. Обе модели - code2vec и word2vec - являются примерами обучения представлениям.
Другая отличительная черта данной работы заключается в том, что для обучения модели использовался очень большой датасет, размер которого на несколько порядков превышает размеры датасетов, которые используют другие исследователи в данной области. Как будет показано в обзоре литературы, разные маленькие датасеты в разных работах порождают ситуацию, в которой невозможно сравнить существующие решения друг с другом. Для решения этой проблемы и сбора данных для этой работы была создана самостоятельная утилита.
Формально в данной работе решается задача регрессии. Модель принимает на вход метод и класс и возвращает число из отрезка - степень уверенности в том, что данный метод нужно переместить в данный класс. В ситуациях, когда метод можно переместить в несколько классов, предлагается выбирать тот класс, для которого модель возвращает наибольшее число. Так как большинство существующих статей описывают алгоритмы для языка программирования Java, то для возможности сравнения подхода из этой работы с существующими решениями модель обучалась для языка программирования Java.
Как было отмечено ранее целью данной работы является разработка алгоритма, который использует машинное обучение для рекомендации перемещения метода. Для достижения цели были поставлены четыре задачи: собрать данные для обучения и проверки модели, придумать регрессионную модель, обучить модель и сравнить полученный алгоритм с уже существующими решениями.
С теоретической точки зрения данная работа демонстрирует, что code2vec векторизацию можно использовать для создания рекомендательных моделей. Эксперименты показывают, что представленная в данной работе модель справляется с задачей на уровне существующих решений, и позволяют предположить, что возможно даже лучше. Также данная работа обладает и практической полезностью. Для решения поставленных задач была разработана специальная утилита для автоматического сбора большого массива данных. С ее помощью можно создавать большие датасеты, которыми могут пользоваться все исследователи. Утилита представлена на воркшопе International Workshop on Refactoring 2019 [10].
Структура работы последующих разделов изложена далее. Во второй главе будет произведен обзор и анализ существующих решений. Каждая последующая глава соответствует задачам, поставленным в данной работе. Третья глава описывает создание датасета, в четвертой главе дано описание разработанной модели, пятая глава рассказывает о процессе обучения модели и описывает результаты тестирования, в шестой главе обсуждается сравнение с существующим решением. Последняя глава содержит заключительные комментарии и описывает достигнутые результаты.
1.Обзор литературы
1.1 Аналогичные работы
машинный метод обучение
Все работы, посвященные рекомендации рефакторинга «перемещение метода» можно разделить на пять направлений: вычисление расстояния, анализ текста, анализ истории, улучшение метрик качества и машинное обучение.
Первый подход к рекомендации перемещения метода был представлен в 2001 году [2]. Авторы предложили ассоциировать специальное множество с каждой программной сущностью (например, метод) . Далее эти множества использовались для подсчета расстояния между разными методами по следующей формуле:
где и - два разных метода. Если метод ближе к сущностям класса, в котором он не лежит, то рекомендуется переместить этот метод.
Тсанталис и др. разработали в 2007 году плагин под названием JDeodorant для среды разработки Eclipse [3]. Данный плагин решает конечную задачу и помогает разработчикам во время написания кода. Алгоритм в JDeodorant очень похож на тот, что описан в [2]. Он использует специальную функцию для подсчета расстояния между методом и классом. Основываясь на подсчитанных расстояниях, плагин рекомендует переместить метод в ближайший класс. Много работ в области рекомендации рефакторингов ссылаются на JDeodorant как на самое лучшее решение.
Терра и др. представили другой плагин для Eclipse - JMove [11], [12]. Они предложили рассчитывать расстояние между методом и классом как среднее расстояние между этим методом и методами из класса. Чтобы посчитать расстояния они ввели понятие зависимостей метода, которое похоже на множества из [2], но устроено сложнее.
Рахман и др. предложили подход, который очень похож на JMove [13]. Их алгоритм считает расстояние между методом и классом как среднее расстояние между данным методом и методами из класса. Для подсчета расстояния между двумя методами они используют множества сущностей, которые используются этими методами. Исследователи утверждают, что преимущество их подхода в том, что он анализирует как обычные методы, так и статические. Позже авторы улучшили свой алгоритм и опубликовали другую статью [14]. В этот раз они применили методы информационного поиска, а именно TF-IDF и косинусное расстояние, чтобы посчитать контекстуальное сходство разных методов. Чтобы скомбинировать различные метрики схожести авторы используют обычное сложение.
Некоторые существующие подходы трактуют исходный код как обычный текст и анализируют его с этой точки зрения. Бавота и др. использовали Relational Topic Models (RTM) для рекомендации перемещения метода [15]. Слова из комментариев и имен переменных записываются в матрицу размерности количество слов на количество методов. Эта матрица используется RTM для вывода семантических связей между методами и определяет вероятностное распределение тем (тематическое моделирование) над методами. Это первая работа, которая использует текстовую информацию для рекомендации перемещения метода.
Другой способ использования текстовой информации продемонстрировали Паломба и др. [16]. Их подход использует методы информационного поиска, чтобы выделить информацию из идентификаторов и комментариев в исходном коде. Далее применяется Latent Semantic Indexing (LSI) для того чтобы стандартизировать полученные вектора и произвести устранение шума. Полученные вектора используются, чтобы посчитать сходство между методами и классами и рекомендовать перемещение метода, основываясь на близости метода к разным классам.
В 2017 году был представлен ещё один плагин для Eclipse - c-JRefRec [17]. Данная утилита создает ориентированный граф зависимостей, основанный на всем исходном коде открытого в среде разработки проекта. В этом графе вершинами являются методы и поля классов, ребра соответствуют зависимостям между этими сущностями. Когда программист пытается изменить открытый проект, c-JRefRec предлагает возможные рефакторинги, основываясь на построенном графе.
Другой тип алгоритм рекомендации рефакторингов - методы, анализирующие историю разработки проекта. Паломба и др. предложили подход для рекомендации переноса метода, основанный на изменениях [18]. Большинство проектов используют систему контроля версий, чтобы отслеживать изменения, которые вносятся в проект. Данный алгоритм анализирует историю изменений проекта. Если метод часто изменялся вместе с классом, в котором он не лежит, то такая ситуация рассматривается как «запах кода», и алгоритм предлагает переместить метод в тот класс с которым он вместе изменяется.
В альтернативном подходе, который называется «эффект домино», предлагается следить за программистом в режиме реального времени [19]. Как только разработчик решает сделать один рефакторинг система предлагает ему похожие. Данный подход обладает рядом ограничений, в частности разработчикам нужно начать процесс рефакторинга и сделать хотя бы один рефакторинг самостоятельно, чтобы система начала работу.
Еще один подход к рекомендации перемещения метода - оптимизация метрик качества. Один такой алгоритм был представлен в 2018 году [20]. Он использует метрики из Quality Model for Object Oriented Design (QMOOD) [21] для оценки качества проекта. Далее алгоритм пытается применить различные перемещения методов и выбирает те из них, что улучшают значения метрик. Данный подход реализован как плагин для среды разработки Eclipse, который называется QMove.
Ранее было предложено некоторое количество алгоритмов, которые предназначены для обнаружения «запахов кода». Алгоритмы базируются на классических алгоритмах машинного обучения и метриках Чидамбера и Кемерера [5]. Недавнее исследование показало, что такие алгоритмы обладают ограничениями и не способны достигнуть хороших результатов [6]. Для улучшения качества работы алгоритмов исследователи предлагают комбинировать статистическое машинного обучение с другими технологиями. Данная работа отличается от подобных подходов тем, что в ней применяется обучение представлениям.
В конце 2018 года был предложен первый алгоритм рекомендации рефакторинга «перемещение метода», который базировался на глубоком обучении и обучении представлениям [7]. Данная алгоритм использует word2vec [8], чтобы обрабатывать идентификаторы, и сверточные слои нейронной сети, чтобы отображать входные данные в итоговые предсказания. Для того, чтобы собрать много данных для обучения и оценки качества, исследователи использовали специальный метод генерации синтетического датасета.
1.2 Анализ рассмотренных подходов
Авторы многих статей ссылаются на JDeodorant как на самое лучшее решение в области рекомендации рефакторингов. Поэтому во многих статьях приводится сравнение предлагаемых алгоритмов с плагином JDeodorant.
Зачастую для сравнения используются такие метрики, как точность (precision) и полнота (recall). Precision - это вероятность того, что найденные алгоритмом «запах кода» и рекомендация по его устранению действительно являются таковыми. Recall является вероятностью того, что случайный «запах кода» будет обнаружен алгоритмом. Обычно требуется максимизировать оба значения, так как можно предложить бесполезные алгоритмы, у которых одна из метрик равна 1, а другая 0. Для удобства сравнения есть -score - среднее гармоническое precision и recall.
Из всех рассмотренных в предыдущем разделе статей девять содержат численные результаты сравнения с JDeodorant. В таблице 2.1 представлены данные, полученные из этих девяти статей. Первый столбец содержит название статьи, во втором столбце записан -score JDeodorant, который был получен в соответствующей работе. В третьем и четвертом столбцах содержится информация о размере датасета, на котором происходило сравнение. Один столбец содержит количество Java проектов, из которых собирались данные, в другом столбце записано количество примеров (методов, которые нужно переместить в другой класс) в датасете. Данные отсортированы по второму столбцу.
Как можно видеть из таблицы разброс чисел во втором столбце очень большой, хотя в идеале числа должны были бы быть одинаковыми. Это позволяет сделать вывод о нестабильности и несогласованности экспериментов из разных статей, из чего вытекает невозможность сравнения подходов разных исследователей друг с другом.
Причиной такой несогласованности могут быть слишком маленькие датасеты, которые используют исследователи. Самый большой датасет содержит около 1000 различных методов, но все они набраны только лишь из 7 проектов. Небольшое количество проектов может сделать датасет нерепрезентативным, так как он будет содержать слишком много специфики конкретных проектов. Самое большое количество разных проектов в одном датасете - 20. Но среди них есть очень похожие. Например, из этих 20 проектов целых 5 являются частью Android API. Получается, что в каждой работе для оценки качества используется либо очень маленькое количество методов, либо небольшое количество проектов, из которых берутся эти методы.
Таблица 2.1
Название статьи |
JDeodorant -score |
Количество проектов |
Количество методов |
|
A Quality-oriented Approach to Recommend Move Method Refactorings [20] |
0.15 |
13 |
375 |
|
Deep learning based feature envy detection [7] |
0.19 |
7 |
1019 |
|
JMove: A novel heuristic and tool to detect move method refactoring opportunities [12] |
0.22 |
10 |
195 |
|
c-JRefRec: Change-based identification of Move Method refactoring opportunities [17] |
0.30 |
3 |
60 |
|
Recommendation of Move Method Refactoring to Optimize Modularization Using Conceptual Similarity [13] |
0.36 |
ручная проверка вывода алгоритма |
||
Recommending Move Method refactorings using dependency sets [11] |
0.36 |
14 |
395 |
|
Recommendation of move method refactorings using coupling, cohesion and contextual similarity [14] |
0.46 |
ручная проверка вывода алгоритма |
||
A textual-based technique for Smell Detection [16] |
0.62 |
10 |
115 |
|
Mining Version Histories for Detecting Code Smells [18] |
0.68 |
20* |
86 |
Все работы об алгоритмах для рекомендации рефакторинга «перемещение метода» можно разделить на пять направлений. Существует очень мало работ, которые пытаются применять машинное обучение [4]. В то же время методы машинного обучения могли бы помочь перейти от разработки эвристик к обучению на данных, которое способно учесть субъективность процесса применения рефакторингов. Поэтому данная работа нацелена на создание алгоритма, который применяет машинное обучение.
Ещё один вывод из проведённого обзора - результаты экспериментов из разных статей не согласуются друг с другом. Причиной могут быть маленькие и нерепрезентативные датасеты. В данной работе предлагается уделить дополнительное внимание созданию утилиты для сбора большого количества данных.
2.Сбор данных
2.1 Существующие датасеты
Из рассмотренных работ лишь в одной датасет открыт для других исследователей. Авторы JMove [11] опубликовали проекты с перемещенными методами, которые использовались для оценки работы алгоритма. 14 проектов содержат в сумме 395 методов, которые были выбраны случайно из разных классов и перенесены в неправильные. Как отмечалось ранее, датасет такого размера может быть нерепрезентативным, тем более если его часть используется для обучения модели.
Другие исследователи создали платформу для коллаборации [22]. На данной платформе предлагалось загружать обнаруженные «запахи кода» и оценить уже загруженные. Для начала авторы вручную обработали 20 проектов с открытым исходным кодом и извлекли 86 «запахов кода», которые разрешаются перемещением метода.
К сожалению, ссылка из статьи на платформу в настоящее время нерабочая, и, скорее всего, платформа прекратила свое существование. В исследовании эволюции «запахов кода» [23] была проведена ручная проверка 395 релизов 30 проектов с открытым исходным кодом. Всего было проверено 17350 случаев потенциального наличия «запаха кода». Однако далеко не все случаи оказались примерами плохой архитектуры, а из-за схожести соседних релизов одного проекта некоторые случаи повторяли друг друга. В итоге в собранном датасете оказалось не более 100 примеров «запахов кода», которые разрешаются переносом метода. Существует очень мало открытых датасетов, в которых можно найти «запахи кода» или примеры применения перемещения метода.
2.2 Поиск рефакторингов в истории проектов
В поставленной в данной работе задаче требуется обучить модель рекомендовать рефакторинги. Прямолинейным способом создания датасета является поиск примененных рефакторингов в истории проектов с открытым исходным кодом.
Для поиска была использована автоматическая утилита Refactoring Miner [24], которая является лучшим решением в области на данный момент. Утилита была запущена на 15 проектах с открытым исходным кодом и обработала 23447 коммитов. В результате запусков Refactoring Miner нашел 1348 случаев применения рефакторинга «перемещение метода». Однако среди найденных рефакторингов было очень много некорректных. В некоторых случаях метод перемещался в новый класс, что соответствует рефакторингу «выделение класса». Иногда перемещались поля и методы доступа к ним, что является рефакторингом «перемещение поля».
Для фильтрации некорректных случаев были написаны автоматические фильтры, которые оставили 121 случай применения рефакторинга. Все оставшиеся примеры были изучены. В конечном итоге реальными рефакторингами «перемещение метода» оказались только 4 ситуации. Данный способ создания датасета оказался слишком неэффективным.
2.2 Синтетический датасет
Альтернативный способ создания датасета был продемонстрирован в статье, описывающей применение глубокого обучения и обучения представлениям для рекомендации рефакторингов перемещение метода [7]. Данный способ базируется на предположении, что в среднестатистическом проекте бульшая часть методов находится в тех классах, в которых они и должны находиться. Тогда для создания одной точки в датасете достаточно переместить один из методов в существующем проекте в класс, в который его можно переместить. После этого в датасет можно добавить пример перемещения метода , который возвращает его в исходный класс. Предположение о том, что бульшая часть методов находится в правильных классах, позволяет заключить, что в таким образом сконструированном датасете будет не очень много неправильных примеров.
Первый шаг в создании такого датасета - отбор тех методов, которые можно перемещать в другие классы. Для фильтрации непригодных для перемещения методов было создано расширение для среды разработки IntelliJ IDEA. Расширение может запускать IDEA в headless режиме (без графического интерфейса), анализировать существующий проект и выводить в специальный файл список методов с классами, в которые их можно переместить. В таблице 3.1 представлен список реализованных фильтров. Первый столбец содержит критерий, по которому фильтр не пропускает методы, второй столбец содержит комментарий о том, почему этот фильтр был реализован. Для тестирования набора фильтров утилита была запущена на нескольких проектах с GitHub. Одним из них был Spring Framework. Изначально утилита обнаружила в этом проекте 29467 методов. Третий столбец таблицы 3.1 содержит количество методов, которые данный фильтр не пропустил дальше. Фильтры применялись в том порядке, в котором они указаны в таблице. В результате из 29467 методов осталось только 200. Тем не менее, полностью автоматизированный процесс позволяет обработать любое количество проектов, а значит, данный метод хорошо подходит для создания датасета большого размера.
Второй шаг в создании датасета - непосредственное применение переноса к методам, которые были найдены на первом шаге. Как будет рассказано далее, данный шаг не является необходимым для обучения и проверки предлагаемой в рамках данной работы модели. Однако автоматизация второго шага поможет адаптировать датасет под уже существующие алгоритмы, а разработанная утилита может использоваться в дальнейших исследованиях. Для того чтобы исходный проект изменялся не очень сильно и разные изменения были независимыми, утилита не будет перемещать метод, если исходный или целевой классы уже были задействованы в предыдущих перемещениях. Таким образом, все методы, найденные на первом шаге, могут быть разбиты на группы, где в каждой группе все перемещения независимы. На данный момент утилита создает только одну группу, а методы, которые в нее не попали, просто не рассматриваются.
Таблица 3.1
Критерий фильтрации |
Комментарий |
Колич. отбр. методов |
|
Статичный метод |
Сильно отличается от остальных |
2271 |
|
Конструктор |
Нельзя перемещать |
3469 |
|
Абстрактный метод |
Нет тела |
401 |
|
Геттер |
Связанное поле |
2857 |
|
Сеттер |
2031 |
||
Пустой метод |
Не несет информации |
911 |
|
Метод, который только бросает исключение |
257 |
||
Единственный в классе метод |
Нет критерия, по которому можно вернуть метод в исходный класс |
524 |
|
Делегирующий метод |
Не несет информации |
4319 |
|
Метод, вызыв. приватные методы |
Нельзя перемещать |
4590 |
|
Метод, использ. приватные поля |
4716 |
||
Переопределяющий метод |
Нельзя переместить только из одного класса из-за динам. связки вызовов |
1597 |
|
Переопределенный метод |
94 |
||
Метод некуда переместить |
Не имеет смысла для датасета |
1230 |
Данная утилита, которая автоматизирует первый и второй шаг в создании датасета, представлена на воркшопе International Workshop on Refactoring 2019 как самостоятельный результат [10].
Датасет создавался посредством запуска утилиты на 1000 проектах с открытым исходным кодом. Все проекты были взяты с платформы GitHub по следующим критериям: основным языком программирования должна быть Java, последний коммит был сделан не раньше 2018 года. Среди всех таких проектов были взяты 1000 с наибольшим количеством звезд (рейтинг популярности на GitHub). Далее на каждом проекте был запущен поиск методов, которые можно перемещать между классами. Для обработки такого большого числа данных использовалась платформа Google Colaboratory - бесплатные облачные вычисления на производительном оборудовании.
Из 1000 проектов в 485 не было найдено ни одного перемещаемого метода. В оставшихся 473 проектах суммарно было найдено 18086 методов, которые можно перемещать в другие классы. Каждая возможность переместить метод в другой класс добавляет в датасет негативный пример - ситуацию, когда метод перемещать не нужно. Каждый метод, который можно перемещать между разными классами, добавляет в датасет позитивный пример - метод необходимо вернуть в исходный класс. Для решаемой в данной работе задачи класс, из которого перемещается метод, не имеет значения, поэтому каждый отдельный метод позволяет добавить в датасет лишь один позитивный пример. Из-за того, что некоторые методы можно перемещать сразу в несколько классов, датасет получился несбалансированным, всего в нем получилось 38320 точек с соотношением позитивных примеров к негативным.
2.3 Модель
Задача о рекомендации рефакторинга «перемещение метода» может быть формализована следующим образом. На вход поступают исходный код метода и класса, в который этот метод можно переместить. На выходе ожидается вещественное число из отрезка - степень уверенности в том, что данный метод нужно переместить в данный класс. Далее можно посчитать степень уверенности для класса, в котором метод уже лежит и для всех классов, в которые метод можно переместить. Среди всех кандидатов предлагается выбрать класс, для которого степень уверенности наибольшая.
Первый шаг в любой модели машинного обучения - сопоставление исходным данным численных признаков. Так как признаков обычно много, то каждому объекту из датасета сопоставляется целый вектор из вещественных чисел, а сам процесс называется векторизацией.
Наиболее простой и популярный способ сопоставления исходному коду численных значений - расширенный набор метрик Чидамбера и Кемерера [5]. Данные метрики просто подсчитывают статистику, основанную на объектно-ориентированной структуре программы. Примерами метрик служат: количество методов в классе, глубина дерева наследования, количество потомков у класса и так далее. Недавняя работа продемонстрировала, что подобного рода метрики плохо справляются с задачей обнаружения «запахов кода» [6]. Задачу поиска «запахов кода» можно свести к задаче рекомендации рефакторинга - если предлагается применение рефакторинга, то обнаружен «запах кода». Таким образом метрики Чидамбера и Кемерера не подходят для векторизации входных данных для разрабатываемой модели.
Обучение представлениям - подраздел машинного обучения, в котором процесс векторизации автоматизирован. Примером модели обучения представлениям является word2vec [8]. Данная модель сопоставляет каждому слову языка (обычно английского) вектор, который называется эмбеддинг (embedding). Так получается, что данные вектора хранят в себе семантику слов. Например, разница между векторами для слов «мужчина» и «женщина» оказывается почти такой же, как разница между векторами для слов «мальчик» и «девочка». Обычно эмбеддинги применяются для векторизации текстов, написанных на естественном языке, для их дальнейшей обработки. Авторы статьи о рекомендации рефакторинга «перемещение метода» с помощью глубокого обучения и обучения представлениям применили word2vec для векторизации имен классов и методов [7]. Данные вектора использовались в их модели для дальнейшей классификации и предложения рекомендаций.
Не смотря на то, что word2vec может помочь в рекомендации рефакторингов, эта модель не предназначена для анализа исходного кода программ. Недавно исследователи предложили другую модель обучения представлениям, которая предназначена для векторизации исходного кода - code2vec [9]. code2vec принимает на вход тело метода и предсказывает имя этого метода. В процессе для метода конструируется вектор, который является его эмбеддингом и обладает свойствами, похожими на свойства word2vec векторов.
Рисунок 4.1
Для векторизации метода code2vec конструирует его абстрактное синтаксическое дерево (АСД). Метод представляется как набор всевозможных путей между каждой парой листьев в этом дереве. Такие пути называются контекстными путями. На рисунке 4.1 изображено АСД некоторого метода, цветом выделены четыре контекстных пути между листьями этого дерева. Каждый контекстный путь - это значения, записанные в двух листах, и набор типов всех промежуточных вершин на пути между этими листьями. Так как путей между каждой парой листьев может быть очень много, для каждого метода выбирается случайный набор из не более чем 200 контекстных путей.
Рисунок 4.2
На рисунке 4.2 изображена схема code2vec модели. На вход модель получает набор контекстных путей. Каждому из двух значений в листе и каждому набору типов промежуточных вершин сопоставляется 128-мерный вектор, которые модель обучает. Контекстный вектор - конкатенация трех векторов: два для значений в листьях и один для промежуточных вершин. Таким образом, контекстный вектор имеет размерность 384. Чтобы смешать координаты трех независимых векторов используется полносвязный слой, который не изменяет размерность вектора. Объединенные контекстные вектора суммируются в один вектор с помощью механизма внимания - каждый вектор входит в сумму с определенным весом, который означает важность этого вектора для всей суммы. Полученный вектор и является эмбеддингом (векторным представлением) исходного метода, который можно использовать в других моделях. Для предсказания имени метода softmax функция применяется к скалярным произведениям векторного представления с обучаемыми эмбеддингами для всевозможных имен методов из фиксированного словаря. Softmax возвращает для каждого имени число от 0 до 1, а сумма всех чисел равна 1. Данные числа можно интерпретировать как степень уверенности в каждом конкретном имени для исходного метода. Модель обучается на большом корпусе Java проектов, в результате чего вычисляемое векторное представление начинает обладать полезными скрытыми свойствами.
Рисунок 4.3
На рисунке 4.3 изображена схема предлагаемой в данной работе модели. На вход модель принимает исходный код метода и класса. Метод преобразуется в вектор путем простого применения code2vec модели. Так как обучение code2vec ресурсоемкая задача, использовались предобученные веса, предоставленные авторами статьи.
С векторизацией классов встает такая же проблема, как с векторизацией предложений. Предложения состоят из слов, для которых существуют векторные представления, класс можно приближенно представить как набор методов, которые можно векторизовать. Но как векторизовать сами предложения и классы? Существует много различных способов векторизации предложений. Ранее было показано, что простое математическое среднее векторов всех слов из предложения работает не хуже других моделей [25]. По аналогии можно векторизовать исходный код класса.
Для векторизации класса используется следующая конструкция: класс представляется как набор методов, которые он содержит; каждый метод векторизуется с помощью code2vec; итоговый вектор для класса - среднее арифметическое всех векторных представлений методов. Если на вход модель получает класс и метод , причем метод уже находится внутри класса , то не используется для векторизации . Таким образом, класс, который уже содержит метод, является равноправным кандидатом на перемещение метода внутрь себя. Если в конечном итоге модель предлагает переместить метод внутрь того класса, в котором он уже находится, то это интерпретируется как ситуация, в которой нет необходимости перемещать метод.
Полученные два вектора для метода и для класса конкатенируются в один вектор размерности 768. Для улучшения точности предсказаний и ускорения процесса обучения размерность понижается с помощью метода Principle Components Analysis (PCA). PCA находит такое вращение исходного пространства, что разброс точек из датасета по первой координате максимален, по второй координате разброс наибольший из оставшихся возможных и так далее. Изменение значений в последних компонентах оказывается незначительным, и этими компонентами можно пренебречь. В данном случае были убраны все координаты, которые объясняли меньше чем 0.1% общего разброса. В результате осталось только 166 компонент, которые вместе отвечают за 88.1% общего разброса.
На полученных 166-мерных векторах, каждый из которых соответствует примеру из датасета, была обучена Support Vectors Machine (SVM) модель. Данная модель пытается провести между точками из разных классов разграничивающую полосу из двух гиперплоскостей, минимизируя при этом суммарное отклонение каждой точки от правильного полупространства. У данной модели есть один необучаемый гиперпараметр - вещественное положительное число . Данный параметр отвечает за ширину полос, которую предпочитает модель.
Для улучшения качества классификации SVM применялся ядерный метод (kernel trick), который заключается в том, что скалярное произведение в исходном пространстве подменяется на другую формулу (ядро). Ядро позволяет искать разделяющую полосу в пространстве более высокой размерности. Тогда эта полоса в исходном пространстве может иметь более сложную структуру. В данной работе в качестве ядра применялась radial basis function (RBF):
где и - два вектора признаков, соответствующие двум разным примерам, а - гиперпараметр.
Так как SVM решает задачу классификации, то результатом является бинарная метка: нужно перемещать метод или нет. Конечной же целью является степень уверенности - число от 0 до 1. Для таких случаев была разработана калибровка Платта (Platt scaling) [26]. Данный метод использует тот факт, что для каждого примера из датасета результатом SVM является вещественное число, возвращаемое решающей функцией - отклонение от разделяющих гиперплоскостей. Знак отклонения (зависит от полупространства, в которое попала точка) является результатом классификации, но само отклонение вещественное. Калибровка Платта работает по следующей формуле:
где - вероятность того, что вектор принадлежит классу (), - решающая функция SVM, а и - вещественные числа, которые вычисляются с помощью метода максимального правдоподобия.
1 Обучение модели
В сгенерированных примерах датасета используется оригинальный исходный код всех методов. Чтобы приблизить ситуацию к реальной, нужно было бы анализировать исходный код перемещенных методов, который немного, но отличается от исходного кода неперемещенного метода. Так как code2vec все равно отбрасывает часть информации об АСТ метода, а генерация перенесенных методов требует доработки утилиты, методы не перемещались.
Датасет получился немного несбалансированным (38320 точек с соотношением позитивных примеров к негативным). Неравное количество примеров для разных классов ведет к тому, что обученный классификатор будет предпочитать один класс другому. Поэтому к данным была применена балансировка. Позитивный пример каждого метода, который порождал несколько негативных примеров (метод, который можно переместить в несколько классов), дублировался несколько раз. В итоге каждый метод порождал одинаковое количество позитивных и негативных примеров. Такая стратегия балансировки поощряет классификатор правильно находить настоящий класс тех методов, которые можно переместить в несколько других классов. Но такие ситуации действительно сложнее правильно распознать, а значит, и награда может быть немного выше. Так как соотношение почти сбалансированное, то дубликатов в итоговом датасете получилось не очень много, количество точек увеличилось до 40468.
Полученный датасет был разделен на три группы в соотношении . На первой части производилось обучение модели, вторая часть использовалась для валидации гиперпараметра , а на третьей части производилось тестирование качества итоговой модели. В таблице 5.1 приведены точные размеры каждой из группы. Для формирования первой группы были взяты 30 проектов с наибольшим количеством примеров в них, для второй группы были взяты следующие 40, в последнюю группу попали примеры из проектов с небольшим количеством примеров. Таким образом тестирование производилось на очень разнообразном датасете.
Обучение модели производилось с помощью библиотеки scikit-learn. Для оценки результатов использовались метрики precision, recall, -score и area under the ROC-curve (AUC). Значения первых трех метрик зависит от порога уверенности, на котором классификатор меняет класс. В данной работе использовался порог . Это означает, что если модель возвращает хотя бы , то пример классифицируется как случай, когда метод нужно перемещать, иначе наоборот. Последняя метрика является оценкой вероятности того, что значение, возвращаемое моделью, для случайного отрицательного примера будет выше значения для случайного положительного примера. Данная метрика является универсальной и не зависит от выбора порога.
Таблица 5.1
Примеров |
Проектов |
||
Обучение |
24434 |
30 |
|
Валидация |
7910 |
40 |
|
Тестирование |
8124 |
403 |
Для - гиперпараметра RBF ядра - было выбрано значение по умолчанию . Гиперпараметр выбирался поиском по сетке. Всего рассматривалось 11 вариантов . Для каждого варианта обучалась своя модель. Из этих моделей в результате была выбрана одна, у которой наибольшее значение AUC на валидационной группе датасета.
Таблица 5.2
Негативный пример |
Позитивный пример |
||
Precision |
0.798 |
0.788 |
|
Recall |
0.785 |
0.801 |
|
-score |
0.791 |
0.795 |
В таблице 5.2 представлены результаты тестирования модели на третьей группе. Итоговое значение метрики AUC при тестировании равно 0.793. Значения всех метрик находятся в районе 79%.
2 Сравнение с JDeodorant
Для сравнения с существующими решениями был выбран плагин JDeodorant. Данный плагин обладает развитой инфраструктурой, что позволяет адаптировать его для сбора статистики и тестирования.
Конвертировать произвольный большой и сложный проект, использующий стандартные системы сборки, вроде Maven или Gradle, в Eclipse формат является трудоемкой задачей. Поэтому для генерации датасета для сравнения с JDeodorant нужны были проекты, которые изначально разрабатывались в Eclipse или уже были сконвертированы в нужный формат. Было принято решение воспользоваться существующим корпусом Qualitas.class [27]. Данный корпус состоит из 111 скомпилированных Eclipse проектов.
Так как JDeodorant является плагином для Eclipse, то он использует Eclipse API, которое устроено таким образом, что не может анализировать код, если в нем существует даже незначительные ошибки времени компиляции. Так как утилита для генерации датасета, а именно та ее часть, которая отвечает за перенос методов, разработана недавно и не прошла испытание временем, в большом проекте обязательно найдется метод, которой она не сможет перенести правильно. Поэтому создание датасета для сравнения с JDeodorant включало в себя ручную проверку всех перемещенных методов, что повлияло на его размер. Другой причиной маленького размера датасета является тот факт, что утилита реализована не до конца, и большую часть потенциальных перемещений она просто пропускает.
Таблица 6.1
Проект |
Количество методов |
|
ant-1.8.2 |
27 |
|
aoi-2.8.1 |
22 |
В таблице 6.1 приведен список проектов, которые были удачно обработаны утилитой и количество методов, которые были удачно перенесены в другие классы. На полученном датасете из 98 точек (каждый метод порождает один негативный и один позитивный пример) было проведено сравнение подхода из этой работы с плагином JDeodorant. Из-за размера датасета данное сравнение нельзя считать окончательным, но оно позволяет сделать некоторые предположения. Результаты сравнения приведены в таблице 6.2. Как и ранее были замерены метрики precision, recall и -score отдельно по двум классам (нужно или не нужно перемещать метод). Данная работа обозначена в таблице как code2vec и по всем метрикам превосходит плагин JDeodorant.
Таблица 6.2
Негативный пример |
Позитивный пример |
||||
Данная работа |
JDeodorant |
Данная работа |
JDeodorant |
||
Precision |
0.739 |
0.452 |
0.712 |
0.360 |
|
Recall |
0.694 |
0.673 |
0.755 |
0.184 |
|
-score |
0.716 |
0.541 |
0.733 |
0.243 |
Заключение
Данная работа привносит в область два полезных результата. Один из них это - утилита для генерации искусственного датасета. Как показал анализ существующих статей, исследователи каждый раз заново собирают небольшие датасеты для своих работ. Это влечет к несогласованным показаниям экспериментов и невозможности сравнивать результаты из разных работ друг с другом. Утилита позволяет в автоматическом режиме обрабатывать существующие проекты и за очень небольшое время создавать датасеты больших размеров.
Теперь исследователям будет гораздо проще собирать данные. Более того, появилась возможность собрать один большой датасет, который позволит объединить усилия ученых. Сама утилита представлена на международной конференции по рефакторингам как самостоятельный результат [10].
К сожалению, утилита работает не идеально. Генерируемый код иногда может содержать ошибки компиляции, которые могут исказить результаты экспериментов или вовсе сделать некоторые инструменты недееспособными. Дальнейшая работа может быть направлена на улучшение этого инструмента с технической точки зрения.
Второй результат данной работы носит теоретический характер. В области существовала одна единственная статья, описывающая подход к рекомендации рефакторинга «перемещение метода», основанный на машинном обучении. Данная работа восполняет этот пробел, предлагая альтернативную модель. Более того, в данной работе было продемонстрировано, что code2vec векторизация очень хорошо справляется с задачей рекомендации рефакторингов.
Предложенная модель показывает результаты на уровне самых лучших решений в области. Однако сравнение было проведено на маленьком датасете и только лишь с одним существующим решением. Дальнейшим развитием данной работы может быть поиск альтернативных применений code2vec, позволяющих добиться результатов, которые будут еще лучше.
Библиографический список
1.Fowler , Beck K., Brant J., Opdy W. Refactoring: Improving the Design of Existing Code. Boston: Addison Wesley Professional, 1999.
2.Simon F., Steinbruckner F., C L. Metrics based refactoring // Proceedings Fifth European Conference on Software Maintenance and Reengineering. Lisbon, Portugal, Portugal. 2001.
3.Fokaefs M., Tsantalis N., Chatzigeorgiou A. JDeodorant: Identification and Removal of Feature Envy Bad Smells // 2007 IEEE International Conference on Software Maintenance. Paris. 2007. pp. 519-520.
4.Muhammad I.A., Palomba F., Shi L., Wang Q. Machine learning techniques for code smell detection: A systematic literature review and meta-analysis // Information and Software Technology, Vol. 108, April 2019. pp. 115 - 138.
5.Chidamber S.R., Kemerer C.F. A metrics suite for object oriented design // IEEE Transactions on Software Engineering, Vol. 20, No. 6, June 1994. pp. 476-493.
6.Di Nucci D., Palomba F., Tamburri D.A., Serebrenik A., De Lucia A. Detecting code smells using machine learning techniques: Are we there yet? // 2018 IEEE 25th International Conference on Software Analysis, Evolution and Reengineering (SANER). Campobasso, Italy. 2018.
7.Liu H., Xu Z., Zou Y. Deep Learning Based Feature Envy Detection // Proceedings of the 33rd ACM/IEEE International Conference on Automated Software Engineering. Montpellier, France. 2018.
8.Mikolov T., Chen K., Corrado G., Dean J. Efficient Estimation of Word Representations in Vector Space // CoRR, Vol. abs/1301.3781, 2013.
9.Alon U., Zilberstein M., Levy O., Yahav E. code2vec: Learning Distributed Representations of Code // Proceedings of the ACM on Programming Languages, Vol. 3, No. POPL, 2019. pp. 40:1-40:29.
10.Novozhilov E., Veselov I., Pravilov M., Bryksin T. Evaluation of Move Method refactoringsrecommendation algorithms: are we doing it right? // Proceedings of the 3rd International Workshop on Refactoring. 2019.
11.Sales V., Terra R., Miranda L.F., Valente M.T. Recommending Move Method refactorings using dependency sets // 2013 20th Working Conference on Reverse Engineering (WCRE). Koblenz, Germany. 2013.
12.Terra R., Valente M., Miranda S., Sales V. JMove: A novel heuristic and tool to detect move method refactoring opportunities // Journal of Systems and Software, Vol. 138, 2018. pp. 19-36.
Размещено на Allbest.ru
...Подобные документы
Анализ проблем, возникающих при применении методов и алгоритмов кластеризации. Основные алгоритмы разбиения на кластеры. Программа RapidMiner как среда для машинного обучения и анализа данных. Оценка качества кластеризации с помощью методов Data Mining.
курсовая работа [3,9 M], добавлен 22.10.2012Методы машинного обучения в задачах рубрикации, положительные и отрицательные примеры. Отсечение по центрам тяжести и ближайшим соседям. Оптимальный линейный сепаратор Support Vector Machines. Особенности применения тезауруса. Расчет веса конъюнкции.
лекция [405,0 K], добавлен 01.09.2013Искусственные нейронные сети как одна из широко известных и используемых моделей машинного обучения. Знакомство с особенностями разработки системы распознавания изображений на основе аппарата искусственных нейронных сетей. Анализ типов машинного обучения.
дипломная работа [1,8 M], добавлен 08.02.2017Популярность алгоритмов машинного обучения для компьютерных игр. Основные техники обучения с подкреплением в динамической среде (компьютерная игра "Snake") с экспериментальным сравнением алгоритмов. Обучение с подкреплением как тип обучения без учителя.
курсовая работа [1020,6 K], добавлен 30.11.2016Необходимые условия экстремума. Разработка машинного алгоритма и программы многомерной оптимизации для градиентного метода с использованием метода равномерного поиска. Проверка необходимых и достаточных условий экстремума для найденной точки минимума.
курсовая работа [249,8 K], добавлен 25.09.2013Історія машинного перекладу як науково-прикладного напряму. Теорія машинного перекладу. Особливості використання систем, орієнтованих на персональні комп’ютери. Напрямки розвитку та застосування машинного перекладу. Приклади систем машинного перекладу.
реферат [21,5 K], добавлен 19.02.2011Моделирование системы массового обслуживания. Анализ зависимости влияния экзогенных переменных модели однофазной одноканальной СМО на эндогенные переменные. План машинного эксперимента множественного регрессионного анализа и метода наименьших квадратов.
лабораторная работа [107,5 K], добавлен 15.06.2010Machine Learning как процесс обучения машины без участия человека, основные требования, предъявляемые к нему в сфере медицины. Экономическое обоснование эффективности данной технологии. Используемое программное обеспечение, его функции и возможности.
статья [16,1 K], добавлен 16.05.2016История автоматизированного перевода. Современные компьютерные программы перевода. Сфера использования машинного перевода. Формы организации взаимодействия человека и ЭВМ в машинном переводе. Интерредактирование и постредактирование машинного перевода.
курсовая работа [30,0 K], добавлен 19.06.2015Человеко-машинный интерфейс. Текстовый и смешанный (псевдографический) интерфейсы. Применение человеко-машинного интерфейса в промышленности. Программные средства для разработки человеко-машинного интерфейса. Среда разработки мнемосхем GraphworX32.
дипломная работа [5,3 M], добавлен 19.03.2010Понятие базы знаний для управления метаданными. Особенности баз знаний интеллектуальной системы. Языки, используемые для разработки интеллектуальных информационных систем. Классические задачи, решаемые с помощью машинного обучения и сферы их применения.
реферат [16,9 K], добавлен 07.03.2010Характеристика основных методов для решения различных задач с помощью случайных последовательностей. Реализация и проверка эффективности метода Монте-Карло при его применении на различных примерах. Алгоритм метода имитации. Издержки неопределенности.
курсовая работа [98,9 K], добавлен 04.05.2014Сущность метода проектов и виды проектной деятельности. Изучение особенности wiki-среды и системы связывания метода проектов с программными механизмами, такими как MediaWiki. Оценка степени влияния использования wiki-среды на качество процесса обучения.
курсовая работа [1,2 M], добавлен 23.06.2014Создание системы предобработки данных; разработка системы классификации на базе методов и алгоритмов машинного обучения, их реализация в программной системе. Предобработка информации, инструкция пользователя, система классификации, машинный эксперимент.
дипломная работа [917,1 K], добавлен 31.01.2015Суть основных идей и методов, особенностей и областей применения программирования для численных методов и решения нелинейных уравнений. Методы итераций, дихотомии и хорд и их использование. Алгоритм метода Ньютона, создание программы и ее тестирование.
курсовая работа [423,0 K], добавлен 17.02.2010Рассмотрение принципов работы руткита. Изучение особенностей захвата в режиме пользователя. Анализ модификации машинного кода прикладной программы. Оценка механизма работы руткита в режиме ядра. Характеристика методов обнаружения rootkit в системе.
дипломная работа [241,9 K], добавлен 12.05.2019Сущность и описание симплекс-метода и улучшенного симплекс-метода (метода обратной матрицы), преимущества и недостатки их применения в линейном прогаммировании. Листинг и блок-схема программы на языке Turbo Pascal для решения математической задачи.
курсовая работа [45,0 K], добавлен 30.03.2009Программное обеспечение для получения исходных данных для обучения нейронных сетей и классификации товаров с их помощью. Алгоритм метода обратного распространения ошибки. Методика классификации товаров: составление алгоритма, программная реализация.
дипломная работа [2,2 M], добавлен 07.06.2012Назначение и классификация методов поисковой оптимизации. Эффективность поискового метода. Методы поиска нулевого порядка: исходные данные, условия, недостатки и применение. Структура градиентного метода поиска. Основная идея метода наискорейшего спуска.
лекция [137,8 K], добавлен 04.03.2009Принципы компьютерной стеганографии. Классификация методов сокрытия информации. Популярность метода замены наименьшего значащего бита. Сущность методов расширения палитры и блочного сокрытия. Применение методов в GIF изображениях. Реализация алгоритмов.
курсовая работа [589,7 K], добавлен 17.02.2013