Comments 12
А для чего в начале статьи приведёт обфусцированный код ?
Интересная реализация. Я думаю она хорошо подходит для экспериментов
Надо ещё подобрать простые, но откалиброванные, веса из какой то узкой области и баловаться с разными архитектурами нейросетей.
Где взять базу знаний для нейросети GPT-2 и куда ее приложить для этого C кода?
Эта статья вызвала мой интерес не тем, что она про нейросети, а видом сжатого С-кода. Дело в том, что очень похожий стиль принят среди разработчиков на языках k и q, и интерпретаторы этих языков часто пишут в таком сжатом стиле, который мне даётся с трудом. Я подумал, что ну вот, может тут расскажут, как писать такое, поделятся секретами. А нифига, я сходил на github, и там исходники лежат в гораздо более понятном виде, и питоновский скрипт, который выполняет сжатие. Но при ближайшем рассмотрении оказалось, что питоновский скрипт делает довольно тупые действия, и автору в основном исходнике приходится самому прибегать к препроцессорной магии.
Когда я дошёл до раздела, где объясняется препроцессорная магия для матрично-скалярных и матрично-матричных операций, я сначала нифига не понимал, до тех пор, пока исходники не почитал. Дело в том, что в тексте вроде как define-ится BINARY с двумя аргументами (function и operation) в нижнем регистре, а потом в теле этого BINARY эти же аргументы стоят в верхнем регистре (FUNCTION и OPERATION), это очень сбивает с толку. Это не проблема перевода, в оригинальном тексте тоже так, в исходниках всё норм (fn и opr везде). Ну и раз уж зашла речь про BINARY, то я бы в начале проверил, что размеры матриц совпадают, fail fast и всё такое. Забавно, что он вводит поэлементное умножение и деление матриц, я такого не видел в математике, но у него находит применение в LayerNorm.
В описании математического матричного умножения у автора тоже косяк, в первом, неоптимизированном варианте остались k2 и j2.
Matrix matmul(Matrix a, Matrix b) {
Matrix out = NewMatrix(a.rows, b.rows);
for (int i = 0; i < a.rows; i++)
for (int j = 0; j < b.rows; j++)
for (int k = 0; k < a.cols; k++)
out.dat[i * b.rows + j] += a.dat[i * a.cols + k+k2] * b.dat[(j+j2) * b.cols + k];
return out;
}
Нет ли тут ошибки?
Matrix out = NewMatrix(a.rows, b.rows);
разве не ( y=a.rows, x=b.cols )?
Клон ChatGPT в 3000 байтах на C, основанный на GPT-2