3目並べで強化学習を行うと、どうなるのだろうか。強化学習のアルゴリズムの一つである「Q-Learning」を説明しつつ、Q-LearningにDeep Learningを組み合わせた「Deep Q-Network」を使って、強化学習を実装する方法を紹介する。
【おわびと訂正:2020年5月13日19時 本稿のサンプルのソースコードは「ChainerRLで三目並べを深層強化学習(Double DQN)してみた - Qiita」を引用して一部改変させていただいたものでした。該当箇所で、その旨の記載を追加しております。引用元の著者様、ならびに関係者の皆さまにおわび申し上げます。】
昨今、多くのサービスで活用され注目を集めている「機械学習」。その中から、2016年3月に囲碁のトップ棋士に勝利したDeepMindの「Alpha Go」でも使用されている「強化学習」について解説していく本連載。
前回「囲碁プロ棋士に勝ったAI『Alpha Go』で使われた、『強化学習』って何?」では、「強化学習とは一体何なのか?」「強化学習のメリット」「他の機械学習との違い」「効率的に進めるためのフレームワークと実現できる世界観」「リクルートでの実践例の概要」を紹介しました。
今回は、強化学習の中にあるアルゴリズムの一つである「Q-Learning」について説明し、Q-LearningにDeep Learningを組み合わせた「Deep Q-Network」(以下、DQN)にも触れていきます。また「強化学習×Deep Learning」を効率的に実装できるライブラリの一つである「ChainerRL」を用いて、3目並べを題材にDQNを実装していきます。
前回は、強化学習を用いると「最終的なゴールを目指して、途中過程を最適にしたい」というタスクが解けると紹介しました。この点を、もう少し細かく説明するために、まず3つの要素を定義します。
今回、後述するDQNの実装を説明するときに使うゲーム「3目並べ」をこの3要素に当てはめると下記になります。
すなわち、「最終的なゴール(3目並べの場合、勝敗)を目指して、途中過程を最適にする」とは、「報酬が与えられる状態まで進み、与えられた報酬を基に今まで行ってきた『状態と行動のセット』を評価する」ことと言い換えられます。
ここで状態と行動のセットを評価するに当たって、重要な要素がもう一つあります。
Q値は「価値」。つまり、短期的にもらえる報酬ではなく、将来的にもらえる報酬を鑑みた値のことです。ゲーム「テトリス」で例えると分かりやすいかもしれません。
テトリスの場合、即時的に点数を稼ぐにはブロックを細かく消していく方が良い。しかし、長期的な点数を考えると、ときにはブロックを消さずにためて、一気に消す方が良い場合もあります。このときの「消さずにためる行動」をきちんと価値ある行動として評価できる指標がQ値です。
このQ値を学習し、導くためのアルゴリズムの一つがQ-Learningです。Q-LearningではQ値を、「その状態での即時的に得られる報酬の価値」と「見積もられた次の状態の価値」の和と定義しています。そして次の状態の価値を見積もるのに、現在推定されている価値の最大値を用いるのがQ値の特徴です。更新されたQ値はまた次の推定値として活用することで、徐々に信頼性の高い価値の推定値として学習していきます。このように推定された一番高いQ値から導かれる行動が、ある状態おいて、価値が高く、将来を考慮された最適なものになります。
強化学習の中でもQ値を使う手法は、いかにQ値を正確に推定できるかが鍵になります。逆に言えば、Q値を正確に推定できれば、「将来的に価値が一番高い行動を取ること」ができます。よって、「最適な行動を導くこと」は、「正確にQ値を推定すること」と言い換えられます。
そこで、Q値を推定するためにDeep Learningを使って近似する手法がDQNです。Q-Learningの場合、状態のパターンが少なければQ値を正確に推定できますが、タスクによってはとても複雑な状態を定義する必要があります。このような場合、Deep Learningを組み合わせたQ値の推定の方が有効です。DQNでは学習精度を高めるために、さまざまな工夫を凝らしているのも特徴の一つです。
DQNのアルゴリズムは、もちろん一からフルスクラッチで実装できます。しかし、現在では便利なフレームワークを活用して、効率的に実装することがほとんどです。
DQNを効率的に実装するためのフレームワークは何個か存在します。今回はその中から「ChainerRL」を紹介します。ChainerRLはPreferred Networksが深層強化学習のライブラリとして公開しており、Deep Learningのフレームワーク「Chainer」の強化学習バージョンとして有名です。ChainerだけでもDQNは実装できますが、ChainerRLを使うことでさらに効率的に実装できます。
Copyright © ITmedia, Inc. All Rights Reserved.