こんにちは。数理計算科学系 新 年のフナムシです。東京科学大学 数理計算科学系 年までで学ぶ大学数学について、面白みを感じた応用例を紹介します。数理計算で何をやるのか気になっている人や、大学数学、モチベがよくわからんという人におすすめです。
導入
皆様、大学数学の勉強は捗っておりますでしょうか?
大学数学はよく抽象化をしますが、必ずしも応用を示しません。その結果、ヨクワカラナイ言葉で書かれたヨクワカラナイ道具が爆誕し、結果 ヶ月後に
僕「なぁ、アレって結局何だったん?」
人「知らん」
...
という話題で花を咲かせる悲劇が高校以上に起こりやすいです。しかし、我々は 年間は大学で学ぶわけで、何かしら面白い計算の つでもして見せたいところです。
本稿では、数理計算科学系で学ぶ数学の一部について、筆者が面白いと思う応用例を紹介します。なるべく身近であって、かつ入門書の中盤以降で出てくる言葉で解くような題材を用意したつもりです。雰囲気で読んで頂けると助かります。
お品書き
- 線形代数
- 関数解析(集合と位相)
- 代数
線形代数
賢い空調システムづくり / Ax 計算高速化
筆者が躓いた所
線形代数の本を開くと、行列は実は線形写像と等価ですとか、ユニタリ変換がどうのこうのとか言った話を良く目にします。はて、それらを使ってどんな面白い計算が出来るのでしょうか。
応用例1 : システムの安定性評価
問題設定
システム(ビルの空調システムや火力発電所を想像して頂けると良いです)を安定に運用できる条件を考えます。
時刻が になる時、内部状態が時刻 のパラメータの線形結合に変化するとします。
例えば、空調システムにおいて、 つの状態
として、
といった具合です。この場合、係数がシステム固有の情報を表しており、係数をいい感じに設定することで を保ちたいな〜そのうえで 小さいと良いなぁ〜などと思うわけです。
ひとまず。
システムが安定、つまり暴走しない事を保証する上で、以下の事を保証する必要があります。
システム運用中に、設定温度からの偏差や空調機の出力が際限なく上昇するといった、状態の歯止めのきかない変化が起きない。
また、システムを安定に運用できる範囲内で、効率を最大化したいです。なので、システムにはこちらが設定できるパラメータ が存在するとします。
つまり我々の興味は、システムが安定な の範囲です。
定式化例
時刻 におけるシステムの状態を で表し、システムをパラメータ を用いて行列 で表す。この時、
である。
システムが安定であることは次で定式化される。
ここで、 が対角化可能であるならば、 は次の表示を持つ。
今任意の を考えており、 は正則行列なので、結局
である。
応用例2: 行列の分解
問題設定
を 行列とします。
の計算を高速化したいです。 ここで、 は一般とは限りません。お好きに(くだらなくならない程度に)性質を付加して構いません。
定式化例
とする。ここで、行列 であって、
を満たすものが存在する。
ならば、
とすることで計算が高速化される。
計算量は から になる。例えば の時, 倍速になる。
感想
世の中の多くの物は行列でかけます。なので、その行列について詳しいと嬉しいというメリットがあると思います。
空調の話について、システムが暴走しないでほしいという我々のふわっとした要求が、ある数値 を用いて というとても簡単な条件で出てきます。これならばチェックも簡単でマニュアル化等できますし、のちの応用でも使える気がします。
なお、 を条件とすることで、 なんと を保証できます。つまり、設定温度への収束を保証しつつ将来的な消費電力 まで保証できるわけで、これはちょっとアガります。
の話について、これは機械学習で良く起こると言われており、計算資源に難がある研究環境で特に頻繁に実用されています。
関数解析(集合と位相)
ゲーム AI 作成
筆者が躓いた所
私たちは や の世界の問題を解きたいのであって、それより一般化した話はちょっと、怖いです。
応用例: 動的計画法(マルコフ決定過程文脈)によるゲームAI
問題設定
ゲームAIを作ることを考えます。
ゲームとして、ブロック崩しやテトリス、ルービックキューブを考えます(抽象的に言うと、マルコフ性を持つ 人プレイゲームを仮定していますが、深く考える必要はないです)。
特定のゲームを選ぶと、状態集合 , 行動集合 , 即時報酬関数 , 遷移確率関数 , 割引率 が既知あるいは設定できるパラメータとして手に入ります(詳しくは説明しません、諸々の定数と思っていただければ良いです。また、)
行動価値関数 を定義します。
この時、次の命題が成立します:
についての方程式(ベルマン最適方程式)
を満たす を (存在するならば) と置く。
ここで、各盤面 について
を達成する行動 を選択する戦略は最適戦略の1つである。つまり、即時報酬関数によって定義される、ゲーム全体を通した収益を最大化する戦略である。
つまり、我々の興味は、 が与えられ、かつ を定義した時、ベルマン方程式を満たすような関数 を求める事です。 が一度求まれば命題の戦略を取ることで文字通り最適なプレイが実現され、それは時に人のプレイを凌駕するでしょう。
なお、このアプローチによるゲーム解析を動的計画法と呼びます。
定式化例
距離空間から出てくる著名な定理の1つに、バナッハの不動点定理というものがある。
バナッハの不動点定理(縮小写像の原理)
を完備距離空間とし、 を から 自身への縮小写像とする。この時、次の つの命題が成立する:
- を満たす がただ つ存在する
- 内の任意の初期点 を選び、漸化式 によって点列 を定義すると、この点列は のとき不動点 に収束する
今回、ベルマン作用素 を
とすると、 は一様ノルムに置いて縮小写像であり、かつ を満たす。よって、
と更新していくことで が求まる。なお、収束の速度は指数的である。
感想
が満たすべき方程式が手に入ったと思ったら、それを漸化式とみなして更新を繰り返すだけで が求まってしまいました。あっけないものです。
まぁ、実際の(面白みがある)ゲームでは とか とかになってしまって、計算回らないんですけどね。
ともかく。、 つまり や で記述された方程式の問題が、抽象化を推し進める分野から出た結果によって鮮やかに解かれたわけです。
また、今回 は引数がせいぜい可算無限ですが、ゲームの設定によっては は引数に実数を取りえます。これは行動空間や状態空間が非加算無限であれば良く、例えば車の自動運転などでは実数として扱うのが自然でしょう。
そして、その場合でも大筋は変わりません。これは成功裏に「関数同士の距離」や「関数の収束」を考えている事になり、これらの拡張を踏まえると集合と位相・関数解析のような抽象化した議論を経るのが自然です。
代数
頭が良い符号作成
筆者が躓いた所
私たちは や の世界の問題を解きたいのであって、それより一般化した話はちょっと、怖いです。
応用例: 情報理論における誤り訂正符号
ある通信局から別の通信局に 列を送る事を考えます。
通信の過程で、ノイズが入ってしまいます。具体的には、各文字について、確率 で反転してしまいます。
ここで、送りたい文字列に追加で誤り訂正のための符号を追加することで、誤りに強くする方法を考察します。
単純なものとして、繰り返し符号化を紹介します。例えば
を送りたい時、
を送るという取り決めを考えます(空白は見やすさのためで、実際に送られる文字列にはありません)。
文字列を復元する側はこう考えれば良いです:前から3文字ずつ見ていく。 で多い方を採用する。
前回の例で言えば、
が届いたならば、
と復元することになります。
文字ごとの誤り率は です。 , 例えば ならば となり、送る文字列長が短い間は実用的になるでしょう。
ここまではちょっとした算数パズルのようですね。
ここからは、より効率的な符号を考えたいです。
符号の誤り訂正能力が であることを次で定義します:
符号に発生したノイズが 個以下である時、元の符号を正しく復元できる。なお、個数には訂正の為に追加した bit に発生したものを含む。
我々が求めたいのは、元々送りたい 01 列の長さに対して割合が小さい bit 数で、かつ誤り訂正能力が高い符号です。さらに、要求する誤り訂正能力に対応して付加する訂正 bit を少なく出来ると理想的です。
ただし、簡略化のため以下の仮定を入れます:
- 送りたい 文字列の長さは全て等しい
- 付加する誤り訂正 bit の個数も全て等しい
議論の文脈がないのでアレなんですが、結構自然な仮定です。
定式化例
ここで、 符号を導入する。
概要:
の原始元を とし、 を 以下の任意の正整数、 を満たす を導入する。この時、生成多項式を次のように定義する:
この時、 により生成される巡回符号(という、別で定義される符号)を BCH符号と呼ぶ。
性能:
全体の符号長 =
元々送りたかった01列長
誤り訂正能力
つまり、誤り訂正能力 を持つ符号化方を、追加 bit 数 程度で得られる。
感想
長さ の 列を送りたい時、最初の「3個繰り返し符号」は訂正能力=1を得るために の追加 bit を付加していました。
しかし、代数学の力を借りた 符号では、 の追加 bit でこれを実現しています。つまり、オーダーレベルでの削減に成功しているわけです。
おまけに 符号は誤り訂正能力を簡単に調整可能ですので、遥かに実用性が高いでしょう。
元々は 列を効率的に送りたかったというだけなのに、こういった議論が突然出てくるのだから驚きます。
終わりに
いかがでしたでしょうか。他にも、オートマトンは回路の設計・効率化やコンパイラ作成に使えるなどという低レイヤな話や、複素解析はとりあえず が便利という低レベルな話などぜひ紹介したかったのです。が、あまり張り切りすぎるのも良くない、というか書けるか怪しいということでここまでにします。 年間の振り返り的なノリで書いたのですが、読める文章になっているか少し不安です。
この記事が学習の一助になれば幸いです。