[Из песочницы] Применение нейросетевых технологий: Разработка программного обеспечения
1. Введение
В наше время для разработки программного обеспечения приходиться приложить не мало усилий. Слишком много времени тратится на то что логично было бы возложить на компьютеры выбор методологи, проектирование, написание технического задания, тестирование все это делает человек и делает очень медленно. Но возможно ли это в принципе? Доктор технических наук Максим Щербаков в своей лекции «Нейронные сети: maths & magic» ответил: «Да, это возможно». Хорошо иметь автоматизированного помощника, который решит задачу просто имея некие критерии и шаблоны при этом платить ему не надо и сделает он это в кратчайшее время, но какие конкретно задачи могут решать нейронные сети в наше время? Развитие машинного обучения в наши дни идет семимильными шагами не сегодня так завтра машины смогут заменить человека в рутинных задачах. Составление технического задания не самое приятное занятие особенно из-за необходимости расписать все крайне подробно и по форме (подробнее в 4 пункте). Каждая компания выбирает определенную методологию разработки программного обеспечения и меняет её крайне редко. Как же быть если для проекта другая методология подходит лучше прежней или нынешняя не подходит вовсе? Логично было бы заменить, но какую выбрать (подробнее в 5 пункте)? Правильное тестирование должно занимать приличное количество времени и людей. Довольно затратно и долго (подробнее в 6 пункте). Нейронная сеть удешевит и ускорит все эти этапы.
2. Сокращения
НС — Нейронные сети
ПО — Программное обеспечение
ТЗ — Техническое задание
ИИ — Искусственный интеллект
3. Искусственные нейронные сети
Что такое искусственный интеллект? Грубо говоря, это симуляция человека с помощью компьютера. Тест Тьюринга в каком-то смысле отвечает на этот вопрос. Он заключается в том, что в ходе диалога человек должен решить кто перед ним человек или машина. В наше время тест Тьюринга считается не совсем правильным и используются другие методы тестирования искусственного интеллекта. Для большего понимания почему этот тест не совсем верный его можно просто перевернуть. Как компьютер узнает, что перед ним человек? Задаст вопрос сколько будет 754534×32 и запустит таймер. Поэтому как и мы не можем решить уравнение достаточно быстро так и машина (пока что) не может полностью симулировать человеческое общение со всеми его тонкостями и особенностями. В таком представлении полная симуляция мозга компьютером кажется невозможной. Так что пока мы используем искусственный интеллект только как помощников в конкретной области.
3.1 Краткая история ИИ
История развития искусственного интеллекта не очень веселая и гладкая. Ранние эксперименты по созданию искусственного интеллекта помогли некоторым компаниям сэкономить не малые суммы денег. Например компания Digital Equipment Corporation с помощью искусственного интеллекта экономила по 10 миллионов долларов в год. Так же разрабатывались чатботы, системы по идентификации бактерий и многое другое. После, компании по разработке искусственного интеллекта не смогли выполнить все свои завышенные цели и в итоге закрылись, из-за этого для ИИ настали тяжелые времена и сообщество начало поглядывать на машинное обучение и нейронные сети. В 1943 году Уоррен Мак-Каллок и Уолтер Питс ввели термин искусственная нейронная сеть. Модель выполняющая вычисления используя биологические нейроны. И спустя 63 года в университетах Торонто и Монреаль вовсю начали обучать глубокие нейронные сети, что стало настоящей революцией для машинного обучения!
3.2 Принцип работы нейронной сети, её успехи и слабые места
В упрощенном виде принцип работы нейронной сети состоит в нахождении зависимостей и изменении весов если действие верное то усиливаются весы, которые отвечали за данное действие и наоборот. А если быть по точнее то принцип заключается в уменьшении некоторой функции ошибки. Градиентный спуск чаще всего применяется для этой цели.
Об успехах нейронных сетей все наслышаны. Они побеждают чемпионов игры GO, играть в которую по идее прерогатива исключительно человека и для компьютера она слишком сложна, но как видно это не правда. Не так давно в 2015 году программа AlphaGo победила чемпиона выиграв четыре из пяти партий. Неплохо правда? Через два года в 2017 году нейросеть улучшили и она обыграла 9 чемпионов GO, выиграв шестьдесят из шестидесяти партий. Самое страшное для чемпионов было то что программа действовала абсолютно хаотично и в итоге все равно выигрывала. Как же Google (разработчики AlphaGo) добились такого результата? Все просто улучшенная AlphaGo тренировалась со своей предшественницей. Нейросеть сама нашла недостатки и исправила их.
Нейросети так же обучились писать музыку. «Прослушав» шедевры мировой классики нейросеть сочинила свою музыку и без хорошего понимания работы машинного обучения отличить творение людей от творения машины практически невозможно. На лекции «Нейронные сети: maths & magic» включили одно из произведений компьютерных вычислений и предложили прослушать предварительно сказав что это создал великий музыкант. После прослушивания слушателей спросили: «Кого-нибудь зацепило?» некоторая часть ответила «Да». Получается машины могут творить? Ответить довольно сложно. Чтобы понять почему, немного разберемся с принципом работы нейросети на примере комнаты с очень большим количеством листочков с символами, которые мы не понимаем. У нас есть алгоритм как, куда и какой листочек перекладывать или мы сами строим этот алгоритм основываясь на том поощряют или ругают нас за наши действия. И вот на вход мы получаем запрос после бежим перекладывать листочки по нашему алгоритму и получаем на выход набор сложенных листочков, при этом сами не понимаем что значат эти символы на входе и то что получаем на выходе, мы и есть нейронная сеть. Вернемся к созданию музыки. Получается что нейронная сеть не творит произведение она просто хаотично, но с определенными правилами бьет по аккордам сама не понимая что делает (чем-то напоминает современную живопись). Один из примеров музыки созданной нейронной сетью от компании Яндекс:
Рисовать нейросети тоже научились, используя тот же принцип, что и с музыкой.
Как можно заметить, машинное обучение позволяет решать огромное множество задач. Но как же научить их выполнять все это? Секрет кроется в машинном обучении. Вернемся к комнате с листочками и вспомним что «у нас есть алгоритм как, куда и какой листочек перекладывать» при таком раскладе нейросеть уже обучена. Она знает что и куда надо положить, но так же был и второй вариант «мы сами строим этот алгоритм основываясь на том поощряют или ругают нас за наши действия» именно этот вариант формулирует так называемое обучение нейронной сети с подкреплением. Некий «учитель» поощряет правильные действия нейросети вследствие чего она запоминает и пытается найти зависимость в правильных действиях или «учитель» ругает нейросеть за её ошибки и она все больше пытается найти зависимость в правильных действиях. Так же нейросети обучают методами: с учителем, без учителя, с частичным привлечением учителя. Выбор происходит в зависимости от условий, в которых обучается нейронная сеть.
Используя обучение с учителем мы должны подать набор данных с правильными ответами или по другому тренировочный набор данных на вход после чего нейросеть должна выявить закономерности и ответить правильно уже на тестовый набор данных. Обычно (что и логично) нейросеть чаще ошибается на тестовой выборке это происходит из-за «проблемы переобучения».
Когда нейронная сеть слишком много раз обрабатывает одни и те же данные она приспосабливается исключительно к этой выборке данных вследствие чего на новой выборке где многое по другому нейросеть ошибается.
Используя обучение без учителя мы так же подаем данные, но мы не знаем правильного ответа и задача собственно найти зависимость в этих данных. Обучение с частичным привлечением учителя чаще всего используется при обучении нейросетей способных обрабатывать звук. Не размеченных данных мы можем найти сколько угодно, а вот разметкой придется заняться вручную.
Самым интересным (по некоторым мнениям) является обучение с подкреплением так как мы можем по сути научить чему угодно нейросеть просто отмечая правильное или неправильное действие она выполнила. В 2017 году прошел киберспортивный чемпионат по дисциплине «DOTA 2» под названием «The International 2017», на котором профессиональные игроки сыграли в игру против нейросети «OpenAI» (правда с некоторыми ограничениями). У профессионалов не было ни шанса на победу. Для обучения данной нейросети использовался метод с подкреплением. Нейронная сеть сыграла очень очень много раз и обучилась побеждать без проблем. Ясное дело совсем без проблем у неё не получается так как игра довольно сложна и этим нейросеть можно обмануть. Одному профессиональному игроку удалось одержать победу только благодаря обману.
Теперь, поняв основы, можем обсудить использование нейронных сетей в качестве помощников для программистов.
4. Применение нейронных сетей в создании технического задания
4.1 Принцип
Кому может понадобиться программное обеспечение? В наше время каждому необходимо причем для абсолютно разных целей. Зачастую самим создать ПО они либо не могут, либо не хотят поэтому они, обращаются к программистам. Но как объяснить исполнителю что вы хотите? В принципе программист может составить техническое задание и условно рассказать что будет в программе, но не всем будет до конца ясно ввиду использования терминов или будет понято не так. Как насчет того, чтобы составлять ТЗ индивидуально? Сложно, долго и не так уж и нужно при таких затратах, но когда необходимо сделать что-то сложно и долго почему бы не возложить эту задачу на компьютер? Нейронная сеть позволит выполнить эту задачу.
4.2 Необходимость
Строитель далек от программирования да и вообще далек от компьютера. Для него строка «Процессор Intel Core i5 4200M 2.5 ГГц и выше» совершенно ничего не скажет и зачем тогда ему ТЗ вообще? Давайте научим нейросеть менять строки для каждого индивидуально исходя из того чем он занимается. К примеру возьмем ту же строку из пункта 4.3 «Процессор Intel Core i5 4200M 2.5 ГГц и выше» будем менять её например на краткое название и среднюю стоимость этого процессора на рынке. Так будет более информативно для заказчика.
4.3 Реализация
Реализовать это можно используя метод обучения с учителем. На вход подаем набор той информации, которую может получить исполнитель об условных заказчиках. Так же добавим ярлыки и будем вешать их на людей и за каждым ярлыком будет висеть программа, которая и будет менять текст. Стандартная задача классификации есть набор данных и несколько вариантов ответа. Предположим нейросеть определила, что степень знания в этой области у заказчика находится не на высоком уровне и вешает на него соответствующий ярлык после обращается к программе, которая отвечает за этот ярлык и вот текст заменен на соответствующий знаниям заказчика. Это не совсем то, так как работа нейросети сводится только к определению типа заказчика, а текст меняет сама программа.
Как насчет того чтобы саму программу отвечающую за ярлыки заменить на нейросеть (кремлебота) подобную той что используется для создания отзывов для сайтов, фильмов и вообще где используются отзывы. Научим нейронную сеть использовать термины присущие ярлыку заказчика взамен на программным терминам и вскоре программа по примерному описанию заказчика будет перефразировать и передавать данные исполнителю. Скорее всего по началу можно будет использовать связь нейросетей только для пункта »4.Технические требования к программному продукту» ввиду того что там в основном находится «проблемная зона». Пункт »8. Календарный план работ» тоже можно перенести на нейронную сеть, но об этом в пункте 6.
Позже когда технологии немного эволюционируют можно будет перенести все оформление технического задания на плечи нейронной сети, а точнее на связанную цепь нейросетей. Подобно нашему мозгу отдельные составные части буду отвечать за отдельные процессы в нашем искусственном нейронном организме. Все это позволит разрушить профессиональный барьер общения (его ещё называют коммуникативным барьером) между заказчиком и исполнителем.
4.4 Вывод
Реализация подобного не очень сложна, в особенности первая нейронная сеть. Со второй придется повозиться, но в итоге и она принесет свои плоды. Подобное использование нейросети упростит взаимодействие между заказчиком и исполнителем.
5. Применение нейронных сетей в создании оптимальных методологий разработки ПО
Человек с трудом принимает что-то новое когда он уже привык. Даже если лопата удобнее, проще, легче человек продолжит использовать палку, чтобы выкопать яму. Очень ярко это видно между поколениями. Бабушки имея возможность оплачивать коммуналку из дома через интернет, предпочитают проехать пол города. Почему? Потому что во-первых они люди и как большинство людей не очень любят перемены, во вторых они не хотят учиться новому считают это слишком сложно для них и даже не пытаются вникать. С методологиями та же история. Компании, особенно большие, не очень охотно будут менять методологию, которая и так работает. Но что делать если выбранная методология не оптимальна или совершенно не подходит для данного проекта? Логично сказать, что нужно заменить на оптимальную, но какая будет таковой и что значит оптимальной? Та, которую легко примет команда, или та, которая ускорит разработку? На кого можно возложить такую ответственную работу? Посмотрим как это могут решить нейронные сети.
5.1 Реализация
Скорее всего, для подобного одна нейросеть не справиться и нам снова понадобится цепочка связей, каждая из которых будет отвечать за отдельную задачу. В данной ситуации у нас есть набор данных об использовании методологий и самих проектов, для которых они применялись. Так же можно добавить данные о разработчиках, но это сильно все усложнит так что отложим на время. В наличии набор данных, у которых нет «ответа» значит воспользуемся методом без учителя. Нейронная сеть сама найдет взаимосвязь между временем затраченным на разработку и данными о самом проекте. Скорее всего точность будет не очень высокой ввиду человеческого фактора. Понадобится вторая нейросеть, которая будет анализировать разработчиков на основе например переписок (для чего понадобится их согласие) или того как они предпочитают работать. И добавим ярлыки наподобие тех, что были в пункте 4 и будем их возвращать в первую нейросеть для обработки. Здесь уже придется использовать метод с частичным привлечением учителя. Нам придется отобрать группу людей и выявить по тестам их характеры (ярлыки) и подать эти данные на вход. Теперь необходимо определить с чем нейросеть будет искать взаимосвязь. Если взять переписки, то это во-первых людям не понравится, потому что используются их личные данные во вторых не даст точного результата. Тогда попробуем использовать данные о работе этих людей, но здесь проблема в доступности этих данных для нейросети. Переписку передать на вход не составит труда, а вот как собрать и преобразовать данные о работе этих людей? Зайдем с другой стороны. В качестве «характеров» возьмем 8 типов ролей выявленных доктором Мередит Белбин.
Теперь мы имеем конкретные ярлыки и характеристики для определения какой на кого вешать. Учитывать человеческий фактор довольно сложно ввиду его стохастически, но все же некоторые закономерности прослеживаются, что и может заметить нейросеть. Предположим испытуемый будет иметь первый ярлык «Председатель», но НС об этом знать не будет. Характеристики этой личности нейронная сеть может брать из личного дела этого ей будет достаточно. На основе отчетов так же будет формироваться то какой ярлык будет применен к этой личности. В итоге будет повешен ярлык и отправлен первой нейронной сети для обработки и нахождения взаимосвязей. Все это довольно сложно, но это ощутимо добавит точности при выборе нейросетью методологий. Наша цепочка обучилась, и может определить по входным данным какая методология будет оптимальной по времени с учетом особенностей команды разработчиков. Если команда будет постоянно использовать нейросеть для выбора методологий, то шаг за шагом она будет обучаться все лучше и лучше тем самым окупая себя и повышая свою точность. Исходя из этого нейросеть не лучший выход ввиду долгой обучаемости. Посмотрим в чем ещё нам может машинное обучение.
5.2 Вывод
Нейронная сеть не совсем подходит для подобной задачи ввиду большого количества человеческих факторов и долгого и дорогостоящего обучения.
6. Тестирование программного обеспечения с помощью нейронных сетей
Все мы люди и нам свойственно ошибаться. Кевин Митник однажды сказал: «Люди — самое слабое звено в безопасности. Люди, а не технологии». С развитием технологий разработки программного обеспечения всегда остаются одни и те же проблемы. Недоработки, баги, ошибки. Все это появляется из-за человеческой лени, невнимательности или не знания. Эту проблему решает отладка и тестирование.
6.1 Веб-приложение методом без учителя
Тестирование занимает целых шестьдесят процентов от общего времени это самый долгий этап разработки программного обеспечения. Подобное происходит из-за сложности автоматизации данного этапа ввиду отсутствия стохастичности в автотестировщиках и сложности их создания. Лучший вариант это ручное тестирование, ведь никакая программа (на данный момент) не заменит человека полностью. Долго и сложно реализуемо? Снова пользуемся помощью нейронной сети. Для начала необходимо понять, что значит тестирование с помощью нейросети. Сразу необходимо понять, что универсального тестера создать не получится придется создавать для каждой обобщенной задачи отдельно например нейронная сеть, которая тестирует сайты. Для начала попробуем разобраться с её принципом работы и возможно ли её использование в данном направлении. Что подаем на вход? Чего ожидаем на выход? Обучающая выборка будет состоять из проверенных сайтов, на которых нейросеть будет обучаться. Отпустив нашего друга в свободное плаванье врятли мы получим желаемый результат поэтому ограничим НС в плане объектов которые могу присутствовать на сайте это всякие кнопки, бары, чекбоксы и действий, которые может выполнить нейронная сеть. Пока нейросеть развлекается и запоминает, что происходит при таком действии, что при таком, и ищет зависимость мы создаем самый баганый сайт из всех, что есть и настраиваем нейросеть подавать на выход сообщение, если происходящее не совпадает с её ожиданием. Подав на вход данный сайт мы будем получать сообщения о возможных багах тем самым автоматизируем процесс создания Acceptance Sheet.
Веб-приложение. Методом с подкреплением. Кнут и пряник.
На сколько будет точен предыдущий вариант тестирования предсказать сложно так как нейронная сеть может обучится не верно и ожидать нелогичного исхода. Есть второй вариант более долгий, но при этом более точный и универсальный. Нейросеть просто будет следить за действиями тестировщиков тем самым обучаясь используя метод с подкреплением. Она будет в большом объеме получать данные находя связь в них и воспроизводить их. Нейросеть должна фиксировать не только действия на сайте, но и в какой момент тестировщик запишет сообщение о баге для нахождения связи. Здесь мы уже получим более точный вариант автономного тестировщика. Но в тоже время и там и там присутствует человеческий фактор, который описать функцией не самая простая задача поэтому нейросетям сложно дается человеческая стохастичность.
6.2 Тестирование программного обеспечения
При тестировании ПО мы так же как и предыдущем разделе можем использовать метод с подкреплением. Крайне универсальный метод позволяющий научить нейронную сеть практически чему угодно. Поставим нейросеть следить за огромным колличиством тестеров. Разделим её функции на функциональное тестирование и нефункциональное тестирование. Нейросеть отвечающая за функциональное тестирование будет основываться на техническом задании. Для её обучения воспользуемся набором ТЗ и найденных программистами багов в этих программах. Здесь тоже можно воспользоваться нейросетию из пункта 5 для добавления ярлыков в данные подающиеся на вход. Таким образом НС сможет оповестить о возможных багах или ошибка так же постоянно само улучшаясь со временем и подстраиваясь под определенную команду разработчиков. Для нефункционального тестирования можно использовать обычные программы так как нейросеть здесь будет лишь усложнением.
6.3 Вывод
Нейронная сеть хорошо подойдет для тестирования сайтов, но при этом на обучение придется потратить не мало времени. Примерно то же самое все обстоит и с тестированием программного обеспечения, но несколько хуже и тяжелее в реализации самого тестирования.
7. Заключение
Подытожив, можно сказать, что использование нейросетей для разработки программного обеспечения ускорит процесс, но не во всех случаях. Все выше сказанное конечно же только в теории работает, на практике все может оказать не так радужно, но работа заключается в исследовании возможности хотя бы в теории ускорить разработку программного обеспечения с помощью нейронной сети. Моим итоговым результатом исследования является ответ: да и не только в теории, но при индивидуальных подходах и анализе человека как личности будут большие проблемы, которые на данный момент сложно преодолеть. Для полноценного использования нейросетей как помощников необходимо долгое обучение, которое в дальнейшем окупиться. Лучше всего нейросеть подходит для создания технического задания, а точнее для упрощения взаимодействия между исполнителем и заказчиком. Нейросеть разрушает коммуникативный барьер чем ускоряет и облегчает весь процесс. Так же стоит подметить возможность использования нейросетей в тестировании тоже крайне полезна. Нейронная сеть может предсказать возможный баг чем ускорит тестирование. Это не кардинально ускорит процесс, но немного его облегчит. К сожалению в подборе методологий нейронные сети не очень эффективны. Нейронная сеть не может начать понимать чувства людей поэтому выбирать методологию она может только исходя из статистических данных.
Нейронные сети развиваются семимильными шагами и кто знает как быстро в наших домах появятся те самые человекоподобные андроиды, которые (уничтожат все человечество) улучшат нашу жизнь.
(Андроид София)
Список литературы
Николенко, С. Глубокое обучение: Погружение в мир нейронных сетей / С. Николенко, А. Кадурин, Е. Архангельская — Санкт-Петербург — Глубокое обучение. — СПб: Питер, 2018 — 480 с.: ил. — (Серия «Библиотека программиста»).