Независимо от математики, индексация массива в Java сама по себе может привести к снижению производительности. Учтите, что в Java нет реальных многомерных массивов, а реализует их как массив массивов. В вашем самом внутреннем цикле вы получаете доступ к нескольким индексам, некоторые из которых фактически являются постоянными в этом цикле. Часть массива доступа может быть перемещена за пределы цикла:
final int[] neuronOutputSlice = neuronOutput[layer - 1];
final int[][] fWeightSlice = fWeights[layer - 1];
for (int inputNeuron = 0; inputNeuron < biasNeuron; inputNeuron++) {
activation += neuronOutputSlice[inputNeuron] * fWeightsSlice[inputNeuron][neuron];
}
Возможно, что сервер JIT выполняет аналогичное перемещение, инвариантное к коду, единственный способ узнать это изменить и профилировать его. На клиентском JIT это должно улучшить производительность, несмотря ни на что.
Другая вещь, которую вы можете попробовать, - это предварительно рассчитать условия выхода цикла for, как это:
for (int neuron = 0; neuron < neuronCounts[layer]; neuron++) { ... }
// transform to precalculated exit condition (move invariant array access outside loop)
for (int neuron = 0, neuronCount = neuronCounts[layer]; neuron < neuronCount; neuron++) { ... }
Опять же, JIT уже может сделать это для вас, так что, если это поможет, просим сообщить.
Есть ли смысл умножать на 1.0F, что ускользает от меня здесь?:
float activation = 1.0F * fWeights[layer - 1][biasNeuron][neuron];
Другие вещи, которые могут потенциально улучшить скорость за счет читабельности: встроенная функция sigmoid () вручную (JIT имеет очень жесткий предел для встраивания, и функция может быть больше).
Может быть немного быстрее запустить цикл в обратном направлении (где это, конечно, не меняет результат), поскольку проверка индекса цикла против нуля немного дешевле, чем проверка по локальной переменной (самый внутренний цикл снова является потенциальным кандидатом, но не ожидайте, что выходные данные будут на 100% идентичны во всех случаях, поскольку добавление чисел с плавающей точкой a + b + c потенциально не совпадает с a + c + b).