Python:
pip install tensorflow==1.15
pip install keras==2.3
import gym # загружаем "тренажер" Gym из платформы OpenAi, предоставляющий среду для работы над обучением с подкреплением
import numpy as np # импортируем библиотеку для работы с массивами данных
import keras # импортируем нейросетевую библиотеку
from keras.models import Model, load_model # из кераса подгружаем абстрактный класс базовой модели, метод загрузки предобученной модели
from keras.layers import Dense, Flatten, Input, Lambda, Conv2D, MaxPooling2D, Reshape, Multiply # из кераса загружаем необходимые слои для нейросети
from keras.optimizers import RMSprop, Adam # из кераса загружаем выбранный оптимизатор
import time # модуль для операций со временными характеристиками
import matplotlib.pyplot as plt # импортируем библиотеку для визуализации данных
%matplotlib inline
###########################
# Функция потерь в керасе имеет вид def loss(yTrue,yPred):...А так как нам нужно включить reward в loss, создаем...
# ...функцию rewardedLoss поверх неё, чтобы на входе добавить episodeReward
###########################
def rewardedLoss(episodeReward): # задаем новую функцию потерь, принимающую episodeReward, награда
def loss(yTrue,yPred):
# подаём в кач-ве yTrue фактически сделанное действие(action)
# если фактически сделанное действие было движением вверх - подаем 1 на yTrue, если нет то подаем 0
# yPred - выход сетки(вероятность выбора движения вверх)
# мы не подаём yPred в нейронку, его вычисляет керас
# сначала log(0) and log(1) неопределены - загоняем yPred между значениями:
tmpPred = Lambda(lambda x: keras.backend.clip(x,0.05,0.95))(yPred)
# вычисляем логарифм вероятности. yPred - вероятность выбора движения вверх
# помним что yTrue = 1 когда фактически выбрано движение вверх, и 0 - когда вниз
# формула похожа на кросс-энтропию в керасе, но здесь мы прописываем её вручную, чтобы умножить на значение награды
tmpLoss = Lambda(lambda x:-yTrue*keras.backend.log(x)-(1-yTrue)*(keras.backend.log(1-x)))(tmpPred)
# обновленная функция потерь - "функция политики"
policyLoss = Multiply()([tmpLoss, episodeReward]) #добавляем в loss умножение на награду за эпизод
return policyLoss # ввели обновленную функцию политики
return loss # возвращаем обновленную функцию политики
у меня есть такой код, он работает как лосс для обучения с подкреплением, где yTrue - это действие, которое было совершено роботом, и yPred - действие, которое предсказал робот, тут прикол в том, что на loss влияет так называемая "награда"(episodeReward)(от -1 до 1), т.е на любое действие есть или штраф, или награда. т.е тут шутка еще в том, что если робот должен предсказать не просто действие, а еще и то, чтобы действие было "правильным"(штраф/награда), функция не много изменена, чтобы можно было подавать на питон одновременно ypred,ytrue и саму награду. Еще формула изменена, чтобы нейронка, даже если вероятность дейсвтия номер 1- 70 % и вероятность дествия номер 2 - 30 % совершала не тупо действие - 1, а была вероятнсть, что оно совершит действие 2. Фишка в том, что это реализовано на 2 действия.
Но у меня сейчас встал вопрос на три дейтсвия, и тут нужно как-то это перенести на categrotrical_crossentropy, [0.2, 0.1, 0.7]. Только я не знаю, как это сделать, помогите....