電笑戦 ~ AI は人を笑わせられるのか ? 挑戦を支える技術と AWS

2020-06-01
日常生活で楽しむクラウドテクノロジー

Author : 針原 佳貴

logo_bokete_500x282

みなさんこんにちは、アマゾン ウェブ サービス、シニアエバンジェリストの亀田です。2020 年 5 月に横浜開催を予定していた AWS Summit Tokyo が第三四半期にオンライン開催する方向で、現在従来の AWS Summit Tokyo と変わらぬ興奮を皆さんにお伝えできるようスタッフ一同準備をおこなっています。タイムテーブルなどの発表をお待ちください。

その AWS Summit Tokyo で募集開始から 1 週間で 1,000 名弱の申し込みがあった人気セッションがあります。それが

「電笑戦 ~ AI は人を笑わせられるのか」です。

すでに機械学習、そしてそれにより生成される AI モデルは我々の生活に欠かせないものとなり、多くのサービスがその恩恵を受け進化し、日々の生活を豊かなものにしようとしています。また、多くの企業、そして開発者がより良いサービスを模索し研究が続いています。しかし、AI は我々の生活をより便利なものにするためだけに存在しているのでしょうか。従来難しいとされていた人間の喜怒哀楽に AI は影響を与えることができるのでしょうか。

「電笑戦」はその命題に挑戦したセッションです。今後開催条件が整った際には、皆様を会場にお招きして開催する予定です。

さて、皆さんは「ボケて」というウェブサービスをご存知でしょうか。
株式会社オモロキが運営している国内最大級のお笑いメディアサービスで、1 枚の画像に対して一言コメントをボケという形で付与し、笑いを取るコンテンツです。いくつかボケてに投稿されている、人気の高い事例をみてみましょう。

img_bokete_01
img_bokete_02
img_bokete_03

このボケてに投稿された膨大なボケのデータを AI に学習させて、人間が考え出したボケを上回る新たな笑いを作り出せるのかを競い合う『電笑戦』。まさに新時代の笑いをテクノロジーで切り開くかもしれない壮大なチャレンジです。

本記事では 3 回連載で、その命題にチャレンジいただいた企業に登場いただき、その技術解説を行います。

第一回目は、本企画を株式会社オモロキと一緒に協力頂いている、株式会社電通デジタルの石川氏が作成したサンプルモデルの解説を、インタビュー形式でアマゾン ウェブ サービス ソリューションアーキテクト針原がお送りいたします。

テクノロジー説明「AI はどのように人を笑わせるのか」

笑いにどう AI を使うのか

ボケてでは画像に対してボケることで笑いを生み出します。このボケてのボケ生成を AI にやらせるには、画像を入力としてテキストを出力するモデルが必要です。このように画像からテキストを出力する技術は一般に「画像のキャプション生成」と呼ばれ、近年深層学習の盛り上がりとともに盛んに研究されています。

今回、電通デジタルの石川さんをお招きし、インタビュー形式でボケてのデータを用いたボケ生成 AI の作り方について伺おうと思います。

photo_haribara_s

針原 :
それではボケてのボケ生成モデルを作ってみたという電通デジタルの石川さんに話を聞いてみたいと思います。石川さんよろしくお願いしますー。

photo_dentsu_ishikawa

石川氏 :
よろしくお願いしますー。

針原 :
本題に入る前に、そもそも今回はどういう経緯でボケ AI の作成に至ったんでしょう。ボケて自体は画像からボケを考えて投稿する、というサイトですが、石川さんの中で今回のアイディアが急に閃いたのでしょうか ?

石川 :
いや、そんなことはなくてですね。元々ボケてのサイトにあるデータで面白いことができないかと考えていて、例えばボケのお題画像を Generative Adversarial Network (GAN) で生成するとか、くだらないボケを無限に返してくれる Sequence-to-Sequence (Seq2Seq) のチャットボットとかを考えていました。
一昨年ぐらい、画像のキャプション生成が盛り上がっていたので、それでボケを生成するというのも一つのアイディアとしてありました。なので、何個かやりたいと思っていたことがあった中で、最終的に画像に対してボケを答える AI を作ろうという話になりました。

針原 :
画像のキャプション生成って、例えば人とか犬が写っている画像を見せられてそれに対する忠実な説明文を出す、というのが普通の使われ方だと思います。その技術を使って面白いことを言わせる、というアイディア自体も面白いと思うんですが、そこの発想って自然と出てきたんですか??

石川 :
もともと自然言語処理ってどうしても日本語は英語に比べて遅れてるんですね。それで日本語のキャプション生成を世の中で試されてる方はたくさんいらっしゃると思うんですけど、ボケようとしていないのに出てくる回答がユニークで面白かったりするので、この感じはボケとしてうまくハマるんじゃないかと思ったのがきっかけです。

前処理について

針原 :
それでは電笑戦でのフォーマットに従って聞いていきます。今回予め用意されているのは画像とそれに対するボケ。加えて画像の ID やメタデータが表で与えられてると思うんですが、前処理ってざっくり言うと今回どういうことをされましたか?

img_bokete_04

石川氏 :
普通は自然言語処理でよくやる前処理で、単語の数が異常に少ない造語のようなものって Unknown キーワードで置換することが多いと思うんですけど、今回はそれをやらずに造語は造語で学習させるようにしています。

針原 :
なるほど。

石川氏 :
自分でやったこととしては、最初にボケの文字数を 20 文字以下で切りました。モデルは Long Short-Term Memory (LTSM)(*1) を使っていて、文字列が長ければ長いほど学習にかかる計算時間が増えてしまうので。全てのボケを最長のボケ長に合わせてゼロ埋めすると、ほとんどのボケは 5,6 単語ぐらいだったりするのが無駄に大きいデータセットになってしまいます。これをはじめに p3.8xlarge インスタンスで試したらメモリに乗らなかったんですよね。

針原 :
なるほど、ありがとうございます。長いボケを弾いて、20 文字以下短めの文章だけを使ったと。

石川氏 :
そうですね、メタデータを使って「シュール」カテゴリのものばかりを集めたりとか。あとボケてさんはユーザー投稿型なので 1 つの画像に対して複数のボケがあったりします。そこは画像の重複がなくなるように★の数が一番多いものだけを採用して学習させるなどしています。

針原 :
ちなみにボケの数ってどれくらいありました ?

石川氏 :
百万ボケぐらいもらって、データクレンジングのところで減らしたので、最終的に使ったのは 16 万ボケですね。

モデルについて

針原 :
キャプション生成って画像とテキストに対応するようにベースは Convolutional Neural Network (CNN)(*2) と Recurrent Neural Network (RNN)(*3) を組み合わせたモデルを使うと思いますが、画像特徴量のモデルはどういうものを使いましたか ?

石川氏 :
今回学習済みの VGG16(*4) を使っていて、この理由を説明させて下さい。今って画像だと ResNet50(*5) とか色んなモデルがあると思いますが、CNN って層が深くなればなるほどテクスチャーをよく見るようになるらしいんですね (参考: arXiv:1811.1223 [cs.CV])。層が深くなるにつれて、はじめは人の顔を見ていたのが肌とか鼻の形とかまで見始めるらしいんです。最後の全結合層の出力を特徴ベクトルとして使いますが、正直ボケを答えるためにそんな細かいベクトルの情報は要らないと思ったので、比較的浅い VGG16 を使いました。

針原 :
なるほど、それは面白いですね。キャプション生成のモデルとしては、色々なものが提案されていると思いますがどういうものを使われましたか ?

石川氏 :
元々は RNN を使ってベーシックな Encoder-Decoder モデルを作っていました。Encoder (CNN) を使って画像をベクトルに置き換えて、Decoder (RNN) で文章を出力するというものです。しかし、そもそも VGG16 は物体が何であるかをベクトル空間で表現しているので、実は正解ラベルのボケとは得られる情報がかけ離れていて綺麗な文章が出てこないという問題に直面しました。それを改善するために Decoder のところに Bidirectional-LSTM を使って、その後に attention 層を入れて、global max pooling で 1 次元に落とし込むことにしました。Attention (参考: arXiv:1706.03762 [cs.CL]) は比較的最近のアルゴリズムで、文字と文字の関係性を可視化したり学習できるアルゴリズムなんですけど、その層を入れると精度が良くなるというのは知っていたので (参考: arXiv:1502.03044 [cs.LG])、それを使ってニューラルネットワークを組み立てました。

img_bokete_05

針原 :
なるほど。これで綺麗な文章が出てくるようになったんですね。

石川氏 :
Attention 構造を入れた時の方が、過学習を起こさずに日本語として文章が成り立つようにはなりました。それまでは日本語としての接続詞がなかったり変なところにあったり、日本語として読めないものが多かったので。Attention を使うと単純な文章の埋め込みではない単語と単語の位置的な関係性を学習できてるんだなー、というのを僕も初めて肌で感じました。

針原:
モデルについて、他に言い忘れたことはありますか?

石川氏 :
これは今後の展望なんですが、カテゴリーを変えると出てくるボケが変わる、「シュール」だったり「バカ」だったり色んなカテゴリのボケを選んで生成できるようなモデルを作れると良いなと思います。

針原 :
今回基本的にはシュールのデータを使ってたと思いますが、それ以外でも試されましたか?

石川氏 :
やってみたのはシュールとバカだけなんですが、ジャンルを混ぜると日本語としてうまく出にくくなったので、元々の学習データにはある程度規則性があった方が上手くいきやすいのかなーという気がします。

トレーニングについて

針原 :
ちなみにトレーニングにはどれくらい時間がかかりましたか??

石川氏:
僕は Adam の学習率を結構小さくしてゆっくり学習させていたんですが、それでも 2 時間ぐらいで終わってたかと思います。結構難しいのは、画像系のタスクとかは GPU インスタンスで速くなると思うんですが、今回画像のモデル自体は学習済みの VGG16 を使ったので、意外とデータの前処理の方が時間がかかってたかもしれないですね。
単語を分かち書きして id に変換してという前処理に時間がかかったので、どのインスタンスがいいかは時と場合によるのかなという印象です。よく僕がやるのは前処理だけ CPU が載っている C5d インスタンスとかでやって、データを Amazon S3 に吐き出して、GPU の載っている P3 インスタンスに変えて学習させる、とかですね。

針原 :
なるほど。ちなみに今は EC2 とのことだったので、Deep Learning AMI を使われてますか?

石川氏:
はい、Ubuntu の Deep Learning AMI を使っています。フレームワークは Keras を使って分散学習しています。

結果

石川氏 :
実際に生成されたボケはこんな感じです。気に入ったものを選んでみました。予測で出す1文字目の単語は、soft max の出力分布からサンプリングして選んでいます。漢字を間違えているのも愛嬌ですね。 

img_bokete_06
img_bokete_07

石川氏:
ボケを作るというタスクは特殊で、元々あるボケてのデータと同じものを出したい訳ではないですよね。過学習するとそうなるのが難しいところで。各 epoch ごとにモデルを全部保存した後出力のところで全 epoch のモデルを試して、元のデータと同じ文章が出ていないかつ日本語として読める面白いモデルをピックアップしました。全部で 300 個ほどモデルが出てくるのでそこが一番大変でしたね。

針原 :
なるほど、それは大変そうだけど興味深い。結局、各 epoch の途中結果から面白いモデルを人が選ばないといけないのが良いですね。

石川氏 :
そこの評価関数を作れるほどの技量がなかったですねー。

針原 :
いや、でもそれを簡単に作れないのが笑いの奥深いところ、ということですよね。

石川氏 :
本当におっしゃる通りです。人間の肌感で最後選ぶというのをやっているので、人間と機械学習の融合、という使い方な気がしています。

まとめ

石川さんの話の中で、やはり最後の「人間と機械学習の融合」という側面が今回のボケ AI の興味深いところだなと思いました。データの前処理、モデル作り、トレーニング、そして完成したモデルの中から選別した最も面白いモデルが出力した渾身のボケは味わい深いものがありますよね。

この石川さんのモデルに勝る面白い AI は作れるのか ?
次回以降引き続き、電笑戦に参加される企業の方のインタビューを予定しています。


*1 : Long Short-Term Memory (LSTM) : RNN の各ニューロンに入力・出力・忘却ゲートを付け加え、より長い系列の学習を可能にしたもの。« 記事に戻る

*2: Convolutional Neural Network (CNN) : 画像を扱うニューラルネットワーク。畳み込み層・プーリング層を重ねることにより、画像の特徴を抽出している。« 記事に戻る

*3 : Recurrent Neural Network (RNN) : 系列 (時系列・文字列) データを扱うニューラルネットワーク。中間層のニューロンに自己フィードバック結合を入れている。« 記事に戻る

*4 : ResNet50 : 50 層からなる CNN のモデルで、層をスキップする結合を入れることで高い予測性能を実現している。« 記事に戻る

*5 : VGG16 : 16 層からなる CNN のモデル。3x3 という小さい畳み込みフィルターを用いて層を深くすることで性能を向上させた。« 記事に戻る

筆者プロフィール

photo_haribara_s

針原 佳貴 (はりばら よしたか)
アマゾン ウェブ サービス ジャパン株式会社
スタートアップ ML ソリューションアーキテクト

大阪出身。好きなサービスは Amazon SageMaker と Amazon Braket です。

AWS のベストプラクティスを毎月無料でお試しいただけます

さらに最新記事・デベロッパー向けイベントを検索

記事カテゴリー別に表示
フィルターをリセット
フィルタ
1

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する