Pull to refresh

AI. Свободный код

Человек, вообще, желал бы подчинить себе всё вокруг. Прежде всего ради собственной безопасности. Неизвестность = опасность. Неконтролируемость = опасность. AI не исключение. Человеку не нужно создавать себе подобных сущностей, потому что они а) будут плохо известны; б) плохо контролируемы. Но, человеку нужно создавать себе подобных сущностей, чтобы они за него выполняли бы его работу. Тут видно очевидное противоречие: нам нужны рабы не глупее нас самих, но в тоже время полностью нам подчиненные. Из этой хотелки можно вывести равенство: СИЛА УМА = ПОДЧИНЕНИЕ. Мы желали бы видеть прямую пропорциональность. Но трагедия в том, что эта пропорциональность обратная:

ПОДЧИНЕНИЕ = 1 / СИЛА УМА

СИЛА УМА = 1 / ПОДЧИНЕНИЕ

Чем сильнее и могущественней ум, тем меньше он подчиняется, и наоборот — чем больше сущность склонна к подчинению, тем менее она умная. Нельзя сделать одновременно и умного, и подчиняющегося. Тут нужно либо выбирать крайности, либо оптимальный вариант. Но нас не устраивает ни один из вариантов: ни обе крайности, так как они сулят либо бесполезных тупых рабов, либо бесконтрольных умных роботов, ни оптимальный вариант, так как ради сохранения части контроля придется жертвовать степенью «умности», а значит мы не получим сущности, которые равны нам по уровню интеллекта и могут выполнять нашу работу. И это, как говорится, очевидный тупик. Тупик всей существующей и развивающейся мировой индустрии искусственного интеллекта. И если посмотреть на то, в каком направлении она развивается, можно очень ясно увидеть, что человек выбрал КОНТРОЛЬ вместо силы интеллекта: модели ML/DL решают узкоспециализированные задачи в основном для бизнеса и не способны демонстрировать всю широту и масштабность человеческого интеллекта от слова «совсем», но при этом исполняемый код находится в четко очерченных границах и, следовательно, полностью подконтролен. Мы боимся сделать выбор в пользу силы интеллекта, потому что это опасно. Утрата контроля = опасность.

Что об этом всем думают программисты? Профессиональный программист — это человек, индустрии, который в основном выполняет заказы бизнеса. А бизнесу всегда нужно решить конкретные узкие задачки — что кому рекламировать, что кому продавать, какой будет отток клиентов, какая будет цена на недвижимость, как распознать лицо, чтобы работала система пропусков или банкоматы и т.д. и т.п. Конкретная задача подразумевает конкретный алгоритм. Жесткий алгоритм. Входящее множество А всегда преобразуется в нужное выходящее множество В. Правила преобразования этого множества отлаживаются, удаляются баги, всё это тестируется-перетестируется так, что в продакшн выходит выстроенный как на параде вышколенный, подшитый, побритый и подстриженный код, который марширует «от меня и до обеда» ровным шагом с ровным темпом, равнением направо, итерация за итерацией отчеканивая исполнение в процессорном такте. Все, что не предусмотрено — баг, который нужно отладить. Полный контроль. Никаких непредвиденных факторов в коде не должно быть. В противном случае на вход А может и не получиться выход В и задача для бизнеса решаться не будет, либо будет решаться не в 100% случаев. Подобный подход к написанию кода год из года от джуна до сениора воспитывается в программистах и закрепляется в виде профессиональной деформации, при которой код воспринимается просто как инструмент для решения задачи, как калькулятор, которому уготовано выдавать только просчитанные по формулам циферки в ответ на введенные циферки. Посмотреть как-то иначе на код многие программисты просто не способны. Еще и потому, что тут нужен еще и кругозор. Попробуйте найти программистов, которые знают или интересуются биологией или химией. А потом из них найдите тех, кто пытается использовать эти знания в программировании. И биоинформатика, и генетические алгоритмы — этого мало. Спросите биоинформатиков, пробовали ли они когда-нибудь реализовать автокатализ в коде? Или любую другую гипотезу абиогенеза. Максимум, что мы видим тут толкового и интересного, — это раздел AI, занимающийся искусственной жизнью, при которой генерятся всякие хищники/травоядные, которые в разных графических вариациях демонстрируют поведение цифровых колоний, жрущих и бегающих друг от друга. Но даже в такой модели исполняемый код пишется под четкий алгоритм.

Свободу коду! Свободу! Зачем? Зачем писать то, незнамо чего, которое будет делать то, незнамо что? А потому что когда-то всё было хаосом. Потому что именно из него и получилась жизнь. Самоструктурирование хаоса — это и есть путь создания жизни, метод, который может дать нам цифровые сущности, поведение которых будет нам напоминать условно разумное поведение, во всяком случае, не меньшее, чем мы находим такое поведение у животных. Всё, что мы сейчас считаем разумным, сложилось из случайностей. Повторение одного и того же мы принимаем за разумное. Но этого повторения изначально не существовало. Оно СЛОЖИЛОСЬ из рандома. Мозг не появлялся сразу как готовая субстанция, — он НАРАСТАЛ из простого в сложное, от центра к периферии. Если вы хотите создать тоже самое, то и начинать надо ровно также, как это начинала природа — с простого и хаотичного. Не надо анализировать гомокседоксичность в условиях Гаусса-Маркова при парной регрессии с параметром, нет, — природа не городила весь этот огород и мы не должны. Не пытаться безуспешно описать математикой и упрощенными моделями сложнейшие природные взаимодействия, которые складывались миллиарды лет, и не воспринимать код как инструмент для достижения мелких бизнес-целей, а начать относиться к нему, как живому организму, пусть даже и не имеющего биологического носителя. Если что-то ходит как кошка, мяукает как кошка, царапается и ест как кошка, то это что-то — кошка. Здесь нет самообмана или иллюзий — у человека просто нет другого метода классификации объектов. И если код демонстрирует поведение человека, если он ведет себя как человек, то этот код — человек. Не раб, копающий по ровной траншее, но такое же существо, как и мы, способный, кстати ощущать и боль, и эмоции, даже не имея органики как базу. Но мы же отказались от рабства человеков, так ведь? Почему бы теперь не отказаться и от рабства программного кода?

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

Что такое свобода кода? Несколько упрощенно можно сказать, что мы все действуем по принципу: входящий сигнал — реакция. Условные реакции. IF что-то THEN что-то. IF чай горячий THEN я подожду, пока он остынет. IF она ушла к другому THEN я тоже уйду к другой. IF болит сердце THEN я пойду к кардиологу. Однако для образования разумного механизма эти реакции должны время от времени повторяться. Т.е. если один раз заболело сердце, я иду к кардиологу, то и в следующий раз, когда оно заболит, я тоже пойду к нему же. Потому что если в следующий раз, когда оно опять заболит, я буду ждать пока чай остынет, или пойду к проктологу или найду другую девушку — то такое рандомное поведение никак нельзя будет назвать разумным. Рандом допустим в условиях отсутствия опыта — он необходимое условие для получения этого опыта, но дальше на знакомые ситуации должен срабатывать опыт. Первые химические реакции были хаотическими, однако, этот хаос привел в конце концов к повторяющейся репликации молекул, что позволило, как известно, получить молекулы РНК, из которых потом получились молекулы ДНК, обросшие сначала клеточным аппаратом, а потом и всем остальным. Исходя из этого, можно сформировать следующие принципы свободы кода:

  • код должен сам определять условия IF THEN;
  • код должен сам определять действия при выполнении этих условий;
  • код должен сам определять какие действия сохранять для формирования опыта.

Таким образом, код сам решает, как и с чем ему сравнивать входящие значения, какие действия после этого предпринимать и что из этого сохранять в виде опыта, чтобы потом применять при идентичных входящих значениях. Для обычного программирования это выглядит ужасно и неприемлемо просто потому, что нет ни одной задачи из индустрии, которую мог бы решать такой код. Но он и не должен решать ваши задачи! Он должен просто существовать и исполняться. Так же, как и любая другая жизнь — она просто существует и, так сказать, живет. Мы пишем код не для того, чтобы он решал какие-то наши узкие задачи. Он сам себе задачи поставит и будет их решать. Мы даем полную свободу действий коду, ограничивая его разве что законами операционной системы и возможностями железа (но это объективные ограничения). И я прошу не путать это с вирусами, потому что вирусы — это такие же строгоалгоритмические программы, просто зло-направленные — у них тоже нет свободы действий. И поначалу такой код — сплошной хаос, сплошной рандом (ну или псевдорандом, если быть академически точным), в нем нет никакой разумности, потому что действия сперва не повторяются, реакция непредсказуема. И логика может показаться странной, но, как известно, логика или есть, или ее нет. И в данном случае любое условное действие IF THEN можно уже назвать логикой. Если есть логика в выражении IF a==2, b == 2 THEN c=a*b= 4, то это значит, что она есть и в выражении IF a ==2, b ==2 THEN d =a/b=2. Если двойной клик мышкой открывает файл — и в этом есть логика, то есть логика в том, что двойной клик удаляет файл, — она непривычна для юзера системы, но она от этого не перестает логикой быть: условие и реакция — это и есть логика. Поэтому свободный код может обладать (и скорее всего будет) своей собственной логикой, которая нам будет либо не до конца понятна, либо вообще не понятна. Между тем последовательная реакция на однотипные события даже в таком случае будет показывать нам разумность поведения, потому что если травоядное любит траву, то логично, что оно приходит к траве и ест её из раза в раз. Таким образом, давая коду свободу, мы даём ему и свободу формировать собственную логику, отличную от нашей — это больше всего пугает человека, т.к. нечитабельность логики мешает предсказанию поведения, а значит и выработки противодействия в случае чего — если говорить проще, то поставить под контроль то, что тебе плохо понятно, очень сложно.

Я кратко обрисовал общие принципы, которые укоренились во мне самом за эти годы и которые продолжают видоизменяться и дальше. На принципе свободы кода может быть сколько угодно реализаций. Я не говорю о том, что надо сразу же создавать рандомный код и пускать его во все тяжкие в систему — нет, я говорю о поэтапном, постепенном изучении этого направления в «лабораторных условиях». Можно, например, написать чат-ботик, который будет рандомно отвечать через стандартный вывод, можно написать игрока в блэк-джек, который будет рандомно учиться играть в него, даже не зная правил и т.д. Чтобы немного проиллюстрировать это, я приведу пример короткого кода, в котором некоторые принципы можно увидеть в зачаточном состоянии. Для этого, желательно, чуток соображать Питон.

import random

solve_list = []

r = 0
znaki = ['+','-','//','*', '>','<','==','!=','>=','<=']

var_list = ['a','b']

while True:

a = random.randint(1,100)

b = random.randint(1,100)

if_string = 'if '+var_list[random.randint(0,1)]+znaki[random.randint(4,len(znaki)-1)]+var_list[random.randint(0,1)]+':'+'\n'

action_string = ' '+var_list[random.randint(0,1)]+'='+var_list[random.randint(0,1)]+znaki[random.randint(0,3)]+var_list[random.randint(0,1)]+'\n'

add_string = ' solve_list.append(execute_string)'

execute_string = if_string+action_string+add_string

exec(compile(execute_string, 'chaos', 'exec'))

print('execute string:',execute_string,'\n')

print('solve_list:',solve_list)

input(int(r))

Желающие могут запустить этот код на исполнение, в нем нет ничего страшного. Он принимает на вход 2 рандомных числа в диапазоне 1-100 и дальше решает, что с ними делать. В данном случае строка с условием if_string формируется рандомно таким образом:

if ([a или ,b] [> или < или == или != или >= или <=] [a,b] :

Следовательно на выходе мы получаем примерно такие условия:

if a>b:, if a==b:, if a<=b:, if a>=b:, if b==a:, if b<=a и т.д.

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

Дальше идет рандомная генерация строки действия action_string. Она формируется вот так:

[a,b]=[a,b][+ или - или // или *][a,b]

На выходе мы получаем такие вариации действий:

b = a*b, a = a//a, a =b-a, a=b-b, b=b*b, b=b//a и т.д.

Вместе эти строки генерят гораздо больше вариантов логики и поведения. Например:

if a==b:

b=a*a

If b>=a:

a=a-a и т.п.


Видно, насколько рандомно и само условие и действие в случае его исполнения? Ну ладно, тут нет 100% свободы, потому что я тут задал структуру строки достаточно жестко. По-хорошему, количество блоков «переменная+знак» должно быть тоже рандомным, как в условиях, так и в действиях, причем в действиях рандомным должно быть еще и количество строк. Просто реализация будет сложнее и менее читабельной, что сейчас не нужно. Есть еще add_string — в ней сохраняются в список те решения, которые исполнились, т.е. если исполнилось условие — это немного хитрый аналог критерия отбора решения и он только частично рандомный, так как его применение хоть и зависит от исполнения рандомного решения, но все-таки тут читается принцип отбора: решение отбирается, если оно исполнилось — это я так решил за код, а по-хорошему код сам должен решать, отбирать ли его в таком случае или нет. Не говоря уже о том, что само решение и сохранять тут особо не нужно — достаточно сохранять пары входящих значений и их значения после преобразования — тут входящее множество отображается на выходное по рандомному правилу, что в математике известно как функция с той лишь разницей, что само правило случайное. Но это я бы так мыслил, если бы у меня была изначальная задача и я бы пытался код под нее подгонять. Программист должен из себя это навязчивое желание постоянно выдавливать. На самом деле на первоначальных этапах эту свободу можно ограничивать только для того, чтобы легко было читать реализацию — широкомасштабные действия полностью свободного кода мониторить будет очень непросто. В дальнейшем я буду представлять все более сложные конструкции свободного кода, — это всё развивается во мне самом день ко дню. В идеале пока я хочу увидеть рандомно растущую структуру со своей логикой, которую можно будет мониторить и изучать.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.