В данном случае эти параметры оказались именно такими практически случайным образом, это ведь не настоящие данные, а для разработки (были сгенерированны функцией rand() в экселе).
Вообще их выбирают исходя из того, что слишком большой шаг ведет к расходимости, а слишком маленький долго работает. Насколько я понимаю, данная реализация уменьшает шаг с каждой итерацией на stepSize/sqrt(t). Но пока с этим не разбирался детально.
Да, собственно топологии еще не перебирал (даже кол-во слоев не пробовал менять). Пока занимаюсь отладкой общей логики и функциональной обвязки (распределение вычислений по сети на несколько машин и агрегация результатов).
Да это к счастью не проблема, загрузить проц весьма легко увеличив кол-во параллельно выполняющихся потоков в 1,5-2 раза, данный пример был для сравнимости результатов при одинаковом коде приложения (менялась только библиотека).
Да, GPU показывает изумительные результаты. Я пробовал делать расчеты на GPU, оказалось там очень большие затраты на ввод вывод данных (вплоть до проигрыша CPU в сумме). Специфика моего приложения в том, что обмен данными очень интенсивный, такой что смысла юзать GPU не увидел.
Кроме классических сетей (с реализацией обучения, отжига и т.д.) есть сети Хопфилда, самоорганизующиеся карты Кохонена. Вот тут куча примеров использования:
Думаю вы правы, что это ускорило бы процесс. Только это потребовало бы уже гораздо больше усилий, чтобы перепахать всю внутреннюю логику на поддержку этого.
Вообще их выбирают исходя из того, что слишком большой шаг ведет к расходимости, а слишком маленький долго работает. Насколько я понимаю, данная реализация уменьшает шаг с каждой итерацией на stepSize/sqrt(t). Но пока с этим не разбирался детально.
int x, y, z;
int i, j, k;
x = 100;
y = 10;
z = 10000;
double[,] a = new double[x, y];
double[] b = new double[x * y];
Stopwatch stA = new Stopwatch();
stA.Start();
for (k = 0; k < z; k++)
for (i = 0; i < x; i++)
for (j = 0; j < y; j++)
a[i, j] = i * k;
stA.Stop();
Stopwatch stB = new Stopwatch();
stB.Start();
for (k = 0; k < z; k++)
for (i = 0; i < x * y; i++)
b[i] = i * k;
stB.Stop();
Results:
stA.Elapsed.Ticks = 531087
stB.Elapsed.Ticks = 390716
https://github.com/jeffheaton/jeffheaton-book-code/tree/master/CSIntroNeuralNetworkEdition2