DENXブログ

同志社大学 電気情報研究会(DENX)の活動や日常風景などを紹介します。

TransformerでDENXちゃんを作りました

はじめに

こんにちは!DENXで機械学習をやっている京田辺三回生のryです。
前回のブログから約一年半ぶりのブログとなります。
この一年は機械学習の創作活動から離れて、主に自然言語処理機械学習コンペティションに出場したり、長期インターンに参加したりしていました。
結果としてはKaggleで銀二つ(上位1%と2%)を獲得し、Kaggle Masterに王手をかけるところまで行きました。

動機

そろそろコンペティションだけではなく、創作活動もしないといけないと思い、翻訳の技術で使用されるTransformerを使用してDENXちゃん(チャットボット)を作成しようと思いました。
DENXちゃんを作ろうと思った動機としては、コロナの影響もあり、新入生の入部が少ない中、少しでもDENXに興味を持ってもらえたらいいなと思ったからです。

DENXちゃんとは

DENX公式のマスコットキャラクターで2015年に誕生しました。
好物はラズベリーパイです。
f:id:denx:20200304223651p:plain

データセット

フリーで公開されている名大会話コーパスなどがありますが、より面白みのある返答にしたかったためでんぶん2ちゃんねるSSまとめから異性のタグの全記事をスクレイピングして対話文を抜き出しました。

前処理

全角半角の統一や不必要な文字の除去、文字数の制限(4文字以上25文字以下)などを行いました。
文字数を4文字以上25文字以下にした理由としては3文字以下に多く「はい」や「うん」などのダルレスポンスが多く含まれていたからです。
前処理した結果、学習データは約200万件となりました。
トークナイザーにはSubwordTextEncoderを使用し、vocab_sizeを32768にしました。

学習

手法

「Attention Is All You Need」で検索をかけると自分の説明よりわかりやすく丁寧な解説記事がたくさん出てくると思うのでそちらを参照してください。
特にRyobotさんの記事やTensorflowのチュートリアルが分かりやすいと思います。

パラメータ

以下のパラメータで学習を行いました。

epoch : 100
batch_size : 256
d_model : 256
num_layers : 2
num_heads : 8

num_layersやd_modelをもっと大きくするとさらに精度が上がると思いますが、サークルのパソコン(GTX 1080Ti)ではこれが限界でした。

後処理

一人称を「私」に置き換えて、人物名をユーザー名に置き換えました。
また、一度Google翻訳で英語に翻訳してから日本語に再翻訳を行うバックトランスレーションを行うことにより丁寧な口調にしようと思いましたが、元の文章が思ったより崩れたので最終的には使用しませんでした。

結果

本来ならビームサーチなどを組み込んで複数の候補を用意してその中から応答を選択するべきですが、時間がなくそこまでできませんでした。
最終的には五つの異なるエポックのモデルからランダムに取り出して応答を生成し、同じ文章でも違う返答になるようにしました。

対話例1

f:id:denx:20210221121425p:plain

対話例2

f:id:denx:20210221123116p:plain 以前作成したSeq2Seq2とAttentionを組み合わせたモデルよりはるかに精度が上がりました。
また、並列計算可能なため学習時間もだいぶ早くなりました。

その他機能

ただ会話するだけでは面白くないので他にも通話や画像検索、天気取得、リアクション機能などを追加しました。
次に各機能について説明します。

通話機能

ボイスチャンネルに入っているときにDENXちゃんに話しかけると返答を合成音声で返してくれるようにしました。
Pythonにはgttsというテキスト読み上げの音声合成ライブラリがあり、返答に対して音声を生成し、その音声をボイスチャンネルで流すことによって通話できるようにしました。
文章によって読み上げ速度や声のトーンが変わるので、他に良さげな音声合成ライブラリがあったら教えて欲しいです。

画像検索機能

DENXちゃんに画像の検索ワードを送るとその単語の画像を取得するようにスクレイピングのプログラムを書きました。
Google画像検索からスクレイピングすると圧縮された画像しか取得できなかったため、Yahoo!の画像検索から取得しています。

f:id:denx:20210221101502p:plain

天気取得機能

同様にスクレイピングです。

f:id:denx:20210221102618p:plain

リアクション機能

相手の文章に対してネガポジ判定を行い、確率がある閾値を超えるとスタンプで反応するように設定しました。
文章のネガポジ判定は一から学習を行っておらず、感情分析ライブラリのasariを使用しました。

f:id:denx:20210221102408p:plain

これから

どうしても文中に多く含まれているダルレスポンスを生成しやすくなるので頻度に注目してペナルティをかけて文章の多様性をあげたり、Speaker Model のような特徴ベクトルを入れることによって個性を反映した応答生成できたらいいなと思っています。

終わりに

DENXでは年中新入生を募集しています。
サークルには機械学習以外にもゲーム制作やDTM、Web、競技プログラミング、イラストなどの様々な部門があります。
これらの技術に興味がある・やってみたい人はDiscordの新入生サーバーやLineのオープンチャットに遊びにきてください!
また、Discord新入生サーバーで各部門講座を開催する予定なので、プログラミングをやったことない人でも大丈夫です!
今回のブログとは全く関係ありませんが、「ATRI -My Dear Moments-」というノベルゲームがおすすめなのでよろしくお願いします!