HN 日本語サマリー

← 一覧へ戻る
AI・機械学習

WangNet – 1.8 MB、依存関係なしのNumberwang判定を11言語で

WangNet – 1.8 MB, zero-dependency Numberwang adjudication in 11 languages (github.com)

163 pointsby Liogra12358 コメント

要約

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判定
0That's not Numberwang.
1THAT'S NUMBERWANG!
2That's not even a number. It can never be Numberwang.
3That's Wangernumb!

受け付ける入力

入力挙動
42, sixty-six, 12345数字または単語
zweiundzwanzig, veintidós, tweeëntwintig11言語、アクセントは任意
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 Numberwang0.8200.8850.851
Numberwang0.9190.9000.910
not a number0.9510.8300.886
Wangernumb0.9680.9090.937

未知のオペランドに対する算術演算は弱点であり、44〜72%の精度です。ネットワークは計算するのではなく記憶するため、5*2 のような小さな一般的な式は信頼できますが、904 * 3 は推測の域を出ません。算術演算の正確さが重要であれば、式を評価し、その結果を渡してください。

ライセンス

MIT — LICENSE を参照してください。

特定の数値が Numberwang であるか否かについて、明示的または黙示的な保証はありません。