{"id":14285,"url":"\/distributions\/14285\/click?bit=1&hash=346f3dd5dee2d88930b559bfe049bf63f032c3f6597a81b363a99361cc92d37d","title":"\u0421\u0442\u0438\u043f\u0435\u043d\u0434\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u044f","buttonText":"","imageUuid":""}

Что юристы не понимают про нейронные сети?

Около года назад Герман Греф, выступая перед студентами Балтийского федерального университета, заявил, что Сбербанк перестает брать на работу юристов, «которые не знают, что делать с нейронной сетью». Думаем, что это было художественное преувеличение славящегося своими креативными высказываниями топ-менеджера, но всё же считаем своим долгом дать краткий ликбез по этой теме.

Программирование, как любая область человеческой деятельности, проходила определенные этапы развития. Начиналось всё, разумеется, с самых простых линейных и циклических алгоритмов. Например, компьютер (в переводе - вычислитель) мог выполнить какую-то последовательность арифметических операций и выдать результат. Или промышленный робот выполнял одну и ту же последовательность операций, пока его не отключат. Несмотря на всю простоту, это было огромным шагом вперед и избавляло людей от тяжелой, скучной и монотонной работы.

Потом алгоритмы стали усложняться. Появлялись ветвления вида «если..., то..., иначе...», управляемые циклы вида «выполняй..., пока не...» и т. п. Программы получили возможность подстраиваться и изменять своё поведение в зависимости от изменения внешних условий или действий пользователя. Затем появилась возможность наиболее важные и часто используемые части алгоритма оформлять в виде самостоятельных подпрограмм. Это получило название «процедурное программирование». В результате стремление облегчить программистам создание всё более и более сложных программ, решающих важные прикладные задачи, привело к созданию новых сложных парадигм, включаяневероятно популярное«объектно-ориентированное программирование». Все эти методы позволили достичь в программировании невиданного разделения труда, когда разные части одного алгоритма могут создавать тысячи программистов по всему миру, ничего не зная ни друг о друге, ни о задачах и методах, которые используют другие. Это позволяет создавать современные невероятно сложные и громоздкие программы, немыслимые для программистов 70-х годов.

Записанные всё более и более хитрым способом всё более и более запутанные алгоритмы смогли решать всё более и более сложные задачи. Однако ряд задач в принципе не поддавался алгоритмическому решению. И с увеличением сложности алгоритмов прогресса в них практически не было. Одной из таких задач было распознавание образов (остальные были в некотором смысле аналогичны ей). Какой бы сложный алгоритм вы не придумали, он всё равно не сможет хорошо отличить фотографию кошки от собаки или букву «а» от буквы «б» (особенно написанные от руки не самым лучшим почерком).

Параллельно с развитием алгоритмов появлялись и другие направления в программировании. Например, логическое программирование, все возможности которого, на наш взгляд, до сих пор ещё не используются в полной мере и о котором мы поговорим в будущих статьях. Другой пример – нейронные сети, с помощью которых в итоге и удалось решить задачу распознавания образов и многие другие, с которыми не могли справиться традиционные алгоритмы.

Вообще, нейронная сеть – это обычная математическая функция, наподобие тех, что все из нас изучали в школе: линейная функция, квадратичная, синус, косинус, логарифм… А если сложить или перемножить две функции, то получится тоже функция, но уже другая, более сложная. Если взять, например, синус от логарифма, также получится какая-то сложная функция. И так далее: комбинируя простые функции, мы можем получать всё более и более сложные до тех пор, пока они не перестанут помещаться на листе бумаги или мониторе компьютера. Понятное дело, что в таком виде работать со сложными функциями очень неудобно, поэтому придумали записывать их немножко другим способом – графическим, с помощью стрелочек и кружочков. Получившиеся рисунки напомнили кому-то картинки нейронов и связей между ними из учебника биологии, и за этим классом числовых функций закрепилось название «нейронные сети».

Итак, чем же они так хороши? За счет чего они завоевали такую большую (и заслуженную) популярность?

Во-первых, их не надо программировать в привычном смысле слова. Тут нет алгоритма. Нейросеть – это некая математическая функция, которая по сути и будет являться программой. Вместо программирования нейронную сеть необходимо настроить или, как принято говорить, «обучить». Обучение нейросети тоже выглядит очень просто: мы показываем какой-то пример, про который заведомо всё знаем, и в зависимости от ответа нейронной сети – правильного или неправильного – меняем в соответствии со специальными правилами (не очень сложными) коэффициенты той математической функции, которой нейросеть и является. Например, мы хотим научить нейросеть отличать кошку от собаки. Для этого находим 10 фотографий и каждую подписываем, где кошка, а где собака. После этого показываем наш «датасет» нейронной сети и она говорит свою версию того, где там кошка, а где собака. На основании того, в каких случаях она ответила правильно, а каких – ошиблась, мы немножко меняем её коэффициенты, после чего в следующих примерах она станет ошибаться немного реже. Единственная сложность здесь: такую процедуру надо проделать огромное число раз на примерах довольно высокого качества. Разумеется, сейчас этим никто вручную не занимается и обучение нейронных сетей производится на самых мощных суперкомпьютерах, которые с этим успешно справляются.

Вторым несомненным достоинством нейронных сетей является то, что они успешно решают такие задачи, которые не удавалось решить никакими другими методами: распознавание лиц, отпечатков пальцев, купюр в банкомате, распознавание голоса, нахождение взаимосвязей и закономерностей в больших объемах данных и т. д. То есть ровно все те задачи, которые до этого считались «чисто человеческими», «интуитивными», «принципиально непосильными машине». Разумеется, этот факт в сочетании с возможностью «обучения» нейросетей и «самообучения», а также аналогиями с устройством человеческого мозга не могли не привести к ажиотажу вокруг этой темы. Казалось, что раз уж компьютер покусился на святая святых человеческого мышления, то скоро он научится делать всё то же, что и человек, и искусственный интеллект «захватит мир».

Сбылись ли эти предсказания? И да, и нет. Да, потому что нейронные сети (и аналогичные им методы) продолжили своё победоносное шествие в интуитивные и «чисто человеческие» области, и кто знает каких успехов удастся добиться в ближайшем будущем. Можете сами, например, сравнить качество машинного перевода сейчас и всего 15 лет назад. Нет, потому что нейронные сети всё-таки не моделируют мышление и поведение человека. Они не являются ни панацеей, ни золотым ключиком от всех задач: с чем-то они справляются превосходно, с чем-то – так себе, а какие-то задачи не могут решить вообще.

Лучше всего они справляются с той задачей, для которой и были изначально созданы, - распознавание образов. Причем, образов как визуальных, так и звуковых, или ещё каких-нибудь специальных в специфических наборах данных. Многие задачи из самых разных областей знания могут быть сведены, на самом деле, к задаче распознавания образов. Это многообразие как раз и создает впечатление вездесущности и универсальности нейронных сетей. Однако, как мы теперь должны понимать, это впечатление довольно обманчивое и в основе всё равно лежит один и тот же математический метод, который имеет свои принципиальные ограничения.

Самыми трудными для нейронных сетей оказались, как ни странно, задачи, которые легко решались традиционными для программирования методами – алгоритмическими или логическими. Здесь нам кажется весьма уместной аналогия с человеческим мышлением. Если мы разобьем мышление человека на три составляющие:

1) выполнение команд и инструкций;

2) логика;

3) опыт и интуиция;

то выяснится, что первую лучше всего моделирует алгоритмическое программирование, вторую – логическое, третью – нейронные сети и другие статистические методы. Причем как в человеческом мышлении эти три функции очень плохо сочетаются и скорее мешают друг другу, так и в программировании они реализуются совершенно разными методами, базирующимися на разных принципах.

Разумеется, в юриспруденции, как в любом другом виде человеческой деятельности, важны все эти три типа мышления. Но неужели самым важным является опыт и интуиция, распознавание образов и работа по наитию? Видимо всё же уважаемый Герман Оскарович ошибся, и во все времена главной доблестью юриста была способность делать логические выводы и выстраивать логические цепочки. А это значит, что уж если юристам и надо срочно начать осваивать программирование, то в первую очередь – логическое программирование. Впрочем, это уже совсем другая история…

P.S. Для тех, кто всё ещё верит во всесильность НС и не верит ни во что вышесказанное:

https://www.youtube.com/watch?v=k17viOWIq4Q&feature=youtu.be&t=28m27s

И попробуйте представить, что будет, если судебная или ваша внутрикорпоративная система будет основываться на НС при решении задач...

(Статья 2018 года, оригинал тут.)

0
Комментарии
-3 комментариев
Раскрывать всегда