@NEzyaka
линуксоид; начинающий разработчик C++/Qt, Python

Некорректный результат умножения или логическая ошибка?

Доброго времени суток! Решил для себя заняться нейросетями. Прочитал книгу Тарика Рашида "Make Your Own Neural Network", там в конце есть пример реализации трёхслойного перцептрона для классификации рукописных цифр с использованием матриц. Если кратко, то при таком подходе выход слоя нейронной сети - это произведение матриц весов связей с предыдущим слоем на матрицу входов этого слоя. И в той, и в другой матрице диапазон значений от нуля до единицы. Интереса ради решил переписать реализацию из книги на C++ с использованием Boost. В реализации на C++ сигнал всех нейронов выходного слоя (что является, по сути, вероятностью принадлежности к какому-либо классу) почему-то равен 1.0, получается что то, что подали на вход на 100% относится ко всем классам, чего быть не может. Затем переписал с Python на C++ с Eigen, который используется в TensorFlow, то же самое. Переписал на Go + Gonum, то же самое. Первое расхождение уже после первого умножения матриц: умножения матрицы весов связей входного слоя со скрытым. В результате получается матрица со значениями типа 3.27362482790, 5.4859804, 6.4859834 и т.д. Но как такое возможно, если максимальные значения в умножаемых матрицах не превышают единицы? Ссылки на реализации:
  • Вопрос задан
  • 432 просмотра
Пригласить эксперта
Ответы на вопрос 1
zagayevskiy
@zagayevskiy
Android developer at Yandex
Первое расхождение уже после первого умножения матриц: умножения матрицы весов связей входного слоя со скрытым. В результате получается матрица со значениями типа 3.27362482790, 5.4859804, 6.4859834 и т.д. Но как такое возможно, если максимальные значения в умножаемых матрицах не превышают единицы?


возьми матрицу 2х2 cо значениями 0.9(<1). И умножь её саму на себя. Получишь матрицу 2х2 со значениями 1.62(>1). Магия, правда?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы