日本語に強い大規模言語モデル「Swallow」が12月19日に公開された。私(安岡孝一)にとっても、うれしいクリスマス・プレゼントだ。東工大ニュースによれば、以下のような特長があるらしい。
研究チームはLlama 2のトークナイザに16,000件の日本語のトークンを追加することで、日本語テキストのトークン長を56.2%に削減した。
すばらしい。Swallow-7b-hfを、ちょっと試してみよう。
>>> from transformers import AutoTokenizer
>>> tkz=AutoTokenizer.from_pretrained("tokyotech-llm/Swallow-7b-hf")
>>> print(tkz.convert_ids_to_tokens(tkz("国境の長いトンネルを抜けると雪国であった。","夜の底が白くなった。")["input_ids"]))
['<s>', '▁', '国境', 'の', '長い', 'トンネル', 'を', '抜ける', 'と', '雪', '国', 'で', 'あっ', 'た', '。', '<s>', '▁', '夜', 'の', '底', 'が', '白く', 'なっ', 'た', '。']
国語研短単位より少しだけ短めになっていて、いいセンだ。2021年12月26日の日記にも書いたのだが、下手に「くなった」とかが1トークンになってしまったりすると、非常に扱いに困るので、その点「Swallow」は好感が持てる。では、常用漢字表2136字は、どの程度サポートしているのだろう。
>>> import urllib.request
>>> with urllib.request.urlopen("https://www.unicode.org/wg2/iso10646/edition6/data/JapaneseCoreKanji.txt") as r:
... k=[chr(int(t,16)) for t in r.read().decode().strip().split("\n") if not t.startswith("#")]
...
>>> for i,j in zip(k,tkz(k)["input_ids"]):
... if len(j)>3:
... print(i,tkz.convert_ids_to_tokens(j))
...
丙 ['<s>', '▁', '<0xE4>', '<0xB8>', '<0x99>']
倹 ['<s>', '▁', '<0xE5>', '<0x80>', '<0xB9>']
儒 ['<s>', '▁', '<0xE5>', '<0x84>', '<0x92>']
剝 ['<s>', '▁', '<0xE5>', '<0x89>', '<0x9D>']
劾 ['<s>', '▁', '<0xE5>', '<0x8A>', '<0xBE>']
勅 ['<s>', '▁', '<0xE5>', '<0x8B>', '<0x85>']
厘 ['<s>', '▁', '<0xE5>', '<0x8E>', '<0x98>']
吏 ['<s>', '▁', '<0xE5>', '<0x90>', '<0x8F>']
嘲 ['<s>', '▁', '<0xE5>', '<0x98>', '<0xB2>']
塡 ['<s>', '▁', '<0xE5>', '<0xA1>', '<0xA1>']
墾 ['<s>', '▁', '<0xE5>', '<0xA2>', '<0xBE>']
婿 ['<s>', '▁', '<0xE5>', '<0xA9>', '<0xBF>']
嫡 ['<s>', '▁', '<0xE5>', '<0xAB>', '<0xA1>']
帥 ['<s>', '▁', '<0xE5>', '<0xB8>', '<0xA5>']
庸 ['<s>', '▁', '<0xE5>', '<0xBA>', '<0xB8>']
弐 ['<s>', '▁', '<0xE5>', '<0xBC>', '<0x90>']
恣 ['<s>', '▁', '<0xE6>', '<0x81>', '<0xA3>']
慄 ['<s>', '▁', '<0xE6>', '<0x85>', '<0x84>']
憬 ['<s>', '▁', '<0xE6>', '<0x86>', '<0xAC>']
憾 ['<s>', '▁', '<0xE6>', '<0x86>', '<0xBE>']
拷 ['<s>', '▁', '<0xE6>', '<0x8B>', '<0xB7>']
斤 ['<s>', '▁', '<0xE6>', '<0x96>', '<0xA4>']
斥 ['<s>', '▁', '<0xE6>', '<0x96>', '<0xA5>']
朕 ['<s>', '▁', '<0xE6>', '<0x9C>', '<0x95>']
楷 ['<s>', '▁', '<0xE6>', '<0xA5>', '<0xB7>']
殉 ['<s>', '▁', '<0xE6>', '<0xAE>', '<0x89>']
沃 ['<s>', '▁', '<0xE6>', '<0xB2>', '<0x83>']
淫 ['<s>', '▁', '<0xE6>', '<0xB7>', '<0xAB>']
漸 ['<s>', '▁', '<0xE6>', '<0xBC>', '<0xB8>']
璽 ['<s>', '▁', '<0xE7>', '<0x92>', '<0xBD>']
畏 ['<s>', '▁', '<0xE7>', '<0x95>', '<0x8F>']
痘 ['<s>', '▁', '<0xE7>', '<0x97>', '<0x98>']
糾 ['<s>', '▁', '<0xE7>', '<0xB3>', '<0xBE>']
繭 ['<s>', '▁', '<0xE7>', '<0xB9>', '<0xAD>']
罷 ['<s>', '▁', '<0xE7>', '<0xBD>', '<0xB7>']
羞 ['<s>', '▁', '<0xE7>', '<0xBE>', '<0x9E>']
舷 ['<s>', '▁', '<0xE8>', '<0x88>', '<0xB7>']
虞 ['<s>', '▁', '<0xE8>', '<0x99>', '<0x9E>']
衷 ['<s>', '▁', '<0xE8>', '<0xA1>', '<0xB7>']
詔 ['<s>', '▁', '<0xE8>', '<0xA9>', '<0x94>']
諧 ['<s>', '▁', '<0xE8>', '<0xAB>', '<0xA7>']
諮 ['<s>', '▁', '<0xE8>', '<0xAB>', '<0xAE>']
謁 ['<s>', '▁', '<0xE8>', '<0xAC>', '<0x81>']
賂 ['<s>', '▁', '<0xE8>', '<0xB3>', '<0x82>']
迭 ['<s>', '▁', '<0xE8>', '<0xBF>', '<0xAD>']
逓 ['<s>', '▁', '<0xE9>', '<0x80>', '<0x93>']
錮 ['<s>', '▁', '<0xE9>', '<0x8C>', '<0xAE>']
陪 ['<s>', '▁', '<0xE9>', '<0x99>', '<0xAA>']
頒 ['<s>', '▁', '<0xE9>', '<0xA0>', '<0x92>']
頰 ['<s>', '▁', '<0xE9>', '<0xA0>', '<0xB0>']
𠮟 ['<s>', '▁', '<0xF0>', '<0xA0>', '<0xAE>', '<0x9F>']
2136字のうち51字が、バイトフォールバックしてしまう。もし、これらの常用漢字が必要なタスクだと、精度が下がる可能性があるので、注意が必要だろう。