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 | 判定 |
|---|---|
| 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 はデモにのみ必要です。モデル自体は gradio を必要としません。
精度
486件のホールドアウトされた判定において、マクロF1スコア0.896で88.9%の精度を達成しました。上限は約98%ですが、トレーニングラベルの約2%は、長年の判定慣行に従って反転しています。
| クラス | 精度 | 再現率 | 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 であるか否かについて、明示的または黙示的な保証はありません。