All streams
Search
Write a publication
Pull to refresh

Comments 12

Интересная реализация. Я думаю она хорошо подходит для экспериментов

Надо ещё подобрать простые, но откалиброванные, веса из какой то узкой области и баловаться с разными архитектурами нейросетей.

Где взять базу знаний для нейросети GPT-2 и куда ее приложить для этого C кода?

на гитхабе:

First download the GPT-2 neural network

bash download.sh

содержимое download.sh:

curl https://openaipublic.blob.core.windows.net/gpt-2/models/124M/vocab.bpe > vocab.bpe
curl https://openaipublic.blob.core.windows.net/gpt-2/models/124M/model.ckpt.data-00000-of-00001  > gpt2-124M.ckpt

Эта статья вызвала мой интерес не тем, что она про нейросети, а видом сжатого С-кода. Дело в том, что очень похожий стиль принят среди разработчиков на языках 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 )?

Sign up to leave a comment.

Articles