Задать вопрос
@kot-samolet

Что нужно что бы доработать это до нейронной сети?

Просьба не троллить, отнестись по возможности серьёзно. Функция имитирует математическую модель принятия решения делать сегодня домашку или нет )))
// Делать ли сегодня домашнее задание?
function say($tomorrow, $favorite, $ege, $average){

    // Предмет любимый?
    ($favorite === 1) ? $F = 0.8 : $F = 0.5;
 
    // Урок завтра?
    ($tomorrow === 1) ? $T = (0.7+$F) / 2 : $T = (0.3+$F) / 2;
 
    // По предмету будет ЕГЭ?
    ($ege === 1) ? $E = 0.8 : $E = 0.3;
 
    // Средний бал по предмету сейчас
    if($average > 4.5){
        $A = 0.4;
    }
    elseif($average > 4 && $average < 4.5){
        $A = 0.5;
    }
    elseif($average > 3 && $average < 4){
        $A = 0.6;
    } else {
        $A = 0.7;
    }
 
    return ($F + $T + $E + $A) / 4;
}
 
echo say(0,1,0,3); // 0.5875


Старлся делать по этой модели:
2272_html_m3457e208.png
Где входные данные - это переменные.
Промежуточный (скрытый слой) в данном случае выполняют весовые коэффициенты заданные вручную.
На выходе одно значение.

Вопросы:
1) По идее весовые коэффициенты должны меняться динамически, где их обычно хранят в БД?
2) В данном случае реализована связь 1 к 1 кроме одного места где $tomorrow учитывает значение $favorite, но пишут что делают связь многие ко многим или все ко всем, как в этом случае избежать хаоса и неразберихи что куда идёт, откуда и вообще что происходит.
3) Эта функция целиком, это один нейрон? Или один нейрон это один if?
4) И самое главное, если ответ признан неверным, как определить какую ручку (коэффициент) следует крутить первым делом, какой вторым и т.д.?
  • Вопрос задан
  • 106 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
У вас там ошибка, замените последнюю строку на echo 1;
Ответ написан
sergiks
@sergiks Куратор тега PHP
♬♬
Чтобы обучить сеть понадобится немаленькая «обучающая» выборка правильных данных: 4 ваших входных параметра + ответ. Таких строк бы да побольше, разных.

У вас 3 булевых входа (true/false) и один реальный (float). На выходе true/false.

Возможно, для этой задачи больше подойдёт не нейронная сеть, а дерево принятия решений. Хорошее видео, объясняющее, как построить такое дерево на Python (на англ., но можно включить титру с автопереводом на Русский язык)

Возвращаясь к нейронной сети и весам. На рисунке – три слоя: входной, скрытый и выходной. В каждом слое от 1 до нескольких «нейронов».

У каждого нейрона два параметра, допустим, a и b. На вход к нему попадает некое значение x. Нейрон его умножает на a и прибавляет b, чтобы отправить дальше.

Часто сеть инициализируют случайными весами, чтобы они не были нулевыми.

Затем начинают прогонять через неё готовые, «обучающие» примеры. И смотреть, что на выходе. Разницу между «ожиданием» и «реальностью» называют «потерей» (loss). Её нужно минимизировать. Тема длинная, я плохо рассказываю. Лучше посмотрите курс какой-нибудь. Ответы на ваши вопросы:

1. коэффициентов обычно не так много. Их держат в памяти во время работы сети и сохраняют в файл на диске, чтобы потом можно было снова загрузить.
2. связи все-ко-всем. Если какие-то из них не нужны – ставится нулевой вес. Расчёт этих коеффициентов обычно делается «оптом» – операциями с матрицами.
3. ваш код пока далёк от реализации нейронной сети, а ближе к упомянутому выше дереву принятия решений.
4. в случае нейронной сети и градиентного спуска считается частная производная и делается маленький «шаг» в нужном направлении – коэфф. изменяется с текущего значения «чуть-чуть».
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы