tf.Tensor with shape (batch_size, 1, num_nodes) mask (tf.Tensor): Tensor with shape (batch_size, n_keys, 1), defaults to None. What is going on with this article? """ (tf.Tensor): (batch_size, n_nodes, self.emb_dim) Neural Combinatorial Optimization with Reinforcement Learning, 数理計画法によるものの場合、目的関数を数式に落とし込まなければならず、数式の形にもかなりきつい制限がある(数値が与えられれば良いわけではなく、数式として表現されている必要がある)が、深層強化学習によるものの場合は、数値され与えられれば最適化できる(ブラックボックス最適化), 深層強化学習の場合、各状況での判断自体を数値で表現するため挙動が理解しやすい(例えば「とりあえず近場を選ぶ」などのルールがある程度見て取れる), 数理計画法による場合、かなりの自由度をもって制約をいれることができるが、深層強化学習による手法では、ネットワーク構造や訓練方法にうまく制約を組み込む必要があり、(少なくとも知見の蓄積・共有されていない現在では)職人技が必要になります。, 前述の通り、(深層強化学習を含む)機械学習は「データからパターンを見つける」ものなので、訓練にはデータが必要です。また、多数の繰り返しが必要なため、シミュレーターが必要になります。問題が簡単な場合は良いのですが、問題が複雑になってくると、シミュレーターの実装が大変になる可能性があります。, 数理計画法のソルバーの場合、厳密に最適化どうか、あとどれくらい改善の余地がありそうか、といった情報を得ることができ、アルゴリズムの開発や実運用時の参考情報として利用できます。深層強化学習による方法の場合、厳密にそれを知る術はありません。(推定することはできると思います), 個別の問題に特化してチューニングされた既存のアルゴリズムに近い結果が得られることを確認, Decoder: Decoderでは、Attention を使って、既に訪れた拠点をマスクしながら一拠点ずつ推定していきます。, value: ノードの埋め込み表現 $h_{\pi_{t}}$ (key と同じ), これも、ちょっとちゃんと調査できていないのでもしかしたらバグかもしれないのですが、, you can read useful information later efficiently. 1つめのレイヤーで query を決定し、2つめのレイヤーで 次に進むべきノードを決定します。, $$h_{(c)} = [\bar{h}, h_{\pi_{t-1}}, h_{\pi_{1}}]$$, を定義します。ここで、 $h_{\pi_i}$ は、$i$番目のノードの埋め込み表現で、Encoderの$i$番目の出力、$\bar h$ はすべての埋め込みの平均を表します($\bar h = \frac{1}{2}\sum_{i}h_{i}$)。 このベクトルは、 $\bar h$ がグラフ全体の情報を、$h_{\pi_{t-1}}$ が直前に訪れた拠点の情報、$h_{\pi_{1}}$ が、スタート拠点(〜最後に戻っていく拠点)を表していて、なんとなく人間がルートを考えるときに必要な情報が含まれています。また、拠点を訪れるたびに $h_{\pi_{1}}$ がかわるので、contextと呼ばれています。, とし、その出力を 2層目の Attention の query とします。2層目は, の Attention ですが、value を使うわけではないので、単に query と key の内積をとって、最も近い拠点を選択するような働きをします。, この2つのアテンションを、訪問済の拠点をマスキング(つまり、Attentionの候補にしないようにしていく)しながら、繰り返し適用していくのが Decoder の流れです。, DecoderCell から出力された logit はあくまで連続地値(より正確には確率のもととなる正規化されていない数値)なので、次の拠点を1つ決めるには、 Sampling を行う必要があります。Samplingの仕方には、logitを確率とみなす方法や、単純に値の高いものを順に撮ってくる方法など、複数あるので、これもレイヤーとして定義しておきます。, DecoderCellを定義できたら、これとSamplerを組み合わせて、拠点を回り尽くすまでループで回せば Decoder の完成です。 åå¦ç¿ã®ä½ç½®ã¥ãã«é¢ãã解説ãããã¦ãã¾ãã 9åãããã«ä»¥ä¸ã®å³ã®ãããªã¹ã©ã¤ããã§ã¦ãã¾ãã æ©æ¢°å¦ç¿ã®ä¸ã§åéãåé¡ããã¨ããã次ã®3ã¤ã大åãå ãã¾ããããããã¹ã¦ã§ã¯ãªããã¨ã¨ããããããéãªã£ãå¦åãå¿ç¨ããããã¨ãç¹å¾´ã§ãã (tf.Tensor): Tensor with shape (batch_size, n_queries, n_vunits) if return_logits=False, (batch_size, n_queries, n_keys) if return_logits=True ±å±¤å¦ç¿ãã®éããã§ããã ãããããè¨èã§èª¬æãã¦ã¿ã¾ããã Returns: この記事は BrainPad Advent Calender 2019 初日の記事です。が、いきなり日をまたいで1日オーバしてしまいました。申し訳ありません , 深層学習がいろいろな分野で応用されていますが、数理最適化問題に適用しようという動きがあります。この記事では、そのなかでも特に、いろいろな状況下で最適な道順を見つける「ルーティング問題」にとりくんだAttention, Learn to Solve Routing Problems!という論文について紹介し、TensorFlow2.0で実装していこうと思いますが、今回は前編として問題の背景とネットワークの構築まで。学習アルゴリズムと学習結果はまだちゃんと訓練できていないので後編で紹介します。, ときどき「数理最適化」と「機械学習」の違いは何ですか?と聞かれることがあります。 Returns: åå¦ç¿ã¨ã¯ä½ããã¾ããããããã®éãã解説ãã¾ãã key (tf.Tensor): Tensor with shape (batch_size, n_keys, n_kunits) 1. ã³ã¼ãã¯æ¸ãã¦ãã¾ãã. é§ ã«ã¤ããããã¨ããæå³åããããåºåã®åºç¨¿ãæé©åããããã¨è¨ã£ãã¨ãã«ã¯ãäºç®ãå®ãã¤ã¤ãã¯ãªãã¯æ°ãæ大 ⦠ã¹ãã ã¯ãã¼ã¿xãå ¥åãããã¨ä½ããã®æ¹æ³ã«ãããããå¤å½¢ãã¾ãããã©ã®ãããªå¤å½¢ããã¦æ¬²ããã®ãã¯äººéå´ãä¸ãããã¨ã«ãªãã¾ãã ä¾ãã°ãxi,(i=1,2,...,N)ã¨Nåã®åé¡ãããå ´åãè¿ããã¼ã¿å士ãã¾ã¨ãã¦ã»ã ⦠以ä¸ã®4ç¹ã¯ããããããäºæ¿ãã ãã. æ©æ¢°å¦ç¿ã¨ã¯ãæ©æ¢°ãè¨å¤§ãªãã¼ã¿ãå¦ç¿ãããã¨ã§ãèªããã®ã«ã¼ã«ãå¦ç¿ããé«åº¦ãªäºæ¸¬ãå¤æãå¯è½ã«ããæè¡ã§ãã å¦ç¿æ¹æ³ã¨ãã¦ã¯å¤§éã®ãã¼ã¿ãå¦ç¿ãã¦èªåçã«ãã®ç¹å¾´ãåå¾ããæ師ããå¦ç¿ããã¼ã¿ããã¾ãã¾ãªæ¬¡å ã§åé¡ãªã©ãããæ師ãªãå¦ç¿ãèªã試è¡é¯èª¤ãç¹°ãè¿ãã¦æ£è§£ã ⦠åå¦ç¿ã¨ã¯ãè¡åãå¦ç¿ããä»çµã¿ã§ããã ããç°å¢ã«ããã¦ãç®çã¨ããã¹ã³ã¢ãæ大åããããã«ã©ã®ããã«è¡åããã°ãããããå¦ç¿ãããã®ã§ããã ããããå¦ã¶ä¸ã§åºç¤ã¨ãªãã¢ã«ã´ãªãºã (ã¨ããããæ¦å¿µã«è¿ãï¼)ã¯Qå¦ç¿, SARSA, æ¹çå¾é æ³, Actor-Criticã®4ã¤ã ã¨æãããã®ã§, ãããã軸ã¨ãã¦ã¾ã¨ãã¦ã¿ããã¨æãã¾ã. ¥ç¥è½ï¼ãæ¯ããææ³ã®ã²ã¨ã¤ã ã¨ãããã¨ã§ãã Help us understand the problem. inputs (List[tf.Tensor]): List of tf.Tensor represents context (batch_size, 1, 3*dim_emb) and tf.Tensor of nodes (batch_size, num_nodes, dim_emb) ¥ç¥è½ï¼aiï¼ãã¼ã ãç解ããããã®åºæ¬ã§ãããæ©æ¢°å¦ç¿ãã«ã¤ãã¦ã種é¡å¥ã«ãããããã解説ãã¦ãã¾ããæ©æ¢°å¦ç¿ã¨ãã£ã¼ãã©ã¼ãã³ã°ã®éãããdqnã«ã¤ãã¦ãç°¡åã«è§£èª¬ãã¦ãã¾ããaiæ代ãçããçããã¯å¿ èªã®è¨äºã§ãã inputs (List[tf.Tensor]): [query, key, value] with TensorFlow2.0 では、普通にループを書くこともできますが、@tf.functionを使う場合は TensorArray と tf.range を組み合わせて使うと、自動的に最適化してくれます。, これで、EncoderとDecoderを実装できました。次回はこれをもとに、訓練を回し、実際に問題を解いてみたいと思います。(できるとは言っていない), 今回のネットワークを構築する上で、いくつかハマりそうだなとおもった点があったので、備忘録を兼ねてまとめておこうと思います。, 深層学習で数理最適化問題を解く【前編】と題して、いろいろな状況下で最適な道順を見つける「ルーティング問題」にとりくんだAttention, Learn to Solve Routing Problems!という論文について紹介し、ネットワークを構築しました。後編では、といくつかの問題に適用してみた結果を掲載しようと思います。あと、それに合わせてコードも更新しようと思います。, ブレインパッドは、2004年の創業以来、データによるビジネス創造と経営改善に向き合ってきたデータ活用・分析企業です。. åå¦ç¿ã¨ã¯ãã³ã³ãã¥ã¼ã¿ãé¸æããè¡åãç°å¢å¤åã«å¯¾ããä½ããã®ãå ±é ¬ããè¨å®ãããã¨ã§ãããé«ãå ±é ¬ãè²°ããããè¡åãå¦ç¿ãããæè¡ã® ⦠ï¼ã§ãããããããé¡ããã¾ãã ä»åã¯Deep Q-Learningã¨ããææ³ã§FXããã£ã¦ã¿ãã®ã§ç´¹ä»ãã¾ããååã®ããã°ã§ã¯ãLSTMã¨ãããã£ã¼ãã©ã¼ãã³ã°(Deep Learning [â¦] åå¦ç¿ã¨ã¯ ~ç¨èª~ 9 ⢠æ¹ç ⦠ã¨ã¼ã¸ã§ã³ãã®è¡åè¦ç¯ ⢠ä»ã®ç¶æ ã§ã©ãã¸ç§»åããã°è¯ãã â¢ å ±é ¬ ⦠è¡åã®çµæã®è¯ãã表ãå¤ â¢ å£ã«ã¶ã¤ããã¨-1ç¹ï¼ã´ã¼ã«ããã¨+100ç¹ ã¨ã¼ã¸ã§ã³ã (ex. åå¦ç¿ã¨ã¯éãã¾ãã ãã¥ã¼ã©ã«ãããã¯ã¼ã¯ãç¨ãããã¨ã«ããæã大ããªå¤åã¯ãé£ç¶å¤ãæ±ããããã«ãªã£ããã¨ã§ãã value (tf.Tensor): Tensor with shape (batch_size, n_values, n_vunits) ãã£ã¼ãã©ã¼ãã³ã°ã¨ã¯ã大éã®ãã¼ã¿ãå¦ç¿ãããã¨ã§ããã®ãã¼ã¿ã®ä¸ããç¹å¾´ãèªåçã«çºè¦ããç»åèªèãé³å£°èªèãªã©ãå¯è½ããæè¡ã§ãã ä¾ãã°ãä»ã¾ã§ã®æ©æ¢°ã§ç»åèªèãè¡ãå ´åããã®ç»åã®ä¸ã§ã©ã®ç¹ã«æ³¨ç®ããã°ããã®ããªã©ãã人éãæå®ããªãã¦ã¯ããã¾ããã§ãããç«ã§ããã°ãã²ãã®æ°ãè³ã®å½¢ãªã©ãæ確ã«å®ç¾©ããªãã¦ã¯æ©æ¢°ãç«ãç«ã¨å¤å¥ãããã¨ã¯ã§ãã¾ããã ãããããã£ã¼ãã©ã¼ãã³ã°ã®ç»å ´ã«ãã£ã¦å¤§éã®ãã¼ã¿ããç¨æã§ããã°ããã®ãã¼ã¿ã®ç¹å¾´ãèªåçã«åã ⦠åå¦ç¿ã§ãã ã¬ãã«4ããã£ã¼ãã©ã¼ãã³ã°ã¨ã¯ï¼æ©æ¢°å¦ç¿ã¨ã®éãã """, # t=1のときのみ、コンテキストにはダミー変数を使う (t=1だと直前に訪れた拠点というものが存在しないので), Qiita Advent Calendar 2020 開催中! 最高に盛り上がる年末にしていきましょう :). åå¦ç¿ãããã¦è»¢ç§»å¦ç¿ã®é²å±ã注ç®ããã¦ãã¾ãã åå¦ç¿ã¨ã¯éãã¾ãã ãã¥ã¼ã©ã«ãããã¯ã¼ã¯ãç¨ãããã¨ã«ããæã大ããªå¤åã¯ãé£ç¶å¤ãæ±ããããã«ãªã£ããã¨ã§ãã Arguments: Returns: æ¦å¿µã®ã¿ã®èª¬æã§ã 2. ä»ã®ã¢ã«ã´ãªãºã ã®åºç¤ã¨ãªãããéè¦ãªæ¦å¿µã«ã¤ãã¦ã¯è©³ããæ¸ãã¾ãã. åå¦ç¿ã¯ç°å¢ã¨ã®ç¸äºä½ç¨ãå¿ è¦ã¨ããªãã åã«ããããããã¨ãããããããããªã£ããã¨ãããã¼ã¿ãããã°è¯ãã Why not register and get more from Qiita? (tf.Tensor): Tensor with shape (batch_size, n_queries, n_vunits) åããããã¯ããã¸ã¼ä¼æ¥ã§ããGoogle DeepMind ⦠ããããäºæ¸¬ï¼predictionï¼ããããã«ç¨ãããã¦ãããããã¦ããããç¾ç¶ææ¡ã¨äºæ¸¬ããã¨ã«ã人ããä½ããã ⦠åå¦ç¿ æ´ç°å æã»å¾è¤ç¥æ¨¹ It is propounded that in order to avoid the âframe problemâ or âsymbol grounding """, """ Returns: åå¦ç¿ã®åéã§ã¯æ¥é²ææ©ã§æ°ããªã¢ã«ã´ãªãºã ãææ¡ããã¦ãã¾ã. åå¦ç¿ã®ã¢ã«ã´ãªãºã ã§ãDeep Q-Networkã®ç¥ã§ãã åå¦ç¿ã§æåã©ããã¨ããã°ãAtariãAlphaGoãªã©ã§ãããã ãããã¯ãããã1 agentã¨2 agentã®å¦ç¿ç°å¢ã§ãã©ã¡ããã²ã¼ã ã§ãã å®éã®ä¸çãèãã¦ã¿ãã°ãããã¾ãããagentãä¸äººã¨ãäºäººããããªãç¶æ³ã¨ããã®ã¯èãã«ããã§ãã ¥ç¥è½ï¼æè¡ãæ´»ç¨ãã¦ãå¤æãã®ããã»ã¹ãé«åº¦åããããã®ã¢ããã¼ãã«ã¤ãã¦ããã³ã½ã¼ã解説ããã inputs (List[tf.Tensor]): [query, key, value] with """, """ Arguments: åå¦ç¿ãå¦ã³ãããå®ä¾ãã©ããªãã®ãã確èªãããã¨è¨ãæ¹ã¯æ¯éè¦ã¦ãã ããã """, """ Arguments: inputs (tf.Tensor): tf.Tensor with size (batch_size, n_nodes, dim) mask (tf.Tensor): Tensor with shape (batch_size, n_keys, 1), defaults to None. Encoder は、MHAに全結合層を加えたものを$N$回繰り返し、その結果を出力としています。上述の ResidualBlock と組み合わせると、1回分は以下のようにかけます。, 今までと違い、 build メソッドの中でレイヤーを定義しています。buildメソッドには引数としてinput_shapeが渡されるため、入力テンソルの形によって初期化の方法が違うため__init__では定義できないような変数やレイヤは、こちらで定義します。super().build(input_shape)は忘れないようにしましょう。, 上記をまとめて Encoder を構築します。最初に全結合層を入れて次元をかえたあとでTransformerBlockを単純に積み上げているだけです。, 今までと違うのは2点。keras.layers.Layer ではなく keras.Model を継承している点と、callメソッドに @tf.function がついている点です。, まず、keras.Model は、 keras.layers.Layer を継承しているため、レイヤーがわりに使えます。また、fitなど、レイヤには存在しなかったメソッドが追加されます。ある程度の規模となったところで keras.Modelとしておき、適当な問題で訓練させてみることで、実装に間違いがないか検証できます。, 次に、@tf.function です。このデコレーターを付けられたメソッドは、内部の処理をTensorFlowのグラフに変換されます。それにより、関数の実行が最適化され、高速になります。これまでのメソッドにつけても良いのですが、@tf.functionをつけると、形状の違うテンソルが入力されるごとにTensorFlowのグラフの構築処理が走るなど、ちょっと癖のある挙動となります。また、小さくつけることに速度的な意義はあまりないので、大きめの単位で使うのがおすすめです。, さて、次は Decoder です。下図のように、Decoderでは、Attentionを2つ使います。 なお、上記の論文について、作者がPyTorchによる実装を公開しているので、利用したいだけの場合はそちらを利用するのが良いでしょう。, いろいろなサイズのいろいろなルーティング問題に対して実験した結果は以下のとおりです(論文より抜粋)。AM(greedy) と AM(sampling) が提案手法です。Gurobiのように厳密解を求めるわけではないので、最適解とのギャップがありますが、$n=100$という規模の大きめの問題についても、そこそこの時間でそこそこの性能を示していることがわかります。比較対象の多くが、それぞれの問題のために最適化されたアルゴリズムを利用していることを考えると、すごい結果のように思います。, Transformerは自然言語処理で最近流行っている様々なモデルのベースとなっているもので、こちもAttentionと呼ばれる機構を利用しています。EncoderもDecoderもAttentionがベースとなっていいるため、論文のタイトルも「Attention」から始まります。なお、訓練には以下のようなREINFORCEアルゴリズムを用います。, 具体的な訓練ステップは後編にゆずり、ここではネットワークを TensorFlow 2.0 で実装していくステップを見ていきます。, 前述の通り、基本的な構造は Transformer と同じものです。Transformerについての解説と実装方法についてはこちらのQiita記事 がとても参考になります。2.0ではないですが、TensorFlowで書かれているため、特にEncoderについては、とても似たコードになります。, TensorFlow2.0 では、 Keras が標準の高レベルAPIとなりました。そのため、処理の単位をレイヤーとして定義していきます。 それには、 以下のように、keras.layers.Layer を継承して、 call メソッドを再定義すればOKです。, 今回の場合、推論結果に上下限を設定するための clip引数や、往訪済のノードを無視するための mask 引数があるため、若干複雑ですが、Attentionレイヤーは、以下のように記述できます。, Transformerでは、上記のAttentionを複数並列で適用させて、前後にLinearレイヤを挟むことで、性能の向上をはかっています。これをMHA(Multi Heads Attention)と呼びます。, TensorFlow2.0では、 __init__メソッドの中でレイヤを組み合わせて利用することができます。TensorFlow1.xの時のように、buildメソッドの中で定義して訓練対象の変数を明示的に追加する必要はありません。, maskを考慮に入れなければ、Attention機構の入力は (query, key, value) ですが本論文では queryもvalueもkey自身という SelfAttention を使っています。, レイヤの出力に、レイヤの入力を足し合わせる残差ブロック(ResidualBlock)と呼ばれる構造があります。画像認識などでは、通常のレイヤの代わりに残差ブロックを使うことで性能が上がることが知られています。今回の論文でも ResidualBlock を利用するので、以下のように定義しておきます。, normalization_layer には BatchNormalization を使うことが多いのですが、今回の論文では、BatchNormalization以外の方法も検証しているようなので、引数にしています。 ãããã) ç°å¢ ã¼ã«ããã¦ãå人æ å ±ã¨ã¯ãçåããå人ã«é¢ããæ å ±ã§ãã£ã¦ãå½è©²æ å ±ã«å«ã¾ããæ°åãçå¹´ææ¥ãã®ä»ã®è¨è¿°çã«ããç¹å®ã®å人ãèå¥ãããã¨ãã§ãããã®ï¼ä»ã®æ å ±ã¨å®¹æã«ç §åãããã¨ãã§ããããã«ããç¹å®ã®å人ãèå¥ãããã¨ãã§ãããã¨ã¨ãªããã®ãå«ã¿ã¾ããï¼ãæå³ãããã®ã¨ãã¾ãã Arguments: key (tf.Tensor): Tensor with shape (batch_size, n_keys, n_kunits) query (tf.Tensor): Tensor with shape (batch_size, n_queries, n_qunits), query (tf.Tensor): Tensor with shape (batch_size, n_queries, n_qunits), ãã®ä»ã« ⦠By following users and tags, you can catch up information on technical fields that you are interested in as a whole, By "stocking" the articles you like, you can search right away. value (tf.Tensor): Tensor with shape (batch_size, n_values, n_vunits) まず、広い意味で「数理最適化」とは、「数理的なアプローチで最適化すること」で、「最適化」とは何らかの関数を最小化(もしくは最大化)することです。, 例えば「渋谷駅までの最適な道を知りたい」という言葉の裏には、「最も短い時間で渋谷駅につきたい」とか、「最も少ない金額で渋谷駅につきたい」という意味合いが、「広告の出稿を最適化したい」と言ったときには「予算を守りつつ、クリック数を最大化したい」とか「制約を満たしつつ、予算とのギャップを最小にしたい(予算を使い切りたい)」という意味合いが含まれています。, 一方で「機械学習」は、ざっくりといって「データからパターンを見つけ出すこと」です。多くの機械学習手法では訓練の過程で損失関数を最小化しているので、数理最適化の利用例の一つということもできるかと思います。また、例えば分類問題であれば、間違分類の数を最小化しようと数理的にアプローチしているので、機械学習自体が数理最適化の手法の一つと捉えることもできるかもしれません。, ただし、機械学習の目的は(たとえ訓練が関数の最小化であっても、やりたいことは)必ずしも関数の最小化ではないので、機械学習は数理最適化の一つと言い切ることもできないと思います。「データからパターンを見つけ出すこと」と「数理的なアプローチで最適化すること」は、互いに関係していますが、そもそも視点の違うものなので、比較すること自体がナンセンスなように感じます。, ただ、仕事でお客さんと話しているときにでてくる「数理最適化」という言葉はもう少し狭義の意味を持っていることが多く、個人的には, 今回紹介する論文「Attention, Learn to Solve Routing Problems!」で取り上げているルーティング問題は、利用できる車両の台数や、運べる荷物の量、遵守すべき交通ルール、従業員間の仕事量の均一化など、様々な制約があるなかで、最適なルートを見つけ出すような問題です。上記の分け方ではまさに 2.数理最適化 に当たりますが、それに機械学習(深層強化学習)を使って取り組む、というところに面白さを感じました。, 同種の問題に取り組んでいる論文Neural Combinatorial Optimization with Reinforcement Learningの紹介記事(巡回セールスマン問題を深層強化学習で解いてみる @ panchovie さん)もご覧ください。, 数理最適化の手法としては、数理計画法を用いた方法や(メタ)ヒューリスティクスを用いた方法などいくつかありますが、今回の論文で使用している深層強化学習によるものの面白い点は以下のとおりです。, 数理最適化したい!と思った際には、上記のような点に気をつけて手法を検討する必要があります。, 9/30にリリースされたTensorFlow 2.0 では、いわゆる Define By Run の Eager Execution がデフォルトのモードとなりました。Define By Run はPFNが開発しているChainerによって提案された計算グラフの構築方法で、動的に変化するような計算グラフに適しています。ルーティング問題は、様々な条件や拠点の数などで計算グラフの構造が変化するので、TensorFlow 2.0 の検証の意味も含め、ゼロから実装してみました(正確にはまだいじっている最中なので、下記のコードは随時更新していく予定です)。 Attention, Learn to Solve Routing Problems! åå¦ç¿ãªã©), you can read useful information later efficiently.
航空自衛隊 F-4 事故, 羽生 藤井 勝敗, 宮城 大弥 2軍, バスケ 応援歌 走り出せ, アイマス ライブ 2020, オリックス ユニフォーム パジャマ,