Deep Reinforcement Learning [1] - 強化学習を始めるための基本 (Python 迷路ゲームの解決例を含む)

ここに画像の説明を挿入

強化学習を始めるための不可欠な基盤

1. 強化学習と機械学習

機械学習は人工知能の実装方法であり、機械学習の方法は、一連の入力データからシステム全体のパラメーターを決定するプロセスとして要約できます。

機械学習は、教師あり学習、半教師あり学習、教師なし学習、強化学習に分けられます。

1.1 教師あり学習

教師あり学習は、ラベル付きデータセットを使用してモデルをトレーニングする一般的な学習方法です。教師あり学習では、各データ ポイントは入力ベクトルとラベルで構成されます。たとえば、ラベル付きの画像を使用してモデルをトレーニングできます。この場合、各画像は特定のオブジェクトまたはカテゴリを含むものとしてマークされ、モデルに類似のオブジェクトの認識を学習させます。

教師あり学習では、モデルをトレーニングして、入力データを正しい出力ラベルにマッピングする方法を学習します。トレーニング中、モデルは正しい答えと比較して重みとパラメーターを調整します。トレーニングが完了すると、モデルを新しいデータセットに適用し、その出力を使用して予測を行うことができます。一般的な教師あり学習アルゴリズムには、デシジョン ツリー、ランダム フォレスト、サポート ベクター マシン、ロジスティック回帰、ニューラル ネットワークなどがあります。
ここに画像の説明を挿入

1.2 半教師あり学習

半教師あり学習は、教師あり学習と教師なし学習を組み合わせた機械学習の学習方法です。半教師あり学習では、ラベル付けされたデータとラベル付けされていないデータがいくつかあります。目標は、このデータを使用してモデルをトレーニングし、新しいデータを分類または予測できるようにすることです。

半教師あり学習では、教師なし学習アルゴリズムを使用して、ラベルのないデータを利用してデータ内のパターンと構造を発見し、それによってモデルのパフォーマンスを向上させることができます。たとえば、クラスタリング アルゴリズムを使用してラベル付けされていないデータをグループ化し、これらのグループを使用してラベル付けされたデータを分類することができます。または、半教師あり学習アルゴリズムを使用して、ラベルのないデータに自動的にラベルを付け、それをラベル付きデータと一緒に使用してモデルをトレーニングすることもできます。

半教師あり学習は、医療画像認識や音声認識など、ラベル付けされたデータが少ないか高価なデータセットで役立ちます。半教師あり学習は、ラベル付けされていないデータの情報を利用するため、モデルの精度を向上させ、トレーニング コストを削減できます。一般的な半教師あり学習アルゴリズムには、半教師ありサポート ベクター マシン、半教師ありクラスタリング、およびグラフ半教師あり学習が含まれます。

1.3 教師なし学習

機械学習における教師なし学習は、ラベルや指標変数を使用せずに、ラベルのないデータセットを使用してモデルをトレーニングする学習方法です。教師なし学習の目標は、データの構造とパターンを発見して、データをよりよく理解し、解釈できるようにすることです。

教師なし学習では、通常、クラスタリング、次元削減、異常検出、関連規則などのアルゴリズムを使用して、データのパターンと構造を発見します。クラスタリング アルゴリズムは、データ ポイントを同様の特性を持つクラスタにグループ化するために使用されます。次元削減アルゴリズムを使用して、高次元のデータセットを低次元の表現に変換し、データをより適切に視覚化して理解できるようにします。異常検出アルゴリズムは、データ内の他のデータ ポイントとは異なる外れ値を識別するために使用されます。アソシエーション ルール アルゴリズムは、マーケット バスケット分析など、データ内のアソシエーションを検出するために使用されます。

教師なし学習は、多くの状況で非常に役立ちます。特に、正解やラベルがわからない場合に役立ちます。データの潜在的なパターンと構造を発見するのに役立ち、データ分析の効率と精度を向上させます。一般的な教師なし学習アルゴリズムには、k-means クラスタリング、主成分分析、オートエンコーダ、密度クラスタリング、関連規則などがあります。
ここに画像の説明を挿入

1.4 強化学習

機械学習において、強化学習は、特定の環境でタスクを実行するようにエージェント (エージェント) をトレーニングするために使用される学習方法です。強化学習では、エージェントは環境と対話し、実行されたアクションと受け取った報酬に基づいて学習します。目標は、エージェントが長期的な報酬を最大化するポリシーを学習することです。

強化学習では、環境を定義し、エージェントは環境の状態を観察して実行するアクションを決定します。アクションを実行した後、環境はエージェントにそのアクションの質をフィードバックする報酬または罰を与えます。エージェントは、環境と対話することで、長期的な報酬を最大化するために、状態からアクションへの一連のマッピングであるポリシーを学習します。これは、価値関数を使用して、現在の状態で期待される長期的な報酬を計算し、ポリシーを更新することによって実現されます。

強化学習は、ゲーム、ロボット制御、自然言語処理など、多くのアプリケーション シナリオで非常に役立ちます。一般的な強化学習アルゴリズムには、Q ラーニング、ポリシー勾配、深層強化学習などがあります。
ここに画像の説明を挿入

1.5 深層学習

深層学習は、分類、回帰、クラスタリング、生成などのタスクを実行できるように、人工ニューラル ネットワークを使用して入力データの表現を学習する機械学習手法です。通常、深層学習のニューラル ネットワークには複数のレイヤーが含まれており、各レイヤーは単純な計算を実行し、その結果を次のレイヤーに渡します。

深層学習の主な利点は、ラベル付けされた大量のデータをトレーニングすることで特徴表現を自動的に学習し、手動で特徴を抽出することなく効率的な学習を実現できることです。従来の機械学習手法と比較して、ディープ ラーニングは、画像、音声、自然言語処理などの大規模で高次元のデータを処理する場合に優れたパフォーマンスを発揮します。ディープラーニングは、コンピュータ ビジョン、音声認識、自然言語処理、機械翻訳、レコメンデーション システムなど、多くの分野で広く使用されています。

深層学習の中核はニューラル ネットワーク モデルであり、その中で最も一般的なのは畳み込みニューラル ネットワーク (CNN) と再帰型ニューラル ネットワーク (RNN) です。CNN は主に画像や動画データの処理に使用されますが、RNN はテキストや音声などのシーケンス データの処理により適しています。さらに、オートエンコーダー、生成的対立ネットワーク (GAN)、変分オートエンコーダー (VAE) などのディープ ラーニング アーキテクチャがいくつかあります。これらのアーキテクチャもさまざまな分野で広く使用されています。

上記の 4 つの方法を接続すると、次の図のようになります。

ここに画像の説明を挿入

2. 強化学習の概念

2.1 エージェント、アクション、状態

以下のマリオゲームを例にとると、ゲームの実行主体をエージェント(Agent)(Agent)と呼びます。(エージェント) _ _ _ _

ここに画像の説明を挿入

下図の枠がss状態s

ここに画像の説明を挿入

マリオができるアクションはa , a ∈ { left , right , up } a,a\in \{left,right,up\} として記録されます_aε{ _ _ _正しく_ _ _ _アップ} _

ここに画像の説明を挿入

2.2 政策機能、報酬

戦略関数はマリオの次の行動の選択確率を表し、戦略関数はπ ( s , a ) \pi(s,a)として記録されます。π ( s ,a )、値の範囲は 0 から 1 で、状態の値を観察することにより、アクションは確率に従ってランダムにサンプリングされます。
π ( 左 ∣ s ) = P ( A = a ∣ S = s ) \pi(left|s)=P(A=a|S=s)π (e f t s )=P ( A=a S=s )
少し違う
π ( 左 ∣ s ) = 0.2 π ( 右 ∣ s ) = 0.1 π ( 上 ∣ s ) = 0.7 \pi(left|s)=0.2\\ \pi(right|s )= 0.1\\ \pi(up|s)=0π (e f t s )=0.2π ( r i g h t s )=0.1π ( u p s )=0.7
ここに画像の説明を挿入

強化学習は報酬を目標とする機械学習手法です.そのアイデアは生物学的経験学習法をモデルにしています.ラベルデータがないため,報酬は非常に重要な指標です.強化学習の最終的な目標は,総報酬を最大化することです. . モデル設計は、強化学習全体の方向性を導きます。

このシナリオでは、RR に報酬を与えるR は次のように設計できます。

  • ゴールド コインを取得: R = + 1 R = +1R=+ 1
  • ゲームの勝利: R = + 10000 R=+10000R=+ 10000
  • 敵に当たる(踏まない): R=-10000 R=-10000R=10000
  • 何も起こらない: R = 0 R=0R=0

2.3 状態遷移

古い状態から新しい状態に変化するプロセスは状態遷移プロセスと呼ばれます. 状態遷移はアクションの選択に依存します. アクションがランダムにサンプリングされると, エージェントはアクションが実行された後に現在の状態を変化させます. .

ここに画像の説明を挿入

状態遷移のプロセスはランダムです。ランダム性は環境に由来します。古い状態をssとして記憶します。s、新しい状態はs " s^{'}s'の場合、状態遷移関数ppp有:
p ( s ' ∣ s , a ) = P ( S ' ∣ S = s , A = a ) p(s{'}|s,a)=P(S^{'}|S=s, A=a)p ( s,_a )=P ( S S_=_=a )

2.4 エージェントと環境の間の相互作用プロセス

エージェントが環境と対話するプロセスは、次のように要約できます。

  • 環境生成tt時刻tにおけるst s_tst、環境内のエージェントによって生成された状態st s_tstその後の決定を完了します。
    ここに画像の説明を挿入

  • エージェントの状態はst s_tですst確率による無作為抽出、make tt時刻tのアクションa_tat環境参照に作用します。
    ここに画像の説明を挿入

  • 環境はttに従ってエージェントを取得します時刻tにおけるst s_tsta_t で決定されたアクションatその後、それに応じてttを生成します時刻trt r_trtそしてt+1 t+1t+時間1の状態のst + 1 s_{t+1}st + 1、閉じたループを完成させます。
    ここに画像の説明を挿入

次に、強化学習を使用してこのゲームをプレイするプロセスは、実際には

  • フレームを観察する (状態s 1 s_1s1
  • サンプル アクションa 1 a_1a1(上、左、右)
  • 新しいフレームを観察します (状態s 2 s_2s2) 同時に報酬rewardr 1rewardr_1を取得リワード_ _ _ _ _1
  • サンプル アクションa 2 a_2a2
  • ...(繰り返し)

(状態、行動、報酬) (状態、行動、報酬)(状態, _ _ _ _アクション_ _ _ _ _re w a r d )軌跡シーケンスは
s 1 , a 1 , r 1 , s 2 , a 2 , r 2 , . . , s T , a T , r T s_1,a_1,r_1,s_2,a_2, r_2 ,...,s_T,a_T,r_Ts1a1r1s2a2r2... ,sTaTrT

2.5 割引特典

累積リターンUUUの定義:

U t = R t + R t + 1 + R t + 2 + R t + 3 + . . . U_t=R_t+R_{t+1}+R_{t+2}+R_{t+3}+...t=Rt+Rt + 1+Rt + 2+Rt + 3+...

参照の重要性については、未来の瞬間の報酬は現在の瞬間よりも重要度が低くなければならないため、現在 (t の瞬間) の瞬間を重視する必要があります. 王淑森氏の例によると、今あなたに 100 元を与える.将来的に 100 元を与えるよりも重要です. 100 元はより現実的であるため、上記の式に減衰係数γ \gammaを追加する必要があります.γ,那么 U U Uの定義は次のように変更されます
U t = R t + γ R t + 1 + γ 2 R t + 2 + γ 3 R t + 3 + . . . U_t=R_t+\gamma R_{t+1}+\gamma ^2R_ {t+2}+\ガンマ^3R_{t+3}+...t=Rt+γR _t + 1+c2R _t + 2+c3R _t + 3+...
割引報酬のランダム性

時間 t における累積リターンU t U_ttはランダムであり、そのランダム性のソースは 2 つあります。

  • アクションのサンプリングはランダムです。つまり、
    P [ A = a ∣ S = s ] = π ( a ∣ s ) P[A=a|S=s]=\pi(a|s)P [ A=a S=s ]=π ( a s )

  • 新しい状態の生成はランダム
    P [ S ′ = s ′ ∣ S = s , A = a ] = p ( s ′ ∣ s , a ) P[S^{'}=s^{'}|S= s,A=a]=p(s^{'}|s,a)P [ S=s S_=_=] _=p ( s,_a )

任意のi ≥ ti\geq tについてt,奖励 R i R_i R確率変数S i S_iに依存S A i A_i 、与えられた状態st s_tst, 累積リターンU t U_tt確率変数に依存します:

A t 、A t + 1 、A t + 2 、. . . A_t,A_{t+1},A_{t+2},...tt + 1t + 2...そしてS t + 1 , S t + 2 , . . . S_{t+1},S_{t+2},...St + 1St + 2...

2.6 アクションバリュー機能

行動価値関数Q ( s , a ) Q(s,a)Q ( s ,a )の定義:
Q π ( st , at ) = E [ U t ∣ S t = st , At = at ] Q_\pi(s_t,a_t)=E[U_t|S_t=s_t,A_t=a_t]Qp( stat)=[tSt=stt=at]
つまり、行動価値関数は累積報酬U t U_ttの期待値は、政策関数π \piを反映しています。πの評価。

最適行動価値関数Q ∗ Q^*Q*関数は次のように定義されます。

Q ∗ ( st , at ) = max π Q π ( st , at ) Q^{*}(s_t,a_t)=\mathop{max}\limits_{\pi}Q_{\pi}(s_t,a_t)Q (stat)=円周率マックス_Qp( stat)

行動価値関数: 与えられた政策関数π \piπ ,Q π ( s , a ) Q_{\pi}(s,a)Qp( s ,a )状態ssのエージェントを評価するsダウンサンプリング アクションaa良いか悪いか

2.7 状態値関数

状態値関数V π V_{\pi}pは次のように定義されます:
V π ( st ) = EA [ Q π ( st , A ) ] V_{\pi}(s_t)=E_{A}[Q_{\pi}(s_t,A)]p( st)=[ Qp( stA )]
さらに、行動空間の洗練に基づいて、次のように分けることができます。

  • 独立変数
    V π ( st ) = EA [ Q π ( st , A ) ] = ∑ a π ( a ∣ st ) ⋅ Q π ( st , a ) V_{\pi}(s_t)=E_{A}[ Q_ {\pi}(s_t,A)]=\sum_{a}\pi(a|s_t)\cdot Q_{\pi}(s_t,a)p( st)=[ Qp( st]=aπ ( a st)Qp( sta )
  • V π ( st ) = EA [ Q π ( st , A ) ] = ∫ π ( a ∣ st ) ⋅ Q π ( st , a ) とすると、 V_{\pi} (
    s_t)=E_{A}[ Q_{ \pi}(s_t,A)]=\int \pi(a|s_t)\cdot Q_{\pi}(s_t,a)dap( st)=[ Qp( st]=π ( a st)Qp( sta )_

方策関数π \piを修正するにはπV π ( s ) V_{\pi}(s)p( s )評価状況ss良いか悪いか

すべての状態の期待値 ES を求める[ V π ( S ) ] E_{S}[V_{\pi}(S)]S[ Vp( S )]、ポリシー関数π \piπは良いか悪いかです。

3. Python 強化学習迷路の例

このセクションのソース コードは、Wanghailin2019/Learing-DRL-by-P​​yTorch-cookbook から取得されます: The author of this book is Yutaro Ogawa (Ogawa Kumataro) from Japan. The author's github source code is annotated in Japanese. このリポジトリは、それを中国語

「やってみる深層強化学習 PyTorch プログラミング実践編」より

#导入所使用的包
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

#迷宫的初始位置

#声明图的大小以及图的变量名
fig = plt.figure(figsize=(5, 5))
ax = plt.gca()

#画出红色的墙壁
plt.plot([1, 1], [0, 1], color='red', linewidth=2)
plt.plot([1, 2], [2, 2], color='red', linewidth=2)
plt.plot([2, 2], [2, 1], color='red', linewidth=2)
plt.plot([2, 3], [1, 1], color='red', linewidth=2)

#画出表示状态的文字S0-S8
plt.text(0.5, 2.5, 'S0', size=14, ha='center')
plt.text(1.5, 2.5, 'S1', size=14, ha='center')
plt.text(2.5, 2.5, 'S2', size=14, ha='center')
plt.text(0.5, 1.5, 'S3', size=14, ha='center')
plt.text(1.5, 1.5, 'S4', size=14, ha='center')
plt.text(2.5, 1.5, 'S5', size=14, ha='center')
plt.text(0.5, 0.5, 'S6', size=14, ha='center')
plt.text(1.5, 0.5, 'S7', size=14, ha='center')
plt.text(2.5, 0.5, 'S8', size=14, ha='center')
plt.text(0.5, 2.3, 'START', ha='center')
plt.text(2.5, 0.3, 'GOAL', ha='center')

#设定画图的范围
ax.set_xlim(0, 3)
ax.set_ylim(0, 3)
plt.tick_params(axis='both', which='both', bottom='off', top='off',
                labelbottom='off', right='off', left='off', labelleft='off')

#当前位置S0用绿色圆圈画出
line, = ax.plot([0.5], [2.5], marker="o", color='g', markersize=60)

#设定参数θ的初始值theta_0,用于确定初始方案

#行为状态0-7,列为↑,→,↓,←表示的移动方向
theta_0 = np.array([[np.nan, 1, 1, np.nan],  # s0
                    [np.nan, 1, np.nan, 1],  # s1
                    [np.nan, np.nan, 1, 1],  # s2
                    [1, 1, 1, np.nan],  # s3
                    [np.nan, np.nan, 1, 1],  # s4
                    [1, np.nan, np.nan, np.nan],  # s5
                    [1, np.nan, np.nan, np.nan],  # s6
                    [1, 1, np.nan, np.nan],  # s7、※s8是目标,无策略
                    ])

#将策略参数θ转换为行动策略π的函数定义
def simple_convert_into_pi_from_theta(theta):
    #简单地计算百分比

    [m, n] = theta.shape  # 获取θ的矩阵大小
    pi = np.zeros((m, n))
    for i in range(0, m):
        pi[i, :] = theta[i, :] / np.nansum(theta[i, :])  # 计算百分比

    pi = np.nan_to_num(pi)  # 将nan转换为0

    return pi

#求初始策略π
pi_0 = simple_convert_into_pi_from_theta(theta_0)

#1步移动后求得状态s的函数的定义

def get_next_s(pi, s):
    direction = ["up", "right", "down", "left"]

    next_direction = np.random.choice(direction, p=pi[s, :])
    # 根据概率pi[s,:]选择direction

    if next_direction == "up":
        s_next = s - 3  # 向上移动时状态的数字减少3
    elif next_direction == "right":
        s_next = s + 1  # 向右移动时状态的数字增加1
    elif next_direction == "down":
        s_next = s + 3  # 向下移动时状态的数字增加3
    elif next_direction == "left":
        s_next = s - 1  # 向左移动时状态的数字减少1

    return s_next

# 迷宫内使智能体移动到目标的函数的定义

def goal_maze(pi):
    s = 0  # 开始地点
    state_history = [0]  # 记录智能体移动轨迹的列表

    while (1):  # 循环,直到到达目标
        next_s = get_next_s(pi, s)
        state_history.append(next_s)  # 在记录列表中添加下一个状态(智能体的位置)

        if next_s == 8:  # 到达目标地点则终止
            break
        else:
            s = next_s

    return state_history

# 在迷宫内朝着目标移动

state_history = goal_maze(pi_0)

print(state_history)
print("求解迷宫路径所需的步数是 " + str(len(state_history) - 1))

# 将智能体移动的情形可视化
# 参考URL http://louistiao.me/posts/notebooks/embedding-matplotlib-animations-in-jupyter-notebooks/
from matplotlib import animation
from IPython.display import HTML


def init():
    '''初始化背景图像'''
    line.set_data([], [])
    return (line,)


def animate(i):
    '''每一帧的画面内容'''
    state = state_history[i]  # 画出当前的位置
    x = (state % 3) + 0.5  # 状态的x坐标为状态数除以3的余数加0.5
    y = 2.5 - int(state / 3)  # 状态的y坐标为2.5减去状态数除以3的商
    line.set_data(x, y)
    return (line,)


# 用初始化函数和绘图函数来生成动画
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=len(
    state_history), interval=200, repeat=False)

HTML(anim.to_jshtml())

おすすめ

転載: blog.csdn.net/qq_38853759/article/details/130190054