Математическое и компьютерное

Вот некоторые думают, что если вычисления перенести на ГПУ вместо ЦПУ, то:

1. Всё сразу заработает в сто раз быстрее.
2. Будет сразу работать лучше.

АвотшЫш. Не всегда, и не везде.

Вот сделал я нейросеть, модель одинаковая, довольно несложная, пятислойная, сто нейронов в каждом слое, итого 50 тысяч параметров — по нынешним меркам вообще три копейки.

Запускаю на ЦПУ — сеть тренируется за три минуты, и выдаёт довольно нормальный результат, с точностью в пределах 0.7%

Запускаю на ГПУ — сеть тренируется уже за пять минут, а не за три, а результат у ней — заметно хреновей, с погрешностью уже 1.23%

Я полагаю, что последнее это потому, что TensorFlow, будучи запущенным на ГПУ, по умолчанию до сих пор использует 16 бит для представления чисел с плавающей запятой, вместо 32 бит или даже 64. Надо будет поглядеть, можно ли его заставить использовать больше бит. Хотя, конечно, математика на компьютерах — она дело такое, что вообще-то никто гарантии, что результат вычислений будет одинаковым, если программа запускается на процессорах разной архитектуры, никогда не давал. Особенно, если числа такие, что представить их точно в формате IEEE-754 невозможно (например, десятичная дробь 0.2).

А вот почему оно ничуть не быстрее работает на ГПУ, чем на ЦПУ — для меня уже загадка. RTX3080 вроде как пошЫрше должен быть во флопсах, чем i9-11900k @ 3.5GHz. Может быть, такая маленькая модель его просто нагрузить толком не в состоянии.

И да, “чтобы два раза не вставать”.

Как наиболее правильно считать и представлять среднюю ошибку в вычислениях?

Вот, например, если в одном предсказании из двух программа ошиблась на +100%, а во втором — на -100%, врядли заявление о том, что средняя ошибка составляет 0% (100-100)/2, будет представляться нам истинным.
Но с другой стороны, если тупо считать ошибки по модулю, а программа при этом стабильно ошибается то на +1%, то на -1%, статистически-то ведь она, можно сказать, что не ошибается вовсе.
Как обычно действуют, вдруг кто знает?