S4で始める強化学習(第12回)在庫管理問題で理解を深める

  • HOME
  • S4で始める強化学習(第12回)在庫管理問題で理解を深める

本記事は当社が発行しているシミュレーションメールマガジンVol. 18の記事です。 シミュレーションメールマガジンの詳細・購読申込はこちらのサポートページから

はじめに

S4 で強化学習を使ったシミュレーションモデルを作成してみようという講座の12回目の記事になります。 第8回~第11回では強化学習で在庫管理問題を考え、シミュレーションモデルを組み立てました。 今回のモデルの問題点とその改善方法やパラメータ設定についていくつか解説を行います。

学習の失敗例

今回のモデルでは、発注数は4個、8個、12個、16個から選べるようになっており、在庫の大きさには制限を付けない代わりに在庫管理費がかかるという問題設定となっていました。 第8回などで見た学習結果は比較的うまく学習できているように見えますが、実際にはパラメータの調整が難しく、以下の図のようにパラメータを少し変化させると利益が大きなマイナスになるようなかなり不安定な学習になっています。

パラメータを変化させたときの最終利益

原因を確認するため、学習がうまくいかなかったケースを一つ取り出して結果を見てみます[1]。以下のケースでは、累積利益が大きなマイナスに陥ってしまっていることが分かります。

学習がうまくいかなかったときの累積利益の推移

なぜこのような結果になっているのか、すぐに想像つくでしょうか。在庫数の推移のグラフを見ると一目瞭然です。

学習がうまくいかなかったときの在庫数の推移

在庫数がとんでもなく大きくなってしまっています。これでは、在庫切れを想定することもできませんし、在庫管理費が発注コストに比べて大きすぎて発注コストを考慮するのが難しくなってしまっています。今回の問題設定では、在庫を多めに発注する行動をとると、その行動がかなり尾を引いて影響を残すことがあります。在庫数がかなり大きくなってきてしまうと、状態がなかなか変化せず、ずっと同じ状態を繰り返してしまい、学習がすすみません。 しかし、強化学習では(特に学習初期には)いろいろな状態を訪問し、行動してみる(探索をする)というのが大切でした。この問題にはどんな対処が考えられるでしょうか。 直接的な方法としては、在庫が増えすぎることが無いように

  • 在庫上限を設定し、在庫が大きくなりすぎないようにする
  • 定期的に在庫を一定数に戻すような仕組みを入れる

といった方法が考えられます。在庫上限の設定は比較的簡単にS4でも取り入れられるため、この方法を確認してみたいと思います。

  • この結果自体は、乱数の種を0、初期価値を1000、ランダム行動確率を0.1、学習率を0.6として実行した結果になります。

在庫上限を設定する

実際の在庫にはもちろん上限があると思いますが、今回の問題設定ではそれ以上に上記の問題を回避できるというメリットを持ちます。 在庫を越えて在庫補充をしようとすると、在庫が補充できないというような仕組みにしてみます。設定は比較的簡単で、以下のように変更します。

  • 「在庫」という名前のストア部品で、容量に制限をつける(今回は20で試しました)
  • 「在庫補充」の前に「複製」部品を差し込み、製品数分のアイテムをばらばらに流すようにする
  • 「在庫補充」部品での追加個数を製品数分から1に設定する(直前に複製を挟んだため)
  • 「在庫補充」部品の最大待ち時間を設定し、タイムアウトを0.5などに設定

この設定で再度強化学習をさせると、先ほど学習がうまく進まなかったパラメータでも比較的きちんと累積利益が上がるようになることが確認できます。

在庫上限を設定したときの累積利益の推移

在庫数・到着待ち製品数についての各状態について、学習中に訪れた回数の図も見てみると、在庫数0~4個、到着待ち製品数4個というのが一番多い状態になっていることも確かめられます。

在庫上限を設定したときの在庫数・到着待ち製品数の状態カウント

もちろん、今回取り出したパラメータで特別うまくいくようになる、というわけではなく、パラメータを変化させたときにも先ほどと比べると利益を獲得できるように学習できているケースが多いことが見て取れます。

パラメータを変化させたときの最終利益

おわりに

上記のほかにも、活用の場面でepsilon-greedyよりも損が少ないと思われるsoftmaxを用いたり、学習が進むにつれてepsilonの値を小さくしていく[1]ことで探索から活用に徐々に比重を移す...など、学習効率を高めて限られた時間の中で得られる利益を高くする工夫はいくつか考えられます。上で述べた方法はすべてS4で試すことができますので、興味のある方はお手元で実行してみてください。

S4で始める強化学習の連載は今回で終了になります。ここまで読んでいただいた方には、S4を使った強化学習でどんなことができるか簡単なイメージを持っていただけたかなと思います。 また、本連載ではS4のGUIの中で扱える強化学習の入門を目指しましたが、S4を動かしているpythonのエンジンpsimを使ってコーディングしていくことで、より柔軟に一般的なpython強化学習ライブラリと併せて利用するという使い方も考えられます。マルチエージェント強化学習など、GUIの機能としても紹介しきれなかったものもあります。他の話題についてはまた別の機会にお伝えできれば幸いです。

  • S4ではシミュレーション時刻をnow()で取得できます。例えば epsilion の値を epsilon * 1000/(now()+1000) のように式で記述することで、初めはepsilonの値で初期化され、時間が経つにつれて値が小さくなるものも表現できます。epsilonは確率を表すので、1以上の数にならないような設計が必要です。
監修:株式会社NTTデータ数理システム 機械学習、統計解析、数理計画、シミュレーションなどの数理科学を 背景とした技術を活用し、業種・テーマを問わず幅広く仕事をしています。
http://www.msi.co.jp NTTデータ数理システムができること
「数理科学の基礎知識」e-book無料ダウンロードはこちら