Все мы знаем о единичных ошибках, а также знаем, что, как бы вы ни были осведомлены о проблеме, они в конечном итоге укусили нас. А как насчет применения мощи глубокого обучения? Возможно, это волшебство могло спасти нас от этой самой пагубной проблемы.
Ошибки типа «один за другим» особенно распространены, или я так думаю, в языках, в которых используется цикл For в стиле C в сочетании с массивами, начинающимися с нуля. Вы можете объявить массив размером 10, но цикл for переходит к <10 просто потому, что массив с 10 элементами имеет индекс 9 для своего последнего элемента. Стоит ли удивляться, что мы запутались и написали arrayysize <10, когда должно быть arrayysize <= 10. Это, конечно, только начало. Всякий раз, когда вы реализуете какой-либо алгоритм, который включает в себя отдельные границы, возникает множество ошибок. Так как же избавиться от таких ошибок? Я далек от того, чтобы предлагать нам избавиться от цикла For в стиле C и отказаться от массивов, начинающихся с нуля. Исследователи из Делфтского университета попытались обнаружить отдельные ошибки с помощью глубокого обучения. Существуют и другие примеры продвинутого машинного обучения, помогающие программированию, настолько, что вы даже можете заподозрить, что программирование может быть автоматизировано. Если у вас возникают одиночные ошибки, вы можете спать спокойно - их, кажется, трудно обнаружить. Если вы немного погрузитесь в самоанализ и никогда не сможете что-либо доказать, вы, вероятно, придете к выводу, что отдельные ошибки - это сложно, потому что они связаны с глубокой семантикой, а не с поверхностным синтаксисом. Если вы посмотрите на потенциальную одиночную ошибку, вам понадобится много контекста, чтобы понять, является ли это ошибкой. Обычно вы не можете сказать, это длина массива или последний элемент, на который ссылаются. Вы не можете сказать, включает ли операция границу или исключает ее. Вы не можете сказать, должно ли максимальное значение быть n, или n + 1, или n + m, или ... Такие соображения нелокальны. Газета сначала публикует хорошие новости: «Мы обучаем разные модели примерно на 1,6 млн примеров с ошибками в разных граничных условиях. Мы достигаем точности 85% и отзыва 84% для сбалансированного набора данных, но меньшие числа в несбалансированном наборе данных». Конечно, реальный мир несбалансирован, потому что реальных ошибок гораздо меньше, чем ошибок. В этой более реальной ситуации точность упала до менее 30%. Тогда все становится немного менее многообещающим: «Мы также проводим тесты для 41 реальной ошибки граничных условий, найденных на GitHub, где модель показывает лишь скромную производительность. Наконец, мы тестируем модель на крупномасштабной базе кода Java от Adyen, нашего промышленного партнера. Модель сообщила 36 методов с ошибками, но ни один из них не был подтвержден разработчиками ». Сказал вам, что такие ошибки были тяжелыми. Однако методы глубокого обучения пока не следует сбрасывать со счетов, поскольку альтернативные инструменты ничем не лучше: Индустрия полагается на инструменты статического анализа, такие как SpotBugs2 или PVS-Studio3. SpotBugs обещает идентифицировать возможные бесконечные циклы, а также индексы массивов, смещения, длины и индексы, выходящие за границы. PVSStudio также пытается выявлять ошибки в условных операторах и индексах, которые выходят за рамки при манипуляции с массивами. И хотя они действительно могут найти некоторых из них, многие из них остаются незамеченными. Как мы позже покажем в этой статье, ни одна из случайных ошибок реального мира не может быть обнаружена с помощью инструментов статического анализа состояния практики. Мы также не должны слишком серьезно относиться к инструментам статического анализа. Как я уже сказал, отдельные ошибки являются семантическими, а статический анализ плохо справляется с семантикой. Суть всего этого в том, что, как вы уже могли предположить, единичные ошибки - это сложно. Как гласит старая поговорка, в программировании есть три трудные проблемы - присвоение имен и отдельные ошибки.