Введение 3
Постановка задачи 5
Термины 6
Обзор литературы 8
Глава 1. Данные 13
1.1. Разметка данных 14
1.2. Оценочные данные 17
1.3. Обработка данных 17
Глава 2. Реккурентные нейронные сети 20
2.1. RNN 20
2.2. LSTM 21
Глава 3. Эксперименты над данными 24
3.1. Базовый алгоритм 24
3.2. Модель-конкурент 24
3.3. Предлагаемая модель 24
3.4. Ранжирование 26
3.5. Результаты 29
Выводы 32
Заключение 33
Список литературы
Область искусственного интеллекта, стремительно развивающаяся в последние несколько лет, успешно применяется везде, где возникает потребность в обработке информации. Но если обработка естественного языка сейчас является хорошо изученным разделом машинного обучения, то пусть и похожие на них языки программирования имеют другую структуру, более сложные связи между оперируемыми сущностям и совершенно иной спектр прикладных задач, для которых привычные для NLP методы необходимо грамотно адаптировать. Поэтому программирование само по себе является не только инструментом для создания нейросетевых моделей, но и областью, где такие модели могут быть востребованы. Так, в процессе создания качественного программного обеспечения время, затраченное на написание кода и поиск и исправление ошибок, примерно сопоставимо между собой. Желание упростить одну из этих частей сводится к исследованию двух обширных задач: задачи автоматической генерации программного кода и более простой, но не менее важной - задачи поиска ошибок в полученном коде.
Задача автоматической генерации корректного кода кажется более привлекательной с точки зрения экономии трудозатрат, однако она еще не была качественно решена по ряду причин, самой трудной из которых является сложность формализации требований от человека к результирующей программе. Но существует вспомогательная к ней задача - задача поиска ошибок в исходном коде программы, которая могла бы помочь автоматически исправлять ошибки в программах, тем самым пусть и не автоматизируя, но существенно упрощая процесс написания и валидации кода. Научить модель искать ошибки по какому-то определенному алгоритму вполне реально при помощи статических анализаторов кода, однако они не учитывают более сложные и глубоко заложенные ошибки, часто возникающие непосредственно при исполнении программы. Человек может выявить такие ошибки при ручном методе отладки программы, но это довольно сложно задать в виде каких-либо инструкций. Поскольку в процессе компиляции и работы программ при возникновении ошибок происходит вывод стека вызовов, где происходит вывод сообщений об ошибках и путей до методов, где эта ошибка вскрылась, можно использовать эту информацию для ограничения области поиска ошибок в программе. Таким образом, совместно используя информацию как об исходном коде программы, так и зная последовательность вызванных функций до обнаруженной ошибки, можно построить модель, которая будет указывать на метод, содержащий в себе некорректный код.
Постановка задачи
Основной задачей этой работы является создание модели, позволяющей упростить и ускорить нахождение ошибок в исходном коде программ на основе информации об исходном коде и стеках вызовов. Поскольку данные о стеках вызовов были предоставлены компанией JetBrains и взяты из проекта IntelliJ IDEA, разработка которой ведется преимущественно на языке программирования Java, модель будет ориентирована на обработку данных именно на этом языке.
Решить поставленную задачу предполагается через выполнение следующих этапов:
• ознакомиться с литературой и узнать подробнее о существующих подходах в области локализации ошибок
• собрать данные и привести их в вид, пригодный для подачи на вход модели, разделить на обучающее и оценочное множества
• оценить работу лучшей и наиболее похожей по используемым данным модели-конкурента
• разработать архитектуру модели и реализовать ее
• обучить модель на тренировочной части существующих данных и оценить на отложенной выборке
• оценить модель на общеизвестных данных, чтобы сравнить качество с существующими алгоритмами
Был произведен полный цикл разработки модели машинного обучения, включающий в себя сбор данных, обучение и оценку модели. Для нее была использована архитектура LSTM c улучшением в виде обучаемого эмбеддинга вместо отсутствующих векторов. На ее предсказаниях и дополнительных признаках были также обучены деревья градиентного бустинга, что дало дополнительный прирост качества предсказаний. Используемые скрипты легко адаптируются, что позволит использовать их в дальнейшем в продукте компании JetBrains. Итоговая модель показывает хорошие результаты как на предоставленных компанией данных, так и на общедоступном датасете Defects4j.
Дальнейшие исследования будут включать в себя добавление языка Kotlin, поскольку он тоже широко применяется в кодовой базе IntelliJ IDEA, создание и отладку пайплайна по автоматизированному обучению и использованию модели, а также выпуск статьи по теме после проведения дополнительных экспериментов.
[1] Marimont, R., Shapiro, M., «Nearest Neighbour Searches and the Curse of Dimensionality»IMA J Appl Math, 1979
[2] Devlin J., Uesato J., Singh R., Kohli P.«Semantic Code Repair using Neuro- Symbolic Transformation Networks». arXiv:1710.11054, 2017
[3] Alon U., Zilberstein M., Levy O., Yahav E.«code2vec: Learning distributed representations of code »., arXiv:1803.09473, 2018
[4] Vaswani A., Shazeer N., Parmar N., Uszkoreit J., Jones L.«Attention Is All You Need». NIPS 2017, 2017
[5] Alon U., Brody S., M., Levy O., Yahav E. «code2seq: Generating Sequences from Structured Representations of Code». arXiv:1808.01400, 2019
[6] Chakraborty S., Li Y. , Irvine M., Saha R., Baishakhi R. «Entropy Guided Spectrum Based Bug Localization Using Statistical Language Model». preprint arXiv:1802.06947, 2018
[7] M. Wen et al. «Historical Spectrum based Fault Localization». in IEEE Transactions on Software Engineering, IEEE Transactions on Software Engineering, 2019
[8] He H., Ren J., Zhao G.«Enhancing Spectrum-Based Fault Localization Using Fault Influence Propagation ». IEEE Access 8, 2020
[9] Wong C., Xiong Y., Zhang H., Hao D., Zhang L., Mei H. «Boosting Bug¬Report-Oriented Fault Localization with Segmentation and Stack-Trace Analysis». IEEE, 2014
[10] Just R., Jalali D., Ernst M. «Defects4j: A Database of Existing Faults to Enable Controlled Testing Studies for Java Programs ». ISSTA 14, 2014
[11] Николенко C., Кадурин Аю, Архангельская Е. «Глубокое обучение. Погружение в мир нейронных сетей». — «Питер», 2018
[12] Hochreiter S., Schmidhuber J.«Lons Sort-Term Memory». Neural Computation 9(8): pp. 1735-1780, 1997
[13] Friedman J., «Greedy Function Approximation: A gradient boosting machine ». The Annals of Statistics, 2001
[14] Bruch S., Wang X., Bendersky M., Najork M.«An Analysis of the Softmax Cross Entropy Loss for Learning-to-Rank with Binary Relevance», ICTIR 19, 2019
[15] Pavneet S. K., Xin X., Lo D., and Shanping L. «Practitioners’ expectations on automated fault localization». In Proceedings of the 25th International Symposium on Software Testing and Analysis. ACM, 2016, pp. 165-176.
[16] Kingma D., Ba J.«Adam: A method for stochastic optimization». //arXiv preprint arXiv:1412.6980. - 2014.
[17] Paszke A., Gross S., Massa F., Lerer A. et al.«PyTorch: An Imperative Style, High-Performance Deep Learning Library»2019, arXiv:1912.01703