Вопрос или проблема
Кто-нибудь знает, как этот алгоритм выполняет процесс обучения для нейронных сетей?
Я наткнулся на это решение. Оно работает, но я не знаю, как и почему.
Это нейронно-локально и работает без ошибок или обратного распространения.
void NeuralCluster::applyLearning(float learningRate){
//Корректировать каждый нейрон случайно независимо
vector<bool> alreadyDone;
for(int i = 0; i < weightsActive.size(); i++)alreadyDone.push_back(false);
for(int m = 0; m < weightsActive.size()-1; m++){
//Выбрать случайный нейрон, который еще не был скорректирован
int i = -1;
bool done = false;
while(!done){
i = rand()%(weightsActive.size()-1);
if(alreadyDone[i] == false){
alreadyDone[i] = true;
done = true;
}
}
//Вычислить отрицательное значение входного и выходного сигнала
float meanOutput = 0.0;
float meanInput = 0.0;
for(int j = 0; j < weightsActive.size()-1; j++){
float activationI = (EnergyFlowReal[i]);
float activationJ = (EnergyFlowReal[j]);
meanOutput += -(lastReal[i])*(weightsActive[j][i]);
meanInput += -(lastReal[j])*(weightsActive[i][j]);
}
//Произвести корректировку весов в соответствии с текущей активацией на них
for(int j = 0; j < weightsActive.size()-1; j++){
float activationI = (EnergyFlowReal[i]);
float activationJ = (EnergyFlowReal[j]);
weightsActive[j][i] += (activationJ)*(((meanOutput))/(weightsActive.size()))*learningRate;
weightsActive[i][j] += (activationI)*(((meanInput))/(weightsActive.size()))*learningRate;
}
float activationI = (EnergyFlowReal[i]);
weightsActive[i][weightsActive.size()-1] += activationI*(((meanInput))/(weightsActive.size()))*0.01;
}
//Нормализовать входные и выходные данные каждого нейрона независимо случайным образом
for(int m = 0; m < weightsActive.size(); m++){
//Выбрать случайный нейрон, который еще не был скорректирован
int i = -1;
bool done = false;
while(!done){
i = rand()%(weightsActive.size());
if(alreadyDone[i] == false){
alreadyDone[i] = true;
done = true;
}
}
//Вычислить абсолютные веса на входе и выходе
float absWeightsOut = 0.0;
float absWeightsIn = 0.0;
for(int j = 0; j < weightsActive.size(); j++){
float activationI = (EnergyFlowReal[i]);
float activationJ = (EnergyFlowReal[j]);
absWeightsOut += abs(weightsActive[j][i]);
absWeightsIn += abs(weightsActive[i][j]);
}
//Нормализовать входные и выходные данные каждого нейрона так, чтобы их абсолютная сумма равнялась одному
for(int j = 0; j < weightsActive.size(); j++){
weightsActive[j][i] = ((weightsActive[j][i])/absWeightsOut)*weightsActive.size();
weightsActive[i][j] = ((weightsActive[i][j])/absWeightsIn)*weightsActive.size();
//Отключить некоторые веса, которые не нужны
if((i >= 0)&& (j >= 0) && (i < numInputs)&& (j < weightsActive.size())){ weightsActive[i][j] = 0.0; }
}
}
}
Я не знаю, как работает этот алгоритм, даже с комментариями, потому что многие функции связаны и используют частые циклы, и они также включают выходные значения.
Мне нужно отслеживать каждый шаг, и трудно представить, как значения меняются со временем. Было бы здорово иметь эскиз или математическую логику, стоящую за этим рассуждением.
Рекомендую тщательно отслеживать каждый шаг с помощью инструментов визуализации и тестировать алгоритм в различных сценариях, чтобы получить хорошее представление о том, что происходит.
Поскольку вы, похоже, являетесь автором: считается ли термин “УСЛОВНАЯ НЕЙРОННАЯ СЕТЬ” в README вашим изобретением? Можете ли вы добавить несколько ноутбуков Jupiter, где вы покажете, что можете обучать стандартные 1) задачи классификации 2) задачи регрессии? Также сравните с https://stackoverflow.com/a/74966322/12229416 и посмотрите, можете ли вы найти сходства.
Основываясь на вашем описании, это может быть вариант распространения разности цели https://ar5iv.labs.arxiv.org/html/1412.7525.
Ответ или решение
Ваша просьба о понимании нового правила обучения для нейронных сетей, представленного в коде функции applyLearning
, вызывает большой интерес. Давайте подробнее рассмотрим, как это правило работает и какие принципы оно включает.
Общая структура алгоритма
Код, представленный вами, демонстрирует алгоритм, основанный на коррекции весов нейронов в нейронной сети, используя случайный выбор нейронов для исправления. Эта особенность делает алгоритм "локальным", так как он не зависит от информации, полученной из других нейронов через обратное распространение ошибки.
Ключевые шаги алгоритма:
-
Случайный выбор нейронов:
- Внешний цикл проходит по всем активным весам нейронов. В каждом проходе выбирается случайный нейрон, который ещё не был исправлен. Это гарантирует, что каждый нейрон будет корректироваться независимо, что может способствовать разнообразию обучения.
-
Расчет средних значений:
- Затем алгоритм вычисляет средние входные и выходные сигналы, которые используются для коррекции весов между случайно выбранными нейронами. Эти средние значения выводятся в формуле, и их отрицательные значения используются для коррекции весов.
-
Коррекция весов:
- Каждый из весов нейронов корректируется на основе рассчитанных значений активации, с использованием заданного коэффициента обучения (learningRate). Это позволяет усилить или ослабить связи между нейронами, основываясь на текущем состоянии сети.
-
Нормализация весов:
- После коррекции весов алгоритм выполняет нормализацию для обеспечения того, чтобы сумма абсолютных весов каждого нейрона уходила к единице. Это шаг критически важен для поддержания стабильности модели и предотвращения переобучения.
-
Удаление ненужных весов:
- Дополнительно, при нормализации, алгоритм отключает некоторые веса (устанавливая их в ноль), что помогает избавиться от избыточной связи между нейронами и может улучшить обобщающую способность сети.
Почему это работает?
Независимый подход к обучению нейронов делает этот алгоритм схожим с концепциями, используемыми в других алгоритмах, таких как Propagation with Conditional Learning. Он устраняет необходимость фиксировать значения градиентов и уменьшает зависимость от информации, полученной через обратное распространение, что может быть полезно в некоторых сценариях, где большее значение имеет "локальная" адаптация, чем "глобальная".
Рекомендации для понимания
Для дополнительного понимания можно воспользоваться следующими методами:
-
Визуализация данных: Используйте инструменты визуализации, чтобы прослеживать изменения весов и активаций во времени. Это поможет увидеть, как каждый нейрон адаптируется.
-
Эксперименты в различных сценариях: Применяйте разные наборы данных и задачи (классификация, регрессия), чтобы получить представление о гибкости и надежности алгоритма.
-
Сравнение с существующими методами: Сравните работу этого алгоритма с другими методами обучения, включая обратное распространение ошибки и аналогичные подходы, чтобы выделить его уникальные качества и потенциальные преимущества или недостатки.
Заключение
Таким образом, рассматриваемый алгоритм обучения демонстрирует подход, основанный на независимой коррекции нейронов с использованием случайного выбора. Эта "нейрон-локальная" методология может позволить избежать некоторых существующих трудностей, связанных с традиционными методами обучения, такими как усталость от градиента и переобучение, внося разнообразие в процесс обучения. Для более глубокого понимания алгоритма я рекомендую провести дополнительные эксперименты и визуализации, как это было предложено.