Japan

関連リンク

関連リンク

関連リンク

関連リンク

サイト内の現在位置

AIでもう一人の自分を作ってみた!

2023年2月6日

はじめに

閲覧ありがとうございます。NEC AI・アナリティクス事業統括部の風間です。
普段は官公庁系分野を中心に、AIに携わるお仕事をしています。
突然ですが、皆さんはAIと聞いてどんなイメージを浮かべるでしょうか?
近年では、画像やイラストの自動生成、家電の制御、自動運転など、様々な分野でAIが活躍し始めています。
そんな現在注目のAIに対して私が常々抱いているのは、「AIと自然に会話したい」という思いです。

例えば、ドラえもんや鉄腕アトムのような、創作の世界に出てくるAIは人間と自然に会話していると思いますが、現実世界ではまだそこまでのAIは登場していないと思います。
私の夢は人の様に自然に会話できるAIを作ることであり、それに関連してお仕事では自然言語処理技術を扱ったり、プライベートでは言語分野のAIを使って遊んだりしています。

自分をAI化!?

ある日ふと思いついたのはLINEのトークデータを使って自分をAI化できないかというアイデアでした。LINEなどのSNSを利用している人にとって、誰かとの会話履歴というデータは、身近にある大変貴重なテキストデータです。今回はこのLINEのトークデータ(自分と誰かのやり取り)に対し、文書を生成してくれるAIである「GPT-2」を用いることで、自分をAIで再現してみようと考えました。もし自分をAIで再現したら、どんな会話をしてくれるのか?親しい人は本物かAIか気づくのか…? 好奇心が止まりません。
(安直ですが、ここからは自分を再現したAIを「風間AI」と名付けます(笑))

どうやって自分を再現する?

LINEのトークデータとAIでどうやって自分を再現するのか?という点ですが、やり方は意外にシンプルです。例えば、友達とのある会話を以下の例に出します。


友達:「今日どうする?」
自分:「カラオケいこうー!」
友達:「おっけー、何時にする?」
自分:「18時集合で!」


会話データから自分を再現するために必要なことは、「ある文章に対して、自分はどんな文章を返すか」を学習することです。例文を見ると、「今日どうする?」という友達の文章に対して、自分は「カラオケいこうー!」という文章を返しています。つまり、「今日どうする?」という文章が来ると、「カラオケいこうー!」というようにどこかに行く誘いを返してくるような傾向があるということがわかります。同様に、「おっけー、何時にする?」という文章に対しては「18時集合で!」というような集合時間を指定する文章を返す傾向があることがわかります。このようにある文章に対する返答の傾向を1対1形式でいくつも学習させることで、その人物のような文章を生成してくれるAIが出来上がるという仕組みです。データ量が多ければ多いほどより精度よく学習してくれることが期待できます。

このような文章生成AIの中でも有名なものが、OpenAI社が発表したGPT-2というAIです。GPT-2は当時、開発陣から「あまりにも高度な文章が作成でき、危険過ぎる」と危惧され論文公開が延期、また、開発された4つのモデルも一度に公開せずに、2019年2月、5月、8月と段階的に公開したことで話題となりました。

現在は改良版であるGPT-3や、GPT-3.5をベースとした会話特化のAIであるChatGPTも登場し、非常に話題となっています。今回これらを使用しなかった理由はいくつかあります。ひとつは実行当時GPT-3には使用申請が必要な点でした。今回は遊びの一環として手っ取り早く試してみたかった為、申請なしで使用できるGPT-2を選択しました。もう一つの理由としては、ChatGPTでは自分流にカスタマイズ(自前のデータでファインチューニング)することが現状できないという点です。ChatGPTは会話AIとして非常に優秀ですが、今回のように個人の会話データを用いて、その人間を再現するといった目的には沿いません。こういった理由から、今回はGPT-2を採用することとしました。会話AIとして非常に優秀なChatGPTでは現状不可能な、GPT-2で個人を再現できるかという点に注目です。

全体の流れ

全体の流れは以下の通り。

  • 協力者(Iさん)とのLINEトークデータ取得
  • GPT-2用にデータ加工
  • 「協力者(Iさん)のトーク」を入力、「風間のトーク」を出力としてGPT-2で学習
  • 出来たモデルを基に、文書生成用関数を作成
  • 実行(何か文を入力すると風間っぽい文を返してくれるAIができるはず…。)

環境とデータについて

環境とデータは以下の通り。

  • 環境:Google Colab Pro
  • モデル:GPT-2
  • 協力者:Iさん(変な遊びしてるねと笑われました泣)
  • データ:風間とIさんのLINEトーク履歴
  • データ期間:2014.11~2022.10
  • トーク件数:約18万件(文字数:約180万文字)
    • データ加工概要:
      スタンプ、通話、写真送付、メッセージ取り消し は除外
      GPT-2のファインチューニング用に加工

幸運なことに付き合いの長いIさんとのトークデータ8年分が存在していたので、データ量が割と確保できています(もっと欲しいところですが…。)
このデータを作って自分をAI化してみます。
また、LINEのトークデータはアプリ内から以下の手順で簡単にテキストデータとして抽出することができます。(以下、トークデータ抽出方法です。)

  • トーク画面の「その他」をタップ
  • 「トーク履歴を送信」をタップ

AIとは別で、抽出したデータを分析することで、年間のトーク件数推移や、頻出ワードなど様々な可視化ができ、とても面白いのでおすすめです。(恥ずかしいので見せられませんが…。)

データ加工について

データが抽出できたら、GPT-2で学習できる形にするための加工を行います。
加工方法は以下の通りです。

1会話ごとに「Iさん(入力)」「風間(出力)」となるように1対1対応させた塊をどんどん結合していき、最終的にひとつのテキストデータにします。
ここで<s>や[SEP]などの記号が出てきますが、これは「文の冒頭」や「文と文の切れ目」などを表すもので、Special Tokenと呼ばれています。今回使用したものを以下に列挙します。(他にも気になる方はぜひ調べてみてください。)

  • <s>:bos_token: 文の先頭(Begin of sequence token)
  • </s>:eos_token: 文の末尾(End of sequence token)
  • [SEP]:文と文の区切り目(The separator token)

データ加工が終わったら学習を行い、いよいよ風間AIの完成です。

完成!!早速会話してみよう!

まずは名前を聞いてみましょう!
私がIさんとなって文章を入力し、風間AIの返答を確認します。
風間AIなので「風間だよ」などと返ってきて欲しいところですが…。
(これ以降AIの出力結果は、トークイメージで表示します。)

わしじゃないんかーい!!と思わずツッコんでしまいました(笑)
AIで風間を作ったはずだったのですが、まさかのIさんを作ってしまったようです…。
何度も聞いてみると「風間」と答えることも。(それでいいのか…。)
実際、仲がいい人ほど日々のやり取りの中で自己紹介をすることは殆ど無いでしょうから、こういうケースは学習不足となっているのかもしれません。

早速雲行きが怪しいですが、まだまだ色々聞いてみます。以下はいくつかの会話例です。

④以外は、割と風間っぽい結果となりました。
①は一見おかしいですが、Iさんとの普段のやりとりを考えると、急に「こんにちは」ということはまずないので、たしかに「どーしたの?」と疑う気がします(笑)
②は普段のやり取りとほぼ同じです。(風間はポケモンが大好きです。) 
しかし面白いことにLINEの履歴からこの単語を検索してみると、このやりとりと一言一句同じもの(「ポケモンしてるよ」と返したこと)は存在していないということがわかりました。つまり、Iさんからの問いかけに対する風間AIの返答は、学習データ(過去の会話)からそのままとってきたものでは無く、AIオリジナルのものであることがわかります。「自分は言ったことが無いけれど、自分が言いそうなことをAIが言っている」、というのは何とも不思議な気分です。

会話っぽく流れを作って話してみた!

先程は単発の会話を4つ試してみましたが、今度は少し長めの会話を想定してみます。

「おはよー」の返答は自然ですがそれ以外は話が通じていないです…。他にも試しましたが、一問一答でいい答えが返ってくることはありますが、流れとしての会話が成立するのは難しそうです…。

所感

ここまでの所感として「良い点・感心した点」、「まだまだな点」を以下にまとめます。

■良い点・感心した点

  • 風間が言いそうなフレーズが割と出てくる。(Iさんが認めるものもあり。)
  • 殆どの生成文がトーク履歴に存在していない。
    (自分が実際に言ったことはないが、言いそうな文がポンポン出てくるのは非常に面白いです。)

■まだまだな点

  • 脈絡のないフレーズ、風間が言いそうに無いフレーズも多々あり。名前間違えは特に致命的…。
    (Iさん曰く「全体的にはまだまだだね。」とのこと)
  • 同じ入力文に対して、生成文を複数回作ると、毎回内容が違う。
    (同じ入力文に対して、出力文の再現性が取れないのは残念です。バリエーションがあると考えればよいのかもしれませんが…。)
  • 上手くいっても一問一答レベル。会話レベルには届かず…。

最後に協力者Iさんに風間AIの実力を試してみました!

風間AIは課題感がかなり残るものの、良い返答が返ってくることももちろんあります。そこで、ある1日の「Iさん」との会話の中で、「風間」の返答を「風間AI」にすり替えてみたら気づくのかテストしてみました!行った内容をまとめると以下の通りです。

  • 一日の会話の中でランダムに風間AIが返答を担当
  • AIで文章を生成する前に、本物の風間だったらどう返すかを記録
  • Iさんには一日の会話の中でAIの返答だと思ったらその都度申告してもらう
  • バレたかどうかを記録

このような「機械が人に近い振る舞いができるかどうかを判別する」実験は一般にチューリングテストと呼ばれます。チューリングテストは、1950年にイギリスの数学者アラン・チューリングが「機械(=人工知能)は思考できるのか?」という問題意識から提案した質疑応答式のテストです。アラン・チューリング博士といえば、ナチス・ドイツが第二次世界大戦中に使用した、当時最強と呼ばれた暗号機であるエニグマの解読に成功したことで有名です。そんなチューリング博士は「人工知能(AI)の父」とも呼ばれており、コンピュータの知性についていち早く携わっていた人物でもあります。彼が1950年に発表した論文「Computing Machinery and Intelligence」の中で、「機械(=人工知能)は考えることができるのか?」という問いをやみくもに議論することは無意味だと論じ、「コンピュータに人間の振りをさせて、それを人間が見破れるか?」という内容の「ものまねゲーム(Imitation Game)」を用いる事で議論することを提案しました。発表から64年後の2014年には、13歳の少年という設定の「Eugene Goostman(ユージーン・グーツマン)」と呼ばれるAIが、チューリングテストに初めて合格したとされ、物議を醸しました。(当時の審査員数は不明ですが、審査員の33%が「人間だ」と判断したそうです。)このチューリングテストは賛否様々な意見があり、多くの場で議論の対象となった議題ですが、AIの知性について考える上で非常に重要ですので、気になった方は是非深く調べてみることをおすすめします。

さて、前置きが長くなりましたが気になるテストの結果は以下の通りです…!

意外にもバレない率50%でした!!風間AIはまだまだと言われていたので全滅するかと思っていましたが…嬉しい誤算です(笑)
データが少ないので何とも言えませんが普段の会話にたまに織り交ぜるくらいだと意外と気づきにくくなるのかもしれません。(※それらしい答えが出るまで繰り返しなどはせず、各出力とも1発勝負で行っています。)特に「7時50分に駅つく!」に対する回答である「はいよーん!」という返答は、風間の口調そのものであり、これだけでAIだと判断するのは非常に難しいと私自身思いました。今後は日数を増やしてより正確なデータを取りたいところです。

おわりに

今回はLINE×GPT-2で自分AIを作ってみました。意外にバレないフレーズや、新しいフレーズが生成出来るなど、伸びしろの大きさを感じる事ができました。今回は遊びの一環としての簡単な実装だったため、データの更なる加工やパラメータのチューニングなど、GPT-2の性能をフルに使うための工夫はまだまだ残っています。今後は、前述の工夫や改良モデルを使うなど、精度向上を追い求めていこうと思います。

AIを扱うのは一見難易度が高そうに思えますが、実は無料で簡単に使用できるものも多いです。この記事を読んでくださった皆さんも是非、AIで遊んでみてはいかがでしょうか?もし自分を完全再現できたらいずれは面倒なことを全て分身AIがやってくれるかも…?

参考にした文献やサイト

執筆者プロフィール

風間 祐輔(かざま ゆうすけ)
AI・アナリティクス事業統括部 データサイエンスコンピテンシーセンター

2020年4月、日本電気株式会社入社。官公庁のお客様を中心に、自然言語処理、機械学習を活用したデータ分析業務及び提案活動に従事。プライベートでは、ゲームや旅行、AIや電子機器を使ったものづくりなどが趣味。

資料ダウンロード・お問い合わせ

Escキーで閉じる 閉じる