ボケて電笑戦への挑戦〜AIで画像大喜利〜

こんにちは、Machine Learning部門の森長です。
昨年(2021年)の9月に開催されました、AWS Dev Day Online Japanのスペシャルプログラム #1:ボケて電笑戦に参加させていただきました。
そこで、本記事では、ボケて電笑戦で作成したお笑いモデルについて紹介いたします。
ボケて電笑戦とは
ボケて電笑戦とは、「AIは人を笑わせられるのか?」という問いを解明すべく、アマゾンの奥地へ向かった膨大なボケのデータを学習させて新たな笑いを作り出せるのかを競い合う挑戦です。
今回のボケて電笑戦では、弊社を含め3企業がお笑いモデルを独自に作成して、人を笑わせるべく大喜利対決を行いました。
詳細は、スペシャルプログラム #1:ボケて電笑戦に以下のような記載されていますので、ご覧いただければと思います。
人間の喜怒哀楽に AI は影響を与えることができるのでしょうか。「ボケて電笑戦」はその命題に挑戦した AI 大喜利対決です。 国内最大級のお笑いメディア『ボケて』の約 100 万のお笑いのデータを利用して、人間が考え出したボケを上回る新たな笑いをAI が作り出せるのかを競い合う『ボケて電笑戦』。まさに新時代の笑いをテクノロジーで切り開くかもしれない壮大なチャレンジです。ぜひお見逃しなく!
上記の本戦の様子は公開されておりませんが、テクニカルセッションが公開されています。
また、2020年に参加企業を含めた紹介記事(2020年当時のお笑いモデルの紹介)が以下にて公開されています。
では、以降からこのボケて電笑戦で弊社が作成したお笑いモデルについて紹介していきます。
お笑いモデルの構築
まず、ボケの教師データとして、お笑いメディア『ボケて』の約100万のお笑いデータ(画像とその画像のボケテキスト)をご提供いただきましたので、教師あり学習でお笑いモデルを構築することにしました。
お笑いモデルの構築の流れはおおまかに分類すると以下の手順になります。基本的にはこの手順を何度も繰り返し、お笑いモデルをブラッシュアップしていきます。
- 教師データの準備
- 教師データの前処理
- お笑いモデルの構成と学習
- 生成したボケの後処理
- 生成したボケの評価
では、最終的なお笑いモデルがどのように作成されたかを上記手順の流れで紹介していきます。なお、最終的なお笑いモデルが完了するまでに、何十個ものお笑いモデルが没になっています。
教師データの準備
まず、教師データとして約100万のお笑いデータを提供いただきましたが、これをそのまま使うわけにはいきません。おもしろいボケや感心するボケ、おもしろくないボケ等多数あります。
まずは、どのようなボケがあり、どのようなボケが評価(人による評価)されているのか等、ボケの特徴を確認します。 詳しくは記載しませんが、以下のような特徴がみられました。
- 説明口調の長いボケより、短文でインパクトのあるボケのほうが評価される傾向
- シュール系よりも、王道のおバカ系ボケが大量に存在
- 画像を上手に曲解しているパターン多数
- そもそも画像がおもしろい
上記を元に高評価となりうるボケを教師データとして抽出しました。
しかし、提供いただいたお笑いデータは参加企業3社に等しく提供されていますので、この教師データを使うだけですと他社さんのボケとの差別化が難しいです。なんとか弊社独自の特徴がだせないか。
そこで、提供いただいたお笑いデータ以外のデータの使用も許可されていましたので、弊社が保有しているビジネスニュースのタイトル及びその画像データを教師データとして、追加してみることにしました。
狙いとしては、ビジネスニュースの無機質?真面目な?データを学習することで、アンバランスなボケを生成できないかです。 この狙いは一部成功しました。なぜ一部なのかということは「モデルの評価」で後述します。
教師データの前処理
教師データの準備ができましたので、次に教師データの前処理です。 前処理の対象となるものは、「画像」と「ボケテキスト」の2種類です。
画像の前処理
提供いただいた画像データ及び弊社が準備した画像データは、画像サイズや表示形式がばらばらです。
人間であれば、画像を見るとどんなサイズの画像でも適切なサイズに拡縮し、画像の表示形式に関わらず網膜からの視覚データとして脳へインプットしています。
お笑いモデルも同様に、お笑いモデルが効率よく学習するためにも、インプットする画像のサイズや表示形式を統一する必要があります。
画像データの前処理も色々ありますが、今回は、画像サイズを統一してRGBのデータとしました。
テキストの前処理
テキストに対しても前処理を行います。
テキストに形態素解析を行い、以下のようにテキストを単語に分割していきます。
今日は良い天気です。
↓
今日 は 良い 天気 です 。
分割した単語を集計すると約25,000種類の単語となり、これがお笑いモデルの有する語彙となります。お笑いモデルはこの語彙から単語を選びながら、ボケるようになります。
お笑いモデルの構成と学習
ここまで、教師データの準備と前処理が完了しました。人間の学習に例えると、学習用の教科書の準備が完了したというところでしょう。
次はお笑いモデルの構成と学習です。
お笑いモデルの構成
人間は各人によって得意なことが異なりますが、お笑いモデルも同様に構成によって得意な分野が異なります。 画像の特徴を捉えることが上手なモデル、文章を分類することが上手なモデル、文章を生成することが上手なモデル等、多岐に渡り、機械学習の分野では様々なモデル構成が提案されています。
さて、今回の「画像からボケを生成する」問題は、機械学習の分野のImage Captioningという問題に良く似ています。Image Captioningは、「画像を入力として、その画像内の人物・動物・物体等の振舞いを説明する文章を生成する」という問題です。
Image Captioningを解決するモデルを応用することで、今回のお笑いモデルを作成できそうです。
Imge Captioningにも様々な手法が提案されていますが、弊社は、その内の一つのEncoder-Decoderモデルを採用することにしました。 これは簡単に言うと、Encoderを使って画像を中間表現(ベクトル)に変換して、変換した中間表現をDecoderで文章に変換するものです。
さらにAttentionの機構を組み込み、画像の特定の部分に注目しつつも、日本語として成立する文章を生成するようにしています。 例えば、Attentionを可視化すると、ボケてモデルが画像のどの部分に着目してボケているかも確認できます。

実際のお笑いモデルの構成は以下の通りです。具体的なモデルパラメータの説明は控えますが、比較的スタンダードなモデル構成です。
- Encoder(CNNベース): ResNet
- Decoder(RNNベース): GRU + Attention
お笑いモデルの学習
モデル構成が決まりましたので次は学習です。こちらも様々な学習方法があります。
今回は、スタンダードなモデル構成にしたので、普通に学習させても優位性が見い出せないと考えました。
そこで、GAN(Generative Adversarial Network)の手法を導入することにしました。 GANは画像生成でよく使われる手法で、2つのモデル(生成器と判別器)を用いてモデルが相互に学習しながら画像を生成します。 この手法を今回の「画像からの文章生成」に導入しました。
イメージとしては、Generator(ボケ生成器)とDiscriminator(ボケ判別器)を導入して、相互に学習を行いながら、良いボケを大量に作成していきます。
- Generatorの気持ち:Discriminatorに教師データのボケと見間違ってもらえるボケを作りたい
- Discriminatorの気持ち:教師データのボケとGeneratorのボケを判別して、教師データのボケを見つけたい
これを芸人さんに例えるとすると、以下のようなイメージです。
- 駆け出しの芸人さんが審査員にボケを常に審査してもらい、講評をもらっている
- 芸人さんは、講評からさらに精進する
- 審査員も、さらに審美眼を磨くように精進する


GANの導入により、既存のボケ(教師データに存在するボケ)をそのまま出力するのではなく、新たなボケを生成することが狙いです。
しかし、GANはGeneratorとDiscriminatorのハイパーパラメータ調整が難しく、その点にとても苦労しました。
最終的なお笑いモデルの構成・学習は以下の通りです。

生成したボケの後処理
さて、大量のボケが生成されましたが、まだ文章として成立していないものも含まれます。
この点についてはボケに対して形態素解析を行い、簡単なルールであからさまに変な文を除外します。
生成したボケの評価
評価は定量的に行う必要があります。そうしないとボケの良さをお笑いモデルごとに比較することができません。
しかし、笑いというものは奥深く、定量的に評価することがなかなか困難です!
そのため、今回は人力で(主に私の感性で)50の画像に対しておもしろいボケが生成できているかの定性的な評価をしました。
最終的にはボケを見すぎた結果、何がおもしろいのかよく分からなくなり、ボケで笑うのではなく「そうきたか!」というようにボケに感心するようになってしまいました(笑)。
では、ここまでくると、実際にどんなボケが生成できたのか気になると思います。 ボケて電笑戦本戦でのボケの内、私が好きなボケをいくつか以下に貼りましたので、読者の方でおもしろいかどうかご判断ください!
画像の下にボケがあるので、ゆっくりスクロールして、まず画像を5秒ほど見てからボケを見ていただくと少し雰囲気がでると思います。



…たぶん、冷静にご覧になられたので、おもしろさが伝わっていない可能性がありますね。
お笑いは場の雰囲気や言い方も大事です、ボケて電笑戦本戦では、たぶんとてもおもしろかったです!
学習データにビジネスニュースを入れた効果
さて、学習データにビジネスニュースを入れた効果ですが、判断が難しい結果になりました。
おもしろいボケが生成されたのですが、かなりセンシティブなブラックジョークになってしまいました。
これはまさに良く話題になっているAIの倫理問題です。
今回は倫理を一旦棚に上げて、おもしろさのみを追求しましたので、センシティブなブラックジョークが生成されました。 しかし、これらを実際に世間一般に公開していくには、倫理という観点でAIを制御することが必要不可欠であることを再認識しました。
そのため、おもしろかったブラックジョークは電笑戦やこの場でのお披露目ができませんが、以下のようにビジネスニュースよりのボケが生成されています。

終わりに
ボケて電笑戦への参加は大変なこともたくさんありましたが、とても楽しかったです。ボケてモデル作成のための試行錯誤も楽しかったですし、実際の本戦でも緊張しながらも途中からは良い意味で力が抜けて、楽しく参加できました。
反省点としては以下の2点です。改めて人前でおもしろく話すという難しさを体感しましたね。
- ボケの発表者が私だったので、私のしゃべり方がおもしろくなかったかも。
- 笑いは場の雰囲気がとても大事なので、場の雰囲気を読んでボケるお笑いモデルを作るとさらに良かったかも。
今回の挑戦はStockmarkのプロダクトと直接的な関係は少ない挑戦でしたが、モデルの構築・学習・評価のプロセス・思考には共通のものがあります。また、画像処理という観点でも得るものがありました。この挑戦の経験をプロダクト開発に活かしていきます。
最後に、Stockmarkでは機械学習リサーチャーやソフトウェアエンジニアなど、絶賛採用強化中です! 興味のある方は是非応募してみてください!