Приветствую всех вОблако Tencent + сообщество, получить больше крупной технической практики Tencent по галантерее~
Эта статья написанаЛо ХуэйОпубликован вКолонка «Облако + сообщество»
1. Документ Google по DQN
В феврале 2015 года Google опубликовал статью в Nature (см. вложение):Human-level control through deep reinforcement learning. В статье рассказывается, как научить компьютер играть в видеоигру Atari 2600 самостоятельно.
Atari 2600 — игровая приставка, охватившая США в 1980-х, включает в себя в общей сложности 49 самостоятельных игр, в том числе уже знакомые нам классические игры, такие как Breakout (Прорыв) и Galaxy Invaders (маленькие пчелы). Входными данными для алгоритма Google были только изображение игрового экрана и счет игры.Без вмешательства человека компьютер научился играть в игру самостоятельно и побил рекорды для игроков-людей в 29 играх.
Диаграмма архитектуры глубокой сети, предоставленная Google, выглядит следующим образом:
Левая сторона сети является входом, а правая — выходом. Изображение игрового экрана сначала проходит два сверточных слоя (в статье написано три), затем два полносвязных слоя и, наконец, сопоставляется со всеми возможными действиями геймпада. Между слоями используется функция активации ReLU.
2. Обучение с подкреплением (Q-Learning)
Согласно Википедии, обучение с подкреплением определяется следующим образом:
Обучение с подкреплением — это область машинного обучения, в которой особое внимание уделяется тому, как действовать в зависимости от среды, чтобы максимизировать желаемую выгоду. Это вдохновлено теорией бихевиоризма в психологии, то есть тем, как организмы постепенно формируют ожидание стимулов под стимуляцией наград или наказаний, данных окружающей средой, и производят привычное поведение, которое может принести наибольшую пользу.
В мире обучения с подкреплением алгоритм называется агентом.Он взаимодействует с окружающей средой.Агент получает состояние от среды и решает, какое действие следует предпринять.Среда будет давать агенту вознаграждение в соответствии со своей собственной логикой. Есть положительные и отрицательные награды. Например, в игре каждый раз, когда вы попадаете во врага, это положительная награда, а потеря крови или конец игры — обратная награда.
2.1 Марковский процесс принятия решений
Теперь вопрос в том, как сформулировать задачу обучения с подкреплением, а затем вывести ее? Самый распространенный способ — марковский процесс принятия решений.
Предположим, вы агент в среде (например, в игре Arkanoid). Среда находится в определенном состоянии (например, положение знака, положение и ориентация шарика, наличие или отсутствие каждого кирпича). ИИ может совершать определенные действия в этой среде (например, перемещать бит влево или вправо).
Эти действия иногда приводят к наградам (увеличению очков). Действия изменяют среду и вызывают новое состояние, в котором агент может выполнить другое действие. Правила, по которым вы выбираете эти действия, называются политиками. Вообще говоря, среда случайна, а это означает, что следующее состояние также более или менее случайно (например, когда вы пропустите мяч и выстрелите новым, он пойдет в случайном направлении).
Набор состояний и действий вместе с правилами изменения состояний составляет марковский процесс принятия решений. Эпизод этого процесса (например, игра) образует конечную последовательность состояний, действий и вознаграждений.
Среди них si представляет состояние, ai представляет действие, а ri+1 представляет вознаграждение, полученное после выполнения этого действия. Эпизод заканчивается финальным состоянием sn (например, экран «Игра окончена»). Марковский процесс принятия решений основан на допущении Маркова, то есть вероятность следующего состояния si+1 зависит от текущего состояния si и действия ai, а не от предыдущего состояния и действия.
2.2. Будущее вознаграждение со скидкой
Чтобы хорошо работать в долгосрочной перспективе, нам нужно учитывать не только немедленные вознаграждения, но и будущие вознаграждения, которые мы получим. Как мы можем это сделать?
Для данного запуска марковского процесса принятия решений мы можем легко рассчитать общую награду за эпизод:
Учитывая это, общая будущая доходность в момент времени t может быть выражена как:
Но поскольку наша среда случайна, мы никогда не можем быть уверены, что получим такое же вознаграждение после следующего такого же действия. Чем больше времени проходит, тем больше различий. Поэтому пришло время вместо этого использовать будущие вознаграждения со скидкой:
Здесь γ — коэффициент дисконтирования со значением от 0 до 1 — чем дальше вознаграждение в будущем, тем меньше мы о нем думаем. Легко видеть, что стоимость дисконтированных будущих вознаграждений на временном шаге t может быть выражена так же, как и на временном шаге t+1:
Если мы определим коэффициент дисконтирования как γ=0, то наша политика будет слишком недолговечной, т.е. основанной исключительно на немедленном вознаграждении. Если мы хотим сбалансировать немедленные и будущие вознаграждения, коэффициент дисконтирования должен быть приблизительно равен γ=0,9. Если наша среда детерминирована и одно и то же действие всегда приводит к одному и тому же вознаграждению, то мы можем определить коэффициент дисконтирования как γ=1.
Хорошая политика для агента должна состоять в том, чтобы выбрать действие, которое максимизирует (снижает) будущие вознаграждения.
2.3 Описание алгоритма Q-Learning:
α в алгоритме относится к скорости обучения, которая определяет, насколько велика разница между предыдущим значением Q и вновь предложенным значением Q. В частности, когда α=1, два Qs,a компенсируют друг друга, и результат точно такой же, как в уравнении Беллмана.
То, что мы используем для обновления Qs,a, является лишь приближением, и вполне возможно, что оно было неверным на ранних стадиях обучения. Но с каждой итерацией аппроксимация становится все более и более точной, и мы также обнаружили, что если мы будем выполнять это обновление достаточно долго, Q-функция будет сходиться и будет представлять истинное значение Q.
3. Сверточная нейронная сеть (CNN)
При обработке изображений изображение часто представляется как вектор пикселей, например, изображение размером 1000×1000 может быть представлено как вектор размером 1 000 000. В нейронной сети, упомянутой в предыдущем разделе, если количество скрытых слоев такое же, как и входного слоя, то есть 1000000, то данные параметра от входного слоя до скрытого слоя равны 1000000×1000000=10^12, что слишком много Ну, это почти невозможно тренировать. Поэтому, чтобы практиковать Дафа нейронной сети при обработке изображений, мы должны сначала уменьшить параметры для ускорения.
3.1 Местное восприятие
Сверточные нейронные сети имеют два артефакта, уменьшающих количество параметров Первый артефакт называется локальным рецептивным полем. Принято считать, что познание людьми окружающего мира идет от локального к глобальному, и пространственная связь образов также более тесная.
Следовательно, каждому нейрону на самом деле не нужно воспринимать глобальное изображение, а нужно только воспринимать локальное изображение, а затем синтезировать локальную информацию на более высоком уровне для получения глобальной информации. Идея частично связанных сетей также навеяна структурой зрительной системы в биологии. Нейроны в зрительной коре локализованы (то есть реагируют на раздражители только в определенных областях). Как показано на следующем рисунке: левое изображение — полное соединение, а правое — частичное соединение.
На изображении справа выше, если каждый нейрон связан только со значениями 10 × 10 пикселей, тогда весовые данные составляют 1 000 000 × 100 параметров, что уменьшается до 1/10 000 от исходного. А параметры 10×10, соответствующие значениям пикселей 10×10, фактически эквивалентны операции свертки.
3.2 Совместное использование параметров
Но на самом деле параметров в данном случае еще слишком много, то запускать артефакт второго уровня, то есть разделение веса. В приведенном выше локальном соединении каждому нейрону соответствует 100 параметров, всего 1 000 000 нейронов, если 100 параметров этих 1 000 000 нейронов равны, то количество параметров становится равным 100.
Как понять распределение веса? Мы можем думать об этих 100 параметрах (то есть об операции свертки) как о способе извлечения признаков, который не зависит от положения. Основной принцип заключается в том, что статистические свойства одной части изображения такие же, как и у других частей. Это также означает, что функции, которые мы изучаем в одной части, также могут использоваться в другой части, поэтому для всех позиций на этом изображении мы можем использовать одни и те же изученные функции.
Более интуитивно, когда небольшой блок случайным образом выбирается из изображения большого размера, скажем, 8x8 в качестве образца, и некоторые функции изучаются из этого небольшого образца, тогда мы можем использовать функции, извлеченные из этого образца 8x8, в качестве детектора, применяемого в любом месте. это изображение. В частности, мы можем свернуть исходное большое изображение с функциями, полученными из образцов 8x8, чтобы получить значение активации для другой функции в любом месте большого изображения.
Как показано на рисунке ниже, он показывает процесс свертки ядра свертки 3×3 на изображении 5×5. Каждая свертка — это метод выделения признаков, подобный решету, который отфильтровывает части изображения, соответствующие условиям (чем больше значение активации, тем лучше условия).
3.3 Множественные ядра свертки
Когда имеется только 100 параметров, как указано выше, это указывает на то, что существует только одно ядро свертки 10 × 10. Очевидно, что извлечения признаков недостаточно. Мы можем добавить несколько ядер свертки, например, 32 ядра свертки, которые могут изучать 32 вида ядра свертки. При наличии нескольких ядер свертки, как показано на следующем рисунке:
Справа на изображении выше разные цвета обозначают разные ядра свертки. Каждое ядро свертки генерирует изображение как другое изображение. Например, два ядра свертки могут генерировать два изображения, которые можно рассматривать как разные каналы изображения. Как показано на рисунке ниже, на рисунке ниже есть небольшая ошибка, то есть изменение w1 на w0 и w2 на w1. В дальнейшем они по-прежнему обозначаются как w1 и w2.
На рисунке ниже показана операция свертки на четырех каналах с двумя ядрами свертки, в результате чего получается два канала. Следует отметить, что каждый канал на четырех каналах соответствует ядру свертки, сначала игнорируйте w2, смотрите только на w1, затем значение в определенной позиции (i, j) w1 определяется четырьмя каналами (Результаты свертки в i, j) добавляются, а затем берется значение функции активации.
Следовательно, в процессе получения 2-х каналов путем свертки 4-х каналов на приведенном выше рисунке количество параметров равно 4×2×2×2, из которых 4 означает 4 канала, первые 2 означают генерацию 2 каналов и, наконец, 2×2 представляет собой размер ядра свертки.
3.4. Down-pooling
После получения признаков с помощью свертки следующим шагом будет использование этих признаков для классификации. Теоретически можно использовать все извлеченные функции для обучения классификатора, такого как классификатор softmax, но это сложно с вычислительной точки зрения.
Например: для изображения 96X96 пикселей, предполагая, что мы изучили 400 функций, определенных на входе 8X8, каждая функция и свертка изображения дадут (96 - 8 + 1) × (96 - 8 + 1) = 7921-мерные сверточные функции. , поскольку признаков 400, каждый пример (example) получит сверточный вектор признаков размерностью 7921 × 400 = 3 168 400. Изучение классификатора с более чем 3 миллионами входных признаков неудобно и склонно к переобучению.
Чтобы решить эту проблему, сначала вспомним, что мы решили использовать сверточные признаки, потому что изображения обладают свойством «статичности», а это означает, что признаки, полезные в одной области изображения, с большой вероятностью будут полезны в другой области изображения То же самое относится и к областям.
Поэтому для описания больших изображений естественной идеей является агрегирование статистики по признакам в разных местах, например, можно вычислить среднее (или максимум) определенного признака по области изображения. Эти сводные статистические признаки не только имеют гораздо меньшую размерность (по сравнению с использованием всех извлеченных признаков), но и улучшают результаты (менее подвержены переобучению). Эта агрегатная операция называется объединением в пул, иногда также называемым объединением по среднему значению или максимальным объединением (в зависимости от метода, используемого для вычисления объединения).
3.5 Многослойная свертка
В практических приложениях часто используется многослойная свертка, а затем для обучения используется полносвязный слой.Цель многослойной свертки состоит в том, что признаки, изученные слоем свертки, часто являются локальными.Чем больше количество слоев , тем больше фич узнали.глобальнее.
4. Описание алгоритма DQN
Чистый алгоритм Q-Learning использует таблицу для сохранения состояния.Количество состояний пикселей изображения 1000×1000 в основном близко к бесконечности.Поэтому CNN+Q-Learning является алгоритмом DQN.Алгоритм описывается следующим образом:
5. Используйте DQN для обучения игре «собери кирпичи».
Существует множество библиотек классов с открытым исходным кодом для глубокого обучения, наиболее известными из которых являются tensorlow и caffe. Здесь мы используем Tensorflow для обучения игре «Кирпичики».
Скриншоты игры выглядят следующим образом:
Поймай мяч, нажимая левую и правую кнопки мыши, чтобы управлять движением ползунка влево и вправо, если мяч коснется дна, игра окончена.
Основной код на питоне выглядит следующим образом (код самой игры опущен, здесь мы в основном сосредоточимся на коде алгоритма):
#Game的定义类,此处Game是什么不重要,只要提供执行Action的方法,获取当前游戏区域像素的方法即可
class Game(object):
def __init__(self): #Game初始化
# action是MOVE_STAY、MOVE_LEFT、MOVE_RIGHT
# ai控制棒子左右移动;返回游戏界面像素数和对应的奖励。(像素->奖励->强化棒子往奖励高的方向移动)
def step(self, action):
# learning_rate
LEARNING_RATE = 0.99
# 跟新梯度
INITIAL_EPSILON = 1.0
FINAL_EPSILON = 0.05
# 测试观测次数
EXPLORE = 500000
OBSERVE = 500
# 记忆经验大小
REPLAY_MEMORY = 500000
# 每次训练取出的记录数
BATCH = 100
# 输出层神经元数。代表3种操作-MOVE_STAY:[1, 0, 0] MOVE_LEFT:[0, 1, 0] MOVE_RIGHT:[0, 0, 1]
output = 3 # MOVE_STAY:[1, 0, 0] MOVE_LEFT:[0, 1, 0] MOVE_RIGHT:[0, 0, 1]
input_image = tf.placeholder("float", [None, 80, 100, 4]) # 游戏像素
action = tf.placeholder("float", [None, output]) # 操作
#定义CNN-卷积神经网络
def convolutional_neural_network(input_image):
weights = {'w_conv1':tf.Variable(tf.zeros([8, 8, 4, 32])),
'w_conv2':tf.Variable(tf.zeros([4, 4, 32, 64])),
'w_conv3':tf.Variable(tf.zeros([3, 3, 64, 64])),
'w_fc4':tf.Variable(tf.zeros([3456, 784])),
'w_out':tf.Variable(tf.zeros([784, output]))}
biases = {'b_conv1':tf.Variable(tf.zeros([32])),
'b_conv2':tf.Variable(tf.zeros([64])),
'b_conv3':tf.Variable(tf.zeros([64])),
'b_fc4':tf.Variable(tf.zeros([784])),
'b_out':tf.Variable(tf.zeros([output]))}
conv1 = tf.nn.relu(tf.nn.conv2d(input_image, weights['w_conv1'], strides = [1, 4, 4, 1], padding = "VALID") + biases['b_conv1'])
conv2 = tf.nn.relu(tf.nn.conv2d(conv1, weights['w_conv2'], strides = [1, 2, 2, 1], padding = "VALID") + biases['b_conv2'])
conv3 = tf.nn.relu(tf.nn.conv2d(conv2, weights['w_conv3'], strides = [1, 1, 1, 1], padding = "VALID") + biases['b_conv3'])
conv3_flat = tf.reshape(conv3, [-1, 3456])
fc4 = tf.nn.relu(tf.matmul(conv3_flat, weights['w_fc4']) + biases['b_fc4'])
output_layer = tf.matmul(fc4, weights['w_out']) + biases['b_out']
return output_layer
#训练神经网络
def train_neural_network(input_image):
predict_action = convolutional_neural_network(input_image)
argmax = tf.placeholder("float", [None, output])
gt = tf.placeholder("float", [None])
action = tf.reduce_sum(tf.mul(predict_action, argmax), reduction_indices = 1)
cost = tf.reduce_mean(tf.square(action - gt))
optimizer = tf.train.AdamOptimizer(1e-6).minimize(cost)
game = Game()
D = deque()
_, image = game.step(MOVE_STAY)
image = cv2.cvtColor(cv2.resize(image, (100, 80)), cv2.COLOR_BGR2GRAY)
ret, image = cv2.threshold(image, 1, 255, cv2.THRESH_BINARY)
input_image_data = np.stack((image, image, image, image), axis = 2)
#print ("IMG2:%s" %input_image_data)
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
saver = tf.train.Saver()
n = 0
epsilon = INITIAL_EPSILON
while True:
#print("InputImageData:", input_image_data)
action_t = predict_action.eval(feed_dict = {input_image : [input_image_data]})[0]
argmax_t = np.zeros([output], dtype=np.int)
if(random.random() <= INITIAL_EPSILON):
maxIndex = random.randrange(output)
else:
maxIndex = np.argmax(action_t)
argmax_t[maxIndex] = 1
if epsilon > FINAL_EPSILON:
epsilon -= (INITIAL_EPSILON - FINAL_EPSILON) / EXPLORE
reward, image = game.step(list(argmax_t))
image = cv2.cvtColor(cv2.resize(image, (100, 80)), cv2.COLOR_BGR2GRAY)
ret, image = cv2.threshold(image, 1, 255, cv2.THRESH_BINARY)
image = np.reshape(image, (80, 100, 1))
input_image_data1 = np.append(image, input_image_data[:, :, 0:3], axis = 2)
D.append((input_image_data, argmax_t, reward, input_image_data1))
if len(D) > REPLAY_MEMORY:
D.popleft()
if n > OBSERVE:
minibatch = random.sample(D, BATCH)
input_image_data_batch = [d[0] for d in minibatch]
argmax_batch = [d[1] for d in minibatch]
reward_batch = [d[2] for d in minibatch]
input_image_data1_batch = [d[3] for d in minibatch]
gt_batch = []
out_batch = predict_action.eval(feed_dict = {input_image : input_image_data1_batch})
for i in range(0, len(minibatch)):
gt_batch.append(reward_batch[i] + LEARNING_RATE * np.max(out_batch[i]))
print("gt_batch:", gt_batch, "argmax:", argmax_batch)
optimizer.run(feed_dict = {gt : gt_batch, argmax : argmax_batch, input_image : input_image_data_batch})
input_image_data = input_image_data1
n = n+1
print(n, "epsilon:", epsilon, " " ,"action:", maxIndex, " " ,"reward:", reward)
train_neural_network(input_image)
6. Резюме
Сказав это, я полагаю, что у вас уже есть общее представление об обучении с подкреплением. Следующим вопросом должно быть то, как применить эту технологию в нашей работе и позволить ей сыграть свою роль.
вопросы и ответы
Когда использовать определенный алгоритм обучения с подкреплением?
Связанное Чтение
Резюме обучения с подкреплением
Одна статья для изучения методов обучения с подкреплением на основе Монте-Карло.
Эта статья была разрешена автором для публикации в сообществе Tencent Cloud + Для получения дополнительных оригинальных текстов, пожалуйстанажмите
Найдите и подпишитесь на общедоступную учетную запись «Сообщество Yunjia», получите технические галантереи как можно скорее и ответьте на 1024 после подписки, чтобы отправить вам подарочный пакет технических курсов!
Огромный технический практический опыт, все вСообщество Юнцзя!