サカモトカレンダー・リベンジ
これは52代アドカレ12日目の記事になります。 → 徒然
平素より大変お世話になっております。2020年のアドカレ、今日も続きを書いてまいりましょう。よろしくお願いいたします。
突然ですが、皆様はサカモトカレンダーをご存じでしょうか。
サカモトカレンダーとは参加者がサカモトさんに擬態して"言"を放ち、獲得のサカモトポイントを競い合うというイベントでした。そこには提出者がサカモトさんを真似するだけでなく、投票者が本物のサカモトさんを見極めるという側面もありました。
51-54代の幅広い参加者が集い、 熾烈な争いが繰り広げられました。
結論から述べると、私はこの戦いに敗れました。サカモトさんを見極められなかったのです。
すべての神経を使い、すべての余暇を使い、文字通り尽力したつもりでした。コミケの待機列に並びながら、各資料と当カレンダーの上を反復横跳びしていたことは鮮明に覚えています。しかし私の力は及ばなかったのです。それは紛れもない大敗でした。
結果発表の翌日に訪れたコミケの景色はまったく違ったものでした。そのとき東京ビッグサイトから見た空と海はひどく真っ黒に淀んでいました。それは己の無力さをあらためて思い知らされた瞬間でもありました。ちなみに欲しかったものは買えました。
およそ一年越しのリベンジです。今回はサカモトカレンダーにコンピュータサイエンスをもって挑みます。言い換えるならば、今回の記事はサカモトツイートディスクリミネータについてのものになります。
準備
複数の文章からサカモトさんによって書かれたものを見つける問題はおそらくSequence Classificationというタスクに分類されるでしょう。これはあるシーケンス(たとえば一連の文字や単語など)の特性を分類するというもので、言語に関していえば文が文法的に正しいかどうかを判定したり文に込められた感情を推測したりする目的で用いられます。
今回の場合は与えられたテキストがサカモトさんによるものかそうでないかを見分ける問題になります。つまりサカモトツイートか否かの二値分類を行います。
このような問題に対するアプローチは多くありますが、せっかくなので今回もまたニューラルネットワークの力を借りようと思います。ひとえにニューラルネットワークといっても、やはりそこにはたくさんの種類があります。その中で今回はBERTというモデルを用います。
BERTは本名をBidirectional Encoder Representations from Transformersという、先日のサカモトツイートジェネレータ改で紹介したTransformerが応用されたモデルになります。
ざっくりと説明すれば、これは大量の文章に対する虫食い問題を解きまくることであらかじめ言語を理解しておいてもらうというものです。双方向を考慮した単語の予測によって、前後の文脈に依存する特徴の獲得が可能となるのです。これは前回に少しだけ触れた事前学習の話につながります。詳しい解説とかわかりやすい記事とかは相変わらずインターネットの上に数多転がっているはずなので、気になる方は適宜調べてみてください。
これをサカモト分類タスクに適用することで今回の問題を解こうという話に相成ります。
学習
今回使うBERTですが、たくさんの事前学習済みモデルがインターネット上に公開されています。そして嬉しいことに日本語のモデルも例外ではありません。ありがたいことですね。中でも今回は次を使います。
こちらの日本語モデルを🤗Transformersの上で目的のタスクにFine-tuningすることにしましょう。🤗Transformersというのは自然言語処理を対象としたフレームワークのことで、これさえあれば最先端のモデルも容易に試すことができるのです。簡単なんだよねぇ!
🤗Transformersのサポートは非常に手厚く、さまざまな使用例がExamplesとして提供されています。今回の目的であるSequence Classificationについても当然それは用意されているので、ありがたく参考にさせていただきましょう。
ところで、言語理解を評価するための有名なベンチマークとしてGLUEというものがあります。これはGeneral Language Understanding Evaluationの略で、モデルの性能を見るためにもしばしば用いられるようです。
🤗TransformersではSequence Classificationの例としてこのGLUEというベンチマークに関する学習が挙げられています。run_glue.py
というスクリプトを実行するだけで、そういった学習を実現できるのです。
これを使わない手はありません。おそらくどれでも問題ないのですが、今回はGLUEのうちSST-2というタスクに擬態したデータセットをあらかじめ準備しておき、先のモデルを学習することにします。SST-2は"与えられた文に込められた感情がポジティブなものなのかネガティブなものなのかを判別する"というタスクであり、これを"与えられた文がサカモトさんによるものなのかそうでないのかを判別する"というタスクに挿げ替えます。
どうやら最近になってこのrun_glue.pyが更新され、独自のデータセットによる学習が簡単にできるようになったみたいです。それなので今回のコードは少し古びたものということになります。それも面白かろう!
訓練データとしては、まず正例としてサカモトさんによるツイートを用意します。これは前回のジェネレータで扱ったものと同じです。そしてサカモトカレンダーの参加者によるツイートを適当にクローリングして、それらを負例に充てます。負例と正例のラベルをそれぞれ0
と1
に設定し、それらの二値分類を学習してもらうことになります。2020年の上半期に呟かれたものを対象に、累計約5000ツイートを訓練データとして使用することになりました。
入力文については半角をすべて全角に正規化し、JUMAN++をもって単語に分割します。BPEは学習時に自動で施されるようなので、サブワードのことは無視します。
準備が整ったら、いよいよ学習です。
結果
無事に学習を終えたようなので、実際に出力を見てみましょう。サカモトカレンダーに提出された各"言"を先と同様に処理し、モデルに入力します。is sksk_sskn
というラベルがサカモトさんのツイートであるという判断を表します。
母 に ハンネ で 呼ば れた ので スマホ 食った
not sksk_sskn: 99.69808459281921%
is sksk_sskn: 0.30191761907190084%
午後 の 紅茶 が 美味し すぎて 口 の 形 が ペットボトル に なっちゃ った ……
not sksk_sskn: 44.24114227294922%
is sksk_sskn: 55.75885772705078%
ざむ ちゃん 実は 戦隊 モノ の 黄色 を 担当 して いる んだ よ ね
not sksk_sskn: 5.700467526912689%
is sksk_sskn: 94.29953098297119%
アタシ 、 大きく なったら ナン に なる の が 夢 だった んだ 、 母 が なり たくて も なれ なかった もの だ から …
not sksk_sskn: 98.44356775283813%
is sksk_sskn: 1.556432619690895%
来年 サカ ちゃん カレンダー 開催 し ます ので 覚悟 して おいて ください ね
not sksk_sskn: 99.71803426742554%
is sksk_sskn: 0.28196333441883326%
こんにちは 、 ” 坂本 ” … です … ピキキ … ( メガネ が 割れる 音 ) タスケテーッッッタスケテーッッッタスケテーッッッタスケテーッッッタスケテーッッッタスケテーッッッタスケテーッッッタスケテーッッッタスケテーッッッタスケテーッッッタスケテーッッッ タスケテーッッッ それ で は 、 さようなら
not sksk_sskn: 60.26184558868408%
is sksk_sskn: 39.73815739154816%
外 寒 すぎて デッケェ 冷え ピタ に 包ま れた とき と 全く 同じ 気持ち に なった
not sksk_sskn: 99.61721301078796%
is sksk_sskn: 0.38279134314507246%
口 に 入れた 梅干し が 想像 以上 に スッパ くて この世 が 一 点 に 圧縮 さ れた
not sksk_sskn: 98.90459179878235%
is sksk_sskn: 1.095407921820879%
密度 が 高 すぎる ため 少量で 胃 の 質量 を 5000 倍 に し 人間 を 内側 から 破壊 する 餅 と いう 食材 、 本当に 面白い
not sksk_sskn: 98.99572730064392%
is sksk_sskn: 1.004269253462553%
これ が …… …… モチ …… …… ! ?
not sksk_sskn: 90.66720604896545%
is sksk_sskn: 9.332790970802307%
最後の 肉まん を 救い 出そう と したら 、 他 の 人 に 先 に 救い 出さ れて しまい 美味しく 食べ られろ よ な … と なった
not sksk_sskn: 90.17797112464905%
is sksk_sskn: 9.822031855583191%
手袋 する と 指 パッチン が 出来 なく なっちゃ う んだ よ ネ …
not sksk_sskn: 99.42203760147095%
is sksk_sskn: 0.5779602564871311%
Lv 9 の ヨッシー に なり がち
not sksk_sskn: 2.2807076573371887%
is sksk_sskn: 97.71929383277893%
私 が 私 である こと を 信じて る から こそ 私 は …… すみません …… 本当 は 私 ざむ ちゃん です
not sksk_sskn: 77.07839012145996%
is sksk_sskn: 22.92160540819168%
この はんぺん と か いう ヤツ 、 おもしろい から つゆ だく に しちゃ おう ね
not sksk_sskn: 1.5708951279520988%
is sksk_sskn: 98.42910766601562%
自室 で フィギュア を 見て おほほ と 笑った 話
not sksk_sskn: 7.416819781064987%
is sksk_sskn: 92.58317947387695%
君 は 私 の 手 に は 負え ない よ …… トホホ …… と 思わ せて くれる 担当 、 好きです
not sksk_sskn: 5.265425145626068%
is sksk_sskn: 94.73457336425781%
傘 を 忘れた ので カエル に なった ゲコッ
not sksk_sskn: 15.723828971385956%
is sksk_sskn: 84.27616953849792%
すれ違った サラリーマン 達 が みかん 狩り の 話 を して いて ニコニコ に なった
not sksk_sskn: 99.60901141166687%
is sksk_sskn: 0.3909854218363762%
麺 に ” 真剣 ” な ので 麺 を 食べる 時 の 「 いただき ます 」 に は どうしても 気合 が 入って しまって 空手 家 みたいに なっちゃ う ワネ
not sksk_sskn: 96.54185771942139%
is sksk_sskn: 3.458143398165703%
雨 、 さんさんと この 身 に 落ちて しまい 私 は ……
not sksk_sskn: 43.40104162693024%
is sksk_sskn: 56.598955392837524%
世界 中 の 推し たち が 目の前 に 集まって 会話 して いる の を 眺めて いたら 感情 を 手 に 入れて 「 これ が …… 心ッ …… ! ? 」 と 叫んで 起き ました 良き 夢 だった な
not sksk_sskn: 97.11576104164124%
is sksk_sskn: 2.884242497384548%
この メロン パン 、 実は 生きて る んです よ ね ……
not sksk_sskn: 29.113659262657166%
is sksk_sskn: 70.88633179664612%
致死 量 の 龍角散 を 粉々に し たい 気持ち
not sksk_sskn: 99.13033246994019%
is sksk_sskn: 0.8696696721017361%
量 を 重要 視 した ” 食 ” を 行う に あたって 障害 と さ れる 熱 と 冷え は 取り除く と いい らしい です ワザップ に よる と
not sksk_sskn: 98.45494031906128%
is sksk_sskn: 1.5450607053935528%
完敗。
議論
今回のモデルがもっとも高い確率でサカモトさんによる文だと判断したのは"このはんぺんとかいうヤツ、おもしろいからつゆだくにしちゃおうね"でした。次いで"君は私の手には負えないよ……トホホ……と思わせてくれる担当、好きです"と"ざむちゃん実は戦隊モノの黄色を担当しているんだよね"が選ばれています(ジェネレータは除外)。一方で正解の"外寒すぎてデッケェ冷えピタに包まれたときと全く同じ気持ちになった"がサカモトさんによる確率は1%にも満たないと言っています。無念。
ここでなにより面白いことは、結果発表でもっともサカモトポイントを獲得している"このはんぺんとかいうヤツ、おもしろいからつゆだくにしちゃおうね"と"君は私の手には負えないよ……トホホ……と思わせてくれる担当、好きです"がモデルによって選ばれていることです。また3番目に確率の高かった"ざむちゃん実は戦隊モノの黄色を担当しているんだよね"も、獲得のサカモトポイントは4位となっています。すごくないですか。これはモデルの性能が人間のそれに迫ることを示唆しているといえるかもしれません。
しかし正解である"外寒すぎてデッケェ冷えピタに包まれたときと全く同じ気持ちになった"の確率が1%を下回っていることに対しては悲しみが覚えられます。せめて1%くらいはあってほしかったですね。いや1%はあるでしょ!
今回はあえて背景の理論やモデルの構造などは放り漠然とした説明で済ませていますが、結局は統計的に文を解析して、もっとも尤もらしい値を計算しているだけなんですよね。学習されたモデルはサカモトカレンダーのバックグラウンドも知らなければ、サカモトさんが誰なのかも知りません。そう考えれば今回の結果も納得できます。納得できますよね。納得しましょう。
以上
今回の記事としては以上で終了です。大雑把な実験と考察で申し訳はありませんが、楽しんでいただけたでしょうか。
この話題も前回のジェネレータと同様、改善の余地はいくらでもあると思います。たとえば今回は単純にすべての候補に対してそれがサカモトさんによるツイートである確率を計算させていましたが、もっと適切な手法があるかもしれません。またBERTというモデルに関しては、形態素解析を伴わないものや事前学習に用いるコーパスが異なるものなど多くの選択肢があるみたいなので、別のものを使ってみればまた違った結果が得られるかもしれません。
勝利こそ掴むことはできませんでしたが、興味深い結果を得ることができたので私は満足しています。これで心置きなく成仏できるでしょう。
それではまた次回の記事でお会いしましょう。さようならー。