Skip to content
Published on

[深層強化学習] 01. 強化学習とは:MDPと基本概念

Authors

機械学習の3つのパラダイム

機械学習は大きく3つの学習方法に分かれます。それぞれのアプローチが解決しようとする問題の性質が異なります。

教師あり学習(Supervised Learning)

教師あり学習は、入力と正解のペアが与えられた状態で学習します。画像分類やテキスト翻訳が代表的な例です。核心は「正解ラベル」が存在するという点です。

教師なし学習(Unsupervised Learning)

教師なし学習は、正解なしでデータの隠れた構造を発見します。クラスタリング、次元削減、生成モデルなどがここに該当します。

強化学習(Reinforcement Learning)

強化学習は前の2つの方式とは根本的に異なります。エージェントが環境と相互作用しながら試行錯誤を通じて学習します。正解が明示的に与えられず、代わりに報酬信号を通じてどの行動が良いかを間接的に知ることになります。

特性教師あり学習教師なし学習強化学習
データ入力-正解ペア入力のみ状態-行動-報酬
フィードバック即時(正解)なし遅延報酬
目標予測精度構造発見累積報酬の最大化
画像分類クラスタリングゲームプレイ

強化学習の核心構成要素

強化学習システムは以下の要素で構成されます。

エージェント(Agent)

エージェントは環境の中で行動を選択し実行する主体です。ゲームのプレイヤーやロボットの制御システムなどがエージェントに該当します。

環境(Environment)

環境はエージェントが相互作用する外部世界です。エージェントの行動に反応して新しい状態と報酬を提供します。

行動(Action)

エージェントが各時点で選択できるものの集合です。行動空間は離散的(上、下、左、右)または連続的(操舵角度、加速度)になり得ます。

観測(Observation)

エージェントが環境から受け取る情報です。環境全体の状態を見られる場合(完全観測)と一部だけ見られる場合(部分観測)があります。

報酬(Reward)

環境がエージェントの行動に対して提供するスカラーフィードバック信号です。強化学習の究極の目標は、時間にわたる累積報酬の合計を最大化することです。

エージェントと環境の相互作用の流れを簡単に表すと以下のようになります:

エージェント --[行動]--> 環境 --[観測, 報酬]--> エージェント --[行動]--> ...

エージェント-環境相互作用の基本コード構造

# 強化学習の基本ループ
total_reward = 0
obs = env.reset()

while True:
    action = agent.select_action(obs)
    next_obs, reward, done, info = env.step(action)
    total_reward += reward
    agent.learn(obs, action, reward, next_obs, done)
    obs = next_obs
    if done:
        break

print(f"에피소드 종료, 총 보상: {total_reward}")

報酬の深い理解

割引報酬(Discounted Reward)

未来の報酬は現在の報酬よりも不確実です。これを反映するために割引因子ガンマ(gamma、0と1の間の値)を使用します。

時点tにおける割引累積報酬G_tは次のように計算されます:

G_t = r_t + gamma * r_{t+1} + gamma^2 * r_{t+2} + gamma^3 * r_{t+3} + ...

ガンマが0に近いとエージェントは即時的な報酬のみを重視し、1に近いと遠い未来の報酬も現在とほぼ同等に扱います。

def calculate_discounted_return(rewards, gamma=0.99):
    """할인된 누적 보상 계산"""
    G = 0
    returns = []
    for reward in reversed(rewards):
        G = reward + gamma * G
        returns.insert(0, G)
    return returns

# 예시: 각 스텝에서 보상 1을 받는 경우
rewards = [1, 1, 1, 1, 1]
returns = calculate_discounted_return(rewards, gamma=0.99)
print(f"할인된 누적 보상: {returns}")
# 출력: [4.90, 3.94, 2.97, 1.99, 1.0]

マルコフ過程(Markov Process)

強化学習の数学的基盤はマルコフ性質から出発します。

マルコフ性質(Markov Property)

未来の状態は現在の状態のみに依存し、過去の履歴には依存しないという性質です。数学的に表すと次のようになります:

P(s_{t+1} | s_t) = P(s_{t+1} | s_1, s_2, ..., s_t)

つまり、現在の状態s_tだけ知っていれば未来を予測するのに十分だという意味です。

マルコフ連鎖(Markov Chain)

マルコフ連鎖はマルコフ性質を満たす状態のシーケンスです。有限の状態集合Sと遷移確率行列Pで定義されます。

import numpy as np

# 날씨 마르코프 체인 예시
# 상태: 맑음(0), 흐림(1), 비(2)
transition_matrix = np.array([
    [0.7, 0.2, 0.1],  # 맑음 -> 맑음, 흐림, 비
    [0.3, 0.4, 0.3],  # 흐림 -> 맑음, 흐림, 비
    [0.2, 0.3, 0.5],  # 비   -> 맑음, 흐림, 비
])

states = ['맑음', '흐림', '비']

def simulate_markov_chain(transition_matrix, initial_state, n_steps):
    """마르코프 체인 시뮬레이션"""
    current = initial_state
    trajectory = [current]
    for _ in range(n_steps):
        current = np.random.choice(
            len(transition_matrix),
            p=transition_matrix[current]
        )
        trajectory.append(current)
    return trajectory

# 맑음에서 시작하여 10일간 시뮬레이션
trajectory = simulate_markov_chain(transition_matrix, 0, 10)
print("날씨 변화:", [states[s] for s in trajectory])

マルコフ報酬過程(Markov Reward Process, MRP)

マルコフ連鎖に報酬の概念を追加するとマルコフ報酬過程になります。MRPは次の4つの要素で定義されます:

  • S: 有限の状態集合
  • P: 遷移確率行列
  • R: 報酬関数(各状態で受け取る期待報酬)
  • ガンマ: 割引因子(0以上1以下)

状態価値関数(State Value Function)

状態sの価値V(s)は、その状態から開始して得られる期待割引累積報酬です。

V(s) = E[G_t | s_t = s]
     = E[r_t + gamma * r_{t+1} + gamma^2 * r_{t+2} + ... | s_t = s]

これを再帰的に分解するとベルマン方程式の基本形が得られます:

V(s) = R(s) + gamma * sum_over_s'( P(s' | s) * V(s') )
def compute_mrp_value(transition_matrix, rewards, gamma=0.99, n_iterations=1000):
    """반복법을 이용한 MRP 상태 가치 계산"""
    n_states = len(rewards)
    V = np.zeros(n_states)

    for _ in range(n_iterations):
        V_new = np.zeros(n_states)
        for s in range(n_states):
            V_new[s] = rewards[s] + gamma * np.sum(
                transition_matrix[s] * V
            )
        V = V_new

    return V

# 날씨 MRP: 맑음=+2, 흐림=0, 비=-1
rewards = np.array([2.0, 0.0, -1.0])
values = compute_mrp_value(transition_matrix, rewards, gamma=0.9)
for s, v in zip(states, values):
    print(f"상태 '{s}'의 가치: {v:.2f}")

マルコフ決定過程(Markov Decision Process, MDP)

MDPはMRPに**行動(Action)**の概念を追加したものです。エージェントが行動を選択できるようになることで、意思決定問題になります。

MDPは5つの要素で定義されます:

  • S: 有限の状態集合
  • A: 有限の行動集合
  • P: 遷移確率関数 P(s' | s, a) - 状態sで行動aを取った時にs'に遷移する確率
  • R: 報酬関数 R(s, a) - 状態sで行動aを取った時に受け取る期待報酬
  • ガンマ: 割引因子

方策(Policy)

方策piはエージェントが各状態でどの行動を選択するかを決定するルールです。

  • 決定的方策: 各状態で1つの行動を確定的に選択します。a = pi(s)
  • 確率的方策: 各状態で行動の確率分布を定義します。pi(a | s) = 状態sで行動aを選択する確率
import random

class RandomPolicy:
    """무작위 정책"""
    def __init__(self, n_actions):
        self.n_actions = n_actions

    def select_action(self, state):
        return random.randint(0, self.n_actions - 1)

class GreedyPolicy:
    """탐욕적 정책: Q값이 가장 높은 행동 선택"""
    def __init__(self, q_table):
        self.q_table = q_table

    def select_action(self, state):
        return int(np.argmax(self.q_table[state]))

class EpsilonGreedyPolicy:
    """엡실론-탐욕 정책: 탐색과 활용의 균형"""
    def __init__(self, q_table, epsilon=0.1):
        self.q_table = q_table
        self.epsilon = epsilon

    def select_action(self, state):
        if random.random() < self.epsilon:
            return random.randint(0, len(self.q_table[state]) - 1)
        return int(np.argmax(self.q_table[state]))

行動価値関数(Action-Value Function)

方策piの下で状態sにおいて行動aを取った時の期待累積報酬をQ(s, a)と表します。

Q_pi(s, a) = E_pi[G_t | s_t = s, a_t = a]

最適行動価値関数Q*(s, a)は、すべての可能な方策の中で最も高いQ値を意味します。

Q*(s, a) = max_pi Q_pi(s, a)

グリッドワールドMDP実装例

簡単な4x4グリッドワールドをMDPとして実装してみましょう。

import numpy as np

class GridWorldMDP:
    """간단한 4x4 그리드월드 MDP"""
    def __init__(self):
        self.size = 4
        self.n_states = self.size * self.size
        self.n_actions = 4  # 상, 하, 좌, 우
        self.goal = (3, 3)  # 목표 위치
        self.trap = (1, 1)  # 함정 위치

        # 행동 방향: 상, 하, 좌, 우
        self.action_deltas = [(-1, 0), (1, 0), (0, -1), (0, 1)]
        self.action_names = ['상', '하', '좌', '우']

    def state_to_pos(self, state):
        return (state // self.size, state % self.size)

    def pos_to_state(self, row, col):
        return row * self.size + col

    def step(self, state, action):
        row, col = self.state_to_pos(state)
        dr, dc = self.action_deltas[action]
        new_row = max(0, min(self.size - 1, row + dr))
        new_col = max(0, min(self.size - 1, col + dc))

        next_state = self.pos_to_state(new_row, new_col)
        next_pos = (new_row, new_col)

        if next_pos == self.goal:
            return next_state, 10.0, True
        elif next_pos == self.trap:
            return next_state, -10.0, True
        else:
            return next_state, -0.1, False

    def reset(self):
        return 0  # 시작 상태: (0, 0)

# 그리드월드에서 무작위 에이전트 실행
env = GridWorldMDP()
policy = RandomPolicy(env.n_actions)

n_episodes = 1000
total_rewards = []

for episode in range(n_episodes):
    state = env.reset()
    episode_reward = 0
    for step in range(100):
        action = policy.select_action(state)
        next_state, reward, done = env.step(state, action)
        episode_reward += reward
        state = next_state
        if done:
            break
    total_rewards.append(episode_reward)

avg_reward = np.mean(total_rewards)
print(f"무작위 정책의 평균 보상 ({n_episodes}회): {avg_reward:.2f}")

探索と活用のジレンマ(Exploration vs Exploitation)

強化学習で最も根本的な問題の1つは探索と活用のバランスです。

  • 探索(Exploration): 新しい行動を試みて環境に関する情報を収集します
  • 活用(Exploitation): これまでに知られている最善の行動を選択して報酬を最大化します

探索に偏りすぎると既知の良い戦略を活用できず、活用に偏りすぎるとより良い戦略を発見できません。

イプシロン貪欲方策はこの問題に対する簡単な解決策です。確率epsilonでランダムな行動を選択(探索)し、1 - epsilonの確率で現在最善の行動を選択(活用)します。


まとめ

この記事で扱った核心概念を整理すると以下の通りです:

  1. 強化学習はエージェントが環境と相互作用しながら報酬を最大化する学習方法です
  2. マルコフ性質は未来が現在のみに依存するという仮定で、強化学習の数学的基盤です
  3. MRPはマルコフ連鎖に報酬を追加したもので、状態価値関数を定義できます
  4. MDPはMRPに行動を追加してエージェントの意思決定をモデル化します
  5. 方策は状態から行動へのマッピングであり、最適方策を見つけることが強化学習の目標です

次の記事では、OpenAI Gymを使用して実際に強化学習環境を構築し、エージェントを学習させる方法を見ていきます。