学習済みネットワーク
ブレインが.oannを同梱する理由、整数演算、レイヤー、実行方法、oa-tool brain net、上限、ライブラリでの表示。
この章はdocs/brains/oabrain-standard.md、docs/brains/authoring.md、docs/playing-with-brains.mdの要約です。規範となるのはこれらのドキュメントです。
ブレインがネットワークを使う理由
ネットワークは別の場所で学習させ、パッケージに入れて配布します。スクリプトは、学習した判断が欲しいときにそれを呼び出します。使うかどうかは作者が決めることです。既定はエンジン本来のコンピューターのままで、重みを持つブレインを席に着かせるのも任意です。対象は、それを実行するマシンのコンピューターの席1つです。
.oannと整数演算
ネットワークファイルは、形式1の.oannです。テンソルの型はint8、int16、int32のいずれかです。格納される指数は-48〜16です。入力と活性値はint16です。出力はint16で、argmaxの出力だけはint32です。同じ入力からは、どのマシンでも同じ出力が得られます。
ダイジェストは、パッケージをパックしたとき、インストールしたとき、そして席がブレインを読み込むときにサンドボックスを開く前にもう一度、確認されます。席が64 MiBを超えることになるネットワークは、割り当ての前に拒否されます。席は外され、内蔵コンピューターが引き続きその席を担当します。この読み込みは、どのフェーズにも含まれません。
レイヤー
レイヤーの種類を、この順に挙げます。入力と活性値はint16です。
| レイヤー | 内容 |
|---|---|
dense | 出力はint16です。 |
conv2d | 出力はint16です。 |
maxpool | 出力はint16です。 |
relu | 出力はint16です。 |
leaky_relu | 出力はint16です。 |
tanh | 出力はint16です。 |
sigmoid | 出力はint16です。 |
add | 出力はint16です。 |
concat | 出力はint16です。 |
flatten | 出力はint16です。 |
softmax | 出力はint16です。 |
argmax | 出力はint32です。 |
embedding | 出力はint16です。 |
実行する
brain.network(id)はハンドルを返します。brain.tensorは1〜4,194,304個の数から変更不可のテンソルを作ります。net:runは、ネットワークの入力名とちょうど同じキーを持つテーブルを受け取り、新しいテーブルを返します。int16の出力はテンソル、argmaxの出力はLuaの整数です。brain.gridは、sight、explored、water、height、metal、own、allies、enemies、threat、radarのレイヤー名から1〜10個を選んで正方形のテンソルを作ります。サイズは8、16、32、64、128で、既定は64です。規格の例では、サンプルを1つ記録しています:
brain.record{
features = { sectors = brain.grid({"own", "explored"}, 8) },
decision = 0
}
featuresは1〜16個のテンソルです。decisionは整数かテンソルです。この呼び出しは、対戦が記録中なら学習用のサンプルを書き、ファイルが開いていないときも同じ確認と消費を行います。オプションでネットワークを使わないようにもできます。me.optionsを読み、プレイヤーがオフにしていれば呼び出しを飛ばしてください。それでもネットワークはパッケージと一緒に読み込まれます。
oa-tool brain netで作る
oa-tool brain netは、opset 11〜21のONNXモデルを読み、.oannを書きます。ガイドに載っているコマンドは次のとおりです:
oa-tool brain net MODEL.onnx --calibrate DATA [--out FILE] [--weights int8|int16] [--max-difference X] [--force] [--json]
--weights int16を指定しない限り、重みはint8です。--calibrateはJSON Linesのファイルです。レポートは、各出力の最大の差、またはargmaxが一致したサンプルの割合です。--max-differenceを付けると、それより大きい差は拒否され、何も書かれません。ファイルはsha256とともにnetworksに記載します。中身のハッシュは、そのダイジェストと一致する必要があります。
上限
ファイル、実行、記録は、次のサイズに収まります。
| 上限 | 値 |
|---|---|
| .oannファイル | 最大64 MiB |
| 1ファイル内のテンソル | 2〜4,096 |
| 1ファイル内のレイヤー | 1〜1,024 |
| テンソルの階数と、1つの次元 | 階数1〜4、次元1〜65,535 |
| ファイル内のテンソル1つの要素数 | 最大16,777,216 |
| dense、conv2d、embeddingの重みの合計 | 最大8,388,608要素 |
| 1回の実行で行える演算 | 最大268,435,456 |
| ネットワークのメモリ(Luaの上限とは別) | 64 MiB(67,108,864バイト) |
| brain.tensor1つに入る数 | 1〜4,194,304 |
| brain.grid | レイヤー名1〜10個、サイズ8、16、32、64、128。既定は64 |
| brain.record1回と、記録ファイル | テンソル1〜16個、最大4,194,304要素。ファイルは1 GiBで止まる |
プレイヤーに見えるもの
ライブラリは、重みを持つブレインにネットワークのラベルと、学習済みネットワークを使用({size})という行を付けます。項目には、ブレインのレベル、対応するもの、全視界の有無も表示されます。内蔵コンピューターは常に一覧の先頭にあり、プレイヤーが別のものを選ぶまで既定のままです。