Pull to refresh

Comments 14

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

Чтобы комбинаторным взрывом можно было управлять, нужно менять разрешение разметки пространства символов (идентификаторов для признаков).

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

Есть один хак: рассматривать в качестве нулевого уровня не символ, а переход от символа Сi к Cj на некоторой дистанции.

Это позволит собирать не всю статистику, а только значимую, по наиболее устойчивым патернам, опуская малозначимый шум
Можно будет узнать кто убийца в детективе?
Можно, но для этого потребуются определенные «костыли». Либо с помощью явного хака (сопоставляя категории «внутреннего языка» ИИ с категориям смысла, понятного нам), наподобие того, как создают готовые разметки в Compreno, с той разницей, что процесс вывода внутренней семантики может стать автоматическим. Либо на уровне распознавания интереса пользователя к определенным прогнозам (внутренних связей), а не только к чисто статистически устойчивым структурам в фиксированном корпусе текстов.

То есть помимо того, что семантическое (осмысливающее) ядро ИИ может управлять вниманием к новой информации на основе статистики устойчивых глубоких структур, отдельно анализируя запросы пользователей к данным можно помечать некоторые выявленные устойчивые структуры как особенно привлекательные, приоритетные для исследования структурных (семантических) связей-закономерностей.
А можно ли вообще расширить алгоритм на числа?
А почему нет? Автор предложил использовать деление на интервалы. Как именно делить на интервалы — это уже тонкости конкретного способа. В конце-концов, символы — это ведь тоже числа. И три-четыре символа — тоже всего лишь число. В свое время Кузнецов (Дмитрий, кажется) довольно много писал об одномерных отображениях и кодировании алфавита интервалами вещественных чисел.
Похоже на архиватор, а именно, семейство алгоритмов PPM (Prediction by partial match).
Проблема в том, что модель данных статичная, а значит алгоритм не найдёт смысла в последовательности 1,2,3,4,…

Алгоритмы поиска паттернов (деление текста на предложения, слов на приставки и окончания) хорошо проработаны в литературе. Например, хорош SEQUITUR (Nevill-Manning, 1997). Это всего лишь инструмент, кирпичик в ИИ-приложении, а не основная идея.

Если собирать снизу-вверх, можно много чего наисследовать, только пригодится ли оно потом?
У меня основная идея, что в ходе развития алгоритма прогнозирования, находятся все зависимости, которые могут находится. Наш мозг именно на таком принципе и работает — находит что от чего зависит.

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

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

Задача и ее решение, это просто зависимость. Это так же, как перевести текст с русского на английский.
Попробуйте представить, что паттерны могут быть не только последовательными, а использовать такие операторы, как пропустить пока такое-то значение, или пока не такое-то

Кто решает, в каком месте нужно применить оператор? Может это решение сформироваться исключительно входным потоком? Если да, каким алгоритмом?
Обсчитываются все варианты: какая зависимость если взять символ рядом, какая если символ через символ, или по квантификаторному пропуску. Это при накоплении статистики. А при применении, выбирается та ветвь операторов, которая наиболее эффективная — имеет более однозначный и определенный прогноз.

Под словом все, я конечно не подразумеваю, что обязательно все обсчитается. Это так же как у человека, обсчитается то, что успеет до момента принятия решения. И конечно же последовательность обсчета ранжировать по значимости — вероятности нахождения решения в данной ветви операторов и по важности этого расчета для текущего момента. Вероятность нахождения в данной ветви — что то вроде прогноза, в какой области ветвей искать зависимые. Как когда Вы нажимаете кнопку на клавиатуре, Вы знаете, что реакцию нужно искать на экране, а не на соседней стенке.
Возвращаясь к примеру с последовательностью 1,2,3,4,…
Будет построен прогноз, если в движке заранее не заложен поиск арифметических прогрессий?
А если заложен, но вход будет таким: A_AA_AAA_AAAA_AAAAA…
Все зависит от того, как их рассматривать:

1. Если это как в жизни — пример в учебнике вплетенный в прочие данные, то алгоритм оперирует накопленными функциями.

2. Если это абстрактный пример — начало потока и сразу идет 1, 2, 3…
то как система видит эти данные: дискретные, не упорядоченные, и не имеющие никакой связи между собой значений.
Их можно сравнить между собой только на равенство — оператор используемый в паттернах.

Небольшое отступление.

Какие операторы присутствуют в алгоритме:
1. Операторы перевода курсора, откуда будет браться значение — для простых паттернов это всегда «предыдущий».
2. Операторы условия и сравнения — индекс это оптимизация этого оператора.
3. Возвращаемое значение прогноза это оператор «return».
4. Использование групп — подпроцедуры. За вызов их отвечает оператор перевода курсора.

Так же есть способ, который я в этой статье не упоминал, но упоминал в прошлой.
Один цикл выполнения прогноза подразумевает: входящие данные — сохраненная история и результат — прогноз.
Это обычная функция. Некоторые закономерности образуются цепочками вызовов: fn1(fn2(x)) -> y.

Этих операторов воде достаточно, что бы закодировать любой алгоритм.
Математические операции при естественных данных будут кодироваться алгоритмами типа сложения столбиком — как у нас в мозгу, где операции сложения до десяти будут запомнены в индексе, как прогноз — если 1 и 2, значит вернуть 3. А большие числа уже столбиком (дополнительное кэширование для ускорения пока не смотрим).

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

Так вот, для абстрактного примера 1,2,3,4 операции соотношения значений должны быть закодированны заранее, и тогда будет вычислена постоянная зависимость между значениями.
Для естественного примера, дополнительных математических операций кодировать не нужно.

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

Надеюсь, что это мое описание видится как не выходящее за рамки того, что я описывал в статьях.
Если это абстрактный пример — начало потока и сразу идет 1, 2, 3…
то как система видит эти данные: дискретные, не упорядоченные, и не имеющие никакой связи между собой значений.
Их можно сравнить между собой только на равенство

Это так, пока система не получит последовательность от 1 до 9999, там уже будет достаточно примеров, что 0-9 идут всегда последовательно (это укладывается в статистический предсказатель), а вот правило переноса разрядов надо сформулировать…

Какие операторы присутствуют в алгоритме:

При построении алгоримта операторы будут рандомно подбираться, пока не получится хороший алгоритм, или есть какая-то система?

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

программируются заранее человеком?
Это так, пока система не получит последовательность от 1 до 9999, там уже будет достаточно примеров, что 0-9 идут всегда последовательно (это укладывается в статистический предсказатель), а вот правило переноса разрядов надо сформулировать…

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

При построении алгоримта операторы будут рандомно подбираться, пока не получится хороший алгоритм, или есть какая-то система?

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

Если Вы задаетесь вопросом, как получается программа в соответствии с ТЗ, то это результат прогноза, а не алгоритм реализующий конвертацию из ТЗ в эту программу.

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

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

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

программируются заранее человеком?

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

Тогда, по-хорошему, такие операции должны быть не априорно заданными, а являться данными, которые можно накапливать. Если вопрос в производительности, нужна какая-то мета-компиляция алгоритмов из данных.
Sign up to leave a comment.

Articles