WT
2021.07.29
言語モデルと綴る、実在しない二◯二一年七月日記
TEXT BY TORU URAKAWA
「コロナ禍」がはじまって、一年以上の時が流れた。あらゆるものについて物理的な距離を保つことが推奨され、だいたい部屋に一人でいる生活を送っている。心境や自然環境、社会の変化のようなものはさておき、物質的かつ日々の生活という範囲では代わり映えのしない毎日が続いている。そんな中つける日々の記録=日記は、起床時間と、天気のことを書いて、あとは内面的なことに終始しがちである。そこで、自然言語処理による日記の拡張ができないか、と、ふと思った。具体的には、文章を生成する「言語モデル」を使って、日記を書いていく。代わり映えのしない毎日の代わりに、言語モデルが生成した代わり映えのする2021年7月を記録する。またその中で、いまのモデルの挙動やそれが抱える問題といったことについても、観察したいと思う。これは、言語モデルと綴る、実在しない二◯二一年七月の日記である。
言語モデルとは
言語モデルとは、人間が話したり書いたりする「言葉」を、単語の出現確率でモデル化したものだ。
例えば「今日」「の」「天気」「は」という4つの単語の並びがあった場合、この並びの出現確率を計算できるとともに、この後に続くであろう単語の確率分布(「晴れ」「曇り」などは値が大きく、「数学」「裁判」などは小さい)を与える。
これは音声認識などで得られた文の尤もらしさを計算する際などに利用される(確率の低い文が認識されていたとしたら、それはきっと間違いであろう)ほか、入力として与えられた文から、それに続く語を推測することで、文章生成を行うこともできる。
下図では「現在、私は言語」という書き出しから次に来る単語を予測し、文章生成を行う様を図示している。
近年では、OpenAIのGPT-2など、大量の学習データを事前学習しそれを下位タスク(質問応答や要約など)のためにfine-tuningして利用するといった、大規模な言語モデルが注目を集めている。
朝日新聞社メディア研究開発センターでも、大量の新聞記事により事前学習したGPT-2を保有しており、それによって日本語文章の評価や生成が可能となっている。
このGPT-2を、wikipediaの記事データでfinetuneした事例に「#この記事は実在しません」がある。ここでは、〈記事の題名〉が与えられると、〈それに沿った本文〉を生成するという言語モデルのデモンストレーションを行なっている。実際に生成されたテキストが、wikipediaらしい系列になっているのが確認できるだろう。
言語モデルと日記を書く
今回は<架空の日記の生成>ということで、ある一つの時間や場所における出来事を綴ったテキストを学習させたい、という気持ちから、物語や文学を含む青空文庫データ(著作権の消滅した文書を抽出したもの)を用意した。これにより記事データで事前学習したGPT-2をfine-tuningし、日記=ある日の出来事を綴るテキストを生成していく。
さっそく、日記を書く。初日は、7月1日。
各日記ではinput/outputに、それぞれ筆者の手による入力文と言語モデルによる出力文を載せている。
7月1日「なんでもない1文から」
これが、一日目の日記だ。「朝、7時に起きようと思って実際その通りに起きた。」を入力に、この続きを言語モデルに生成させている。その中身を読んでみると......初日から不穏な内容になってしまった。<朝、起きた>という文脈から、不眠、それによる不調、病気と身体、精神について語ったテキストが生成されている。もう少し夢のある内容を期待していたが、書き手の入力時点の予想から大きく外れた出力が得られる、というのも、言語モデルによる生成の特徴だと思う。特に与えている入力が1文と短いため、その後の出力内容に対するコントロールも効かせにくい、ということがあるだろう。
7月2日「なんでもない2文から」
昨日に比べ、文脈を少し増やしている。起床時間に加えて「梅雨」に関する一文を添えた。これを上手く捉えているのか、天候に関する記述が現れているのがわかる。昨日よりは健康的な内容で安心する。後半の空模様に関する描写は、自分では書かない(書けない)内容とも思う。大きな真っ白な雲と無数の星が見える、深い赤と青の空に、今後出会うことはあるだろうかと思う。
7月3日「文脈をしぼって」
入力内容に一貫した主題(=短歌がうまく書けない)を与え、文脈を絞るような操作を行なってみた。fine-tuning用のデータの中には、短歌も含まれている。そのためか、絞った通りに歌(の、ようなもの)が引かれているのがおもしろい。ちなみに筆者は、文語を用いた短歌を書いたことがない。というか、書けない。
7月4日「あたらしい言葉たち」
一方で、言語モデルはあらゆる入力を我々の思う通りに扱ってくれるとは限らない。例えば「スマートフォン」「twitter」はどちらもfine-tuningのデータ中には現れない新語だ(青空文庫データが著作権の消滅した過去の文書であることを考えると、当然である)。これらの新しい言葉が我々の期待する出力を生むことは稀であって、ここではそれが電報へと形を変えながら、古めかしいモチーフが多数登場する(外套、鍵束、番人、...)世界が展開されていく。何か、日常を揺さぶるようなDMでも来るかと思ったが、届いたのは電報だった。
7月5日 「選択肢を狭めて」
最初に見たように、言語モデルによる文章生成は〈ある入力文が与えられたときの、次に来る語の確率を計算する〉ことで行われる。ただそれは、毎回のステップで確率の高い語だけ選べば良い、というわけではない。この日記では、あえて、各ステップで確率が最大である語だけを選択する生成を行ってみた。この例で確認できるように、語の選択がループに陥ってしまうことがある。
これは文章生成においてしばしば見られる問題の一つで、特に今回の様に毎ステップ確率の高い語のみを選び、文全体での尤もらしさを考慮しない場合などには、よく起こる。実際に読んでみるとしかし、意外と情景が浮かぶような気もする。2コマ漫画のような日記だ。
7月6日「選択肢を広げて」
昨日は、確率の高い語を選びとるだけでは自然な文章は得られない、ということについて触れたが、これに対しては様々な系列探索手法やサンプリング手法が提案されている。
そこで今日は〈top-k sampling〉と呼ばれる手法により日記を生成した。これは、確率の高い語を上位k個に絞った上で、確率分布に基づいて語を選択する手法で、ここではk=100としている。つまり、各ステップでは次の単語が確率の高いもの上位100個の中から選択されている。昨日のものとは比べるまでもなく多様な描写と出来事が綴られているのが分かる。妙に詩的な文章が多い気もする。
top-kの他にも〈top-p (nucleus) sampling〉と呼ばれる、kの値を累積確率の閾値によって動的に変化させる手法や、確率の高い単語は選ばれやすく/低い単語は選ばれにくくする〈temperature〉など、より自然な文章を生成するためのパラメータは複数存在する。これらのチューニングによって、出力の結果は変化する。今日はk=100としたことで、砂原の中に眠る、一人の少年に出会えたのだ。
7月7日「一緒に書く」
今日、7月7日、最後の1日は、筆者と言語モデルが交互にテキストを書いていく〈日記の共作〉を行なった。グレーのハイライトが筆者による入力で、水色が言語モデルによる出力である。生成にあたってパラメータの調整を繰り返し、自分好みの設定にこだわった(一応メモしておくと、top-p sampling, p=0.6, temperature=0.85)。どこか、おそらく現代ではないような、遠く離れた場所で、夏を感じている。そして、夕立からふと心に浮かんだ鰻への執着。〈鰻を食べていると、何だか、夏が、私を悩ます。夏というものが、私の心にある。〉この最後の一文は、私と、言語モデルが、この夏一緒に日記を書く、ということをしなければ生まれなかったものだと思う。