枕文:量子ビットは通常平面上の漁期に配置される。格子手術を用いるプログラムは、この領域の一部、通常は四角やブロックを組合わせたペントミノのような形の量子ビットを使用する。これを時間方向に伸ばして考えると、3次元の直方体の中に、ある時刻からある時刻まで、この領域を使う、という、立体ペントミノを配置するようなことになる。また、プログラムは一回使った領域を使い続けるわけではないので、時間軸方向にもでこぼこした、立体ペントミノ、ブロックを配置することになる。いくつものプログラム(タスク)をスケジュールすることは、この直方体の中に互いにオーバーラップしないように、プログラムに対応するペントミノブロックを配置することになる。
最近、ChatGPTやAI翻訳ツールが出てきたおかげで、機械が意味を扱えるようになってきた。このことで、生成AIや機械翻訳とコンパイラの世界が近づいてきたような印象がある。もしかしたら、機械学習にコンパイラのこれまでの研究成果や考え方が活かせるようになるのではないか?
例えばAI翻訳を例にとると、自動翻訳では機能や使用が定義されていない。意味が正しく伝わることが目的であり、意味が近い方がいいですよね、というある種の最適化が行われ、変換されている。
しかし、世の中には意味が全く同じになるように保存される必要がないものも結構ある。機能または仕様が満たされていれば良いというもの。例えば特許文書などの執筆では、意味が同じである必要はなく、機能と仕様にズレがなければ良いという場合もある。「こういうものを作りました、こういうところに有用性があります」と伝えると、弁理士さんが書き直して特許文書の形式に変換する。このような変換は、ひょっとしたらコンパイラなんじゃないのか?
これをいい感じのメールに描き直してください、とChatGPTに指示して書き直させるのは意味を保存して機能を変えている。これはコンパイラなのか?ChatGPTが登場したおかげで、翻訳と添削、およびコンパイラの定義が連続的に繋がっているかあやふやになっているのでは?
量子ビットは通常平面上の漁期に配置される。格子手術を用いるプログラムは、この領域の一部、通常は四角やブロックを組合わせたペントミノのような形の量子ビットを使用する。これを時間方向に伸ばして考えると、3次元の直方体の中に、ある時刻からある時刻まで、この領域を使う、という、立体ペントミノを配置するようなことになる。また、プログラムは一回使った領域を使い続けるわけではないので、時間軸方向にもでこぼこした、立体ペントミノ、ブロックを配置することになる。いくつものプログラム(タスク)をスケジュールすることは、この直方体の中に互いにオーバーラップしないように、プログラムに対応するペントミノブロックを配置することになる。
(絵で解説したいなあ)
・立体の詰め込み問題が、そのままスケジューリング問題になる。このようなある種くせのあるペントミノだけを詰め込む問題として考えることで、優位性を作るような、最適化アルゴリズムの研究が考えられる
・プログラム、実行途中で、エラー訂正や、魔法状態の生成など、様々な計算コストの高い作業が発生する、つまり実行時間の遅れが発生する可能性がある。そのため、遅れたときの被害が最小になるようなスケジューリングを行うという目的意識はあると考える。
目的関数の設計としては、たとえば、各タスクxに対して、遅れるとxに遅れが発生する、つまりxと異存関係がある先行ジョブの個数を計算して、それを評価値とする方法が考えられる。全てのタスクに関する評価値の総和の最小化や、評価値の最大値の最小化が考えられる。
このあたり、OR分野でのスケジューリングをはじめとする企業の業務の最適化の研究で、こういったいろいろな制約、いろいろな評価値の研究がある。いかに現実の問題を簡単、単純で、新しい感じのする制約や評価値に落とし込むか、が興味の中心で、うまい表現ができるととてもうれしい。現場の価値観にあっていることも大事だが、上手に表現できるというその表現方法自体や、既存の問題の類型に上手に落とし込む、あるいはいいアルゴリズムが作れる形に落とし込むのもまた楽しい。評価値や制約をモデル化するときに、現実の要因を正確に反映するのは無理なので、何かを削り落とすことになる。ここで、何を削るか、何に着目するか、というところがセンスの出しどころで、現場での納得感や、実用上でのパフォーマンス、システムの簡潔さや、何か条件が変化したときに対する頑健性など、さまざまな視点から評価することが可能で、ここはデザインが評価されるときと同じように、これら様々な視点から、いいね、悪いね、が決まる。
・タスクに対応するペントミノブロックの形は変化させることができる。タスクの形が固定されていない。時間軸方向に対する連続性が保たれていれば、一部のブロックを平面上で移動させることができる。ただし、左右方向の移動はできるが、それを上下方向にすることはできない、などの制約がある場合もある。なので、「変形が可能な立体ブロックの詰め込み問題」になっており、これは最適化アルゴリズムの問題として新しい概念を含んでおり、面白そうである
このあたり、OR分野でのスケジューリングをはじめとする企業の業務の最適化の研究で、こういったいろいろな制約、いろいろな評価値の研究がある。いかに現実の問題を簡単、単純で、新しい感じのする制約や評価値に落とし込むか、が興味の中心で、うまい表現ができるととてもうれしい。現場の価値観にあっていることも大事だが、上手に表現できるというその表現方法自体や、既存の問題の類型に上手に落とし込む、あるいはいいアルゴリズムが作れる形に落とし込むのもまた楽しい。評価値や制約をモデル化するときに、現実の要因を正確に反映するのは無理なので、何かを削り落とすことになる。ここで、何を削るか、何に着目するか、というところがセンスの出しどころで、現場での納得感や、実用上でのパフォーマンス、システムの簡潔さや、何か条件が変化したときに対する頑健性など、さまざまな視点から評価することが可能で、ここはデザインが評価されるときと同じように、これら様々な視点から、いいね、悪いね、が決まる。
・タスクに対応するペントミノブロックの形は変化させることができる。タスクの形が固定されていない。時間軸方向に対する連続性が保たれていれば、一部のブロックを平面上で移動させることができる。ただし、左右方向の移動はできるが、それを上下方向にすることはできない、などの制約がある場合もある。なので、「変形が可能な立体ブロックの詰め込み問題」になっており、これは最適化アルゴリズムの問題として新しい概念を含んでおり、面白そうである
このあたり、OR分野でのスケジューリングをはじめとする企業の業務の最適化の研究で、こういったいろいろな制約、いろいろな評価値の研究がある。いかに現実の問題を簡単、単純で、新しい感じのする制約や評価値に落とし込むか、が興味の中心で、うまい表現ができるととてもうれしい。現場の価値観にあっていることも大事だが、上手に表現できるというその表現方法自体や、既存の問題の類型に上手に落とし込む、あるいはいいアルゴリズムが作れる形に落とし込むのもまた楽しい。評価値や制約をモデル化するときに、現実の要因を正確に反映するのは無理なので、何かを削り落とすことになる。ここで、何を削るか、何に着目するか、というところがセンスの出しどころで、現場での納得感や、実用上でのパフォーマンス、システムの簡潔さや、何か条件が変化したときに対する頑健性など、さまざまな視点から評価することが可能で、ここはデザインが評価されるときと同じように、これら様々な視点から、いいね、悪いね、が決まる。
・タスクに対応するペントミノブロックの形は変化させることができる。タスクの形が固定されていない。時間軸方向に対する連続性が保たれていれば、一部のブロックを平面上で移動させることができる。ただし、左右方向の移動はできるが、それを上下方向にすることはできない、などの制約がある場合もある。なので、「変形が可能な立体ブロックの詰め込み問題」になっており、これは最適化アルゴリズムの問題として新しい概念を含んでおり、面白そうである
🌟ここは、コンパイルの問題としては、比較的新しいと思われる。通常、リソースの最小化、スピードの最大化などの目的で、リソースをどのタイミングでどう使うか、リソースが幾何的な制約を持っており、それをどのタイミングで使ってどういう3Dの形を作るか、という問題は新しいであろうし、今まで技術とちょっと違うものを作る必要があると思われる。また、多様な形を用意することになると思われるので、なるべく違う形、だがある種の良い特徴を持っていること、(直方体に近い、体積が最小、makespanが最小、へこみがない、など。)を考える必要があり、こういうことを満たすように自動的に形を生成する問題は新しい興味があるはず。
・ものづくりなどの工場の現場でのスケジューリング等、現実社会でのスケジューリング問題では、スループットを最大化することが最重要な価値軸ではないことが多い。急な依頼が来てもだいじょうぶなように、常にある程度空きを設けることや、新しい仕事の問い合わせに短時間で回答できるよう、再スケジューリングの高速化が重要課題であったりもする。
・その意味で、タスクのキャンセル、挿入、変化などに対応するようなメカニズムを設計する方が、現実的には機構のほうが重要かもしれない。リスケジューリングのやりやすさとか重要。
京も、けっこう使用割合がすかすかだったりする。あちらも、幾何的な状況があり、直方体のジョブだけが出てくるような状況。こちらのほうが難しいが、だいたい似たような状況だと思われる。
こういう状況だと、スループットを極めるよりも(こちらのほうが価値の提示はしやすいと思うが)、いろいろな概念、価値軸に対応できるような、様々な方向性の研究ができるほうが、世のため人のためかもしれない。
このあたりは、どのような「実用でのストーリー」を考えるか、だと思われる。ボトルネックが発生しそうな所、人々が苦労しそうなことを想像し、それがどのように困難になるのか、どのように解決して価値を作るのか、それを現場の人、計算機を作る人や、ユーザになり得る人など、あるいは古典計算機のシステムの使用状況などから、いろいろな状況や問題意識などの概念を集めて、それを組合わせてどういうストーリーを作るか、というところが面白いだろう
関山さんが神田ラボにやってくる前に、宇野さんは「関山さんと話したいこと」や「関山さんと話す前の自分の考え」を以下のような事前メモにまとめていた。
最近、ChatGPTやAI翻訳ツールが出てきたおかげで、機械が意味を扱えるようになってきた。このことで、生成AIや機械翻訳とコンパイラの世界が近づいてきたような印象がある。もしかしたら、機械学習にコンパイラのこれまでの研究成果や考え方が活かせるようになるのではないか?
例えばAI翻訳を例にとると、自動翻訳では機能や使用が定義されていない。意味が正しく伝わることが目的であり、意味が近い方がいいですよね、というある種の最適化が行われ、変換されている。
しかし、世の中には意味が全く同じになるように保存される必要がないものも結構ある。機能または仕様が満たされていれば良いというもの。例えば特許文書などの執筆では、意味が同じである必要はなく、機能と仕様にズレがなければ良いという場合もある。「こういうものを作りました、こういうところに有用性があります」と伝えると、弁理士さんが書き直して特許文書の形式に変換する。このような変換は、ひょっとしたらコンパイラなんじゃないのか?
これをいい感じのメールに描き直してください、とChatGPTに指示して書き直させるのは意味を保存して機能を変えている。これはコンパイラなのか?ChatGPTが登場したおかげで、翻訳と添削、およびコンパイラの定義が連続的に繋がっているかあやふやになっているのでは?
まとめると、
・ChatGPTが、文章の添削や、丁寧な文章にすることや、プログラムの整形とか、いろんなことをしてくれるようになった。
・今までの文章(線形な文字列で意味や機能を持つモノ)の変換と言えば、コンパイラ、翻訳、添削など。chatGPTはこれらの操作をなめらかにつないでしまった。
・すると、翻訳とはなんなのか、コンパイルとはなんなのか、境目がわからなくなってくる。言語を変換するとか、機能や意味を保っているとか、なんか性能や上品さをよくしているとか、そういうレベルで考えると、違いが見えないように思える。
というのが元々持っていた問題意識。
コンパイラの拡大と再定義による新領域の可能性
コンパイラはそもそも計算機のためにデザインされている概念で、これまで言語や意味などは扱ってこなかった。しかし、ChatGPTや機械翻訳など「意味を変換する機械」が登場したことで、意味までを扱うものとして再定義することができるのではないだろうか?
ならば、意味を扱えるコンパイラを再定義する上で、コンパイラとはそもそもなんなのか?を検討した。
辞書では、「ものを集めて合成するアセンブリング」のような意味合いも入っているが、それはちょっと違うように思う。コンパイラでは、意味自体を扱わず、記号列を別の記号列に変換するだけで、記号列以外のなにか違うものを保存するということは考えていない。
一方でChatGPTではメール文を別の書き方に変換してくださいというとき、何かの意味ベクトル的なものに一旦置き換えられ、特定のルールにおいて違う形に変換されてくる。学習結果によって、このベクトル空間のようなものが変化してくるので、機械的にルールが記述されていない。
コンパイラ側でも最近では一意にルールが決まっているわけではなくて、効率をよくするために順番を入れ替えたり、こういう場合はこうしたいという変換をしたりと色々行っているが、基本的には元々やろうとしていたことと結果的に出てきたコードが同じであればOK、という考え方。
そういう意味では、コンパイラではやってることと意味が同じならOK、ということになるが、「意味が同じ」は判定ができないのでよくわからない。意味を保存するのは難しいが、わかりやすいのは例えば、以下のようなデータのフォーマットの変換。
・データフォーマットの変換(住所の書き方、番地の書き方、単位を30cmから0.3mに変える、表記揺れの修正、セブンイレブンを7-11に、座標の変換、日付、電話番号、金額、名前と苗字の連結など)
・事務文書の作成(定型の所を埋める)
こういう変換は、意外としんどい作業としてある。これもある種コンパイラ的な話かもしれない。そう考えると、コンパイラのところには変換するためのノウハウや知見がいろいろすでにある。わざわざ人間が指示をださなくてもコンパイラが認識して自動でやるべきことかもしれない。
北海道に出張に行く時の要件や、事務文書の作成なども、何らかの骨格があり、要件があり、あらかじめデータも存在するので、ある種のコンパイラと言えるのではないか。今はコンパイラというと、計算でしか考えていない。しかしコンパイラを広く考えてみると、機械に変換しますというだけじゃない定義で、違う考え方があるんじゃないか。
コンパイラを広く再定義することで、「新しい定義ではこういうことができるといいですよね」というコンパイラの新しい研究領域が生まれるかもしれない。例えば、「一貫性を保つのがコンパイラである」、「要件をつけていって、もののシークエンスを変換すのがコンパイラである」と別の定義でコンパイラを捉えてみると、ならばその要件とは何か?という話になり研究が広がるのではないだろうか?
上記の宇野さんの問題意識をもとに、関山さんとの議論が始まった。
自然言語をコンパイルする、とプログラムをコンパイルする、を比べながら考えてみよう。何がコンパイラっぽくて、何がコンパイラっぽくないのか?
・考えて、観察してみると、自然言語をコンパイルすることと、プログラムをコンパイルすることは、文字や単語のシークエンスを変換してるという意味では両者は似ている。
・ただし、専門的には機能が同じならいいというわけではない。たとえば、Pythonのfor
loopとは同じシークエンスのループを繰り返すものだが、最近ではsubroutineという呼び出し機能を使って書くこともできる。これをコンパイラで書き換えてしまってもいいのかもしれないが、本来はやってほしくない。途中でメモリがなくなってパフォーマンスが落ちたりするため。
・同様に、機能がおなじでも違うアルゴリズムを使って欲しくないという要件がある。例えば、これを主語にしないでほしい、盲導犬を主語にしないでほしいなど。
・何もないところから、指定した機能が達成されるように作ってしまえるなら、それはプログラム生成、とよぶべき。これはプロンプトエンジニアリングに近いものであり、コンパイラではない。こういう機能を作ってください、とお願いして作ってもらうものは、コンパイラとはちょっと違うって感じ。
この議論では、コンパイラが近年、抽象化していっていることが背景にあった。コンパイラが単なる言語を別の言語に変換するだけでなく、意味を扱い、最適化を含んだより抽象的なものになっていっている。その傾向が発展していった先に、隣に似たようなものとして生成AIと翻訳があった。この議論では、近づいてきた2つの世界がどのように関連するのかを探ることで、コンパイラ研究の新しい展開の可能性を模索している。
関山さんと宇野さんの議論から、以下の「新しい問い」が話し合われた。
・生成AI(ChatGPT)の存在から、コンパイラを再定義するとしたら?
・生成AIとコンパイラの比較:どこまでがコンパイラ的で、どこからが生成的なのか?
・翻訳はコンパイラか? ・最適化は、コンパイラに含まれるのか?
・意味の生合成を、コンパイラと翻訳ではそれぞれどう捉えるか?
意味の整合性のチェックは、ノウハウとして蓄積されているわけではないが、人間の翻訳技術的には行われている。コンパイラ研究側には、構造とか、矛盾がないことを調べる、型の違い、この変数はこういうものという違うことをするとエラーが出る、などが行われている。