---
# System prepended metadata

title: 'Reinforcement Learning: day 3 DQN'

---

# Reinforcement Learning: day 3 DQN

## Review
Solve traveling salesman problems with reinforcement learning.
![](https://i.imgur.com/uG2AaVs.png)
## Q-Learning
$Q(s,a)$ s: state, a: action に依存する価値Qを更新する algorithm
$$
Q(s^{(t)},a^{(t)}) \leftarrow Q(s^{(t)},a^{(t)})+\alpha(r^{(t+1)}+\gamma \max_{a'}Q(s^{(t+1)},a')-Q(s^{(t)},a^{(t)}))
$$
## Q-table
ここでは、state は滞在できる国の数、actionは行動できる国の数である。
次のようなテーブルを用意できる

| state\action | Tokyo | Taipei | ... |
| -------- | -------- | -------- | -------- |
| Tokyo     | 0     | 1.3    | ... |
| Taipei    |2.1     | 0    |... |
| ...    |...    | ...    |... |
各テーブルの数値は、その状態と行動をとったときの価値（報酬の期待値）である。

## DQN
Q-Table をNNで記述する。
![](https://i.imgur.com/c0E9zLU.png)

この巡回セールスマン問題では、次のようなNNを構築した。
input: 80（国の数）
hidden1: 128
hidden2: 128
output: 80（国の数）

## What is Answer of DQN Learning ?
NNは正解ラベルと予測値を損失関数で計算し誤差を微分して学習を進めるものである。
では、正解ラベルとは？損失関数とは？
基本的にはQ-tableの数式を使う。
$$
Answer: r^{(t+1)}+\gamma \max_{a'}Q(s^{(t+1)},a')
$$
$$
Predict: Q(s^{(t)},a^{(t)})
$$
これを損失関数に入力して誤差と微分を計算し、学習を進める。

## Loss Function
最初MSEを使っていたがうまく学習が進まなかった。
pytorch [公式](https://pytorch.org/tutorials/intermediate/reinforcement_q_learning.html)にあるように、[Huber loss](https://en.wikipedia.org/wiki/Huber_loss) を使うと良くなった。

## Double DQN
DQNのAnswer は学習中の$Q^{(t)}(s,a)$を使っているので、ｎそれを正解ラベルにすると学習が安定しない。
なので、$Q^{(t-1)}$のコピーのNNを用意して、それを使って学習中は固定の正解ラベルになるように工夫したもの。
任意の頻度で$Q^{(t-1)}$を更新する。

## Practice
なんとなくQ学習を再現できた。
![](https://i.imgur.com/6CVZeZ1.png)

## Next
Attension 構造をもったNNでのQ学習の予定。