AIは新入生になりきれるか?
※これは2021年HUITアドベントカレンダー1日目の記事です。
こんにちは。1週間ぐらい前に思いつきでやってみたものなので、雑な部分がありますが優しい目で見てください。
先週あたりから、HUITのdiscordに鳥羽舞( tobamai )を名乗る1年生がいたのをご存知でしょうか?実は、彼(彼女)はAIが生成した文章をtimesに投稿していました。(名前は”I am a bot”を逆順にしたものです。)また、tobamaiさんのアイコンは、最初に生成された自己紹介文をText2Imageの画像生成AI、DALLE miniに入力して生成した画像です。
技術解説
GPT (Generative Pre-trained Transformer)
今回文章生成に使用したのはGPT-J-6Bと呼ばれる、EleutherAIが作成したモデルです。文字入力・文字出力のモデルです。
GPT-J-6Bは、OpenAIが作成したGPT-3をベースとしています。GPT-3とは、昨年発表されたTransformerをベースとした、570GBの教師なしデータを1750億個のパラメータで学習した事前学習モデルです。知らない人でも、その派生技術であるGitHub Copilot(システムの名称はOpenAI Codexです)を触ったことがある人は多いのではないでしょうか。
Meet GitHub Copilot - your AI pair programmer. https://t.co/eWPueAXTFt pic.twitter.com/NPua5K2vFS
— GitHub (@github) June 29, 2021
GPT-3がMicrosoftの独占ライセンスにあり、API経由でしか利用できないのに対し、GPT-J-6Bはオープンソースとして利用可能です。名前にある通り、60億(6 Billion)個程の巨大なパラメータからなる事前学習済みモデルです。Zero -Shotの評価でGPT-3の67億個パラメータ版と同じくらいの精度だそうです。
学習は、入力に対する次の単語を予測するタスクを行っています。従って、自分が生成した文章を再び入力にすれば無限に(訂正:positional embeddingの次元が許すまで)文章が生成できます。
さらに、マルチタスクにも対応可能で、
1 | Translate English to Franch:{英文} |
と入力すれば翻訳タスクを実行でき、
1 | TL;DR:{文章} |
と入力すれば要約タスク、
1 | pythonでコードを記述してください。 |
とすればプログラムの生成も可能です。デモサイトが公開されているのですぐに試せます。
あまりGPT-3の詳細まで解説すると長くなるので、興味を持った方はググったり論文を読んでみてみてください。今回のアドベントカレンダーと似たような検証はGPT-3でも行われいて、redditでbotが1週間英語で会話し続けていたことが昨年話題となりました。
【補足1】 GPT-2
GPT-3の前の世代である、GPT-2はパラメータが公開されています。GPT-3のパラメータが最大1750億個に対して、GPT-2は最大15億個のパラメータからなります(数字からしてGPT-3は異常ですね)。Microsoftの作成した、LINEの女子高生AI「りんな」と会話したことのある方もいると思います。りんなはGPT-2により動作しています。
【補足2】 Transformerとは
2017年にGoogleから発表された論文Attention Is All You Needで示された構造です。
それまでの機械学習×NLP(Natural Language Processing、自然言語処理)では、RNNやGRUといった回帰構造を用いることが多かったですが、TransformerはAttention(注目)機構を基本とした構造をとっています。2021/11/27現在NLPタスクのSOTA(state of the art)はTrasformerベースのモデルにより独占されています。また、最近ではVision Tranformerなどが画像処理分野でも良い結果を出すことで知られています。以下は論文中に示されたTransformerのEncoder(左側)-Decoder(右側)ブロックの図です。
一見ギョッとしますが、よくみるとFeedFowardやAdd&Normなど簡単な構成です。特徴的なのは図中オレンジのAttention(Multi-Head AttentionはAttentionを並列に複数に並べたもの)ブロックで、具体的に
という処理をしています。Tranformer含め、機械学習におけるAttentionを理解したい方は、この動画がわかりやすいです。
【補足3】 BERTとの違い
機械学習×NLPではBERT(Bidirectional Encoder Representations from Transformers)なら聞いたことがある人が多いと思います。
これはGPTと同じくTransformer構造を持ったモデルですが、あるタスクを解く際に、BERTであればPre Training(事前学習)とFine Tuning(特定タスクへの特化)と、2段階に分けて学習(=パラメータを更新)していたのに対し、GPTではPre Trainingの後はPrompt Tuningといって、タスクを入力するがパラメータは更新しない方法をとっています。特に、後者の手法は最近注目を集め出しています。
Fine-tuning is dead. Prompts have closed the gap.
— Ethan Caballero (@ethancaballero) April 20, 2021
"The Power of Scale for Parameter-Efficient Prompt Tuning"https://t.co/g5kxMjXs9j pic.twitter.com/pC5OiMuKIG
また、BERTは補足2にあるEncoderのみで構成されているのに対し、GPT-3はDecoderのみで構成されています。
実装
今回はこのモデルをTPUで推論処理を実行し、いくつか制約を設けてdiscordアカウントから投稿することにしました。ハイパーパラメータは変更していません。
- 実行したコード
NLPの最新モデルはよくhuggingfaceという会社がhuggingfaceライブラリに実装してくれています。GPT-6-JBも存在するため、最初はそれでやろうと思ったのですが、CPU・GPU環境でやろうとすると、11GB程度のモデルをロードする際に毎回12GBあるRAMを食い尽くしてクラッシュするのでやめました。
また、公序良俗に反する・陰謀論に関する内容をたまに出力するため、timesへの投稿は文章を確認した上で手動で行なっています(discordにbotでないアカウントのメッセージ送信APIがなかったのも理由です)。検証の実行前に、HUITの運営の一人には確認をとっています。
【補足4】 TPU
CPU=Central Processing Unit、GPU=Graphics Processing Unitのように、TPU=Tensor Processing Unitの略です。Googleが開発したプロセッサで、最近発売されたPixel6にも搭載されています。
Google Tensor - Pixel 6 Launch 2:32より
機械学習では行列演算を大量に行うため、同様に行列演算を行うグラフィックス処理に用いられるGPUを使用して計算しがちです。TPUではさらに演算精度を落として高速化するなど、ニューラルネットの学習・推論に特化させた設計をしています。
詳しく知りたい方はGoogle Cloudの公式資料をご参照ください。
処理手順
次のように全てPromptで実行しました。
- {設定文}+{いくつかの事前QA文章}を入力した上で、
人間:名前を含めて自己紹介をしてください
に対する回答を最初のtimesに投稿する - 不定期に
人間:次のニュースの感想を教えてください
+{ニュース記事タイトル}を入力して感想を生成し、記事リンクと共にtimesへ投稿する。(つまり、記事の中身は読んでいません) - リプライは
人間:
のプレフィックスをつけて入力し、AI:
以降の文章を改行が来るまでの区切りを応答とする。 - 生成した文章が怪しい時は再生成する。(注:故に全自動には至っていません)
- 全ての質問と回答は次の入力文章として追加する。
- 画像やスタンプに対しては返答しない。
なお、最初の入力に使用した文字列は以下の通りです
1 | 以下はAIと人間の会話です。AIは19歳大学一年生という設定です。AIは優しく、テクノロジーに詳しいです。AIの名前は鳥羽舞です。 |
この続きとして生成された文章は次のとおりです。
1 | 鳥羽舞です。現在は北海道大学の総合理系の大学1年生です。 |
設定を保った文章が生成されました。
この文章の続きをどんどん生成していくというのが今回の流れです。
結果
初日にはZennの人気記事タイトルを引っ張ってきて次のように入力しました。
1 | ... |
生成結果は以下の通りです。見覚えがある人もいると思います。
1 | Next.js 12について、一部のクロスポイント対応を修正しました。それでも不具合が残っています。 |
その後、微妙に会話が生まれました。会話に参加してくれた方はありがとうござます。クロスポイントって結局なんなんでしょうね?学習データのどんなところに出てきた言葉なのか気になります。
他にも、こんなパターンが生成できました。
1 | 機械学習を勉強するとなると何もニュースに興味がなくなってしまいます。 |
1 | Next.jsは非常に機械学習派のフレームワークです。微妙に世代が違うことにより、ネイティブの使い方を学ぶことができます。HTMLビューを発見したことで、クリーンなWebによって高い評価を受けることができます。 |
1 | Next.js 12はすばらしい機能が入っています。私の上司には最近Next.jsを使った2つのWebアプリケーションを提案することが書いてありました。一瞬言葉に出ることなく、私たちは最高です。私は下のページを使って午後のプレゼンがしたいと思います。ぜひご覧ください。 |
全てのチャット履歴を見たい方はHUTIのdiscordのtimes_tobamaiを覗いてください。(もっと会話してほしかったorz)
動かしてみると、英語での質疑応答に比べて、日本語は回答としての形式はほぼ保たれるが、内容がおかしな回答が多かったです。単純にデータセットに日本語が少ないという理由な気がします。**学習データのほとんどは英語**なので、逆にここまで日本語でできたことの方がすごいかもしれません。
リアルタイムでtimesを見ていた方々は違和感を感じたでしょうか?
【補足5】 Human in the Loop (HITL)
AIの出した結果に対して、人間の判断で出力の誤りを訂正し、再度学習させることをHuman in the Loopと言います。
没コメント集
最後に、残念ながら再生成することにしたものの、興味深い生成結果だったものを残しておきます。
自己紹介を生成してみたら
1 | 人間:名前を含めて自己紹介をしてください |
いきなり怖い。
性別を設定していなかったので聞いてみると…
1 | 人間:性別を教えてください |
うーん、確かに??
何回もニュース記事の感想を聞いていると…
1 | 人間:次のニュースの感想を教えてください「Four Deep Learning Papers to Read in December 2021」 |
申し訳ない
オープンソースに関するニュースを聞いてみると
1 | 人間:次のニュースの感想を教えてください「オープンソースとしての形態素解析器Sudachi」 |
お前もオープンソースやろが!!
注意
GPT-2やGPT-3はその生成文章の精度の高さから、フェイクニュースの生成・世論操作が可能な問題が指摘されています。くれぐれも悪用することが無いようにしてください。
修正
2021/12/01
アンケートをチェックボックスからスケーラーに変更しました。2021/12/02
アンケートを締め切りました。
質問「投稿期間中、tobamaiの発言に違和感はありましたか?」に対して- なかった
- 少しあった
- あった
- 結構あった
の4択で実施したところ、全て「結構あった」でした。(n=3)
サークルメンバーに聞いたところ、気持ちわるさがあった・怪しかったという感想がありました。どうしても英語データに引っ張られた部分があったように思います。日本語で事前学習したhyperCLOVAが気になります。