春告げ抹茶ホイップ

組み合わせ最適問題と小説執筆

先日、以下の記事を楽しく読みました。

この記事は最適化問題という工学の分野でよく出てくる考え方をわかりやすく説明した記事であると同時に、その考え方そのものの面白さにも触れられていました。

「最適化問題を作って解いてみる」という話ではなく、最適化問題を解くときに考える「目的関数を作って空間の中を目的関数の値を頼りに探索する」というイメージ自体が世界の捉え方として面白い、という話があったのかなと思っています。 工学とか特に計算機科学の考え方とかでそのまま応用するというわけでなくても、そういう観点で世界を見るというモノの見方を手に入れたことが自身にメタ的に物事の構造を考えさせる思考法をもたらしてくれるような、そういう面白さについては私自身共感するところではあります。

この記事のように、人生観にまで影響を与える大きな話に発展した内容を書くつもりではありませんが、私が最近考えていた最適化の問題と創作の間のどうでも良い戯言をちょっと書き留めてみようかなと言う気分になったので、以下に適当に書き連ねてみます。

今回この記事で語るのは、先の記事のような連続的な空間の中を目的関数を元に最適化する連続値の最適化問題とは別の最適化問題である、組み合わせ最適問題と創作の話をしてみようかなと。

あくまで戯言なのであまり真面目に論じるという感じではありません。 どうかお手柔らかにお読みいただけると。


今年も既に 1 ヶ月が経過しようとしていますが、私の今年の目標のいくつかあるうちの 1 つとして「小説を書く」というものがあります。

この手の目標というのは、目標を人に話してしまった時点で満足してしまって結局やらなくなってしまうことも多いので、ここに書いてしまった以上きっと今年は小説を書くことはない気がしますが。。。

まず初めに断っておきますが、小説執筆を目標に据えている時点で察せられるように私の小説執筆の経験はほとんどゼロです。 過去に友人とノリで 1 週間でショートショート書いてみよーぜ、というので 1 つめっちゃ短いお話を書いたことがあるのですが、正直満足行く小説というものを書けなかったという思い出があります。 こんな感じで小説を書くという行為とちゃんと向き合ったことは今まで無いくせに大胆にもこの記事では小説執筆の行為について語ろうと思っています。 つまりこの記事は私の完全に小説執筆という行為について妄想するだけの話なのでいかがなものかという感じではありますが、それはおいておくとして。

当時書いたその小説は、もうただお話を作り上げるだけで精一杯で、まとめ上げることもできず適当にぶん投げて終わってしまったというものでした。 そんな感じでお話自体うまくまとめられなかったのですが、小説というのはお話や筋書きのようなものさえうまく作れればよいというものでもありません。 お話の筋書きとしての面白さと同時に別軸で、言葉のきれいさとか文章のリズムとか、そういう言葉の選択自体を試行錯誤することも小説執筆においてきっと重要な要素だろう想像します。

残念ながら前回の小説執筆では言葉選び自体を楽しんだりと行ったことまで考える余裕がありませんでした。 なので今年はその言葉の選択自体を楽しみながらなにか書いてみたいなあと思っています。

まあ、書いてみたいなあと思っているだけで実際には何も書かずに今年も終わる気がしますが。


さて、この小説執筆における言葉を選んでいく行為というのが、私の中では組み合わせ最適化問題の一種のように思える、というのが今回ブログに書いてみたい内容になります。

小説を書くという行為、プロットを立て、登場人物を配置し、出来事を並べ、言葉を選ぶという一連の行為を組み合わせ最適問題として捉えるとは次のような考え方を想定しています。

プロットは「制約条件」と言えます。 プロットと言うと少し大きすぎるかもしれませんが、今ここでどんな出来事や描写を書くのかという書きたい意味内容自体というのをここでは指しています。

そして一方で作者の頭の中には、「こういう雰囲気にしたい」「読者にこう感じてほしい」という曖昧ではあるものの目標があります。 これがある種の目的関数に相当すると考えています。 その値は数値で定量的に測るものではないですが、例えばこの文章で「不安」「静謐」「懐かしさ」「不穏さ」などなどの雰囲気の感覚的な評価軸が存在していて、それを目的の雰囲気にマッチさせるというのが目的関数です。

単語を入れ替えたり別の表現に置き換えたりして良い文章を作るという行為は、いわばプロットを制約条件として人間の文章から感じ取れる雰囲気が目標とどれだけマッチするかという目的関数を最大化することにあたる気がします。 そのために言葉の組み合わせを探索する行為が、小説の文章を書くということに似ている気がします。


2 つほど例を挙げてみようと思うのですが、普段から文章を書いたりしない人間が雑に作った例なのでそのクオリティには目をつぶっていただけると。

例えば次のような 2 つの文章を考えてみます。

  • 夜の道は静かで、明るく街灯が照らす道を歩いていた。
  • 夜の道は静まり返り、歩道を歩く私を街灯の無機質な光が突き刺している。

意味内容(夜・道・街灯・歩く)はほぼ同一であるにもかかわらず、雰囲気はまったく異なるような例を作ろうとしました。 「静か」と「静まり返り」、「明るく」と「無機質な光」、「照らす」と「突き刺す」といった語彙の選択が異なっています。 これらの語彙選択は、個別に見ると小さな差異ではありますが、組み合わさることで全体の評価関数の評価値は結構違うものになっている気がします。

「静か」はニュートラルに静かな様子を示す一方で、「静まり返る」という表現はただ静かなだけでなく何処か不吉なというか不安なかんじのニュアンスがあるかもしれません。 「無機質な光」と「突き刺す」なども不安感を強めるような語彙のつもりです。

意味内容を制約条件にしたうえで、単語の組み合わせを選ぶことで目的関数の評価値を変えられて、その評価値を最大化する組み合わせを探索するようなそういうイメージが伝わるでしょうか。

もう 1 つの例として次のような文章を考えてみます。

  • 歴史を感じる古い建物は、長い年月を静かに受け止め佇んでいた。
  • その古い建物は、歴史の淀みに何かを隠すように沈黙していた。

こちらも意味内容はほぼ同一ですが、雰囲気は結構異なるような例を作ろうとしました。 「静かに佇んでいる」と「沈黙している」というあたりは結構雰囲気が違うように思います。

果たして上記の 2 例が良い例になっているかというのはおいておくとして、私の取り上げたいのはこういう感じで、言葉の選択自体が全体の雰囲気に影響を与えておりその雰囲気を目標にマッチさせる最大の言葉の組み合わせを考えるのは、最適化問題に似ているなあという感覚です。


組み合わせ最適化問題とは、計算機科学の世界などでクラス NP に属するような問題らしいです。

残念ながら私はこのあたりの計算のクラスの問題は全くの素人なので、この記事で話していることも全く的外れだったり間違ったことを行っている可能性があり、まあ良い感じに割り引いて聞いてほしいのですが。 組み合わせ最適化問題とはおおよそ次のような問題です。

「有限個の選択肢の組み合わせの中からある評価基準を元に、最も良くするものを選ぶ問題」

ここで重要なのが、解が連続値では無く離散的なものであり、「選ぶ/選ばない」とか「順序」とかを扱っていること。 そして探索対象が組み合わせそのものであるというところです。

典型的な問題としてナップサック問題とか巡回セールスマン問題とかがあるようです。

ナップサック問題というのは、ある重量まで入れられるナップサックに対して、複数の品物が与えられたときに、その中からナップサックに入れられる重量の範囲内で最も価値の高い組み合わせを選ぶ、という問題です。 複数の品物はそれぞれ価値と重量が与えられており、ナップサックに入れられる重量の上限が決まっています。 これがまあ簡単には求まらない問題ということになります。

ナップサック問題には、最適化バージョン以外に判定バージョンがありこちらのほうがクラス NP っぽさがあるかもしれません。 そちらは、与えられた品物の組み合わせの中からナップサックに入れられる重量の範囲内で、価値がある閾値 K 以上になるような組み合わせが存在するかどうかを判定する、という問題です。 この問題は、与えられた組み合わせた K 以上の価値を持っているかはすぐに検証できる一方で、この K 以上の価値を持つ組み合わせを見つけ出すのは難しいとされています。

そして最適化問題の方の最適な組み合わせがもし多項式時間で見つかるなら、その最適値が K 以上かどうかを判断することで判定問題も多項式時間で解けることになります。 その意味で、判定問題が NP であるとすれば最適化問題版もある種 NP に属するような難しさだと言えるのかなと理解しています。 私の理解なので間違っている可能性はあります。

ナップサック問題は選ぶ選ばないの二択で選んだ品物の順序は考えていませんでした。 巡回セールスマン問題は、有名な問題で都市の集合が与えられたときに、各都市を一度ずつ訪れて元の都市に戻る最短経路を求める、という問題です。 こちらは順序も考慮する必要がある問題となりますね。

この手の組み合わせ最適化が難しいのは主に組み合わせ爆発が起こるからになります。 これは要素数が増えると指数関数的に探索空間が増えていくという話ですね。 例えば 50 個の要素を「選ぶ/選ばない」の二択を付与するだけでも組み合わせ数は 2502^{50} 通りとなりかなり大きな数になることがわかります。 これは、全探索が事実上不可能で、少しサイズが大きくなるだけで計算不能という話になります。

組み合わせ問題の多くが NP 困難だそうで、厳密解を多項式時間で求めるアルゴリズムは知られていないそうです。 「正しいかどうかの検証は速いが、最適解を見つけるのは極端に難しい」というタイプの問題ですね。

そのため必ず最適解を出す方法を全探索とかで行うのは現実的ではないので、この手の問題では工学的には、近似アルゴリズムやヒューリスティクス、メタヒューリスティクスなどを用いて「まあまあ良い解」を見つける手法がよく使われるようです。


この手の組み合わせ問題の解き方として、古典的には例えば次のようなアプローチがあります。

厳密解法で、整数線形計画とか動的計画法とか。 これらは小規模とか良い構造を持つ問題には有効ですがスケールには弱いです。

近似アルゴリズムで、最適解の何%以内を保証するとかそういうことを考える理論的な性能保証を重視する近似アルゴリズムもあるとか聞いたことがある気がします。

ヒューリスティクスで、局所探索とか焼きなましとか遺伝的アルゴリズムとか。 これらは実用性が高く、真面目に解くより圧倒的に速くだいたい良い感じの解を見つけられることが多いです。

近年は数理最適化ソルバが高度化して性能が向上していたり、機械学習でヒューリスティックの自動学習や分岐の選び方を学習したりという研究もあるそうです。


小説の例に戻りましょう。

小説というものを素朴に捉えると、文章は語彙の選択でできています。 そこで辞書を巨大なアイテム集合とみなして、それらを使うか使わないかを割り当てつつ更に順序も入れてその順序付きの組み合わせを最適化するという問題に見えてきます。

アイテムは単語やフレーズで、目的は狙った雰囲気と結果を人間が評価したときのマッチ度合い、そして同じ意味を保ったまま単語を入れ替えるのは制約条件です。 こうしてみるとまるでナップサック問題や巡回セールスマン問題のような組み合わせ最適化問題のように見えてきます。

ここで小説の単語選択が単純なナップサック問題よりさらに複雑なのは、単語の価値が線形に積み上がるわけではないところです。 単語 A を選んだうえで単語 B を選ぶと大きく価値が跳ね上がるような、そういう単語の組み合わせというものが考えられます。 このような選択変数同士のペアが絡み合うような最適化問題は、非線形の高次な相互作用ということで難しい問題になります。

さらに、選ぶだけでなく順序がある並べる問題なのもナップサック問題より巡回セールスマン問題とかスケジューリング問題のようになってくるかもしれません。


ここまで書いておいてなんですが、上記のような小説と最適化問題の比喩を持ち出してみることはできるものの、実際のところは話はそんなに単純ではないとは思われます。

最適化問題と違って、制約条件自体もソフトなものとなります。 例えば「この雰囲気を出したいなら出来事を少し変えたほうが良い」というような、意味を変えずに単語を選ぶという問題ではなく、単語を選んでいるうちに意味の方にもフィードバックがあり、制約条件自体も変化していくような問題になっているかもしれません。 作者は目的関数の形に引きずられるように制約条件を更新することがあります。 これは、単純な制約付き最適化を超えて、探索空間そのものが動的に再定義されていく探索のようになります。

また、評価関数に人間が含まれることも複雑なところですね。 ヒューマンインザループ最適化とかいう分野もありますが、評価関数自体が人間の感覚に依存する場合、評価関数のノイズや不確実性、主観性なども考慮する必要が出てきます。 さらに、評価という行為それ自体が人間の判断が必要で、機械化して大量に評価することに依存したアルゴリズムが使いにくいということもあります。 クラス NP の話を先程しましたが、実のところ人間の評価というのはコストが高い行為なので、検証は安いけど判定が難しい問題以上の難しさがあるかもしれません。

そんなわけで、まあ小説執筆という行為を組み合わせ最適化問題に見立てるのは、あくまで比喩的な話であり、実際にはもっと複雑な問題になっている可能性が高いです。 しかしながら、言葉の選択という行為を組み合わせ最適化問題に見立てることで、文章を書くという行為を新たな視点で捉えられるかもしれない、という感覚があります。


NP 困難の世界では厳密最適解を諦めて以下のような手法でまあまあ良い解を見つけることが多いです。

  • ヒューリスティック
  • 局所探索
  • 焼きなまし
  • 多スタート探索
  • 評価関数の設計

小説執筆中の行為は、これらの手法に似た行為を自然に行っているように思えます。

  • 書いてみる(初期解生成)
  • 推敲する(局所探索)
  • 大胆に崩す(温度を上げる=探索範囲拡大)
  • ボツを作る(多スタート)
  • 読み返して評価する(ヒューマン・イン・ザ・ループ)

局所探索や近傍操作というのは組み合わせ最適の探索でよく行われます。

巡回セールスマン問題なら「2 都市の順序を入れ替える」、スケジューリングなら「ジョブの順番を 1 つずらす」といった小さな変更のことを近傍というようです。

小説執筆においては例えば次のようなものが近傍操作かもしれません。

  • 単語の言い換え
  • 修飾語の削除・追加
  • 文の分割・統合
  • 主語と視点の微調整

近傍探索というのは探索の中で基本的な行為ではありますが、それだけでは局所解に嵌ってしまうことがあり必ずしもうまくいかないことが知られています。

局所最適を避けるというのも組み合わせ最適の工学的な探索では重要なことです。

どの近傍を見ても改善はしないが、全体的には良くない解に嵌ってしまうということは実際の問題でもあるようです。

小説執筆においても、一文一文は整っているが章全体としてなんかイマイチということはありそうに思います。 一文単位の改善が作品全体の改善を保証しないなかで、目的関数の最適化を行わなければいけません。

この局所最適を脱出するために焼きなましとか多スタート探索とかが使われます。

焼きなましとは、局所最適を脱出するためにあえて悪化するような変更も受け入れる手法です。 一時的に悪化する変更を受け入れて、徐々にそれを許さなくするような戦略が取られることがあります。

小説執筆で言うなら例えば次のような操作は焼きなまし的かもしれません。

  • あえて文を壊す
  • 仮に乱暴な言葉に置き換える
  • トーンを極端に振ってみる
  • 章を丸ごと書き直す

これらの「とりあえず壊してみる」という行為は、焼きなましで temperature を上げて探索範囲を広げるような行為に似ている気がします。 最終稿に近づけば近づくほど細部しか触らなくなるとは思いますが、探索の初期では temperature を高くして大胆に壊してみるのも良さそうです。

多スタート戦略とは、初期解依存性を減らすために複数の初期解を用意しそれぞれ独立に探索し、最も良いものを採用するという手法です。

小説執筆で言うなら、同じ場面を別の文体で書いたり、語り口を変えて冒頭を書き直したり、ボツを出してとりあえず色々書き直してみるという実践に対応するかもしれません。

よく言われる「最初からうまく書こうとしない」で捨てるつもりで色々書いてみるというアドバイスは、実は工学的な合理的なアドバイスだったのかもしれません。

一度書いたものが惜しくて大きく変更することにビビってしまったり、最初に書いたものに引きずられてしまうことはよくあると思います。 しかし、工学的な知見として temperature を上げて大胆に探索したり、多スタートで色々試してみるというのは、局所最適を避けるために有効な手法であることが知られています。 この知見があれば、より大胆に色々探索をしてみるということに積極的になれるかもしれません。

作品を作るという行為が空間探索であるという感覚を持っていると、そしてその中を探索することの重要性や探索の戦略について知っていると、そういうメタ的な知識が無意識的に行っている創作行為をより意識的にメタ的に認知して行えるようになるかもしれません。


ここまで書いてきた小説執筆を最適化問題として捉えるというのは、別に小説の単語選択を機械に自動で最適化させようという話ではありません。

現代では LLM によって文章の意味とか雰囲気とかも機械が評価できる時代なので、LLM を評価器として挟んで最適化をぶん回して良い文章ができるかというのを試すのはそれはそれで面白い試みかもしれませんが。

特に今回の設定では評価関数が人間の感覚に依存するものです。 人間の感覚はその個人の経験や、あるいは文化的背景などに依存するでしょう。 個人が過去に読んだ小説とか詩とか、どういう文章に触れてきたか、あるいは文章以外に触れてきたかというのが目的関数の形に影響しそうです。 あるいは文化の中でこのワードはこれまでの作品でどういうふうに使われてきたかとか、そういうのが積み重なることで単語やフレーズ自体にニュアンスというのが生まれて文化の中で共有されていきます。

そういう文化的、人間的行為を別に機械化で置き換えようというわけではありません。 計算機の考え方をこういう文化的人間的行為に持ち込むのを嫌う人もいるとは思うのですが、個人的にはこういう計算機科学の知見で得られるモノの見方を人間の行為に持ち込むこと自体は面白いと思っています。

小説の単語選択という問題を実用的に最適化問題として解きたいと言うよりも、自分の行っている行為が最適化問題なんだなあと認識することそれ自体がメタ的に自分の行為を捉え直すことにつながり、創作行為に対する新たな視点をもたらしてくれるかもしれない、というようなそういうお話をしたいつもりでした。


こういう文化的な人間的な行為にコンピュータ科学的なあるいは工学的な枠組みでのモノの見方を持ち込むの、結構面白いと感じています。 冒頭に紹介した橋本麦さんの記事なんかがまさしくそういう考え方をされている記事で読んでいて楽しいものでしたね。

この手の考え方は人によっては嫌われそうと言うか拒絶感がありそうと言うか、アルゴリズム的、機械的なものを人間の文化的な行為に持ち込むのは不適切だという考え方もあるかもしれません。 しかし、ここで持ち込みたいのは機械的にアルゴリズムで文化を最適化したいという話ではなく、そういう機械的なアルゴリズムとか自体がメタ的な観点を与えてくれる世界の捉え方の 1 つとして面白いというお話のつもりです。

何より、計算機的であったり工学的枠組みでものを捉えるという行為自体が、計算機科学とかあるいはもっと広く工学という分野の文化というものであるとも言えると思います。 いろんな文化に触れて見識を広げるのは、きっと面白いことだと思います。