@yuichirominato 2019.02.28更新 193views

【QBM】量子ゲートボルツマンマシンでの強化学習


はじめに

前の記事ボルツマンマシンをゲート展開をしました。実際の学習モデルのコードにQAOAを導入して、変分回路でのボルツマンマシンを実装してみた上で、学習と推論の方法に関して確認してみたいと思います。

QAOAを導入した量子ゲートRBMモデル

QAOAを用いた量子ゲートのRBMモデルの式は下記の部分を変更する必要があります。

    def getMmodel(self,beta):
        c = Opt().add(beta*self.J).run(shots=100)
        ccc = counter(c)
        print(ccc)
        Mmodel = np.diag([0 for i in range(self.n)])
        for i,j in ccc.items():
            temp = [*i]
            temp = list(map(lambda x:int(x)/j,temp))
            Mmodel = Mmodel + np.diag(temp)
            for k in range(self.v):
                for l in range(self.h):
                    Mmodel[k][self.v+l] = temp[k]*temp[self.v+l]
        return Mmodel

上記の最適化部分を、

c = Opt().add(0.1*a.J).qaoa(shots=100)

に書き換えます。また、ループ部分に量子ビットの答えの格納を変更処理する必要があります。

RBMの推論

学習は前回までの記事に少し書きましたが、visiblelayerを入力と出力に対応させて、学習と推論を行います。推論の入力値の固定は局所磁場を利用して行います。

c = Opt().add(a.J).add("-10*q0-10*q1").qaoa(shots=100)
c.most_common(12)

#=>
(((0, 0, 0, 0, 0, 0, 0, 0), 0.4020990180474289),
 ((0, 0, 1, 0, 0, 0, 0, 0), 0.18650948659338823),
 ((0, 0, 0, 0, 0, 1, 0, 0), 0.10986637438485558),
 ((0, 0, 0, 0, 0, 0, 1, 0), 0.055083968265518916),
 ((0, 0, 1, 0, 0, 1, 0, 0), 0.03859321782313931),
 ((0, 1, 0, 0, 0, 0, 0, 0), 0.03773956476911518),
 ((0, 0, 0, 0, 0, 0, 0, 1), 0.021609758825796577),
 ((0, 0, 0, 0, 0, 1, 1, 0), 0.015584625036213188),
 ((0, 1, 1, 0, 0, 0, 0, 0), 0.01550494310602666),
 ((0, 0, 0, 1, 0, 0, 0, 0), 0.015501708822164914),
 ((0, 0, 1, 0, 0, 0, 1, 0), 0.014592269080913394),
 ((0, 0, 1, 0, 0, 0, 0, 1), 0.007134026224727637))

強化学習の導入

ここに迷路などを解くためには強化学習を導入していきます。量子ゲートボルツマンマシンで強化学習を解く際には通常のNNの強化学習とあまり変わりません。まずはベルマン方程式を導入し、

$$V^*(s) = max_a {R(s,a)+\gamma\sum_{s’}P(s’|s,a)V^*(s’))}$$

s:状態,a:行動,γ:時間割引率,P(s|s,a):条件付き確率

上記のように直近の報酬と、時間割引率を導入した報酬の総和を導入します。

NN導入前はQtableの採用で、Q関数を大きなテーブルとして持っていましたが(正直これは量子コンピュータにとっては魅力的ですが、、、)、これをNNの形に落としてみます。

Q関数へwの導入

Qtableは巨大なので、次元を削減するために量子ゲートボルツマンマシンを導入してみます。量子ゲートボルツマンマシンは学習をするにつれていい方策を取れるように学習されていきます。誤差補正するように学習していきます。

Q関数は量子ゲートボルツマンマシンの結合荷重を利用して更新されますが、誤差更新は報酬の期待値と現在のNNの誤差を補正するように更新されます。

$$L(w) = (r+\gamma max_{a’}Q(s’,a’,w)-Q(s,a,w))^2$$

初期のDQNに近いですが、同様にExperience replayなどのテクニックは、量子ゲートボルツマンマシンでも有効です。

1.Experience Replay
To remove correlations, build data-set from agent’s own experience
連続した時系列データの相関を除くデータセットを作る。

2.Fixed Target Q-Network
To avoid oscillations, fix parameters used in Q-learning target
値の頻繁な変更を許容しないミニバッチの際のパラメータの固定

3.Reward/Value Range
DQN clips the rewards to [−1, +1] I This prevents Q-values from becoming too large
Q値が大きくなりすぎないように配慮

実問題へのチャレンジ(まだ途中)

これをもってして迷路などへの実問題へチャレンジできます。参考はカナダの1Qbitの論文で、

こちらの方にざっくり書いてあります。まだ、量子ゲートボルツマンマシンは体系だってやってるところがないので、効率性の追求はまだまだこれからですが、ひとまずモデルの改善に進みたいと思います。

今後の展開

今回はRBMの2層モデルですが、量子コンピュータで考えられるアプローチは3つあります。

1、Qtableを$2^N$の状態ベクトルで表現して、量子ビットの重ね合わせを最大限活用する。

2、DQNタイプで次元削減したモデルにボルツマンマシンを適用

3、ボルツマンマシンではなくて、ほかの量子ゲートのNNモデルを活用する。

引き続きやっていきたいと思います。以上です!

Recommended


Wikiへ移動