のどあめ

ググってもなかなか出てこなかった情報を垂れ流すブログ。

TransformerとSentencepieceでなんJスレタイ生成器を構築する(3回目)

なんJスレタイを生成するシリーズ3回目です。

おさらい

なんJスレタイ生成とは

ニューラルネットの文書生成を利用して、なんJのスレッドタイトルのような文書を生成します。

過去のシリーズ

前回(2回目)のおさらい

  • 文書生成を行う生成器Generatorと、その文書の評価器Evaluatorの2つのモデルを利用する。
  • Generatorは過去のなんJスレタイを利用して学習し、Evaluatorは真のスレタイかGeneratorが生成したスレタイかを分類するよう学習する。
  • Generatorでたくさんのスレタイを生成し、Evaluatorが高スコアを出したものだけを出力する

後で似たアイデアの論文*1を見つけましたので、本稿ではその表記に合わせて生成器をGenerator・評価器をFilterと呼びます。

3回目のなんJスレタイ生成

github.com

今回と前回(2回目)との差分

大きく3つの点を変更しています。

  1. 文書生成にTransformer(のEncoder)を利用する(前回:多層GRU)
  2. 文書のトークナイズにsentencepieceを利用する(前回:MeCab + NEologd)
  3. 評価器(Filter)にCNNを利用する(前回:多層Bidirectional GRU)

Transformerによる文書生成

前回は文書生成に多層GRUを利用していましたが、流行りのTransformerのほうが文書生成も強いのでは?と思って導入しました。

TransformerはもともとSeq2Seqのモデルなのでその前半のEncoder部分だけ利用します。 Masked Multi-Head Attentionを適用したEncoderを用いて、1文字前までのトークンシーケンスから次のトークンを予測します。

※詳しくはgithubのソースコードを参照してください

sentencepieceによるトークナイズ

前回はMeCab+NEologdを利用していましたが、Sentencepiece : ニューラル言語処理向けトークナイザ - Qiita によると機械翻訳においてはMeCab+NEologdよりsentencepieceを使うほうが良いそうです。

機械翻訳も文書生成タスクの一種であることを考えると、単純な文書生成においてもsentencepieceの方が良い気がしたので採用しました。

sentencepieceを使うことで2点良いことがありました。

  • 辞書を別でダウンロード必要がなく実験が早く進められた
  • 語彙サイズに合わせてトークンを決めてくれるので、最低限の正規化でも違和感の少ないスレタイが生成できた

特に後者が強力で、今回数字も特殊トークン化しなくても違和感のない文書を生成できました(後の生成例参照)。 昔は何でも形態素解析をしていた印象ですが、今の主流はsentencepieceなのでしょうか。

評価器(Filter)による選別

前回は多層Bidirectional GRUを利用していましたが、今回はより精度が良かったCNN3層による文書分類器で実装しました。 他にもいくつかモデルを試しましたが、イマイチ精度が良くなりませんでした。ここは改良の余地がありそうです。

実験

※ 前回同様、一部ブログに書くにはアレな文書も生成されていたので選抜しています。 選抜していないものを見たい方はこちら

※ 文書の開始・終了を表すトークンは表示していません、<kusa>は「w」が2つ以上連打されることを意味する特殊トークン、スレタイの後ろの数値はFilterの評価値です。

制限なしで生成したスレタイ

「はん」を「さ」に変えて予測変換が一致する唯一の球団 0.866355836391449
ワイの彼女「ふにゃふにゃふにゃふにゃゅ」ワイ「ふゅうごゅ?」 0.8488953113555908
コミケのオリジナルグッズガチでクオリティが高そうな件について<kusa> 0.814984917640686
コンビニでいつも悩んでいるオヤジにブチ切れて 0.8129239082336426
dmmでゲームやってるとやってるニキおる? 0.8119136095046997
ワイ「今日はリリースさてそろそろでしょ」上司「ちょっと待って!それ面白いやつくわ!」 0.8110376596450806
【悲報】古参オタクに意見を「お前のスレ」と書き込まれたこともなく何故か開く 0.8091040849685669
ワイ草野球で143キロ計測 0.8077213764190674
禁書の七人に一人無能がおるよな 0.8069646954536438
【画像】「私はロボットではありません」と主張する男がsnsに広がり始める 0.801096498966217

Prefix「三大」で生成したスレタイ

三大購入特典で必ず発送された商品「発送」「6時」「前売り」 0.8469894528388977
三大モテない奴は難しい言葉「努力以上の努力が必要」「努力は必ず責め」「代表」 0.8417271375656128
三大怖さがよくわからない単語 「マクナル」「マクド」 0.8301395177841187
三大気になっててくる車『山登る』『砂降り』『雪の降る街』『雪』 0.8113009333610535
三大深夜12時にありがちな事「伸びてるレス」「実は内容が急に伸びていた」 0.8103548884391785
三大理解不能な「若干滑ったな」「それでも否定コメしたらええんや」あとひとつは? 0.8086734414100647
三大アフィ大喜利本 「 頭 く い な っ て の い」 0.8043513894081116
三大森野メジャーで獲らない球団「日ハム」「ヤクルト」あと1つは? 0.8020216822624207
三大彼女連れてきた車「砂漠」「まや」「ゲド戦」 0.7955830097198486
三大なんかあるミステリー小説『ダディ』『ゲームの面別』 0.7863622903823853

Prefix「【なぞなぞ】」で生成したスレタイ

【なぞなぞ】平常時川で橋の上に座る? 0.897125244140625
【なぞなぞ】鉄板志の鉄が1つだけ買えるポジションってなーんだ? 0.8656874895095825
【なぞなぞ】屁がこえることが出来ない奴と良い法律で同居できる問題 0.8614312410354614
【なぞなぞ】2chではすぐngにするとその程度の書き込みができる人ってなーんだ? 0.8599361181259155
【なぞなぞ】『校長部類』と「先生」しか居ない説 0.8505473136901855
【なぞなぞ】トロースでかい野菜ってなーんだ? 0.8492956757545471
【なぞなぞ】野菜がパンしか食えない食べ物ってなーんだ? 0.8488330841064453
【なぞなぞ】女の子が大好きな男をデートに誘うために行くものってなーんだ? 0.8411668539047241
【なぞなぞ】痒くもなく終える前に食べるものはなんでしょう? 0.8402188420295715
【なぞなぞ】「悪の趣味」を使って文章を作りなさい 0.8386388421058655

Prefix「ゲーミング」で生成したスレタイ

ゲーミングpc買うのに利用者数分金払ってるやつ<kusa> 0.8862704038619995
ゲーミングpcとwindowsとドラえもんってどっち選ぶんや? 0.8519608974456787
ゲーミングpc買いたいからオススメのオススメ教えてクレメンス 0.8464795351028442
ゲーミングpcのチャクチャチャのiphone買えばええ? 0.8367217183113098
ゲーミングpcでpubg配信した結果 0.8358103632926941
ゲーミングpcをsfcとやりたいんだけど何か良いゲーム教えて 0.828700602054596
ゲーミングpcの探しが遅いニキおる? 0.8259073495864868
ゲーミングスマホ買おうと思うんやけどオススメのゲームない? 0.8258553743362427
ゲーミングpc使いにいったら気づいた事<kusa> 0.8251885771751404
ゲーミングpcのパーツ1tb使ってるやつおる? 0.8218405842781067

雑感

  • 全体的に前回より精度が良い文書生成ができたと思います。
    • 本当はちゃんと比較をしたかったのですが、色々変えて直接比較ができそうになかったため諦めました。
    • パラメータの問題かもしれませんが、前回よりややユーモアのある文書が生成できているようにも見えます
  • 数が入る文書(ワイ草野球で143キロ計測禁書の七人に一人無能がおるよな)も違和感ない数値を使った文書を生成できています(※両者とも学習データに同じ文書は存在せず、似たものは存在する)
  • sentencepieceの影響?
    • 前回と比べてUNKトークンの生成率が大幅に下がりました。
    • 若干文法がおかしい文書が生成されやすくなった気がします。
    • 鉄板志のような(おそらく)造語を使った文書が生成されるようになりました。

参考にしたページ