Блог страдающего Лиса
Lorem ipsum hello dolor sit world amet
02 мар 2023 Чт
Особо ничего нового
Сегодня день, в котором ничего такого не произошло, просто работал, что-то делал, выполнял определенные задачи. Часто размышляю о том, что бы мне хотелось сделать на ПЛИС, и даже если и думаю, то все эти проекты довольно сложные для их реализации. К примеру думал о том, чтобы сделать нейросеть. Как можно вспомнить, искусственная нейросеть опирается на нейроны, реализованные через сигмоиду, то есть вот такую функцию
Она сложна по двум причинам для своей реализации. Во-первых, тут требуется найти экспоненту дробного числа, что уже само по себе непростое дело, и, во-вторых, требуется разделить число. Сложность вычисления очень велика для каждого нейрона.
Как вообще вычислять это дело? К примеру, экспонента может быть разложена следующим образом:
Для нейронной сети хорошо бы использовать float-point, но вполне даже может пригодиться число половинной точности, так что количество умножении может быть к примеру, 10 или 11, по количеству двоичных чисел в мантиссе. Значит, 11 тактов придется потратить на то, чтобы возвести экспоненту в степень. Однако, это не все! Как минимум, надо сделать деление, и на деление тоже тратится 11 тактов (длина мантиссы). Кстати, в случае с отрицательной экспонентой, то есть, при возведении в степень отрицательного значения, можно лишь взять другой набор значений.
Получается, чтобы вычислить один нейрон, потребуется минимально 22 такта + то количество тактов, которое нужно для сложения и умножения весов на входящие значения. Допустим, что мы даже так, тратим 50 тактов на вычисление одного нейрона, то сколько нейронов можно будет вычислить в секунду? На частоте 25 мгц это будет 500 тыс нейронов. Это в целом, неплохо, если нейросеть не делать очень большой.
У меня постоянный запар какой-то идет по оптимизации, чем бы ни занимался, хочется сделать все с максимальной скоростью. В итоге же я ничего не делаю! Да сколько можно то! Надо просто брать и делать и вообще на все плевать, хоть медленно, но сделать, чтобы работало.
Она сложна по двум причинам для своей реализации. Во-первых, тут требуется найти экспоненту дробного числа, что уже само по себе непростое дело, и, во-вторых, требуется разделить число. Сложность вычисления очень велика для каждого нейрона.
Как вообще вычислять это дело? К примеру, экспонента может быть разложена следующим образом:
Для нейронной сети хорошо бы использовать float-point, но вполне даже может пригодиться число половинной точности, так что количество умножении может быть к примеру, 10 или 11, по количеству двоичных чисел в мантиссе. Значит, 11 тактов придется потратить на то, чтобы возвести экспоненту в степень. Однако, это не все! Как минимум, надо сделать деление, и на деление тоже тратится 11 тактов (длина мантиссы). Кстати, в случае с отрицательной экспонентой, то есть, при возведении в степень отрицательного значения, можно лишь взять другой набор значений.
Получается, чтобы вычислить один нейрон, потребуется минимально 22 такта + то количество тактов, которое нужно для сложения и умножения весов на входящие значения. Допустим, что мы даже так, тратим 50 тактов на вычисление одного нейрона, то сколько нейронов можно будет вычислить в секунду? На частоте 25 мгц это будет 500 тыс нейронов. Это в целом, неплохо, если нейросеть не делать очень большой.
У меня постоянный запар какой-то идет по оптимизации, чем бы ни занимался, хочется сделать все с максимальной скоростью. В итоге же я ничего не делаю! Да сколько можно то! Надо просто брать и делать и вообще на все плевать, хоть медленно, но сделать, чтобы работало.