Skip to content

Commit

Permalink
improve README.md & charts
Browse files Browse the repository at this point in the history
  • Loading branch information
GreenWizard2015 committed Jan 1, 2021
1 parent 1cedbc4 commit ff1bea0
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 16 deletions.
17 changes: 10 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
Надя, [01.01.21 20:46]
# Deep Maze

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

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

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

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

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

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

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

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

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

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

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

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


Продолжение, правки, фиксы и видео следуют, а пока Happy New Year :)
Binary file modified img/20201231-high.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified img/20201231-low.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
23 changes: 14 additions & 9 deletions test.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
from Agent.DQNAgent import DQNAgent
from Agent.DQNEnsembleAgent import DQNEnsembleAgent
import pylab as plt
import numpy as np

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

fig.legend()
fig.tight_layout()
fig.subplots_adjust(right=0.85)
fig.legend(loc="center right", prop={'size': 12})
fig.savefig(filename)
plt.close(fig)
return

def testAgent(environments, agent, name, metrics, N=5):
def testAgent(environments, agent, name, metrics, N=20):
print('Agent: %s' % name)

scoreTop90 = metrics['scores']['%s worst 10%%' % name] = []
scoreTop90 = metrics['Worst scores (top 90%)']['%s' % name] = []
scoreTop10 = metrics['Best scores (top 10%)']['%s' % name] = []

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

scores = list(sorted(scores, reverse=True))
scoreTop90.append(scores[int(0.9 * len(scores))])

plot2file(metrics, 'chart.jpg', 'scores')
scoreTop10.append(scores[int(0.1 * len(scores))])
return

if __name__ == "__main__":
MAZE_PARAMS = {
'size': 64,
'FOV': MAZE_FOV,
'minimapSize': MAZE_MINIMAP_SIZE,
'loop limit': 64,
'loop limit': 1000,
}
environments = [MazeRLWrapper(MAZE_PARAMS) for _ in range(100)]
MODEL_INPUT_SHAPE = environments[0].input_size

metrics = {
'scores': {}
'Worst scores (top 90%)': {},
'Best scores (top 10%)': {}
}
models = []
for i, x in enumerate(glob.iglob('weights/*.h5')):
Expand All @@ -96,4 +98,7 @@ def testAgent(environments, agent, name, metrics, N=5):
DQNEnsembleAgent(models),
name='ensemble',
metrics=metrics
)
)

for i, name in enumerate(metrics.keys()):
plot2file(metrics, 'chart-%d.jpg' % i, name)

0 comments on commit ff1bea0

Please sign in to comment.