Разбивка сложных проблем на отдельные составляющие

«Как съесть слона?»

Скорее всего, вы слышали эту идиому вместе с ее слишком очевидным ответом: «по кусочку за раз».

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

Это очень очевидно, когда дело доходит до технологий.

Я работаю в области программного обеспечения и науки о данных. Один из распространенных шаблонов, которые вы видите в разработке программного обеспечения, — это объединение нескольких небольших компонентов в гораздо большую систему. Это происходит на всех уровнях вычислений — от регистра сборки до Интернета и спутниковой сети.

Каждая большая система состоит из множества меньших систем, которые сами состоят из подсистем, построенных из еще более мелких компонентов.

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

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

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

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

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

Глубокие сети, предпоследний алгоритм машинного обучения, который обучается по композиции, берет простые отдельные «нейроны» и объединяет их вместе для выполнения невероятного количества задач распознавания образов. Сети Capsule, RNN, convolution и LSTM продвигают эту идею на шаг вперед, реализуя специализированные слои, которые могут еще больше расширить функциональность нейронной сети.

Конечно, ничего из этого не является революционным, но это подчеркивает силу декомпозиции проблемы. Я не сомневаюсь, что самые сложные проблемы в будущем будут решаться с использованием подобного подхода, и подозреваю, что общего искусственного интеллекта мы не увидим, пока у машин не появится возможность «рационально» выполнять этот набор задач самостоятельно.