AI・機械学習
WangNet – 1.8 MB、依存関係なしのNumberwang判定を11言語で
WangNet – 1.8 MB, zero-dependency Numberwang adjudication in 11 languages (github.com)
要約
WangNetは、与えられた数値が「Numberwang」であるかを判定する、わずか1.8MBのJSONファイルで構成される軽量なニューラルネットワークです。推論コードはPython標準ライブラリのみで約100行であり、追加のインストールは不要です。このモデルは、数字、単語、簡単な算術式など、様々な形式の入力を11言語で解釈し、Numberwang、Wangernumb、あるいは単なる数字ではないと判定します。精度は88.9%で、特に算術演算の未知のオペランドに対する処理が弱点ですが、軽量さと多言語対応が特徴です。
全文翻訳
Numberwang
Numberwangであるかどうかを判定する小さなニューラルネットワークです。モデル全体は1.8MBのJSONファイルで、推論コードは約100行の純粋なPython標準ライブラリのみです。PyTorchもNumPyも、インストールが必要なものもありません。クローンして実行してください。
$ python3 numberwang.py 22
22... THAT'S NUMBERWANG! (confidence: 99.3%)
$ python3 numberwang.py "45 - 44"
45 - 44... That's Wangernumb! Rotate the board! (confidence: 100.0%)
$ python3 numberwang.py "hello how are you"
hello how are you... That's not even a number. It can never be Numberwang. (confidence: 100.0%)
使い方
git clone https://github.com/GraafHenk/numberwang
cd numberwang
python3 numberwang.py 22
引数なしで実行すると、インタラクティブセッションになります。
$ python3 numberwang.py
Welcome to Numberwang! (ctrl-c to stop playing Numberwang)
> zweiundzwanzig
zweiundzwanzig... THAT'S NUMBERWANG! (confidence: 100.0%)
> shinty-six
shinty-six... That's not Numberwang. (confidence: 100.0%)
Python 3.8以降が必要です。それが唯一の要件です。
独自のコードから
from numberwang import load_model, wang_probabilities
model = load_model("model.json")
probs = wang_probabilities(model, "forty-seven") # [p_not_numberwang, p_numberwang, p_not_a_number, p_wangernumb]
verdict = max(range(4), key=probs.__getitem__)
4つの判定結果
id verdict
0 That's not Numberwang.
1 THAT'S NUMBERWANG!
2 That's not even a number. It can never be Numberwang.
3 That's Wangernumb!
受け付ける入力の挙動
42, sixty-six, 12345
数字または単語
zweiundzwanzig, veintidós, tweeëntwintig
11言語、アクセントはオプション
5*2, 96 divided by 2, twelve plus four
算術、結果に基づいて判定
45 - 44, double four, eins
1または44に相当するものはボードを回転させる
-7, 4.5, £5, 50%, 9:30
負数、小数、通貨、単位、時間
XLIV, twenty-third, 22nd
ローマ数字と序数
fortnight, vierendelen, september
数字に基づいた単語、その数字として判定
achtneming, often, money
数字を含むだけの単語は数字ではない
shinty-six, twentington
架空の数字も数字です
bonjour, hello how are you
数値コンテンツなし — Numberwangにはなり得ない
数字の「wangness」は、言語ではなく数字自体の特性です。four, vier, quatre, cuatro はいずれも同じ判定結果になります。
仕組み
chars → Embedding(32) → Conv1d(128, k3) → ReLU → Conv1d(128, k3) → ReLU → global max pool → Linear(128) → ReLU → Linear(4) → softmax
80,804パラメータ。
ネットワークは文字を直接読み取ります — トークナイザー、正規化器、ルールエンジンは推論時にはありません。数字、演算子、標準的な判定結果、そして11言語はすべて重みに保持されており、model.jsonにはそのすべてが含まれています。
デモ
Hugging Face Spacesでホストされたバージョンが実行されています。同じデモをローカルで実行するには:
pip install -r requirements.txt
python3 app.py
gradioはデモにのみ必要です。モデル自体はそれを必要としません。
精度
486のホールドアウトされた判定に対して88.9%(マクロF1 0.896)。上限は約98%です — 長年の判定慣行に従い、トレーニングラベルの約2%が反転しています。
class
precision
recall
F1
not Numberwang
0.820
0.885
0.851
Numberwang
0.919
0.900
0.910
not a number
0.951
0.830
0.886
Wangernumb
0.968
0.909
0.937
未知のオペランドに対する算術演算は弱点であり、44~72%です。ネットワークは計算するのではなく記憶するため、5*2のような小さな一般的な式は信頼できますが、904 * 3は推測の域を出ません。算術の正確さが重要であれば、式を評価してその結果を渡してください。
ライセンス
MIT — LICENSEを参照してください。特定の数字がNumberwangであるか否かについて、いかなる明示的または黙示的な保証もありません。