Как работает окончательный расчет output в нейронной сети?

Я пытаюсь освоить, как работает саморазвивающаяся программа, нейронная сеть - хотя по-моему это слишком сильно сказано.

C GitHub'a я скачал проект с "обучающимися птичками", проходящими FlappyBird. Разбирая код, в скрипте NeuralNetwork я наткнулся на такой метод:

public float[] FireNeurons(float[] input)
    {
        for (int i = 0; i < layers.Length; i++)
        {
            for (int j = 0; j < layers[i]; j++)
            {
                if (i == 0)
                {
                    neurons[i][j] = input[j];
                }
                else
                {
                    neurons[i][j] = 0;
                    for (int k = 0; k < layers[i - 1]; k++)
                    {
                       neurons[i][j] += neurons[i - 1][k] * connections[i][j][k];
                    }
                }
            }
        }
        return neurons[layers.Length - 1];
    }

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

Здесь

  • layers - это массив [5, 10, 10, 2]
  • neurons - двумерный массив размером 4 х layers[i]
  • connections - трехмерный массив размером 4 х layers[i] х layers[i-1], значения в котором генерируются случайно в диапазоне (-0.5, 0.5)
  • input - это массив размером 5, в котором хранятся нормализованные расстояния до препятствий вверх, вправо-вверх, вправо, вправо-вниз, вниз, высчитанные с помощью Raycast'a

Так вот, сам вопрос:
Как именно происходит расчет neurons? Почему именно мы прибавляем neurons[i - 1][k] * connections[i][j][k] к neurons[i][i]? Что к чему в данном случая мы добавляем, но не с математической компьютерной стороны, а с человеческой. Получается, мы постепенно прибавляем вес т.н. вес нейрона к весу его соединения?

Сам автор данной программы оставляет комментарий, что это - Linear Activation Function - линейная функция активации, я почитал про нее, но не совсем понял, как именно она работает. Даже не так, я скорее понял, но не совсем осознаю, почему мы складываем и конкретно что с чем мы складываем.

Понимаю, что мой вопрос возможно сумбурен и непонятен, но все же я не просто прошу сделать или объяснить все за меня. Я смог разобрал большую часть сам, подробно описал собственные мысли, вложил свои силы в это, но нуждаюсь в помощи здесь. Так что надеюсь вопрос не закроют:)


Ответы (0 шт):