Skip to content

Commit ff1bea0

Browse files
improve README.md & charts
1 parent 1cedbc4 commit ff1bea0

File tree

4 files changed

+24
-16
lines changed

4 files changed

+24
-16
lines changed

README.md

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
Надя, [01.01.21 20:46]
12
# Deep Maze
23

34
Этот проект является симуляцией изучения простого grid world-a ботом с ограниченным полем зрения. Очки начисляются исключительно за открытие новых участков мира, что требует, как минимум, планирования и навигации.
@@ -11,24 +12,26 @@
1112
Видимая область - 17x17
1213
```
1314

14-
В данный момент, используется простой Q-learning, без какой-либо памяти, поэтому в состояние мира был добавлен срез с данными о прошлых передвижениях агента. Таким образом, агент получает данные о проходимости окружающих его клеток, проходил ли он по ней и давно ли (чтоб не использовать LSTM).
15+
В данный момент, используется простой Q-learning, без какой-либо памяти, поэтому в состояние мира был добавлен срез с данными о прошлых передвижениях агента. Таким образом, агент получает данные о проходимости окружающих его клеток и о передвижениях (проходились ли вообще и если да - то как давно, чтобы не использовать LSTM).
1516

16-
Агенты очень часто застревали в сложных участках, поэтому было добавлено детектирование данного поведения, остановка агента и запуск того же агента в режиме исследования. Полученные таким способом данные помещаются в отдельную память, чтоб потом обучать агента действовать в подобных ситуациях. Эмпирически эффект заметен, но нельзя однозначно утверждать пользу подобного подхода.
17+
Агенты очень часто застревали в сложных участках, поэтому было добавлено детектирование данного поведения, остановка агента и запуск того же агента в режиме исследования. Полученные таким способом данные помещаются в отдельную память, чтобы потом обучить агента как действовать в подобных ситуациях. Эмпирически эффект заметен, но нельзя однозначно утверждать пользу подобного подхода.
1718

18-
Изначально использовалась CNN (что логичнее для карт), но простая Dense-сетка давала сравнимый результат. Возможно, конечно, что остальные доработки могли привести к более заметному улучшению предсказаний CNN. Кроме того, были испробованы различные варианты наград, начальных условий, предобработки и др.
19+
Изначально использовалась CNN (что логичнее для карт), но простая Dense-сетка давала сравнимые результат. Возможно, конечно, что остальные доработки могли привести к более заметному улучшению предсказаний CNN. Кроме того, были испробованы различные варианты наград, начальных условий, предобработки и др.
1920

20-
Длительная тренировка одного агента не давала ощутимого прогресса, поэтому, в итоге, были натренированы 4 версии той же сети и затем их решения объединяются вместе (см. [DQNEnsembleAgent.py](Agent/DQNEnsembleAgent.py)). Ансамбль из агентов позволяет получать более стабильные результаты в сложных ситуациях. Например, если агент попадает в сложный участок пространства, то существенно выше шанс что он сможет попытаться найти выход, чем когда агент основывается на предсказании лишь одной сети. Верхнюю же границу ансамбль не улучшает.
21+
Длительная тренировка одного агента не давала ощутимого прогресса, поэтому, в итоге, были натренированы 4 версии той же сети и затем их решения объединялись вместе (см. [DQNEnsembleAgent.py](Agent/DQNEnsembleAgent.py)). Ансамбль из агентов позволяет получать более стабильные результаты в сложных ситуациях. Например, если агент попадает в сложный участок пространства, то существенно выше шанс что он сможет попытаться найти выход, чем когда агент основывается на предсказании лишь одной сети.
2122

22-
Ниже показано сравнение верхней границы (кол-во открытой области в 10 симуляциях из 100, по 5 прогонов):
23+
Ниже показано сравнение верхней границы (кол-во открытой области в 10 симуляциях из 100, по 20 прогонов):
2324

2425
![](img/20201231-high.jpg)
2526

2627
Как видно, ансамбль ведёт себя стабильнее, но не намного лучше отдельных его частей.
2728

28-
А это нижняя граница (кол-во открытой области в 90 симуляциях из 100, по 5 прогонов):
29+
А это нижняя граница (кол-во открытой области в 90 симуляциях из 100, по 20 прогонов), при худших начальных условиях:
2930

3031
![](img/20201231-low.jpg)
3132

33+
Опять же, прямо ощутимого улучшения нет, но ансамбль немного стабильнее открывает 20-25% карты.
3234

35+
Следующим шагом будет дистилляция ансамбля в единую сеть, а так же использование полноценной сети для комбинации предсказаний подсетей. Есть большая вероятность того, что это позволит уловить более глубокие корреляции т. к. обучаемая сеть будет иметь представление о соотношение Q-values.
3336

34-
37+
Продолжение, правки, фиксы и видео следуют, а пока Happy New Year :)

img/20201231-high.jpg

23.4 KB
Loading

img/20201231-low.jpg

24.6 KB
Loading

test.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
from Agent.DQNAgent import DQNAgent
2121
from Agent.DQNEnsembleAgent import DQNEnsembleAgent
2222
import pylab as plt
23-
import numpy as np
2423

2524
#######################################
2625
MAZE_FOV = 3
@@ -39,15 +38,18 @@ def plot2file(data, filename, chartname):
3938
axe.plot(dataset, label=name)
4039
axe.title.set_text(chartname)
4140

42-
fig.legend()
41+
fig.tight_layout()
42+
fig.subplots_adjust(right=0.85)
43+
fig.legend(loc="center right", prop={'size': 12})
4344
fig.savefig(filename)
4445
plt.close(fig)
4546
return
4647

47-
def testAgent(environments, agent, name, metrics, N=5):
48+
def testAgent(environments, agent, name, metrics, N=20):
4849
print('Agent: %s' % name)
4950

50-
scoreTop90 = metrics['scores']['%s worst 10%%' % name] = []
51+
scoreTop90 = metrics['Worst scores (top 90%)']['%s' % name] = []
52+
scoreTop10 = metrics['Best scores (top 10%)']['%s' % name] = []
5153

5254
for i in range(N):
5355
print('Round %d/%d...' % (i, N))
@@ -60,22 +62,22 @@ def testAgent(environments, agent, name, metrics, N=5):
6062

6163
scores = list(sorted(scores, reverse=True))
6264
scoreTop90.append(scores[int(0.9 * len(scores))])
63-
64-
plot2file(metrics, 'chart.jpg', 'scores')
65+
scoreTop10.append(scores[int(0.1 * len(scores))])
6566
return
6667

6768
if __name__ == "__main__":
6869
MAZE_PARAMS = {
6970
'size': 64,
7071
'FOV': MAZE_FOV,
7172
'minimapSize': MAZE_MINIMAP_SIZE,
72-
'loop limit': 64,
73+
'loop limit': 1000,
7374
}
7475
environments = [MazeRLWrapper(MAZE_PARAMS) for _ in range(100)]
7576
MODEL_INPUT_SHAPE = environments[0].input_size
7677

7778
metrics = {
78-
'scores': {}
79+
'Worst scores (top 90%)': {},
80+
'Best scores (top 10%)': {}
7981
}
8082
models = []
8183
for i, x in enumerate(glob.iglob('weights/*.h5')):
@@ -96,4 +98,7 @@ def testAgent(environments, agent, name, metrics, N=5):
9698
DQNEnsembleAgent(models),
9799
name='ensemble',
98100
metrics=metrics
99-
)
101+
)
102+
103+
for i, name in enumerate(metrics.keys()):
104+
plot2file(metrics, 'chart-%d.jpg' % i, name)

0 commit comments

Comments
 (0)