Нейросеть для прогнозирования: универсальная обработка и методика для любой конфигурации. Примеры прогнозирования бизнес процессов




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

85 Comments

  1. theelectric

    Достойные шаги в 1С по направлению использования нейросетей!

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

    И еще вопрос… Почему при слишком большом количестве нейронов скрытого слоя сеть будет не «думать» а «зазубривать» возможные варианты? Ведь, по идее, наоборот — точность результата от этого будет выше, нет?

    Reply
  2. informa1555

    (1) Спасибо! Да есть саморганизующиеся сети (другой совсем тип) и то что Вы написали тоже есть по отношению к многослойным перцептронам. Причем тоже еще в 60х такие работы делались. Сам я тоже занимаюсь самоорагнизующимися сетями с собственной теорией только в другой области (изображения). Для 1Ски я специально такую простую сеть написал чтобы людей не пугать сразу, а чтобы потихоньку с малого начали использовать сети, разбираться. Кто-то дальше пойдет, кому то этого будет достаточно. Такая задумка.

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

    Reply
  3. theelectric

    (2)

    Сам я тоже занимаюсь самоорагнизующимися сетями с собственной теорией только в другой области (изображения)

    Это тоже в 1С?

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

    И еще… Как лучше организовать отдельный модуль по организации сети в 1С? Чтобы можно было внедрить такой «модуль» в любую конфигурацию, а потом вызывать его штатными средствами, например, в тех же отчетах. Организовать для этого какой-то определенный интерфейс, может привязать его к какому-нибудь уже существующему «стандарту» если таковы есть. Есть размышления?

    Конечно, есть тот же ТерзорФлоу, почему бы его не использовать отдельной библиотекой. Но соглашусь с Вами, что лучше бы использовать средства 1С, т.к. это дает определенную прозрачность.

    Reply
  4. Wolfis

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

    Reply
  5. informa1555

    (3) Да не, изображения то она не тянет нормально. Хотя у меня есть публикация just for fun что называется http://infostart.ru/public/200922/ . Но пронозирование тянет в самый раз, поэтому я большие надежды на эту технологию возлагаю. Странно что в 1С это по дефолту нет. В САПе Хана есть например.

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

    Как лучше организовать отдельный модуль по организации сети в 1С?

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

    Reply
  6. informa1555

    (4) Спасибо! Тут как раз материал нацелен на то чтобы пощупать руками, поэкспериментировать

    Reply
  7. McSim_

    Бизнес не любит нейросети в учёте. Пока интерпретации чёткой не будет.

    Reply
  8. Сурикат

    А в 1С есть типовые методы. Чем они лучше/хуже?

    Чем нейросети лучше той же интерполяции? В обработке изображений это понятно, они давно себя зарекомендовали…

    А на достаточно простых финансовых данных зачем эти навороты?

    Но за реализацию однозначно ++++

    Reply
  9. Dream_kz

    (8)

    А на достаточно простых финансовых данных зачем эти навороты?

    Я думаю это для примера, с чего то надо начинать, с тем же прогнозированием справляется статистика, ну а дальше сложнее.

    Статья очень интересная, однозначно +.

    Reply
  10. Dem1urg

    (7) А РАУЗ бизнес любит? Для нейросети не будет четкой интерпретации. Но есть ряд задач, для которых другие алгоритмы не работают (или дают результат существенно хуже).

    Reply
  11. Dem1urg

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

    Reply
  12. informa1555

    (8) Интерполяция?… Ну допустим у меня если я сегодня скидку сделаю в 2 раза больше то у меня выручка будет в 2 раза больше? А если в 3раза? Статистикой можно посмотреть допустим сколько товара продавалось при такой же скидке или при другой скидке и сделать линейную (или например квадратичную) экстраполяцию/интреполяцию. Но проблема в том что по статистике сложно вывести зависимость даже от одно фактора если ее мало. А интерпояция/экстраполяция это не порождает абстрактные знания о предмете, т.е. эти методы не добавляет информации — она остается такой же сжатой. Это как битовая картинка если ее увеличивать — появятся квадраты.

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

    Reply
  13. ABudnikov

    (13) Так написано же зачем в (2)

    Reply
  14. informa1555

    (13) Да это не сложно. Посмотрите модуль обработки — там 300 строк вместе с сервисными процедурами. Любая печ форма под erp 2 больше в разы))

    Reply
  15. informa1555

    (16) не знаю чему вас там волосатые дяди научили в реальной жизни… Я же не предлагаю писать сверточные сети на 1С, тем более они не нужны для задач планирования и прогнозирования. У всего свое применение. Тут речь идет о применении этой технологии к решению конкретных экономических задач. Я мог написать и про CNN которыми я много лет занимаюсь,про генетические алгоритмы и про много что еще. Простой однослойный перцептрон на практике хорошо фильтрует сигнал — там не надо добавлять уровней адстракции если он и так справляется. Тоже самое и применительно к задачам 1Ски.

    Reply
  16. Сурикат

    (12)

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

    А если обучающая выборка мелкая, то где гарантия, что сеть найдет правильное решение?

    Reply
  17. comol

    (17) Простой персептрон не нужен — есть линейная регрессия. Всё равно нужно приличную НС конструировать чтобы решать задачи на практике… ну и не пишется это на 1С конечно :). Не для того она 🙂

    Reply
  18. informa1555

    (19) про обработку сигнала это я для примера сказал, понятно что есть лучше методы. Кстати дисперсионные типа парной регрессии вычисляются дольше, ну не суть.

    А почему это не пишется на 1С?Какие аргументы? И приличная это какая(какие слои, сколько нейронов) и почему именно такая?

    Reply
  19. venvlad

    (2)

    Огромное спасибо! Ждём продолжения банкета)

    Reply
  20. &rew

    Вот! То что нужно для моих задач с кучей ЮЛ, комиссией и себестоимостью.

    Reply
  21. informa1555

    (22) Ну, если это не шутка, то думаю для учета с/стоимости сети плохо подходят, по крайней мере гораздо хуже СЛАУ. Хотя… линейные нейроны чем не СЛАУ…

    Reply
  22. &rew

    (23) Без подробностей. Цель — совсем не расчет затрат.

    Reply
  23. inf012

    Первая статья на эту тему, где получил понятие, что это такое и как на практике работает))

    Спасибо, интересно.

    Reply
  24. sergey512
    Процедура РешитьНейрон (нейрон, ВидНейрона)
    Сумма = 0;
    СуммаБезВеса = 0;
    Для каждого с из Нейрон.Входы Цикл
    входнойСигнал = с.Значение;
    Вес = Нейрон.Веса.Получить(Нейрон.Входы.Индекс(с)).Значение;
    
    Сумма = Сумма+ входнойСигнал*Вес;
    СуммаБезВеса = СуммаБезВеса+ входнойСигнал*Вес;
    
    КонецЦикла;
    
    //Если ВидНейрона = «Линейный» Тогда
    Если ВидНейрона = «Входной» Тогда
    Нейрон.Выход =  СуммаБезВеса;
    КонецЕсли;
    
    Нейрон.Выход = sigmoid(Сумма);
    
    //Нейрон.Выход = Сумма;
    //КонецЕсли;
    
    КонецПроцедуры
    

    Показать

    В данной процедуре есть бесполезное условие или автор ошибся и забыл поставить в условии возврат:

     Если ВидНейрона = «Входной» Тогда
    Нейрон.Выход =  СуммаБезВеса;
    КонецЕсли; 

    Выход всегда будет рассчитан так:

    Нейрон.Выход = sigmoid(Сумма);
    Reply
  25. informa1555

    (26) Да, использовалось для другой конфигурации сети, потом переделал а убрать забыл. Сейчас смысла в этом куске нет.

    Reply
  26. sergey512

    (27) Т.е. выход всегда должен пройти через функцию активации, в данном примере через сигмойд??

    Reply
  27. informa1555

    (28) Да, в данной сетке все нейроны одинаковые в всех 3х слоях и всегда через активацию

    Reply
  28. comol

    (20)

    И приличная это какая

    Минимум 4-5 слоёв, иначе смысла особого нейросеть не имеет- будет почти линейный прогноз. Не менее 10-ка нейронов в каждом слое, ну и обучение на нормальном объёме данных.

    Не говоря уже о том что если вы строите стат. модель желательно бы попробовать и векторные модели и деревья решений и нелинейную регрессию — вдруг даст лучший результат, ну и сеть обучать конечно не таким алгоритмом, да и не персептрон взять, и функцию активации другую… :).

    Какая уж тут 1С…

    Reply
  29. informa1555

    (30) ух! А как Вы, не зная параметров задачи вот так вот сходу выдали параметры сети, а? И главное чем это обосновано? Почему 4-5, почему 10? Насчет обучения да — backpropagation тормозной алгоритм включая его улучшенные версии. А все остальное то — чем обусловлено?

    Reply
  30. protexprotex

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

    Reply
  31. protexprotex

    (19) А зачем «приличная НС»? — если задача стоит только в линейном разделении пространства двух классов объектов, и центры тяжести этих двух классов хорошо разделимы линейным классификатором, то почему и не обычный персептрон? — давайте еще AdaBost-инг сюда прикрутим? — тоже линейный (бинарный) классификатор. Не надо усложнять себе задачу, если она решается более простой моделью.

    Reply
  32. protexprotex

    (30) Ну, на самом деле сеть и с одним скрытым слоем может аппроксимировать практически любую функцию (выпуклую). А с двумя скрытыми слоями — вообще любую (и не выпуклую). 4-5 слоев — это для глубокой сети, когда нужно выявить глубокие закономерности в данных + уменьшить количество связей в сети (сверточная сеть) и настраиваемых параметров.

    Reply
  33. theelectric

    (16)

    Много позже взрослые волосатые дяди научили меня как это надо делать в реальной жизни… 🙂

    Олег, научите всех нас! )) Как минимум — интересно! Как максимум — будет полезно!

    Ну, или хотя бы ссылочку…

    Reply
  34. ildarovich

    Обработку пока не скачивал, поэтому задам такие вопросы:

    — есть ли в модели нейроны смещения?

    — как задать гиперпараметры (я понял, что используется обратное распространение ошибки), управляющие градиентным спуском (скорость обучения и …(забыл как называется))?

    — используется стохастический спуск (веса переопределяются сразу в момент уточнения или все сразу)?

    — количество операций обучения в каких единицах? — это число «эпох» или число «сетов»;

    — какое примерно быстродействие у обучения?

    — есть ли возможность рассчитать ошибку? как она оценивается?

    Reply
  35. comol

    (33)

    только в линейном разделении пространства двух классов объектов

    если она решается более простой моделью.

    тогда НЕ НАДО ИСПОЛЬЗОВАТЬ НС! Модель подбирается под задачу. Если задача настолько простая что решается НС с несколькими нейронами, значит НС там не нужно — более того вредно.

    Reply
  36. comol

    (34)

    4-5 слоев — это для глубокой сети

    Вы немного не понимаете… нужно разобраться в теории сначала.

    Глубокие НС это совсем о другом.

    может аппроксимировать практически любую функцию

    Как и векторная модель и гауссовская… И что? :))))))) вообщем матчасть — немного надо углубиться

    Reply
  37. informa1555

    (36) bias можно просто в формуле задать

    Скорость обучения тоже в коде отдельная переменная, на форму не выносил

    Веса переопределяются в момент уточнения

    Итерации — сеты, если я правильно понял вопрос

    Ошибка в процессе обучения оценивается по среднеквадратическому отклонению

    Скорость от 5 минут (15 нейронов 10000 итераций) до порядка 20. При текущей скорости обучения.

    Reply
  38. comol

    (35)

    Олег, научите всех нас! ))

    Либо платные видюхи по Classification/regression learner -ам на Mathworks либо курсы/конференции от экспоненты

    Ну либо у ребят из Yandex Data Factory https://ru.coursera.org/specializations/machine-learning-data-analysis поучиться.

    Reply
  39. theelectric

    (40) Спасибо!!!

    Reply
  40. RainyAugust22

    Занимательно! Просьба выложить пример файла сети и файл границы.

    Reply
  41. RayCon

    (39) Дмитрий, спасибо за ликбез. Даже я, человек, далёкий от нейронов и сетей, что-то понял. 🙂

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

    (40) Олег, назвался груздем — полезай в кузов! Кооптирую тебя для участия в проекте.. в свободное от докладов на Инфостарте время. 🙂

    Reply
  42. informa1555

    (43) Это очень интересно! Я готов заняться подбором решения на конкретном проекте. Насчет массового решения не уверен, но тоже можно попробовать. Пишите в личку.

    Reply
  43. protexprotex

    (38) Простите, не понял про векторную модель и гауссовскую модель….. Распределение по гауссу знаю, функцию такую знаю, что такое вектор знаю. А вот про модель векторную и модель гаусса…. просветите, пожалуйста. (я не ёрничаю, честно не понял).

    Reply
  44. protexprotex

    (38) Глубокая нейросеть — это сеть где на каждом последующем слое (если это однонаправленная сеть) производится анализ специфичных для прикладной области признаков. Например, при анализе изображения — на первом слое — это точки (аналог ганглиозных клеток off/on). На втором — линии. На третьем углы. На четвертом — окружности. Ну а там и до лица человека дойдем. В обычной (второго поколения — MPL — сети) — там один скрытый слой, и этот слой пытается разгрести все изображение -> проблема с отсутствием анализа двумерности изображения, т.к. сеть полносвязная, то кол-во обучаемых параметров — просто огромно-> переобучение и кол-во примеров должно быть очень велико, ну и скорость обучения хромает и т.д. -> это все лечиться добавлением количеством слоев + новой парадигме обучения. Разве я не прав ?

    Reply
  45. informa1555

    (42) Ну вот из примера в статье

    Reply
  46. comol

    (43) Николай, конечно тиражная решение это хорошо… но и тут уже конкуренция приличная… У меня сейчас, к примеру, внедряются некто Nextail для управления товарным ассортиментом на основе машинного обучения. И у них есть конкурентное преимущество — они из Zara…

    А для не тиражных с Yandex Data Factory нам конечно не тягаться 🙁

    Reply
  47. RayCon

    (48) Т.е. ты считаешь, что рынок плотно занят? Но ведь есть огромная ниша бесшовной интеграции «на платформе 1С». 😉

    Reply
  48. comol

    (45) Это стандартная функциональность Matlab-а при выборе модели для классификации или регрессии.

    И то и то относится к машинному обучению, но при этом не НС. НС используют когда эти модели не дают нужного результата.

    Что это такое — гуглится:

    https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D­1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%­D0%BE%D0%B2

    https://ru.wikipedia.org/wiki/%D0%93%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0­%BA%D0%B8%D0%B9_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81

    Reply
  49. comol

    (49) Да… но «платформа 1С» по аналитическим возможностям уступает специализированным платформам. Т.е. если делать хорошо — это будут некоторые внешние компоненты… А они уже накладывают ограничения — данные сначала нужно затянуть в память а потом передать в ВК.

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

    Reply
  50. comol

    (46) Вы правы, и прекрасно понимаете что такое глубокая НС. Но коллега который думает что просто НС с кучей слоёв можно назвать глубокой ошибается.

    Reply
  51. protexprotex

    (50) Ясно — SVM — метод опорных векторов. Меня смутило название — векторная модель. По поводу Гауссовой модели — это упрощенно матрица ко вариации + мат. ожидание -> просто вычисляем коэфф. корреляции с некоторыми ограничениями для нескольких сигналов.

    Reply
  52. m-rv

    Спасибо за статью!

    Если не затруднит, объясните следующий момент:

    А= нейрон.Нейрон.Выход;
    нейрон.Нейрон.Ошибка= ОшибкаСледующегоСлоя*А*(1-А);
    

    почему ошибка перемножается на какой-то коэффициент вычисленный из значения выхода (А*(1-А))? что он означает?

    Reply
  53. informa1555

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

    Reply
  54. comol

    (53) Ну для меня это всё статистические модели :). Они конечно простые, но часто решают задачи лучше чем НС, не говоря о том что быстрее.

    Если всё это дело лажает — уже приходится обучать НС, ну и как правило 1-2 слоя в этом случае проблему не решают.

    Reply
  55. ildarovich

    (54) (55) Думаю, ответ не совсем точный.

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

    Можно еще почитать вот эту статьюНейронные сети для начинающих. Часть 2, где больше говорится об устройстве НС и ее обучении.

    Reply
  56. informa1555

    (57) Да все там точно, просто у меня сначала ошибка вычисляется, потом веса меняются в другом месте с коэффициентами

    Reply
  57. ildarovich

    (58) Про

    веса меняются в другом месте с коэффициентами

    понял. Неточность (или, скорее, непонятый вопрос) я усмотрел именно в ответе. Вас спрашивали про А(1 — А), а вы отвечали про влияние веса.

    Reply
  58. informa1555

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

    Reply
  59. ildarovich

    (60) Прошу прощения за занудство:

    А тогда (1 — А) зачем?

    Проверочные вопросы: 1) а если функция активации будет другой (например, ReLU), формула изменится или нет? 2) как связаны обратное распространение ошибки и градиентный спуск?

    Это я к тому, что, кажется, вы воспринимаете формулы, используемые в методе обратного распространения ошибки, как эмпирическое. Хотя они строгим образом выведены исходя из модели нейронной сети (которая действительно изначально эмпирическая). Опасность этого в том, что при таком понимании легко допустить ошибку: например, изменить модель, не изменив метод обучения.

    И, наоборот, понимание зависимостей позволяет избегать трат времени на поиск «лучшего метода обучения» (в рамках градиентного спуска).

    Reply
  60. protexprotex

    (56) Тут полностью с Вами согласен. SVM, AdaBost, корреляция — математические методы тем и лучше нейронных сетей, что позволяют ответить на вопрос почему данный сигнал (ошибочно или нет) относится методом к такому то классу, а не к другому. В нейронных сетях ответ на этот вопрос скрыт в самой нейросети, и достать его оттуда получается только для самых простых случаев — типа метода XOR, что само по себе настолько тривиально, что применение нейронной сети не оправдано. Поэтому я пытаюсь тоже сначала при решении применить математический метод от самого быстрого и простого — и потом уже по нарастающей.

    Reply
  61. informa1555

    (61) Хмм.. Может мы о разных вещах говорим… Ну и какая формула Вы считаете будет при ReLU?

    Reply
  62. ildarovich

    (63) Думаю,

    ?(А > 0, 1, 0)

    если на языке 1С.

    Reply
  63. informa1555

    (64) так это и есть сама функция активации, а та то формула это ошибка для 1го входа 1го нейрона. Т.е. мы уже посчитали выход (не важно какой функцией или вообще как), посчитали отклонение от желаемого значения (опять же неважно как оно получено) и нам надо посчитать на какую величину корректировать вес. Мы же об этой формуле говорим? Или есть какая то связь с функцией активации о которой я не знаю? А где про это написано конкретно — все перерыл не нашел. Вот что в википедии об этом — все как у меня:

    Reply
  64. ildarovich

    (65) Функция активации ReLU

    ?(А > 0, А, 0)

    , а в (64) — ее производная. Они похожи из-за простоты ReLU, но там в скобках не А, а 1. Потому, что производная от Х равна 1.

    Вот тоже из википедии https://ru.wikipedia.org/wiki/Искусственный_нейрон

    Обратите внимание, на формулу производной сигмоида и что там про производную говорится.

    Reply
  65. informa1555

    (66) да, теперь понял, точно это ж производная! Странно что у меня и так прокатывало с гиперболическим тангенсом например))

    Reply
  66. ildarovich

    (67) А в том то и дело, что гиперболический тангенс — эта по сути та же функция, отличается только областью значений, производная ее той же формулой выражается:

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

    (68) Да спасибо что поправили. Я думаю Ваш коммент будет полезен тем кто будет разбираться

    Reply
  68. Yashazz

    …вот смотрю я на всё это, а потом понимаю, что наша реальность — не всякие там завиральные нейронные сети, а экстренное впиливание новых счетов-фактур в дебри нетиповых конфиг, да объяснение бухам в сотый раз, почему у них на 62 счёте третье субконто красненькое… А это так, из параллельной вселенной, астрономически далёкой от автоматизации учёта с помощью 1С.

    Reply
  69. informa1555

    (70) автоматизация УЧЕТА это базовый уровень, чё про это говорить. Но я Вас понимаю мне тоже некоторые вещи кажется космос, а потом глядишь все вокруг начали внедрять.

    Reply
  70. Yashazz

    (71) Просто ничего, кроме этого базового уровня, никому нафиг не нужно. НС это «космос» не потому, что продукт не потянет или программисты тупые, а потому, что нужды нет и не будет, готовности к этому никакой. В первую очередь среди тех, кто платит деньги. Попробуйте объяснить — хоть среднему торгашу, хоть гендиру фабрики, нафига это — он не поймёт и денег платить не станет. Разве только действительно, «все вокруг начали» — мода дурная пойдёт, тогда что-то глядишь изменится. Но вряд ли.

    Если даже, допустим, логисты не желают видеть воплощённое решение задачи коммивояжёра, а хотят, чтоб «операторы били ручками», а маркетологи орут, что у них отнимают хлеб — ну какая к чертям нейронная сеть, о чём вы?

    Reply
  71. informa1555

    (72) а к нам наоборот логисты обращались за оптимизацией делали несколько раз на разных алгоритмах, всякие оптимизации в wms тоже. Или например из экзотического — линейный и 2мерный раскрой на муравьином/ генетическом алгоритме для оконной фабрики. Ну и мат.методы в планировании и прогнозировании. Насколько я знаю много кто на 1Ске оптимизирует логистику. Да и вообще, например, сравните wms-ки например лет 10 назад и сейчас и их распостранение — они умнеют и распостраняются больше. Тоже могу сказать о бюджетировании, планированиии. Как это «продавать» я не знаю я не продажник, но факт есть.

    Reply
  72. Xershi

    Появилась реальная задачка, т.к. с данным вопросом еще не работал нужно разбираться.

    Если можете помочь: http://forum.infostart.ru/forum9/topic174867/message1892038/#message1892038, то велком=))

    Reply
  73. OerlandHue

    Что почитать из фундаментальных книг, чтобы понимать комментарии?

    Reply
  74. informa1555

    например «Нейронные сети, генетические алгоритмы и нечеткие системы» есть еще оч хорошая книга Тадеушевича помоему так и называется «Нейронные сети»

    Reply
  75. Rico17

    Приглашаю в проект:

    https://infostart.ru/project/795704/

    Необходимо разработать движок для работы со смыслами.

    Вот простая задача для понимания направления работы:

    Система должна уметь составлять осмысленные предложения из набора слов, например:

    — пустыня, озеро, река.

    Можно добавлять любые слова, чтобы получилось предложение имеющее смысл.

    Например: В пустыне нет озера и реки.

    Reply
  76. user1005585

    скачал вашу программу, открыть не могу

    Reply
  77. informa1555

    (78) А в чем проявляется проблема?

    Reply
  78. kauksi

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

    вот есть простая история продаж Покупатель — товар1, товар2… товар10 и период. Как «обучить» чтобы нейросеть «предсказала» что через 10 периодов покупатель купит товар5?

    полезность статьи 0. Скачал обработку — а где брать имя файла сети и файл параметров, их структуру? вообщем одна обида злость и разочарование. Бери учебник и разбирайся….

    Reply
  79. ResAndDev

    Когда то давно, когда читал про нейросети — пытался написать нечто подобное — не осилил и бросил. Ваша статья заставила вернуться к этой теме.

    Reply
  80. ResAndDev

    Убить всех человеков! Слава роботам! (нейросетям) (бендер)

    Reply
  81. izidakg

    По «Выбрать количество нейронов скрытого слоя» вопрос — как определить что количество нейронов достаточно? анализ какой или просто интуитивно?

    По построению — есть какие рекомендации что закладывать на обработку в 1 и 2-й слой? Тот же типовой пример по анализу продаж — что пойдет в первый слой и что во второй?

    Reply
  82. informa1555

    (83) Для 3-х слойного перцептрона есть рекомендация Число слоев скрытого = корень квадратный из ЧислоВходов*ЧислоВыходов , но это не жесткое правило и подбирать надо на конкретных данных. По поводу 1 или больше скрытых слоев, то это вопрос интересный. Если прогноз продаж представить некой зависимостью (функцией) и эта функция непрерывная в каком то диапазоне, то 3-х слойный (т.е. 1 скрытый) ее может апроксимировать. Но на практике мы не знаем зависимость и ее свойства и даже не знаем факторы которые влияют. Поэтому опять же теоретически 4-х слойным можно апроксимировать любую функцию. Как раз буквально на след. неделе я как раз собрался выложить пример готового отчета с 2мя скрытыми слоями.

    Reply
  83. izidakg

    (84) это будет здорово. Самое сложное и непонятное как раз понимание что закладывать в 1-й слой, а что во 2-й. Во всяком случае для меня и элементарная «мурзилка» позволит преодолеть этот барьер и попробовать реализовать реальную задачу

    Reply
  84. venvlad

    «..обучить сеть на то какою скидку дать покупателю чтобы он купил товара максимально исходя из его предыдущих покупок и некоторых специфических для отрасли параметров.». Для расчёта оптимальной скидки корректно на вход подавать?

    н1 — сезон

    н2 — цена

    н3 — количество

    Reply
  85. informa1555

    (86) да, вполне. Если от жтого зависит то будет зависимость, если нет то не будет учитываться.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *