2022年4月25日月曜日

控え目に量子コンピューティング入門(2)

  今回は、前回(1)でも述べた量子アニーリング型コンピュータ(別名、イジングマシン)の実機を使い、少し現実味のある例題に取り組みます。全く新しいタイプのコンピュータの利用ですから、これから大学で卒研を始める人にも、参考になれば嬉しいです。私も卒研生にかえったつもりで書いていますので、フルスペックの解答は示していません!?(単なる言い訳か。)

[*]その後の検討の結果、以下の論理には一部欠陥があることに気づきました。後日、改訂版を書きますが、本記事はそのまま(検討過程の経緯として)残します。→ 改訂版はこちらです。

課題:卒研発表会プログラムの作成
 図1は、ある大学の情報工学科の卒研発表会の実データである。図1(a)のように、19の研究室に4名〜10名の発表者がいる。5つの教室で並列に行われ、一人当たりの持ち時間は11分(=1スロット)、研究室入れ替えに1スロット、昼休みは5スロット分とする。全体をできるだけ短い時間で終わらせたい。
 これは単なる箱詰め問題ではなく、さらに、図1(b)のような研究室間の依存性もある。すなわち、教員は自分の研究室の発表にはもちろん参加するが、指導(評価)する他の研究室の発表も聞く必要があるからだ。

 この課題のフルスペックの解答は、従来の数理計画法でも可能だろうが、ここではそれは置いておき、新しい量子アニーリング型コンピュータを如何に利用するのかに焦点を当てる。Fixstars Amplify で提供されている、D-Wave(量子回路)、日立CMOSアニーリングマシン、Fixstars AEなどを選択して使うことができる。以下で段階的に検討する。

レベル1:練習(全体終了時間を短くする配置
 できるだけ全体の終了時間を短くする配置は、箱詰め問題のようである。これを量子アニーリングにかけるためのイジングモデルは以下のようになる。
(1)エネルギー関数A(目的関数)
 各教室で9:30に一斉に開始する。決定された割り当てに対して、各教室の終了時間のバラツキを示す関数Aを作る。この値を最小化するのが目標だ。前回述べたFixstars AmplifyのSDKを利用すれば、イジング変数(またはQUBO変数)の多項式として、そのような関数を(シンボリックに)イジングモデルへ与えることができる。
(2)制約関数X
 当然ながら、各研究室がいずれかの教室に必ず1回だけ配置されること。このような制約は、各研究室ごとに、全ての教室に対応するQUBO変数の総和がちょうど1となる関数をシンボリックに作成すればよい。
 これらの関数を与えて得られたスケジュールの一例を図2に示す。レベル1の練習問題としての要求仕様は満たしているだろう。

レベル2:昼休みを入れた配置とする
 レベル1では、昼休みがないので現実的でない。これを入れた配置にするため、午前と午後に分けて考える。以下では、午前の部について述べる。例えば、どの教室も12:10頃には一斉に終了するようにする。
(1)エネルギー関数A(目的関数)
 各教室の終了のバラツキをできるだけ小さくするという意味で、レベル1の場合と同じ。
(2)制約関数X'
 これは、レベル1の制約関数Xを緩和したもの。すなわち、各研究室がいずれかの教室に、0回(配置されない)または1回配置されること。
(2)制約関数Y
 どの教室の終了時間も12:10をこえないこと。すなわち、スケジュール長が一定のスロット数以下であることを示す。これもエネルギー関数の場合と同様に、QUBO変数の多項式からなる不等式をシンボリックに作成して与えることができる。
 このようにして得られた配置例を図3に示す。うまく行っているようだ。続けて、(午前中に配置された研究室を除いて)午後の配置を、例えば13:30開始で行えば良い。

レベル3:手作業での配置との協調
 これまでは自動配置だったが、例えば、研究室L13には特殊事情があり、午前中に教室0へ手作業で配置したい、という場合がある。残りの配置は上記の通り自動で行う。実はこれは簡単にできる。QUBO変数を定数にすることも可能だからである。その実現例を図4に示す。

レベル4:研究室間の依存を考慮した配置
 まず、確認しておきたいことがある。それは、上記のようなアニーリングの結果は、「研究室をどの教室へ配置するか」だけを決めるのであって、教室内での順序は決まらないことだ。図1〜図4での配置順序は一例に過ぎない。
 図1(b)に示したような研究室間に依存性がある場合は、ちょっと厄介だ。最初からこのような依存関係を含む自動配置を求めるのではなく、レベル1での様々な配置結果を参考に、手動で依存関係を満たすように再配置するという選択肢もあるだろう。
 しかし、どうしても自動配置が必要ならば、依存関係を十分条件として満たすような、QUBO変数の多項式や不等式による制約の生成も可能である。だが、それは(スケジュールが決まる前に設計するので)過剰な制約となり、結果としてスケジュール長を伸ばす恐れがある。これに関しては、次回以降に再度検討したい。

従来のプログラミングとの比較
 量子アニーリング利用の最大の特徴は、解きたい問題毎の解法手順を与える必要がないことだ。これは、ディープラーニングに似たところでもある。必要なのは、問題を表現するエネルギー関数と制約関数の生成だけである。("だけ"と言うな!そこが難しい。)Fixstars Amplifyを利用する場合は、それを通常のPython関数として与えるのではなく、数式としてシンボリックにイジングモデルへ渡すことになる。このあたりが、従来のプログラミングと異なる。
 しかしながら、従来型のプログラミングの必要性は、実はさらに高まってきたと言えるのだ。なぜなら、入力データの整形やFixstars Amplify SDK利用にはPythonが欠かせない。さらに、アニーリングの結果は、特殊なオブジェクトで返ってくるので、それをPython型に変換したり、分かりやすいプロット図やグラフ表示にもPhthon機能が不可欠なのである。
情報源:まだ少ないが増えてきた
 このためのプログラミング関連情報源はまだ多くはないと思う。そんな中で、特筆すべきものが出た。CQ出版「インタフェース」2022年6月号である。「Pythonで体験!量子コンピュータ:ゲート方式&アニーリング方式」という、全115ページに渡る大特集記事が掲載されている。量子コンピュータの基本原理や、上記で述べたFixstars Amplify SDK利用による量子アニーリングアプリの詳細解説まで載っている!我々にも、一気に量子コンピュータ時代がやってきた感がある!

2022年4月20日水曜日

控え目に量子コンピューティング入門(1)

 ディープラーニングに強化学習、それに自然言語処理の新しい技術を学びつつある中、「量子コンピュータ」には手は出さない(出せない)、と決めていたのですが、あるキッカケでそれは崩れました。今後少しづつ、それに関して書いて行きたいと思います。
 物理学は分からないが、(どの分野でもいいのだが)例えば、数学は勉強したことがあり、プログラミングもある程度できる。そういう人は、憧れの「量子コンピュータ」をすぐに利用できる時代に既になっていました!(うーん、遅れていた!)

 にわか勉強だが、量子コンピュータは、当初は「量子ゲート方式」と呼ばれるものだったが、これは外部のノイズの影響を受けやすく不安定なうえ、量子ビットも僅かしか作れないという難点があった。それに代わる「量子アニーリング方式」で稼働するシステムが2007年にカナダで初めて開発された。それがD-Waveというマシンだ。その後も、搭載量子ビット数の増大や、利用のためのソフトウェアの開発などが継続されている。また、量子ゲート方式の方も、「誤り訂正量子ビット」の方法など、多くの研究機関や大企業での研究開発が盛んになっている。

 一方、D-Waveのような量子回路によるのではなく、現代の先端半導体技術を駆使して量子アニーリング方式を実現し、多様な組合せ最適化問題の解決に供している企業もある。それには、日立製作所、富士通、東芝などが含まれる。その開発は、NEDOからの委託で行われたものもあるようだ。それらの研究開発成果をまとめて世の中へ還元すべく、Fixstars Amplifyという組織がこれらのマシンを一括して使えるようにしている。

 このFixstars AmplifyのWebサイトへ行けば分かるのだが、上記のD-Wave(量子回路)、日立CMOS Annealing Macnine(CMOS)など、5種類の専用コンピュータを誰もが無料で(一定の規約のもとで)使える!それらのハードウェア構成は各社様々であり、それぞれ特徴が異なる。にも拘らず、統一的なインタフェースで、どのマシンでも使えるAmplify SDKが提供されていることは素晴らしい!

 ここで解くべき問題は、エネルギー関数(コスト関数)と制約関数で表現する必要がある。さらに、それをイジングモデルと呼ばれる形式に変換する必要があり、そこにかなりの労力を費やすことになる。その際、スピンの論理的な接続関係を、マシン内の物理的な結線関係に直接的には写像できない場合もある。そんな難題も、Amplify SDK(Pythonで利用)が大幅に緩和してくれるのである。

 実際、小生はデモとして用意されている数例の組合せ最適化問題を、Amplify SDKによって、D-Waveマシン、日立CMOS Annealingマシン、Fixstars Amplify AEマシンの3機種で実行させ、それぞれの結果を得ることができた。例えば、有名なTSP(巡回セールスマン問題)は、64都市の場合でも、約700ミリ秒で答えが出た。こんなに手軽に、量子アニーリング型マシンを自宅から使えるとは、数週間前まで知らなかった。素晴らしい!

 だが、上記のAmplify SDKを利用するとしても、現実的な問題をこのようなマシンに乗せるのは、そんなに簡単ではなく、敷居は高い。そのため、例えば日立CMOS Annealingマシンでは、入門向けの親しみやすいWeb APIや、インタラクティブでビジュアルに係数設定ができるイジングエディタが提供されている。それでも、CやPythonやJavaを使った従来の一般的なプログラミングとはかなり異質なものである。実は、そこが楽しい!とも言える。新しいことへの挑戦のような気持ちになれる。だから、大学の卒業研究などにも活用できるだろう。

 少し覚めた見方をする人もいる。「従来コンピュータでは1億年かかるものが1秒で済む」みたいな言い方に反発しているようだ。確かにそれにも一理ある。というのも、天文学的な計算量になる、というのは最もナイーブな(全ての組合せをひたすら計算するような)方法を指している場合が多いからだ。例えば、上記のTSPの場合、実は非常に優れたアルゴリズムが存在しており、従来コンピュータでも短時間で処理可能なのに、それを無視している。それに加え、従来のアルゴリズムは通常、最適解を求めるように設計されているが、量子アニーリングはその性質上、必ずしもそうではなく、近似解になる場合も多い。だから、本当の意味での比較になっていないのだ、と。

 でも、未来は明るいように思う。

2022年4月17日日曜日

日立Annealing Cloud Webを試すためのスマホアプリの作成(その4)

  以前に書いた(その1)において、例題「ネットワーク堅牢性構築」に掲載されているネルギー関数(コスト関数)の説明は納得できると思うのですが、その式をイジングモデルの形の式にどう持っていくのかは、初心者には自明ではないかも知れません。

 そこで、補足説明することにしました。下図に、何をやりたいのかを再度掲載し、結論として、外部磁場係数相互作用係数はこうなる、ということを示しました。

 さらに、簡単な例題を使って、これらの係数の求め方を示しました。下図の式(1')において、第1項と第2項の総和をとると、頂点i毎に、hi x Siの形が出てきます。この係数hiが外部磁場係数です。第3項は、どの辺の相互作用係数Jijも固定の1となっているので、問題ありませんね。

 図をクリックし拡大してご覧ください

2022年4月15日金曜日

日立Annealing Cloud Webを試すためのスマホアプリの作成(その3)

 日立のCMOS Annealingマシンを利用するためのチュートリアル「画像のノイズリダクション」に関する 前回記事の続編です。画素(スピン)の相互作用をどこまで考慮するかに関して、簡単な実験を行いました。

画素間の結合は4方向で十分か
 前回と同じく2値画像のノイズリダクションにあたって、イジングモデルを組み立てる場合のスピンの相互作用を、4方向の場合と8方向の場合で、結果の違いを比較しました。下図をご覧ください。

 白または黒の大海原では、4方向だけで十分だろうと考えてアニーリングを行いましたが、上図左側の通り、ノイズが少し残っています。一方、8方向にした場合は、上図右側のようにほぼ完全にノイズがなくなっています。どこにノイズが入るのかが分からないのですから、8方向という精密化を図るべきなのですな。このマシンでは、King's graphのトポロジーをサポートしているのですから。

参考資料

[1] Hitachi Annealing Cloud Web
https://annealing-cloud.com/ja/index.html



2022年4月14日木曜日

座標(x,y)と一連番号の相互変換

 あるスマホアプリを作っていて、座標(x,y)一連番号の相互変換が必要になりました。もちろん、算数の簡単な計算に属しますが、ちょっと煩わしい。もしかすると、今後、また必要になるかも知れないので、以下に記録しておきます。

以下は、MIT App Inventorの場合ですが、JavaScriptなどでは、関数ceilingMath.ceilなどのはず。

左上隅が、(0,0)(1,1)の両方とも必要でした。シリアル番号の方は、開始 = 1としています。(開始 = 0 の場合は、1足すか引くかで済みますね。)



2022年4月10日日曜日

日立Annealing Cloud Webを試すためのスマホアプリの作成(その2)

  前回記事の続編です。日立のCMOS Annealingマシンを利用するためのチュートリアル「画像のノイズリダクション」の解説を読み、それに従って、自分でイジングモデルの設定を行い、実機での実行結果を(少しだけですが)検討しました。(その後、図1に関して若干変更してあります。)

2値画像のノイズ低減をイジングモデルで解く
 この問題をどのようにイジングモデルへ導くかは、参考資料[1]に丁寧に書かれており、すんなり納得できると思います。実は、これは、イジングモデルに取り組む初心者にとって絶好の例題なのです!

 というのも、(詳細は[1]にありますが)導かれたエネルギー関数(コスト関数)の形が、そのままダイレクトにイジングモデルを表すことになるからです。他の問題では、そうは行かずに、苦労することになります。2値画像のノイズ低減のためのエネルギー関数は、図1の上部に示した通りです。

スマホアプリから日立Annealing Cloud Webを使って解く
 
前回と同様、小生の作成したスマホアプリから、Annealing Clowd Webへイジングモデルの設定値(スピン結合関係、相互作用係数、外部磁場係数など)を送って、結果を得ることができました。図1にその一例を示します。

 128x128の2値画像に対して、ここでは、ランダムに50個のノイズを載せました。多くのノイズが除去されていることがわかります。(特に黒電話受話器と持ち手周辺などです。)画像やノイズのタイプで除去性能はかなり変わるでしょう。また、エネルギー関数の第1項と第2項の効果のバランスを取るためのこのパラメータηの値にも敏感なようです。アニーリングは、ヒューリスティックなので、そういうものでしょう。難しい問題では、最適解でなくても、かなり良い解を欲しいというケースも多いです。

(補足)白黒の2値画像なのですが、ピクセルに対応するスピンの向き(南北)のイメージを鮮明にするため、ノイズ除去後の画像は、(南向き)と(北向き)にしました。

浮動小数点版GPU32bit Floatマシンも使ってみる
 
このノイズリダクションでは、一般にη=2 or 3が推奨されるようです。しかし、図1に示した通り、小生が採用した簡単な画像では、η=1が良い結果を出しました。そこで、さらに、η=0.75としたところ、結果が異常になりました。ここまで使ってきたマシンは整数版だったのですね。でも、ちゃんと浮動小数点版もありました!ケースバイケースなので、断定的には何とも言えませんが、小生の画像に限れば、η=0.75がさらに良い結果を出すようです。図2がそれです。

(注)画素(スピン)間の結合をどのように与えるかに関してはこちらの(その3)をご覧ください。

参考資料

[1] Hitachi Annealing Cloud Web
https://annealing-cloud.com/ja/index.html


2022年4月8日金曜日

日立Annealing Cloud Webを試すためのスマホアプリの作成(その1)

 量子コンピュータが話題になっています。中には、これを使うだけで「先進性」をアピールできるなどと考える人もいるようです。そうではなく、量子アニーリングなどの考え方のもとに、もっと堅牢性があり実用性の高いハードウェアで問題解決することも盛んに行われています。ここでは、その一つと考えられる(量子回路ではなく先端CMOS技術で製造された)日立のCMOS Annealingマシンに注目します。

(続編:画像のノイズリダクション例題についてはこちらに書きました。)

日立のAnnealing Cloud Web
 日立製作所では、従来のノイマン型コンピュータとは別物の大規模CMOS Annealing マシンを開発し、それを一般の人が使えるようにAnnealing Cloud Webサービス[1]を提供しています。シミュレータではありません!大規模で超高速なAnnealingマシン実機を使えるのです!

 古くから知られているアニーリング法と、ここでの量子アニーリングは別物です。(多分、考え方に共通点はあると思いますが。)このマシンによって、種々の組合せ最適化問題(IoT世界での物流、金融工学、勤務シフト作成、等々)を極めて高速に解くことができるようです。

 このWebサイトには、アニーリングマシンとイジングモデルなどの基礎知識から、簡単な例題の計算の仕方までが、丁寧かつ簡潔に解説されており、とても有用です。図1は、デモとして載っている、グラフの最小頂点カバー問題(その具体例としてのネットワーク堅牢性問題)の最適解の例です。

 自分の組合せ最適化問題を解くには、それをイジングモデル化する必要があります。その際に、目的に応じたエネルギー関数(コスト関数)を設定する必要があります。この辺りが初心者にはちょっと難しいのですが、丁寧な解説もあるので、これを頼りに、徐々に使えるようになるはずです。

 具体的な使い方としては、イジングエディタを使って、ビジュアルに、スピンのトポロジーやスピン頂点毎の外部磁場係数や、スピン間の相互作用係数を設定することができます。さらに進めたい場合には、これらの設定値を引数として、curlコマンドでwebサービスをリクエストし、レスポンスをjson形式で受け取ることもできます。(この場合は、Web APIキー取得の申請が必要です。)

Annealing Cloud Webを試用するための独自のスマホアプリの作成
 
このように、コマンドラインからcurlでWebサービスを呼び出せるのに、なぜ、スマホアプリが必要なのか?

 [答え] 楽しい。ワクワク感があります。解くべき問題をイジングモデル化した後、スマホからこれらの設定値をwebサービスへ送り、レスポンスとしてのjsonを解析して、その結果をグラフ表示します。強力なAnnealingマシンの利用が、このようにスマホだけで完結するのは意味があるのではないでしょうか。

 図2は、作成したスマホアプリによって、図1に示した最小頂点カバー問題を解いたものです。頂点カバーに入るスピンが、赤い北向き矢印↑で示されており、図1の場合と同じ結果が得られています。

 スマホでの設定を容易にするため、ここではスピンの頂点は座標値ではなく、一連番号で与えています。webサービスへ送信する時、また、結果のグラフを描く際には、この一連番号を(x, y)座標に変換しています。

 ところで、スマホ画面の中央にある、「外部磁場設定」と「相互作用設定」の係数はどうやって計算して入力したのでしょうか?疑問に思われた方は、こちらの(その4)をご覧ください。

 このスマホアプリから解くことのできるスピントポロジーはKing's グラフの場合ですが、いろいろ他にも試すことができます。まだまだ、初歩的な段階ですが、アニーリングマシンを使うための入門の意味はあると思います。

参考資料

[1] Hitachi Annealing Cloud Web
https://annealing-cloud.com/ja/index.html


2022年4月1日金曜日

自然言語による発話からスマホアプリを自動生成する!

 MIT App Inventorは、従来型のコーディング無しにブロックを編集する方式で、スマホアプリの開発を格段に容易にしました。MITでは、この「ノーコーディング」をさらに進化させるべく、作りたいアプリを(自然言語で)喋るだけで、それを実現するApp Inventorプログラムを自動生成するプロジェクトAptlyを進めています。

Aptly (次世代MIT App Inventor)では何ができるのか
 このAptlyは現時点ではそのコンセプトの実験実証が行われています。そこでは、一つの例が示されています。図1に示す言葉(文章)をスマホに向かって喋ると、それを実現するスマホアプリ(6カ国間の言語の自動翻訳アプリ)が自動的に生成されることを示しています!

 研究開発の意義や開発状況については、MIT App Inventorの創始者であり現在もチームのトップを務めるProf. Hal Abelsonが自身のブログにかなり詳しく書いています:
Mar 21, 2022 hal's Blog

人手でこの仕様のApp Inventorアプリを作成してみよう
 まず、これまで通り、人手によって、図1に示された仕様の「6カ国の言語間の自動翻訳アプリ」をMIT App Inventorで作成してみます。慣れている人ならば、標準機能だけを使って容易に作成できるはずです。実際、図2に示した動くアプリは、小生が(作成開始から実行まで)10分ほどで作り上げたものです。

 このように、現時点のMIT App Inventorは、作り易さにおいて十分に優れているのですが、それでも、初心者は、インターフェースのデザインと、処理ブロックの実装において、色々と戸惑うと思われます。Aptlyは、それをも解消しようとしています!

先進的な自然言語処理モデルGPT-3(Codex)の利用がその要
 Aptlyの処理の要は、自然言語処理モデルCodexの利用にあります。最近注目を集めているGPT-3は、BERTなどと同じくTransformers、Self-Attentionsをベースとしており、自然言語の文章から何らかの記号列への変換を得意とします。Codexは、その変換先がPythonなどのプログラミング言語となるようにGPT-3を特化したものです。

 AptlyはこのCodexの上で、App Inventorのブロックに対応できるように設計された(少しPythonに似た)言語の中間語コードを学習させています。実際、図1に示した自然言語の文章に対して、図3のような中間語コードが自動生成されるとのことです。ここまで来れば、App Inventorの本来のブロック図は生成できる気がしますね。上記のブログ記事には、図2と似たApp Inventorアプリの生成結果も載っています。

 [小生の感想]
 すごいことになってきた。しかし、疑問も....。BERTにせよGPT-3(Codex)にせよ、文章の内容を理解しているわけではありません。精密な構文解析や意味解析も行っていないでしょう。また、人間のような、プログラミングに関する知識も持ち合わせていません。膨大なコーパスを使って、ひたすら、高度な学習(訓練)によって、入力記号列から別の記号列を生成しているだけとも言えます。それでも、驚嘆すべき変換結果が得られるのだから、参ってしまう!
 だから、「生成しているだけ」という言い方は適切ではないでしょう。実際、学習によって、見事に、生成に必要な何らかの(完璧ではないにせよ)重要な規則を発見しているように見えます。

ノーコーディングを推進することの意義
 上に示したProf. Abelsonのブログ記事は、単に技術論にとどまらず、「ノーコーディング」を推進することの意義についても言及しており、大いに参考になります。詳細は、原文をお読みいただきたいのですが、概略、以下のように述べています:
  • コーディングの技術はIT教育の基本であると唱える人もいる。逆に、コーディングはComputational Thinkingにとって重要ではなく、どのコンピュータ言語でどのように表現されるかに関係なく、computingの概念的なアイデアに焦点を当てたいと考える人もいる。Aptlyは後者の見解に合致している。
  • 産業用アプリケーションの構築においても、専門的なプログラマーの必要性を減らそうとする動きにも注目すべき。コーディングの十分なトレーニングを受けた人でなくてもアイデアを実現できるよう、障壁を取り除くことが重要である。
  • ある程度経験のある学習者は、Aptlyを使ってアプリを自動作成し、生成されたブロックを編集して自分で機能を追加することもできる。Aptlyで作成されたアプリが意図通りに機能しない原因となるバグを見つける練習もできる。
  • 一方、Aptlyは、コンピュータサイエンスの課題解決に適用される最新の機械学習の驚くべき特徴を明らかにする。与えられた特定の命令を超えた判断をするという証拠も見られる。例えば、上記の翻訳アプリを作る際、特定の言語を指定していないにもかかわらず、Aptlyは学習結果に基づき、ターゲットとなる6つの言語(英語、仏語、日本語など)を独自に選択した。[小生の注:日本語が自動選択されたのは嬉しい!]
  • ノーコーデイングから連想されることだが、1970年代に導入された電卓は、教育現場での使用について議論を巻き起こし、50年経った今でも続いている。教育者の中には、電卓が算数の学習能力を損なうことを懸念して、電卓に抵抗する人もいる。逆に、電卓が算数だけでなく、より高度な数学の概念に向かうための踏み台になることを歓迎する人もいる。