お知らせ

このシステムについて

このシステムでは、多層パーセプトロンを利用した MNIST データセットの分類器の訓練を MN-Core 2 で実行するのに必要な演算セットの実装を、オンラインジャッジ形式で行うことができます。

以下のような、\(32×32 = 1024\) ピクセルの画像を入力とし、隠れ層サイズ \(16\)、出力層サイズ \(16\) のニューラルネットワーク (NN) を用いて MN-Core 2 上で実装し、分類と訓練を行うのが目標です。

class SimpleNN1024(nn.Module): def __init__(self): super().__init__() self.fc1 = nn.Linear(1024, 16) # 入力 32x32 = 1024、隠れ層 16 次元 self.fc2 = nn.Linear(16, 16) # 出力 16 次元 (10クラス問題だけど、16次元にしておく) self.relu = nn.ReLU() def forward(self, x: torch.Tensor): x = x.view(x.size(0), -1) x = self.relu(self.fc1(x)) return self.fc2(x)

nn.Linear とは NN の全結合層を表し、\(y = Wx + b\) という計算を行います。\(W\) は重み行列、\(b\) はバイアスベクトルです。

このモデルの forward 関数を、バッチサイズ \(256\) として計算グラフで表現すると以下のようになります。

SimpleNN1024 の計算グラフ

Gemm とは行列積のことを指します。入力 input の \(256 \times 1024\) 行列と、重み fc1_weight の \(16\times1024\) 行列の転置行列との積を計算し、バイアス fc1_bias を加えた後に ReLU 関数を適用しています。ここで、\(256\) はバッチサイズ、\(1024\) は入力画像のピクセル数、\(16\) は隠れ層の次元数を表しています。

更にその出力 \(256 \times 16\) 行列に対して再び同様の処理を行い、\(256 \times 16\) 行列 output を得ています。これは、\(256\) バッチの各画像に対して、\(0\)~\(9\) の各数字に対するスコアを出力していることを意味します。

この output を Softmax 関数に通し、正規化された確率分布に変換することで、確率出力 probs を得ています。推論で行われる計算は以上です。

このページでは、この計算で使われるそれぞれの演算を、小ステップに分けて実装していき、最終的に上記の NN の推論や訓練を MN-Core 2 上で実行できるようにすることを目指します。

NN の 訓練部分の解説

今回の問題セットでは、推論だけでなく訓練部分も MN-Core 2 上で実装することを目指します。なお、推論で使う演算だけを実装しきれば、推論部分だけを実行することも可能です。詳細はブログにまとめ、ここでは簡単に訓練部分の計算について説明します。

訓練では、まず推論で得られた確率分布 probs と正解ラベル入力 labels を用いて、損失(誤差)を計算し、その損失を各パラメータで微分することで勾配を求めます。勾配は、例えば Add 演算であれば、出力の勾配をそのまま入力の勾配として伝搬します。ReLU 演算であれば、順伝播の出力が \(0\) 以下の部分の勾配を \(0\) にすることで求められます。Gemm演算(入力 \(X\) と重み \(W\) の積)であれば、入力 \(X\) に対する勾配は「出力の勾配と重み \(W\) の転置行列の積」で求められます。

こうして各演算の入力や重みパラメータに対する勾配を逆伝播で計算し、重みパラメータ(fc1_weightfc1_bias など)に対しては、その勾配に訓練率(今回は \(0.01\))を掛けた値を引くことで、重みの更新を行います。

完全な計算グラフは こちら に示しますが、訓練だけであれば loss の計算は不要なので、こちらのように loss を除いた計算グラフに対応することにします。

また、Softmax のように複雑な演算は、Sub, Exp, ReduceSum, Div といったより基本的な演算に分解して実装することにします。そうすると今回の訓練部分は、以下のような計算グラフになります。

SimpleNN1024 の訓練部分を分解した計算グラフ

また、MN-Core はデバイス上に DRAM を持ちますが、演算を行うためには値を DRAM から、LM などの PE 内部の SRAM に移動してから行う必要があります。

そのため、DRAM から SRAM に値を移動する DL という処理と、SRAM から DRAM に値を移動する UL という処理も必要になります。

推論部分だけを、DL/UL を含めた計算グラフは こちら、訓練部分も含めた完全なDL/UL付き計算グラフは こちら になります。

本当は、連続する DL, UL はまとめたり省略することも可能なのですが、今回は「とりあえず動く」を目標にしているため、全ての DL, UL を明示的に挿入しました。

この計算グラフを見ると「うっ…」となってしまうかもしれませんが、色々使いまわしができるように問題サイズを工夫しているので、実際に実装すべきパターンは限られています。

問題一覧 に、実装すべき各演算の問題が揃っています。

48問と非常に多いですが、SumCol のように、一気に実装するのが難しい場合は、SumCol mini のように分割してあるため、一問一問は比較的簡単に実装できるはずです。

48問中、16 問は基礎的な演算の実装、15 問はメモリ転送の DL,UL 問題、残りの 17 問は行列積 MMulGemm)の実装になっています。

行列積問題は、実際に NN の訓練で使用するのは「★」のついた 5 種類だけですが、ステップを細かく分けて用意しました。

ぜひ一緒に MN-Core 2 でのニューラルネットワーク訓練の実装を楽しみましょう!

順位

ジャッジ

入出力に関する共通ルール

ジャッジ結果

禁止事項

下記の禁止事項に該当するとみなされたとき、正答の取り消しやアカウントの削除を行う可能性があります。

個人情報の取扱い

利用規約・お問い合わせ

本システムに提出いただくには登録時に利用規約に同意していただく必要があります。

その他、本システムに関連するお問い合わせはMN-Core Challenge 事務局までお送りください。