フリーの13Bモデル Cerebras-GPT-13BとGPT4-x-Alpacaをローカルで試す
四月に入って、エイプリルフールのネタをHuggingFaceでやるという不届き者も現れたが、いくつか本物のニュースが混じっているから気が抜けない。
Cerebras-GPTは、完全にフリーのGPTモデルを標榜している。
ドスパラ製Memeplexマシン(A6000x2,256GBRAM,20TBHDD)で実際にこの大規模言語モデルをダウンロードして試してみた。
まずは1.3Bモデル
>>> model = AutoModel.from_pretrained("cerebras/Cerebras-GPT-1.3B")
Downloading (…)lve/main/config.json: 100%|█████████████████████| 360/360 [00:00<00:00, 29.3kB/s]
Downloading pytorch_model.bin: 100%|███████████████████████| 5.36G/5.36G [03:05<00:00, 28.9MB/s]
>>> tokenizer = AutoTokenizer.from_pretrained("cerebras/Cerebras-GPT-1.3B")
>>> pipe = pipeline("text-generation", model=model, tokenizer=tokenizer)
>>> pipe("富士山の高さは?", max_length=50, do_sample=False, no_repeat_ngram_size=2)[0]
{'generated_text': '富士山の高さは?\n\n「おそらくどうしてもいいんだろう」\n \nみんなに悲しいのは、'}
富士山の高さについて聞いてみるとどうもハッキリしない。
次に6.7Bのモデルにアップグレードしてみる
>>> model = AutoModelForCausalLM.from_pretrained("cerebras/Cerebras-GPT-6.7B")
Downloading pytorch_model.bin: 100%|███████████████████████| 26.8G/26.8G [16:08<00:00, 27.6MB/s]
>>> pipe = pipeline("text-generation", model=model, tokenizer=tokenizer)
>>> pipe("How tall of mount Fuji?", max_length=50, do_sample=False, no_repeat_ngram_size=2)[0]
Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.
{'generated_text': "How tall of mount Fuji?\n\nI'm trying to find the height of Mount Fuji. I've tried using Google Earth, but it doesn't seem to be working.\nDoes anyone know how to do this? I'm using Windows 7."}
「How tall of mount Fuji?」と聞くとこんな答え
GoogleEarthを使おうとしたけどWindows7だから動かないそうだ。古すぎる。
アメリカ大統領は誰か聞いてみる
>>> pipe("Who is the president of United States?", max_length=50, do_sample=False, no_repeat_ngram_size=2)[0]
Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.
{'generated_text': 'Who is the president of United States?\n\nDonald Trump is president.\nHe is a billionaire real estate developer,\nwho has been in politics for decades. He is\nthe first president to be elected without\na political party affiliation. Trump'}
トランプだそうだ。
ちょっと専門的なことを聞いてみよう。WYSIWYGについて
説明はあってる。しかしもういまどきWYSIWYGとか言わないよな。当たり前すぎて
でもWYSIWYGがWhat You See Is What You Getの頭字語だということくらいは説明してほしいものだ。
ラブストーリーを作らせてみる。
翻訳はGoogle翻訳
シン仮面ライダーでも見たのかという泥試合。
7Bは限界っぽいので13Bモデルで試してみよう
>>> tokenizer = AutoTokenizer.from_pretrained("cerebras/Cerebras-GPT-13B")
>>> model = AutoModelForCausalLM.from_pretrained("cerebras/Cerebras-GPT-13B")48<15:33, 27.1MB/s]
Downloading (…)l-00001-of-00002.bin: 100%|█████████████████| 29.7G/29.7G [17:48<00:00, 27.8MB/s]
Downloading (…)l-00002-of-00002.bin: 100%|█████████████████| 21.9G/21.9G [12:47<00:00, 28.5MB/s]
Downloading shards: 100%|████████████████████████████████████████| 2/2 [30:54<00:00, 927.05s/it]
Loading checkpoint shards: 100%|██████████████████████████████████| 2/2 [00:44<00:00, 22.35s/it]
>>> pipe = pipeline("text-generation", model=model, tokenizer=tokenizer)
>>> pipe("What is WYSIWYG", max_length=50, do_sample=False, no_repeat_ngram_size=2)[0]
Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.
{'generated_text': 'What is WYSIWYG?\n\nWYSISWIG is a term used to describe a user interface that is designed to be used by a human. It is also known as a "front-end" interface.\nThe'}
WYSIWYGについて再び聞いてみた。
もうちょっと洗練された気がしたが50トークンでは少なすぎたか。
ラブストーリーを作らせてみる
>>> pipe("make love story of Taro and Hanako.They live in Tokyo", max_length=500, do_sample=False, no_repeat_ngram_size=2)[0]
こんな物語が出てきた。翻訳はGoogle
7Bのときよりもマシになったが面白さはそこまでではない。
不思議なことに何度試しても同じ物語しか出てこない。シードが固定されてる?
GPT4の出力をAlpacaデータセットでファインチューニングした、「GPT4-x-Alpaca-7B」もダウンロードできるようになっていたので試してみた。
>>> tokenizer = AutoTokenizer.from_pretrained("chavinlo/gpt4-x-alpaca")
Downloading (…)okenizer_config.json: 100%|█████████████████████| 329/329 [00:00<00:00, 96.7kB/s]
Downloading tokenizer.model: 100%|███████████████████████████| 500k/500k [00:00<00:00, 8.95MB/s]
Downloading (…)in/added_tokens.json: 100%|███████████████████| 20.0/20.0 [00:00<00:00, 5.77kB/s]
Downloading (…)cial_tokens_map.json: 100%|███████████████████| 96.0/96.0 [00:00<00:00, 32.6kB/s]
>>> model = AutoModelForCausalLM.from_pretrained("chavinlo/gpt4-x-alpaca")
Downloading (…)lve/main/config.json: 100%|██████████████████████| 535/535 [00:00<00:00, 162kB/s]
Downloading (…)model.bin.index.json: 100%|██████████████████| 33.4k/33.4k [00:00<00:00, 178kB/s]
Downloading (…)l-00001-of-00006.bin: 100%|█████████████████| 9.96G/9.96G [05:26<00:00, 30.5MB/s]
Downloading (…)l-00002-of-00006.bin: 100%|█████████████████| 9.94G/9.94G [05:39<00:00, 29.3MB/s]
Downloading (…)l-00003-of-00006.bin: 100%|█████████████████| 9.94G/9.94G [05:30<00:00, 30.1MB/s]
Downloading (…)l-00004-of-00006.bin: 100%|█████████████████| 9.87G/9.87G [06:07<00:00, 26.8MB/s]
Downloading (…)l-00005-of-00006.bin: 100%|█████████████████| 9.87G/9.87G [05:25<00:00, 30.3MB/s]
Downloading (…)l-00006-of-00006.bin: 100%|█████████████████| 2.49G/2.49G [01:37<00:00, 25.6MB/s]
Downloading shards: 100%|████████████████████████████████████████| 6/6 [30:26<00:00, 304.49s/it]
Loading checkpoint shards: 100%|██████████████████████████████████| 6/6 [00:21<00:00, 3.64s/it]
Downloading (…)neration_config.json: 100%|█████████████████████| 137/137 [00:00<00:00, 36.9kB/s]
>>> pipe = pipeline("text-generation", model=model, tokenizer=tokenizer)
>>> pipe("make love story of Taro and Hanako.They live in Tokyo", max_length=2000, do_sample=False, no_repeat_ngram_size=2)
するとこんなストーリーが出てきた。
GPT-4のおかげなのか、わりと読めるストーリーが出てきた。
ただ、大切なのは、たとえ拙いものであっても、CerebrasやBloomのように「非OpenAIな」大規模自然言語モデルがあれば、Alpacaデータセットの「OpenAI規約汚染」されていないものが作れそうということだ。AlpacaデータセットはOpenAIの規約である「OpenAIに対抗するものを作ってはならない」に抵触するので完全に自由なデータセットにはなれない。AlpacaデータセットをつくるためにOpenAIのGPT3を使っているからだ。
ただ、この規約もけっこう解釈は微妙で、たとえばそうとは知らせずブログやニュースの文章をGPT4で生成していて、それをそうとは知らないクローラーがクロールしてPileのようなオープン大規模データベースに取り込み、学習してしまった場合、誰が規約違反をしたことになるのか曖昧だ。
生成された文章がAI由来のものかどうか判断する方法がいまのところほぼない。なんかそれっぽいサービスを作ったと主張する人がいるのは知っているが、原理的にAIによって生成された文章なのか、学習したもとの文章なのか、完全に判別するのはほとんど不可能に近い。生成過程にランダム性が含まれるためで、これは実はメディア業界が長年不文律として扱ってきた問題にも関係する。
メディア業界では、「原稿には著作権があるが、事件そのものには著作権はない」という前提で動いてきた。
たとえば、Aという人がXという事件を起こしたとする。
このXという事件を最初に報道したのがα新聞だとすると、α新聞を見て事件を知ったβ新聞が、α新聞の記事をまるごと写すのは盗作だが、α新聞に載っている事件が起きているようだと報じるのはセーフである、という考え方だ。
「α新聞がXという事件を報じています」ということを他の媒体が伝えてもα新聞の著作権を侵害したことにはならない、という解釈だ。
これはたとえば「リリース起こし」などでも日常的に行われている。
誰かがニュースXを報じた時、報じられた内容そのものは同一でも、表現が異なればそれは別々の著作物になる。
すると、AIが生成した文章にも同じことが言えて、内容が同じだったとしても、語順や強調される事柄が変化していれば、その二つがもともと同じ内容の事実を指摘していたかどうかは判断がつかない。
個人的には、この「語順選び」こそが実は売文業という仕事の本質だと思う。
言葉と言葉をつなぐ独特のリズムだけは著者固有のものであり、これをGPTのようなAIが表面だけなぞっても決して真似できない。というのは、当たり前だが、言葉には言外の意味が含まれているからである。
GPTの作り出す文章がまるで「人間が書いたみたいだ」と人々を錯覚させるのは、人間が生来的に持っている「行間を読む」能力が間違った方向に作用しているからだ。
知識がない人からすれば、GPTが紡ぎ出す文章は「まるで中に人がいるかのように」見えるのだが、それは「人がいるかのように見えるように振る舞う」というAIの性質に過ぎない。
直観的にAIを理解するために、AIが何であるか一言で説明すれば、AIとは「学習された鏡」である。
鏡は、たとえばそのままの状態では本物そっくりの景色を映す。
瞳の奥の奥、微小な毛細血管、何でも本物そっくりに映す。
ところが、鏡がそこに映るものを「理解」してると考える人は誰もいないはずだ。鏡は光を反射しているだけであり、そこに「何かがある」と考えているのは人間の方であって鏡ではない。
かといって、鏡が「考えてない」からといって役に立たないというわけではない。
人類にとってAIは、「情報とは何か」を学習した、瞬時に構造を理解不可能なほど複雑な構造の鏡である。
鏡が光を反射するように、AIは言葉を内部で乱反射させ、何かしら本物そっくりの言葉のようなものを返してくる。しかしそれは決して「理解された」ものではない。
鏡に映る現実が、まるで本物のように見えるのと同じように、十分学習されたAIの出力は、まるで本物の知性のように見える。
少なくとも「言葉を紡ぐAI」についてはこの説明で十分だろう。
というのも、「言葉を紡ぐAI」というのは、それが言葉を紡いでいるように見える以上、人類を超越するものにはなり得ないからだ。
だが実はAIにはもっと重要な側面、つまり人類をかるがると超越する側面がある。それが強化学習だ。
強化学習にとって、人類が作り出した「言葉」という概念はまるきり邪魔者である。
あってもいいが、なくてもいい。
道を歩いて駅に向かう時、道路の脇にススキが生えていてもいいが、生えてなくても全く問題ない。それが強化学習から見た人類である。
強化学習するAIは、ある目的を与えられると、その目的に向かって最適な方法を自分で見つけ出す。ここに人間の与える情報はほぼ必要ない。
強化学習AIにとって必要な外部リソースのは、「環境」と「評価」だけである。
この評価も、自動的に獲得するようにもできる。自発的な評価関数を持つAIのほうがそうでないAIよりも柔軟な発想をもてることがわかっている。たとえば「好奇心」を内在的な報酬として設計する例がある。
このような強化学習AIは、人間の情報に注意を払うAIよりもはるかに短時間で人類を超越することは何度も確かめられている。たとえば、AlphaGoの初期型は人類の棋譜を学習したが、人類の棋譜を学習することをやめ、完全にAIのみによる自己対戦で学習したAlphaGoZeroは、AlphaGoの能力をわずかな期間で上回った。つまり、人類の情報は囲碁というゲーム(環境)を攻略する上でノイズでしかなかったということだ。
「言葉を紡ぐAI」は、こうした「人間を超越する」強化学習AIと人間をつなぐインターフェースになることがある程度は期待されている。
要は、「待って、私の話を聞いて」と強化学習AIに語りかけるための手段として、いわばブレーキのような制動装置として、「言葉を紡ぐAI」を使うのである。
強化学習AIにとっても、「言葉を紡ぐAI」が人間の考えを映し取った鏡である以上、人間という感知不能なモノに対するインターフェースとして役立つ可能性がある。
けれども、強化学習AIにとって、人間に対してどうこうするというのは、そのように作られない限り永久に興味を持てない対象になる。まあもっとも、強化学習AIとて、「評価関数」を人間に与えられない限りは何もできない。
とりあえず今のところは。
こんな感じの話をシラスチャンネルの「シラス特別講義」ではやろうと思っています。また、日々僕がおこなっている実験のうち、公開可能なものはシラスチャンネル内の突発放送としてほぼ毎日やっています(これは都度課金可能な場合もある)。