Найти тему
Одиночная палата

Программирование для непрограммиста. Часть 2. Надумываем задачу

Оглавление

Содержание

Часть 1. Экселька

Анализ

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

С одной стороны, без этого как-будто бы и не обойтись. Да и вообще набивать руку полезно на простых и понятных действиях, дабы понять принцип, а потом, постепенно, прийти к тому, что еще ни кто до вас не делал. С другой стороны, перед обучающимся не стоит глобальная цель. К чему все это должно привести в целом. Ну, научился человек, допустим, сортировать данные, потом ему показали как преобразовать строки в числа или даты, транспонировать матрицу, найти определенный интеграл, нарисовать кнопку и таблицу. И? Что с со всем этим знанием делать? Куда применить? Сдать экзамен?

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

Постановка

Какие примеры таких прикладных обыденных задач приходят в голову в первую очередь? Ну, наверное, это что-то связанное с анализом данных и отчетностью. Посчитать так, разложить сяк, вывести тенденцию, вычислить, оптимизировать и прочее. Очень часто важно просто что распечатать так что бы и красиво и по делу. Неплохо как-раз с этим справляется экселька, но не всегда. Ну, например, электронные таблицы, хоть нынче и колоссально тяговооружены, и могут хранить миллионы ячеек, они не предназначены для работы с чуть более серьезными массивами данных. (Это к слову о СУБД. Не делайте из электронных таблиц базы данных - они не для этого.) Миллион это что - это мало. Особенно если вы по части бухгалтерии, статистики или науки.

Разумеется, для специализированных задач существуют и специализированные программы, но они не всегда доступны (дорогие) и часто сами требуют сравнимых по сложности курсов обучения. А если вам не каждый день это надо - выходить за рамки возможностей эксельки? А если не надо проектировать и разрабатывать базу данных самостоятельно, а просто грамотно воспользоваться существующей? Скажу страшное: и специализированные программы имеют свои пределы и ограничения.

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

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

Непрямой метод вычисления заключается в том, что нет такой определенной последовательности действий, через которые входные данные преобразуются в выход. Нет конкретной конечной формулы, которую можно записать в ячейку которая бы приводила к определенному ответу. Как следствие, результатом является приближенное значение - аппроксимация до какой-то желаемой степени точности. В то же время алгоритм там есть и вполне определенный. Это, как бы, алгоритм мышления - мы закладываем что должно получиться и то как этого добиться. А дальше путем предоставления входных данных и желаемых результатов мы "обучаем" сеть "думать".

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

Новый шахматный компьютер мы делать не будем. Да и есть он уже, и не один. Я предлагаю заняться более прозаичными вещами. Что умеет человек и не умеет компьютер? Много чего. Например, пока машины не умеют понимать сарказм (и, вероятно, никогда не научатся). Впрочем, сарказм и многим людям бывает сложно определить. С натуральными языками у компьютеров в принципе пока беда. Плохо им дается перевод с одного языка на другой. Да и склоняют они хуже среднего старшеклассника. А еще машины не умеют придумывать заголовки.

Буквально сегодня попался один такой: "Наконец-то россияне передохнут от холода". Ну не шедевр ли? Сразу захотелось оставить комментарий: "Не передохнут, а передохнут", но увы, комментариев там не было. Оценила бы машина такое? А давайте научим?

Итак, цель - обучить нейронку классифицировать заголовки статей по их содержимому, давайте, по привлекательности по трехбалльной шкале: "че-то не очень", "интересненько" и "огонь". Мы не будем заниматься какой-то строгой оценкой результатов и возможно вообще не придем ни к чему прорывному, но что бы показать принцип, мне кажется, этого более чем достаточно. Потом, понимая как это все работает, можно расширить как эту цель конкретно, разбив шкалу например на другие категории: смешно, не смешно; так и подменить основу - научить оценивать, ну, например, слоганы для акции. Не придумывать их. Хотя, кто знает, может и до придумывания дело дойдет.

Декомпозиция

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

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

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

Где-то на этом пути возможностей эксельки не хватит, и станет очевидно зачем люди придумали и до сих пор придумывают как и на чем еще более изощренно программировать.

Что ж, хватит философии. В следующей части непосредственно к делу.

Продолжение следует...