強化学習 (Reinforcement Learning)
強化学習を基礎から解説 (理解できている範囲で)
参考文献: 斎藤 康毅 『ゼロから作るDeep Learning ❹ ― 強化学習編』
1. 問題設定
- エージェントは環境から状態 $S_t$ を受け取る.
- エージェントは方策 $\pi$ に従って行動 $A_t$ を決定する.
- 環境が次の状態 $S_{t+1}$ に遷移し, エージェントは報酬 $R_t$ を受け取る.
- (1-3 繰り返し)
1.1. キーワード
- マルコフ決定過程 (MDP; Markov Decision Process)
- 報酬 (reward) $R_t$: 状態遷移のたびに環境から受け取る評価値 (スカラー)
- 収益 (return) $G_t$: 現在の時刻以降に得られる報酬の (重み付き) 期待値
- 行動 (action) $A_t$: 方策 ($\pi$) に従ってエージェントが決定する
- 状態 (state) $S_t$: エージェントが環境から観測するデータ
-
方策 (policy) $\pi_\theta(a|s)$:
- 状態 $s$ を入力したときに, どの行動 $a$ が最適かをモデルで推定する.
- どの行動 $a$ を選択するかは確率的に決める (ものとする).
- $\theta$ はモデルのパラメータ.
-
状態価値関数 $\mathcal{v}_\pi(s)$:
-
\mathcal{v}_\pi(s) = \mathbb{E}_\pi{\big[{G_t|S_t=s}\big]} -
方策 $\pi$ が変われば, 状態価値関数の値も変わる点に注意.
-
-
行動価値関数 $q_\pi(s, a)$
- ある時刻 $t$ における状態が $s$ のとき, 行動 $a$ を選択したときの "価値" を表す.
1.2. マルコフ決定過程
- エージェントがとりうる最適な行動 $a^*$ が, 現在の状態 $s_t$ にのみによって決められること.
- つまり, エージェントが行動決定するとき, 現在の状態 $s_t$ にのみ着目し, 過去の状態 $s_0, \dots, s_{t-1}$ は無視できること.
1.3. 報酬について
$R_t = r(S_t,A_t,S_{t+1})$
- プログラマーが設計する.
- 確率的に決まる値にしても良いが, 期待値をとれば決定的に決まる値としてみなせる.
→ 決定的に決まる値として考える.
1.4. 収益について
ある時刻 $t$ における収益 $G_t$ は
\begin{align*}
G_t &= R_t + \gamma R_{t+1} + \gamma^2 R_{t+2} + ... \\
&= \sum_{i=0}^{\infty}{\Big[{\gamma^{i} R_{t+i}}\Big]} \\
&= R_t + \gamma G_{t+1}
\end{align*}
∴ 無限大に発散することを防ぐため, $\gamma$ ($0 < \gamma < 1$) で重み付けする.
1.5. よりよい方策とは?
どの状態 $s$ でも方策 $\pi_2$ の状態価値 $\mathcal{v}_{\pi_2}(s)$
の方が 方策 $\pi_1$ の状態価値 $\mathcal{v}_{\pi_1}(s)$
より高い.
∴ 方策 $\pi_2$ は 方策 $\pi_1$ よりよい方策と言える.
1.6. 行動価値関数と状態価値関数の関係
\mathcal{v}_{\pi}{(s)} = \sum_{a}{\Big[{\pi(a|s) q_{\pi}{(s, a)}}\Big]}
2. ベルマン方程式
2.1. 状態価値関数のベルマン方程式
\begin{align*}
\mathcal{v}_{\pi}{(s)}
&= \mathbb{E}_{\pi}{\big[{G_t|S_t=s}\big]} \\
&= \mathbb{E}_{\pi}{\big[{R_t + \gamma G_{t+1}|S_t=s}\big]} \\
&= \color{#1f77b4}{\mathbb{E}_{\pi}{\big[{R_t|S_t=s}\big]}} + \gamma \color{#ff7f0e}{\mathbb{E}_{\pi}{\big[{G_{t+1}|S_t=s}\big]}}
\end{align*}
ここで,
- 方策 (確率的) の定義: $\pi(a|s)$
- 状態遷移 (確率的) の定義: $p(s'|s, a)$
とすると
\begin{align*}
\color{#1f77b4}{\mathbb{E}_{\pi}{\big[{R_t|S_t=s}\big]}}
&= \sum_{a,s'}{\Big[{\pi(a|s) p(s'|s,a) r(s,a,s')}\Big]} \\
\color{#ff7f0e}{\mathbb{E}_{\pi}{\big[{G_{t+1}|S_t=s}\big]}}
&= \sum_{a,s'}{\Big[{\pi(a|s) p(s'|s,a) \mathbb{E}_{\pi}{\big[{G_{t+1}|S_{t+1}=s'}\big]}}\Big]} \\
&= \sum_{a,s'}{\Big[{\pi(a|s) p(s'|s,a) \mathcal{v}_{\pi}{(s')}}\Big]}
\end{align*}
のように式変形できるため,
\begin{align*}
\therefore \mathcal{v}_{\pi}{(s)}
&= \color{#1f77b4}{\sum_{a,s'}{\Big[{\pi(a|s) p(s'|s,a) r(s,a,s')}\Big]}} + \gamma \color{#ff7f0e}{\sum_{a,s'}{\Big[{\pi(a|s) p(s'|s,a) \mathcal{v}_{\pi}{(s')}}\Big]}} \\
&= \sum_{a,s'}{\Big[{\pi(a|s) p(s'|s,a) {\Big\{ \color{#1f77b4}{r(s,a,s')} + \gamma \color{#ff7f0e}{\mathcal{v}_{\pi}{(s')}} \Big\}}}\Big]}
\end{align*}
2.2. 行動価値関数のベルマン方程式
\begin{align*}
q_{\pi}{(s,a)}
&= \mathbb{E}_{\pi}{\big[{G_t|S_t=s,A_t=a}\big]} \\
&= \mathbb{E}_{\pi}{\big[{R_t + \gamma G_{t+1}|S_t=s,A_t=a}\big]} \\
&= \color{#1f77b4}{\mathbb{E}_{\pi}{\big[{R_t|S_t=s,A_t=a}\big]}} + \gamma \color{#ff7f0e}{\mathbb{E}_{\pi}{\big[{G_{t+1}|S_t=s,A_t=a}\big]}}
\end{align*}
ここで,
\begin{align*}
\color{#1f77b4}{\mathbb{E}_{\pi}{\big[{R_t|S_t=s,A_t=a}\big]}}
&= \sum_{s'}{\Big[{p(s'|s,a) r(s,a,s')}\Big]} \\
\color{#ff7f0e}{\mathbb{E}_{\pi}{\big[{G_{t+1}|S_t=s,A_t=a}\big]}}
&= \sum_{s'}{\Big[{p(s'|s,a) \mathbb{E}_{\pi}{\big[{G_{t+1}|S_{t+1}=s'}\big]}}\Big]} \\
&= \sum_{s'}{\Big[{p(s'|s,a) \color{#2ca02c}{\mathcal{v}_{\pi}{(s')}}}\Big]} \\
&= \sum_{s'}{\Big[{p(s'|s,a) \color{#2ca02c}{\sum_{a'}{\Big[{\pi(a'|s') q_{\pi}{(s', a')}}\Big]}}}\Big]} \\
\end{align*}
のように式変形できるため,
\begin{align*}
\therefore
q_{\pi}{(s,a)}
&= \color{#1f77b4}{\mathbb{E}_{\pi}{\big[{R_t|S_t=s,A_t=a}\big]}} + \gamma \color{#ff7f0e}{\mathbb{E}_{\pi}{\big[{G_{t+1}|S_t=s,A_t=a}\big]}} \\
&= \sum_{s'}{\Big[{p(s'|s,a) {\Big\{ \color{#1f77b4}{r(s,a,s')} + \gamma \color{#ff7f0e}{\mathcal{v}_{\pi}{(s')}} \Big\}}}\Big]} \\
&= \sum_{s'}{\Big[{p(s'|s,a) {\Big\{ \color{#1f77b4}{r(s,a,s')} + \gamma \color{#2ca02c}{\sum_{a'}{\Big[{\pi(a'|s') q_{\pi}{(s', a')}}\Big]}} \Big\}}}\Big]} \\
\end{align*}
2.3. ベルマン最適方程式
2.1. よりベルマン方程式は
\begin{align*}
\mathcal{v}_{\pi}{(s)}
&= \sum_{a,s'}{\Big[{\pi(a|s) p(s'|s,a) {\big\{ {r(s,a,s')} + \gamma {\mathcal{v}_{\pi}{(s')}} \big\}}}\Big]} \\
&= \sum_{a}{\bigg[{ \pi(a|s) \sum_{s'}{\Big[ p(s'|s,a) {\big\{ {r(s,a,s')} + \gamma {\mathcal{v}_{\pi}{(s')}} \big\}} \Big]} }\bigg]} \\
\end{align*}
のように表される.
ここで, 最適方策 ${\pi}_{*}(a|s)$ が分かっているとすると, ベルマン最適方程式は
\begin{align*}
\mathcal{v}_{*}{(s)}
&= \sum_{a}{\bigg[{ {\pi}_{*}(a|s) \sum_{s'}{\Big[ p(s'|s,a) {\big\{ {r(s,a,s')} + \gamma {\mathcal{v}_{*}{(s')}} \big\}} \Big]} }\bigg]} \\
\end{align*}
最適な方策なので, 以下のように決定的に決まる.
\pi(a|s) =
\begin{cases}
1 & (a = a^*) \\
0 & (a \neq a^*)
\end{cases}
最適な方策をとったとき, 状態価値関数は最大値をとるはずなので,
\begin{align*}
\mathcal{v}_{*}{(s)}
&= \max_{a}{\sum_{s'}{\Big[ p(s'|s,a) {\big\{ {r(s,a,s')} + \gamma {\mathcal{v}_{*}{(s')}} \big\}} \Big]}} \\
\end{align*}
行動価値関数についても, 同様にベルマン最適方程式を求めることができる (省略).
2.4. 現実的な課題について
最適状態価値関数がわかれば, 最適方策を得ることができる.
しかし, 現実的な課題で最適状態価値関数を解析的に求めることは難しい…
3. 動的計画法
- 環境モデルが既知の場合に適用できる.
4. モンテカルロ法 (MC 法)
- モンテカルロ法: データのサンプリングを何回か行って, その結果から推定する結果の総称.
- 環境モデル (状態遷移確率 $p(s'|s, a)$, 報酬関数 $r(s, a, s')$) は既知ではない場合にも適用可能.
- 環境モデルが不透明な初期段階では, エージェントは 探索 を行い, 環境モデルについてのサンプルデータを集める必要がある.
- 強化学習では, 方策評価 と 方策改善 を交互に繰り返して, 最適な方策を見つける.
- 方策評価: 方策 $\pi$ が与えられたときに, その方策の価値関数の推定値 $V_\pi(s)$ を計算する.
- 方策改善: 推定した価値関数をもとに, 方策 $\pi$ を最適な方策に近づける.
4.1. 評価フェーズ
- $i$ 回目のエピソードで得られた収益を $G^{(i)}$ と表記する.
\mathcal{v}_\pi(s) = \mathbb{E}{\big[{G|s}\big]}
のため, モンテカルロ法で推定すると
\begin{align*}
V_\pi(s) &= \frac{1}{n}{\big\{ {G^{(1)} + \dots + G^{(n)}} \big\} } \\
Q_\pi(s, a) &= \frac{1}{n}{\big\{ {G^{(1)} + \dots + G^{(n)}} \big\} } \\
\end{align*}
インクリメンタルに計算する場合:
\begin{align*}
V_{n}(s) &= V_{n-1}(s) + \frac{1}{n}\big[{G^{(n)} - V_{n-1}(s)}\big] \\
Q_{n}(s, a) &= Q_{n-1}(s,a) + \frac{1}{n}\big[{G^{(n)} - Q_{n-1}(s,a)}\big] \\
\end{align*}
4.2. 改善フェーズ
\mu(s) = \operatorname*{argmax}_a{Q(s, a)}
4.3. ε-greedy 法
-
エージェントがある状態 $s$ のときの行動 $a$ を決定するとき, $q(a|s)$ の値に関係なく, $\epsilon$ の確率でランダムに行動を選択する. ($0 \le \epsilon \le 1$)
-
例: 取り得る行動の数が 4 で, $$\operatorname*{argmax}_{a}{q(a|s)} = a_2$$ のとき, 方策は次のように設定する:

-
探索 と 利用 のトレードオフ:
- $\epsilon$ が大きいとき, ランダムに行動を選択する確率が高くなる (探索 (exploration) を重視する).
- $\epsilon$ が小さいとき, 経験から得た知識を利用する行動を選択する確率が高くなる (利用 (exploitation) を重視する).
4.4. 方策オフ型と方策オン型
4.4.1. 方策オフ型
- 自分とは別の場所で得られた経験から, 自分の方策を改善するアプローチ.
- ターゲット方策 と 挙動方策 が異なる.
4.4.2. 方策オン型
- 自分で得た経験から自分の方策を改善するアプローチ.
- ターゲット方策 と 挙動方策 が同じ.
4.4.3. ターゲット方策 (target policy)
評価と改善の対象となる方策.
4.4.4. 挙動方策 (behavior policy)
エージェントが実際に行動を起こすときにつかう方策.
4.5. 重点サンプリング
ある確率分布 $\pi$ の期待値を, 別の確率分布 $b$ からサンプリングしたデータを使って推定する手法.
\begin{align*}
\mathbb{E}_{\pi}{[x]}
&= \sum{x \pi(x)} \\
&= \sum{x \frac{b(x)}{b(x)}\pi(x)} \\
&= \sum{x \boxed{\frac{\pi(x)}{b(x)}}b(x)} \\
&= \sum{x \rho(x)b(x)} \\
&= \mathbb{E}_{b}{\big[{x \frac{\pi(x)}{b(x)}}\big]} \\
&\approx \frac{1}{n}{\Big[ \rho(x^{(1)})x^{(1)} + \dots + \rho(x^{(n)})x^{(n)} \Big]}
\end{align*}
5. TD (Temporal Difference) 法
2.1. 節より
\begin{align*}
\mathcal{v}_{\pi}{(s)}
&= \mathbb{E}_{\pi}{\big[{G_t|S_t=s}\big]} \\
&= \mathbb{E}_{\pi}{\big[{R_t + \gamma G_{t+1}|S_t=s}\big]} \\
&= \mathbb{E}_{\pi}{\big[{R_t + \gamma \mathcal{v}_{\pi}(S_{t+1})|S_t=s}\big]} \\
\end{align*}
- 現在の状態価値関数を ${V}_{\pi}$
- 更新後の状態価値関数を ${V'}_{\pi}$
とする.
\begin{align*}
{V'}_{\pi}{(S_t)}
&= {V}_{\pi}{(S_t)} + \alpha [{\boxed{{G}_{t}} - {V}_{\pi}{(S_t)}}] & (MC 法) \\
&= {V}_{\pi}{(S_t)} + \alpha [{\boxed{{R}_{t} + \gamma V_\pi{(S_{t+1})}} - {V}_{\pi}{(S_t)}}] & (TD 法) \\
\end{align*}
5.1. MC 法と TD 法の比較
- MC 法では, エピソードを完了させて収益 $G_t$ を計算しないと状態価値関数を更新できない.
- TD 法では, 次時刻の状態 $S_{t+1}$ と報酬 $R_t$ のみから状態価値関数を更新できる.
5.2. SARSA (方策オン型)
- 評価フェーズ
Q'_\pi(S_t,A_t) = Q_\pi(S_t,A_t) + \alpha \big[{ \boxed{R_t + \gamma Q_\pi(S_{t+1}, A_{t+1})} - Q_\pi(S_t,A_t)}\big] - 改善フェーズ
\pi'(a|S_t) = \begin{cases} \operatorname*{argmax}_a{Q'_\pi(S_t,a)} & (1-\epsilon の確率) \\ ランダムな行動 & (\epsilon の確率) \\ \end{cases}
5.3. SARSA (方策オフ型)
- 備考:
- 挙動方策 $b$ は ε-greedy に更新
- ターゲット方策 $\pi$ は greedy に更新
- (復習) 2 つの方策が異なるため, 重点サンプリングを使って重み $\rho$ による補正を行う
- (復習) $A_{t+1}$ は挙動方策の確率分布 $b$ に従ってサンプリングする.
- 評価フェーズ
\begin{align*} Q'_\pi(S_t,A_t) &= Q_\pi(S_t,A_t) + \alpha \big[{ \boxed{\rho\{R_t + \gamma Q_\pi(S_{t+1}, A_{t+1})\}} - Q_\pi(S_t,A_t)}\big] \\ \rho &= \frac{\pi(A_{t+1}|S_{t+1})}{b(A_{t+1}|S_{t+1})} \end{align*} - 改善フェーズ
\begin{align*} \pi'(a|S_t) &= \operatorname*{argmax}_a{Q'_\pi(S_t,a)} \\ b'(a|S_t) &= \begin{cases} \operatorname*{argmax}_a{Q'_\pi(S_t,a)} & (1-\epsilon の確率) \\ ランダムな行動 & (\epsilon の確率) \\ \end{cases} \end{align*}
5.4. Q 学習 (方策オフ型)
- 評価フェーズ
Q'(S_t,A_t) = Q(S_t,A_t) + \alpha \big[{ \boxed{R_t + \gamma \max_{a}{Q(S_{t+1}, a)}} - Q(S_t,A_t)}\big] - 改善フェーズ
\begin{align*} \pi'(a|S_t) &= \operatorname*{argmax}_a{Q'(S_t,a)} \\ b'(a|S_t) &= \begin{cases} \operatorname*{argmax}_a{Q'(S_t,a)} & (1-\epsilon の確率) \\ ランダムな行動 & (\epsilon の確率) \\ \end{cases} \end{align*}
5.5. ベルマン方程式, ベルマン最適方程式 と SARSA, Q 学習 の対応関係
- ベルマン方程式が SARSA に対応
- ベルマン最適方程式が Q 学習 に対応 (ヒント: $\max$ 演算子を使う)
(導出は省略)
6. ニューラルネットワークと Q 学習
- Q 関数をニューラルネットワークでモデル化する.
- 応用技術:
- DQN
- Double DQN
- 優先度付き経験再生
- Dueling DQN
- DQN
※詳細は省略
7. 方策勾配法
-
強化学習の手法は大きく 価値ベース (Value-based Method) と 方策ベース (Plicy-based Method) の手法に大別できる.

-
方策をニューラルネットワークなどでモデル化し, 勾配を使って方策を最適化する手法は 方策勾配法 (Policy Gradient Method) と呼ばれる.
7.1. 最も単純な方策勾配法
7.1.1. 記号の定義
- 方策(確率的): $\pi_\theta(a|s)$
- モデル化した方策: $\pi_\theta(a|s)$
- モデルのパラメータ: $\theta$
-
軌道 (Trajectory): $\tau$
- 実際に収集されたエピソードデータ
- $\tau = (S_0, A_0, R_0, S_1, A_1, R_1, \dots, S_T, A_T, R_T, S_{T+1})$
- 収益: $G(\tau)$
- $G(\tau) = R_0 + \gamma R_1 + \gamma^2 R_2 + \dots + \gamma^T R_T$
7.1.2. 目的関数の設計
目的関数 $J(\theta)$ とその勾配は
\begin{align*}
J(\theta)
&= \mathbb{E}_{\tau \sim \pi_\theta}{\big[ G(\tau) \big]} \\
{\nabla}_{\theta}{J(\theta)}
&= {\nabla}_{\theta}{\mathbb{E}_{\tau \sim \pi_\theta}{\big[ G(\tau) \big]}} \\
&= \dots \\
&= \mathbb{E}_{\tau \sim \pi_\theta}{
\bigg[ \sum_{t=0}^{T}{\Big\{
G(\tau) {\nabla}_{\theta}{{\big[\log
\pi_\theta(A_t|S_t)
\big]}}
\Big\}} \bigg]
} \\
\end{align*}
サンプリング数 1 の場合で近似すると,
\begin{align*}
{\nabla}_{\theta}{J(\theta)}
&\approx \sum_{t=0}^{T}{\Big[
G(\tau) {\nabla}_{\theta}{{\big[\log{\pi_\theta(A_t|S_t)} \big]}}
\Big]} \\
&= G(\tau) \sum_{t=0}^{T}{\Big[
\color{#1f77b4}{{\nabla}_{\theta}{{\big[\log{\pi_\theta(A_t|S_t)} \big]}}}
\Big]} \\
&= G(\tau) \sum_{t=0}^{T}{\Big[
\color{#1f77b4}{\frac{1}{\pi_\theta(A_t|S_t)} {\nabla}_{\theta}{\pi_\theta(A_t|S_t)}}
\Big]} \\
\end{align*}
合成関数の微分
$$
\frac{dz}{dx} = \frac{dz}{dy} \frac{dy}{dx}
$$
定式化すると
$$
\text{maximize}{\big[{J(\theta)}\big]}
$$
7.2. REINFORCE
- REINFORCE: REward Increment = Nonnegative Factor × Offset Reinforcement × Characteristic Eligibility
- 最も単純な方策勾配法の改良
最も単純な方策勾配法の勾配は
{\nabla}_{\theta}{J(\theta)}
= \mathbb{E}_{\tau \sim \pi_\theta}{
\bigg[ \sum_{t=0}^{T}{\Big\{
G(\tau) {\nabla}_{\theta}{{\big[\log
\pi_\theta(A_t|S_t)
\big]}}
\Big\}} \bigg]
}
$G(\tau)$ は 1 エピソード全体分の (割引率を加味した) 報酬和だが, 方策 ${\pi}_{\theta}(A_t|S_t)$ は現時刻以前の状態・報酬には影響されないはず (MDP より).
→ $G(\tau)$ を 収益 $G_t$ に置き換える.
{\nabla}_{\theta}{J(\theta)}
= \mathbb{E}_{\tau \sim \pi_\theta}{
\bigg[ \sum_{t=0}^{T}{\Big\{
G_t {\nabla}_{\theta}{{\big[\log
\pi_\theta(A_t|S_t)
\big]}}
\Big\}} \bigg]
}
※式変形は省略
7.3. ベースラインつき方策勾配法
{\nabla}_{\theta}{J(\theta)}
= \mathbb{E}_{\tau \sim \pi_\theta}{
\bigg[ \sum_{t=0}^{T}{\Big\{
\big(G_t - b(S_t)\big) {\nabla}_{\theta}{{\big[\log
\pi_\theta(A_t|S_t)
\big]}}
\Big\}} \bigg]
}
- ある値 (ベースライン) を引いても成り立つ. (証明は省略)
- $G_t$ をそのまま使うより, 適切なベースライン $b(S_t)$ を設計し, $G_t - b(S_t)$ を用いる方が分散が小さくなる.
- 計算誤差が小さくなる? (🤔)
7.4. Actor-Critic
- 状態価値関数をベースラインとして用いる.
- $V_w(S_t)$: 状態価値関数をモデル化したニューラルネットワーク (Critic)
- $\pi_\theta$: 方策をモデル化したニューラルネットワーク (Actor)
{\nabla}_{\theta}{J(\theta)}
= \mathbb{E}_{\tau \sim \pi_\theta}{
\bigg[ \sum_{t=0}^{T}{\Big\{
\big(G_t - \color{#1f77b4}{V_w(S_t)}\big) {\nabla}_{\theta}{{\big[\log
\pi_\theta(A_t|S_t)
\big]}}
\Big\}} \bigg]
}
TD 法を導入し, エピソードの完了を待たずに, 時刻 $t$ と時刻 $t+1$ のデータから更新できるように修正する.
{\nabla}_{\theta}{J(\theta)}
= \mathbb{E}_{\tau \sim \pi_\theta}{
\bigg[ \sum_{t=0}^{T}{\Big\{
\big(\color{#ff7f0e}{R_t + \gamma V_w(S_{t+1})} - \color{#1f77b4}{V_w(S_t)}\big) {\nabla}_{\theta}{{\big[\log
\pi_\theta(A_t|S_t)
\big]}}
\Big\}} \bigg]
}
7.5. 方策ベースの手法の利点
- 価値ベースの手法に対して, 方策ベースは, 方策を "ダイレクト" に推定するため, (場合によっては) 効率的.
- 連続的な行動空間でも使える.
- 学習が安定しやすく, 早く収束しやすい.
- 価値ベースでは, Q 値が変わると方策が大きく変わる場合がある.
- 方策ベースでは, 急に方策が変わることはない.
8. 応用
8.1. 経験再生 (Experience Replay)
- 方策オフ型の強化学習に適用できる手法.
- エージェントが過去に経験した $E_t = { S_t, A_t, R_t, S_{t+1} }$ をバッファに記憶しておく.
- バッファからランダムにサンプルを取り出し (ミニバッチ), 学習データとして用いる.
- ランダムに取り出すことにより, 多様な経験から学習が行うことができる.
![]()





