Машинное обучение и нейронные сети - страница 65

 

Основы Python — Часть 01


Основы Python — Часть 01

Я доктор Сопер, и сегодня я имею удовольствие представить первый из трех всеобъемлющих уроков по основам языка программирования Python. Хотя невозможно охватить все детали программирования на Python в нескольких видеороликах, к концу этих трех уроков вы получите достаточно знаний, чтобы понять и начать свое путешествие по программированию на Python.

На этих уроках мы будем использовать Jupyter Notebooks — мощный инструмент для интерактивного программирования и исследования данных. Если вы не знакомы с Jupyter Notebooks, я настоятельно рекомендую посмотреть предыдущее видео из этой серии, чтобы ознакомиться с этой средой, прежде чем погрузиться в программирование на Python.

Давайте начнем с обзора того, что вы узнаете на этом уроке. К концу этого видео вы получите знания о следующих аспектах Python:

  1. Отображение текста: мы узнаем, как использовать функцию print() для отображения текста на экране. Текст в Python заключен в одинарные кавычки, чтобы отличать его от команд программирования.

  2. Переменные. Переменные — это места хранения в памяти компьютера с символическими именами. Они содержат значения, которые можно изменить по мере необходимости. Мы рассмотрим, как создавать переменные и присваивать им значения, будь то текст, целые числа или числа с плавающей запятой.

  3. Арифметические операторы: Python предлагает различные арифметические операторы для выполнения математических операций над переменными. Мы рассмотрим сложение, вычитание, умножение, деление, возведение в степень и операции по модулю.

  4. Операторы сравнения. Операторы сравнения позволяют нам сравнивать два значения и определять их взаимосвязь. Мы узнаем о таких операторах, как «равно», «не равно», «больше», «меньше», «больше или равно» и «меньше или равно».

На протяжении всего урока мы будем использовать примеры и демонстрации, чтобы закрепить ваше понимание этих навыков и функций Python. Начнем с обсуждения того, как отображать текст в Python. Чтобы продемонстрировать строку текста, мы используем функцию print(). Текст, который мы хотим отобразить, передается в качестве аргумента функции print() в одинарных кавычках. Кроме того, мы можем включать разрывы строк, используя символ «\n». Комментарии, обозначенные знаком решетки (#), предназначены только для использования человеком и помогают объяснить разделы кода. Python игнорирует комментарии при выполнении кода.

Чтобы продемонстрировать эти методы, давайте рассмотрим ячейку кода в Jupyter Notebook. Ячейка кода использует функцию print() для отображения текста «Привет, меня зовут Дэн!» на экране. Другой пример демонстрирует использование «\n» для отображения нескольких строк текста в одном вызове функции print().

Переходя к переменным, они называются местами хранения в памяти компьютера. Переменные могут содержать данные любого типа. Чтобы создать новую переменную в Python, мы присваиваем ей значение, введя ее имя слева от знака равенства и значение справа. В ячейке кода мы можем объявить такие переменные, как «название_продукта» со значением «Вкусные начос», «количество проданных» со значением 33 и «цена за единицу» со значением 12,99. Затем мы можем распечатать значения этих переменных, используя функцию print() и конкатенацию.

В качестве альтернативы мы можем использовать функцию format() для достижения того же результата с заполнителями для значений переменных. Это упрощает процесс, позволяя нам определить желаемый выходной текст и указать позиции переменных в фигурных скобках. Для демонстрации арифметических операций мы используем такие символы, как «+» для сложения, «-» для вычитания, «*» для умножения, «/» для деления, «**» для возведения в степень и «%» для операции по модулю. Эти операторы выполняют математические вычисления над переменными.

Надеюсь, у вас у всех замечательный день. Меня зовут доктор Сопер, и сегодня я имею удовольствие представить первую часть серии из трех уроков по основам языка программирования Python. Теперь важно отметить, что я не смогу охватить каждую деталь программирования на Python всего в нескольких видеороликах. Однако к тому времени, когда вы закончите эти три урока, вы приобретете достаточно знаний, чтобы понять и начать работать с проектами Python.

На этих уроках я буду использовать Jupyter Notebook для выполнения всех примеров. Если вы не знакомы с Jupyter Notebooks, я настоятельно рекомендую посмотреть предыдущее видео из этой серии, прежде чем погрузиться в мир программирования на Python. Без дальнейших церемоний, давайте сделаем краткий обзор того, что вы узнаете в этом уроке.

К концу этого видео вы будете хорошо понимать следующие аспекты Python:

  1. Отображение текста
  2. Переменные
  3. Арифметические операторы
  4. Операторы сравнения

Мы подробно рассмотрим каждую из этих тем с большим количеством наглядных примеров и демонстраций, которые помогут вам понять концепции и функции языка программирования Python. Давайте начнем с изучения того, как отображать текст в Python. Чтобы отобразить строку текста в Python, мы используем функцию print(). Текст, который мы хотим отобразить, передается в качестве аргумента функции print(), заключенного в одинарные кавычки. В Python принято заключать текстовые строки в одинарные кавычки. Это помогает Python различать текстовые строки и другие текстовые команды программирования.

В приведенном ниже примере вы заметите строку, предшествующую функции print(), которая начинается со знака решетки (#). Эта строка называется комментарием. Комментарии предназначены только для использования человеком. Они помогают нам понять назначение определенного раздела кода и облегчают понимание нашего кода другими. Python игнорирует комментарии, считая их невыполнимыми операторами. Таким образом, они не влияют на функциональность кода. Если вы хотите включить разрыв строки в текстовый вывод, вы можете использовать управляющую последовательность \n (новая строка). Это вставит разрыв строки в этой точке.

Теперь давайте посмотрим на демонстрацию этих методов. В первой ячейке кода этой записной книжки у нас есть простой пример, в котором функция print() используется для отображения строки текста на экране. Когда вы нажимаете кнопку запуска, текст «Привет, меня зовут Дэн!» будет отображаться. В следующей ячейке кода мы будем использовать символ новой строки \n для отображения нескольких строк текста всего одним вызовом функции print(). После запуска кода Python выведет на экран обе строки текста. Теперь, когда мы рассмотрели отображение текста, давайте перейдем к переменным в Python.

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

В Python переменные могут содержать данные любого типа, такие как текст, целые числа или числа с плавающей точкой (числа с десятичными знаками). Чтобы создать новую переменную, вы просто присваиваете ей имя и значение. Давайте рассмотрим пару примеров, чтобы лучше понять концепцию. В первом примере мы объявляем переменную с именем «x» и присваиваем ей значение 33. Во втором примере мы объявляем переменную с именем «current_price» и присваиваем ей значение 42,99.

Обратите внимание, что значения, присвоенные переменным, могут быть числами, текстом или любым другим допустимым типом данных. После того, как мы присвоили значения переменным, мы можем использовать функцию print() для отображения их значений на экране. В третьем примере мы используем функцию print() для отображения значения переменной «x». То же самое делаем для переменной «current_price» в четвертом примере.

Вы можете видеть, что, печатая переменные, мы можем просматривать их значения и работать с ними по мере необходимости. В дополнение к прямой печати переменных есть еще один способ включить их в текстовый вывод. Мы можем использовать функцию format(), которая упрощает процесс объединения текста и значений переменных. В этом случае вы определяете желаемый выходной текст и указываете позиции переменных, используя фигурные скобки {} в качестве заполнителей. Внутри функции format() вы предоставляете переменные в желаемом порядке.

Давайте посмотрим на пример, чтобы увидеть это в действии.

В пятом примере у нас есть переменная с именем «product_name» со значением «Вкусные начос». Мы хотим отобразить сообщение, включающее название продукта. Определяем текст "Я люблю {}!" как желаемый результат, с {} в качестве заполнителя для значения переменной. Внутри функции format() мы предоставляем переменную «product_name». После запуска кода Python заменяет заполнитель значением переменной и выводит результат: «Я люблю вкусные начос!». Этот метод обеспечивает большую гибкость и динамический вывод текста, особенно при работе с несколькими переменными или более сложными сообщениями. Теперь, когда мы рассмотрели переменные, давайте перейдем к арифметическим операторам в Python.

Python предоставляет различные арифметические операторы, которые позволяют нам выполнять математические операции над переменными.

Наиболее часто используемые арифметические операторы:

  • Дополнение: +
  • Вычитание: -
  • Умножение: *
  • Разделение: /
  • Возведение в степень: **
  • Модуль: %

Эти операторы можно использовать с числовыми переменными для выполнения вычислений.

В следующем примере мы будем использовать две переменные, «a» и «b», чтобы продемонстрировать некоторые из этих арифметических операторов.

Сначала мы объявляем переменную с именем «a» и присваиваем ей значение 5. Затем мы объявляем другую переменную с именем «b» и присваиваем ей выражение «a + 2». Выражение «a + 2» добавляет значение «a» (которое равно 5) к 2, в результате чего значение «b» равно 7. Затем мы можем использовать функцию print() для отображения значений «a». и "б" на экране.

После запуска кода Python оценит выражение и отобразит значения «a» и «b», равные 5 и 7 соответственно.

Помимо сложения, мы можем использовать оператор вычитания (-) для вычитания значений, оператор умножения (*) для умножения значений, оператор деления (/) для деления значений, оператор возведения в степень (**) для возведения значений в мощность и оператор по модулю (%) для вычисления остатка от операции деления. Эти арифметические операторы можно комбинировать и использовать различными способами для выполнения сложных вычислений.

Наконец, давайте кратко обсудим операторы сравнения в Python. Операторы сравнения позволяют сравнивать два значения и определять их взаимосвязь.

Наиболее часто используемые операторы сравнения:

  • Равно: ==
  • Не равно: !=
  • Больше, чем: >
  • Меньше чем: <
  • Больше или равно: >=
  • Меньше или равно: <=

При использовании эти операторы возвращают логическое значение True или False, указывающее результат сравнения.

Например, выражение a == b возвращает True, если значение «a» равно значению «b», и False в противном случае. В следующем примере мы сравним значения двух переменных, «a» и «b», используя разные операторы сравнения. Мы будем использовать функцию print() для отображения результатов этих сравнений на экране. После запуска кода Python оценит каждое выражение сравнения и отобразит соответствующее логическое значение. Вы можете видеть, что вывод показывает результат каждого сравнения: True или False.

Операторы сравнения полезны для условного выполнения различных частей кода на основе отношений между переменными.

На этом мы завершаем наш первый урок по основам программирования на Python. В этом уроке мы рассмотрели:

  • Отображение текста с помощью функции print()
  • Объявление и использование переменных
  • Выполнение математических вычислений с помощью арифметических операторов
  • Сравнение значений с помощью операторов сравнения

Я надеюсь, что этот урок дал вам прочную основу для программирования на Python. На следующем уроке мы углубимся в типы данных, включая строки, целые числа и числа с плавающей запятой.

Если у вас есть какие-либо вопросы или вам нужны дополнительные разъяснения по любой из затронутых тем, пожалуйста, не стесняйтесь спрашивать. Спасибо за просмотр, увидимся на следующем уроке!

 

Основы Python — часть 02



Основы Python — часть 02

Я доктор Сопер, и сегодня я имею удовольствие представить вторую часть нашей серии из трех статей об основах языка программирования Python.

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

Теперь давайте уделим немного времени краткому обзору того, что вы можете узнать на этом уроке.

К концу этого видео вы получите знания о следующих аспектах Python:

  1. Списки
  2. Массивы NumPy
  3. Операторы if
  4. Логические операторы

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

Начнем с обсуждения списков в Python.

В Python список — это просто именованная коллекция элементов. Эти элементы могут быть любого типа, включая числа, текст, переменные, объекты и даже другие списки! Если список содержит другие списки в качестве своих элементов, он называется многомерным списком.

Для иллюстрации рассмотрим пару примеров. В первом примере мы создаем список с именем «int list» и присваиваем его элементам значения -3, 7, 4, 0, -2 и 342. Вы можете представить простой одномерный список в виде вектора. Python идентифицирует список по его квадратным скобкам. Чтобы присвоить значения элементам списка, мы разделяем их запятыми внутри квадратных скобок. Помните, списки могут содержать элементы любого типа данных.

Во втором примере мы объявляем список планет и присваиваем его элементам имена всех известных планет нашей Солнечной системы. Стоит отметить, что в 2006 году Международный астрономический союз понизил Плутон до статуса «карликовой планеты», поэтому он не включен в этот список. Переходя к третьему примеру, мы объявляем двумерный список. Другими словами, элементы этого списка также являются списками. Вы можете думать об этом как о матрице 2x3 с двумя строками и тремя столбцами.

Теперь давайте рассмотрим несколько демонстраций, где списки объявляются и используются в Python. В первой ячейке кода мы просто объявляем три списка, которые мы обсуждали ранее. Когда мы запускаем эту ячейку, вывод не будет отображаться, потому что мы просто инструктируем Python создать эти три списка и сохранить их в памяти компьютера. В следующей ячейке кода мы рассмотрим, как получить доступ к определенным значениям в списке. Однако, прежде чем мы продолжим, важно понять индексацию в Python.

Python использует систему индексации с отсчетом от нуля. Это означает, что при работе с коллекциями, такими как списки или массивы, первый элемент имеет индекс, равный нулю, второй элемент имеет индекс, равный единице, и так далее. Чтобы проиллюстрировать это, давайте рассмотрим наш «int list» в качестве примера. Этот список содержит шесть значений. Если мы хотим получить доступ, скажем, к пятому элементу в списке, этот элемент будет иметь индекс 4.

Усвоив эту систему индексации с отсчетом от нуля, следующая ячейка кода просто печатает название третьей планеты в списке «планет», в данном случае это «Земля». Поскольку это третий элемент в списке, он должен располагаться в индексной позиции 2. Давайте нажмем кнопку запуска, чтобы убедиться, что результат соответствует ожидаемому, и подтвердим, что Земля действительно является третьим камнем от солнца.

Двигаясь дальше, давайте углубимся в нашу следующую тему этого урока: массивы NumPy в Python. Теперь давайте перейдем к нашей следующей теме этого урока: операторам if и логическим операторам. Python предоставляет нам возможность использовать условные операторы с операторами if. Оператор if позволяет нам выполнять различные блоки кода в зависимости от того, истинно или ложно определенное условие. Кроме того, Python также предоставляет логические операторы, которые позволяют нам объединять несколько условий вместе.

В первом примере у нас есть простая структура if-else, которая проверяет, меньше ли переменная с именем «x» 10. Если условие истинно, на экран выводится «x меньше 10». В противном случае, если условие ложно, печатается «x больше или равно 10». Оператор else используется для указания кода, который должен выполняться, когда условие в операторе if ложно.

Мы можем расширить эту структуру, чтобы обрабатывать несколько возможностей, используя структуру if-elif-else. Во втором примере мы вводим дополнительное условие, проверяя, меньше ли возраст человека 13 лет. В зависимости от возраста человека код определяет, является ли человек ребенком, подростком или взрослым. Оператор elif позволяет нам проверить наличие дополнительных условий, прежде чем вернуться к оператору else, если ни одно из условий не выполняется.

Давайте посмотрим на некоторые демонстрации этих операторов if и логических операторов в действии в нашем блокноте Jupyter.

В первой ячейке кода мы объявляем переменную с именем «x» и устанавливаем ее значение. Затем мы используем структуру if-else для вывода определенного сообщения в зависимости от того, меньше ли «x» 10. Давайте запустим ячейку кода и посмотрим на вывод. Поскольку значение «x» в настоящее время равно 10, Python выводит на экран «x больше или равно 10». Если мы изменим значение «x» на -7 и снова запустим ячейку кода, мы получим другой результат. После изменения значения «x» на -7 Python теперь печатает «x меньше 10».

В следующей ячейке кода мы реализуем структуру if-elif-else, чтобы определить, является ли человек ребенком, подростком или взрослым в зависимости от его возраста. Давайте запустим ячейку и посмотрим, что произойдет. Как и ожидалось, Python печатает «ребенок», потому что значение переменной «возраст» в настоящее время установлено на 5. Если мы изменим значение «возраст» и повторно запустим ячейку кода, мы получим разные результаты в зависимости от возраста человека. Переходя к следующей теме, давайте обсудим логические операторы в Python. Python предоставляет три логических оператора: «и», «или» и «не». Эти операторы позволяют нам тестировать несколько условий одновременно.

В первом примере мы показываем, как использовать операторы «и» и «или», чтобы определить, являются ли две переменные, «х» и «у», положительными. Оператор if проверяет, положительны ли и x, и y. Если хотя бы одно из условий ложно, код переходит к оператору elif, который проверяет, положительно ли значение «x» или «y». Если ни 'x', ни 'y' не являются положительными, выполняется оператор else.

Во втором примере мы вводим оператор «не», который используется для обращения или инвертирования результата сравнения. Проверяем, не меньше ли возраст человека 13 лет. Если человеку не меньше 13 лет, то ему должно быть не меньше 13 лет, а значит, он не ребенок. В противном случае они считаются детьми.

Давайте посмотрим на некоторые демонстрации использования этих логических операторов в Python.

В первой ячейке кода мы используем логические операторы «и» и «или», чтобы определить, являются ли «х» и «у» положительными. Мы установили «x» на 5 и «y» на -2. Давайте запустим ячейку и посмотрим на результат. Поскольку «у» отрицательно, условие для оператора «и» ложно. Однако условие для оператора «или» верно, потому что «х» положителен. Таким образом, код выводит на экран «x положительный». Теперь давайте изменим значение «x» на -3 и снова запустим ячейку кода. На этот раз оба условия для операторов «и» и «или» ложны, поэтому код переходит к оператору else и печатает «x и y не положительны».

В следующей ячейке кода мы используем оператор «не», чтобы проверить, не является ли человек ребенком на основе его возраста. Мы установили для переменной «возраст» значение 10, что означает, что человек считается ребенком. Давайте запустим ячейку кода и посмотрим на результат. Поскольку возраст человека меньше 13 лет, условие для оператора «не» ложно, и код выводит на экран «Ребенок».

Теперь измените значение «возраст» на 18 и повторно запустите ячейку кода. На этот раз возраст человека не менее 13 лет, поэтому условие для оператора «не» выполняется, и код выводит «Не ребенок». На этом мы завершаем наш урок о списках, массивах NumPy, операторах if и логических операторах в Python. Я надеюсь, что вы нашли эту информацию полезной и она поможет вам в вашем путешествии по программированию на Python.

В следующей и последней части этой серии мы рассмотрим более сложные темы, включая циклы, функции и работу с файлами. Итак, следите за обновлениями!

Спасибо за внимание, и до встречи на следующем уроке!

 

Основы Python — часть 03



Основы Python — часть 03

Надеюсь, у вас все хорошо. Это доктор Сопер, и я рад вернуться к вам на наш третий урок по основам языка программирования Python. На сегодняшнем занятии мы углубимся в Python и рассмотрим некоторые ключевые концепции, которые улучшат ваше понимание и навыки.

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

Теперь давайте на минутку обсудим, чему вы можете научиться на этом уроке. К концу этого занятия вы будете иметь полное представление о следующих аспектах Python:

  1. петли «для»
  2. циклы "пока"
  3. Функции
  4. Классы
  5. Объекты

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

Давайте начнем с погружения в мир циклов for и while в Python.

В общем, циклы позволяют нам многократно выполнять набор инструкций. Python предоставляет два типа циклов: циклы for и циклы while. Основное различие между ними заключается в том, что циклы for выполняются определенное количество раз, а циклы while продолжают выполняться до тех пор, пока не будет выполнено определенное условие.

Давайте начнем с примера цикла «for», который печатает первые 10 натуральных чисел, которые являются целыми числами в диапазоне от 1 до 10. Чтобы создать цикл «for», мы используем ключевое слово «for», за которым следует имя переменной. В этом случае мы будем использовать переменную «x». По мере повторения цикла «for» переменной «x» будет присваиваться другое значение для каждой итерации. Затем мы указываем набор элементов, которые будут итеративно присваиваться переменной, после чего ставится двоеточие. В этом конкретном примере мы создаем набор элементов, используя функцию «диапазон» Python. Функция «диапазон» возвращает диапазон чисел между нижней и верхней границами. Примечательно, что нижняя граница является инклюзивной, а верхняя — исключающей. Поэтому диапазон чисел в этом примере будет от 1 до 10.

Во время первой итерации цикла значение «x» будет равно 1. Впоследствии «x» будет присвоено значение 2 во время второй итерации, и так далее, пока не будет достигнуто значение 10. Любые строки кода с отступом, следующие за «for», Оператор будет выполняться при каждой итерации цикла. В этом примере мы просто печатаем значение «x», в результате чего отображаются числа от 1 до 10.

Теперь давайте рассмотрим другой цикл for, выводящий названия планет. В этом случае мы будем использовать имя переменной «планета» для управления циклом и будем перебирать список планет. По мере выполнения цикла переменной «планета» будет присваиваться имя каждой планеты одно за другим, что позволит нам напечатать имя каждой планеты в списке.

Двигаясь дальше, давайте обсудим вложенные циклы в Python. Во вложенных циклах один цикл (известный как внутренний цикл) выполняется внутри другого цикла (известного как внешний цикл). Внутренний цикл будет выполняться один раз для каждой итерации внешнего цикла. Например, рассмотрим сценарий, в котором внешний цикл заполняет переменную с именем «строка» целыми числами в диапазоне от 0 до 1, а внутренний цикл заполняет переменную с именем «столбец» целыми числами в диапазоне от 0 до 2. Эти числа соответствуют строке и индексы столбцов двумерного массива NumPy. По мере выполнения вложенного цикла он сначала печатает значения всех элементов в первой строке массива, а затем переходит ко второй строке.

Наконец, давайте рассмотрим цикл while. В этом типе цикла мы полагаемся на управляющую переменную, такую как «x», для которой изначально установлено определенное значение. Цикл будет продолжать выполняться до тех пор, пока значение «x» удовлетворяет определенному условию. Например, мы можем инициализировать «x» равным 1, и цикл будет продолжать работать до тех пор, пока «x» остается ниже 10. На каждой итерации значение «x» будет обновляться, что позволяет нам выполнять определенные действия в пределах цикл до тех пор, пока условие больше не будет выполняться.

На этом мы завершаем обзор циклов for и while в Python. В следующем сегменте мы рассмотрим функции — фундаментальную концепцию программирования, позволяющую эффективно организовывать и повторно использовать код.

 

Основы обучения с подкреплением


Основы обучения с подкреплением

Я доктор Сопер, и сегодня я буду обсуждать основы обучения с подкреплением, которое является важной областью в более широкой области искусственного интеллекта. Прежде чем мы углубимся в основы обучения с подкреплением, давайте рассмотрим, что вы узнаете на этом уроке.

К концу этого видео вы будете иметь четкое представление о следующем:

  1. Что такое обучение с подкреплением.
  2. Пять принципов, лежащих в основе искусственного интеллекта, основанного на обучении с подкреплением: а. Система ввода и вывода. б. Награды. в. Окружающая среда. д. Марковские процессы принятия решений. е. Обучение и вывод.

Как только мы поймем эти концепции, мы будем полностью готовы к созданию реальных моделей ИИ. Итак, не будем терять время и приступим!

Во-первых, давайте рассмотрим, что подразумевается под «обучением с подкреплением». Наряду с обучением с учителем и обучением без учителя обучение с подкреплением является одной из трех основных парадигм машинного обучения.

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

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

В контексте обучения с подкреплением входные данные называются «состояниями», представляющими состояние окружающей среды. Выходные данные называются «действиями», отвечая на вопрос «Что мне делать дальше?» Целью обучения с подкреплением является определение оптимальной политики, которая направляет действия в каждом состоянии.

Идем дальше, давайте поговорим о наградах. Вознаграждения играют решающую роль во всех системах искусственного интеллекта и когнитивных вычислений. Они действуют как метрики, которые информируют систему о ее производительности. Функции вознаграждения могут быть разработаны для максимизации прибыли или минимизации потерь в зависимости от решаемой проблемы. Считается, что немедленные и накопительные вознаграждения максимизируют общее накопленное вознаграждение с течением времени.

Третий принцип - это среда, которая относится к обстановке или среде, в которой работает система обучения с подкреплением. Среда предоставляет информацию о состояниях и наградах. Он также определяет правила игры, определяя, какие действия возможны в любой момент времени. Изначально система ничего не знает о последствиях своих действий и должна экспериментировать, чтобы учиться.

Далее у нас есть марковские процессы принятия решений (MDP). Названные в честь математика Андрея Андреевича Маркова, MDP обеспечивают математическую основу для моделирования принятия решений, когда результаты частично случайны, а частично находятся под контролем лица, принимающего решения. При обучении с подкреплением система ИИ выступает в роли лица, принимающего решения в окружающей среде. MDP включают дискретные единицы времени, и система переходит из одного состояния в другое на основе наблюдений, действий, вознаграждений и последующих состояний.

Наконец, у нас есть режим обучения и режим вывода. Системы обучения с подкреплением проходят две фазы: обучение и вывод. В режиме обучения система обучается и стремится определить оптимальную политику посредством нескольких циклов обучения. Он обновляет свою политику на основе полученных знаний. В режиме логического вывода система полностью обучена и развертывается для выполнения своей задачи с использованием изученной политики без дальнейших обновлений.

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

Эти видеоролики обеспечат практический опыт создания моделей ИИ с использованием Python. Надеюсь, вы присоединитесь ко мне в этих захватывающих приключениях в области когнитивных вычислений и искусственного интеллекта!

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

 

Обучение с подкреплением: выборка Томпсона и проблема многорукого бандита - часть 01



Обучение с подкреплением: выборка Томпсона и проблема многорукого бандита - часть 01

Я доктор Сопер, и я с удовольствием представляю вам первую часть нашего всеобъемлющего урока по обучению с подкреплением, уделяя особое внимание выборке Томпсона и известной задаче о многоруком бандите.

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

Чтобы дать краткий обзор того, что вы можете узнать на этом уроке, позвольте мне выделить ключевые моменты:

  1. Мы начнем с понимания того, что влечет за собой проблема многорукого бандита.
  2. Мы исследуем, почему проблема многорукого бандита так важна.
  3. Далее мы представим выборку Томпсона и ее отношение к этой проблеме.
  4. Наконец, мы раскроем внутреннюю работу Thompson Sampling и то, как она эффективно решает дилемму разведки-эксплуатации.

Предстоящее путешествие обещает быть поучительным, поскольку мы раскрываем различные приложения и последствия проблем с многорукими бандитами. Итак, без лишних слов, давайте начнем наше исследование!

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

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

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

Название «Задача многорукого бандита» происходит от аналогии с азартными играми. Представьте себе игрока, стоящего перед рядом игровых автоматов и пытающегося определить тот, который максимизирует его шансы на выигрыш. Игровые автоматы — это азартные игры, обычно встречающиеся в казино, где игроки вносят деньги и участвуют в ходах. Если удача благоволит игроку, автомат выдает денежное вознаграждение, которое, как надеется игрок, превысит его первоначальные вложения.

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

Дилемма исследования и эксплуатации вращается вокруг определения того, сколько раз игрок должен играть на каждом автомате. Если игрок обнаруживает автомат, который, как кажется, предлагает частые вознаграждения, должен ли он продолжать играть на этом конкретном автомате (эксплуатация) или рисковать потенциальными потерями, пробуя другие автоматы в надежде найти еще более выгодный вариант (исследование)?

Теперь вы можете задаться вопросом, почему проблема многорукого бандита имеет такое большое значение. Что ж, правда в том, что проблемы с многорукими бандитами вездесущи в реальном мире, проникая как в нашу повседневную жизнь, так и в бизнес-среду.

Подумайте о выборе, с которым вы сталкиваетесь в своей личной жизни. Например, решить, стоит ли посетить ваш любимый ресторан еще раз в пятницу вечером или посетить новое заведение, в котором вы раньше не были. Точно так же представьте, что у вас есть несколько интригующих сериалов, доступных для потоковой передачи, но ограниченное свободное время для их просмотра. Как вы определяете, в какое шоу инвестировать свое время?

Выборка Томпсона — это популярный алгоритм, используемый для решения дилеммы разведка-эксплуатация в задаче о многоруком бандите. Он обеспечивает принципиальный подход к балансированию между разведкой и эксплуатацией путем использования байесовского вывода.

Основная идея, стоящая за Thompson Sampling, состоит в том, чтобы поддерживать убеждение или распределение вероятностей об истинных базовых вероятностях вознаграждения каждого варианта (руки) в задаче о бандитах. Это убеждение обновляется на основе наблюдаемых вознаграждений от предыдущих взаимодействий с руками.

Thompson Sampling использует вероятностный подход к принятию решений. Вместо того, чтобы строго выбирать руку с наивысшим ожидаемым вознаграждением (эксплуатацией) или случайным образом исследовать руки, он выбирает руку из распределения убеждений таким образом, чтобы уравновесить исследование и эксплуатацию.

Давайте пройдемся по шагам алгоритма выборки Томпсона:

  1. Инициализация: начните с инициализации распределения убеждений для каждой руки. Это распределение представляет собой неопределенность относительно истинной вероятности вознаграждения для каждой руки. Как правило, бета-распределение используется в качестве априорного распределения, поскольку оно сопряжено с биномиальным распределением, обычно используемым для моделирования вознаграждений в задачах о бандитах.

  2. Выборка: для каждого раунда взаимодействия выберите вероятность вознаграждения из распределения убеждений для каждой руки. Этот шаг включает в себя исследование путем рассмотрения рук с более высокой неопределенностью в их вероятностях вознаграждения.

  3. Выбор: выберите руку с наибольшей выборочной вероятностью вознаграждения. Этот шаг включает в себя эксплуатацию, отдавая предпочтение рукам, которые, вероятно, будут иметь более высокие ожидаемые вознаграждения, основанные на распределении убеждений.

  4. Обновление: наблюдайте за вознаграждением от выбранной руки и обновляйте распределение убеждений для этой руки на основе байесовского вывода. Этот шаг обновляет апостериорное распределение, используя предварительное распределение и наблюдаемое вознаграждение.

Путем неоднократной выборки, отбора и обновления Thompson Sampling адаптирует свое распределение убеждений на основе наблюдаемых вознаграждений, постепенно улучшая выбор оружия с течением времени.

Thompson Sampling зарекомендовал себя как эффективный алгоритм решения дилеммы разведка-эксплуатация в различных приложениях. Он широко используется в онлайн-рекламе, клинических испытаниях, системах рекомендаций и во многих других областях, где требуется последовательное принятие решений в условиях неопределенности.

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

В заключение, Thompson Sampling предлагает элегантное решение проблемы многорукого бандита, уравновешивая разведку и эксплуатацию с помощью байесовского вывода. Его способность адаптироваться к изменяющимся вероятностям вознаграждения и его широкое применение делают его ценным инструментом обучения с подкреплением и принятия решений.

В следующей части нашего урока мы углубимся в математические основы Thompson Sampling и изучим его гарантии производительности. Оставайтесь с нами для захватывающего путешествия в тонкости этого мощного алгоритма!

 

Обучение с подкреплением: выборка Томпсона и проблема многорукого бандита - часть 02



Обучение с подкреплением: выборка Томпсона и проблема многорукого бандита - часть 02

Я доктор Сопер, и я здесь, чтобы представить вторую часть нашего урока по обучению с подкреплением в контексте выборки Томпсона и знаменитой задачи о многоруком бандите.

В предыдущем видео этой серии мы получили представление о проблеме многорукого бандита и о том, как можно использовать выборку Томпсона для ее решения.

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

Сегодня мы сосредоточимся на внедрении системы искусственного интеллекта, основанной на обучении с подкреплением, которая использует выборку Томпсона для решения реальной проблемы многорукого бандита. Для этого мы переключимся на Python и начнем! Для начала давайте кратко рассмотрим сценарий, с которым мы будем работать. Представьте, что вы находитесь в казино с 1000 долларов, чтобы играть в игровые автоматы. Доступно шесть игровых автоматов, и каждый ход стоит 1 доллар. Коэффициент конверсии, который представляет собой вероятность выигрыша в любой конкретный ход, варьируется в зависимости от автоматов и вам неизвестен.

Ваша цель — максимально увеличить свои шансы на выигрыш, как можно быстрее определив игровой автомат с самым высоким коэффициентом конверсии.

В нашей реализации Python мы начнем с импорта необходимых библиотек. К счастью, для этого проекта нам нужно только импортировать numpy. Далее мы определим среду. Определение среды является важным шагом в любом проекте обучения с подкреплением. Здесь мы начнем с указания общего количества ходов, которые мы будем играть в игровые автоматы. Поскольку у нас есть 1000 долларов, а каждый ход стоит 1 доллар, всего у нас будет 1000 ходов.

Нам также необходимо определить общее количество игровых автоматов, которых в данном случае шесть. Кроме того, мы создадим массивы для отслеживания наших выигрышей и проигрышей для каждого игрового автомата. Эти массивы будут служить параметрами формы для бета-распределения, как обсуждалось в предыдущем уроке. Кроме того, мы установим начальное значение для генератора случайных чисел, чтобы обеспечить воспроизводимость наших результатов.

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

На следующем шаге мы создадим первичный набор данных. Этот набор данных будет матрицей с одной строкой для каждого хода и одним столбцом для каждого игрового автомата. В этом случае наш набор данных будет иметь 1000 строк и 6 столбцов, представляющих 1000 ходов и 6 возможных игровых автоматов. Каждая запись в матрице будет указывать результат игры на конкретном игровом автомате на определенном ходу, где «1» означает выигрыш, а «0» — проигрыш.

Для создания набора данных мы будем использовать вложенные циклы for. После создания набора данных мы напечатаем первые 15 строк, чтобы понять его структуру.

Запуск ячейки кода отобразит матрицу, заполненную единицами и нулями, представляющими выигрыши и проигрыши соответственно. Каждая строка соответствует ходу, а каждый столбец соответствует игровому автомату. Например, в первый ход игра на любом игровом автомате приведет к проигрышу. Набор данных позволяет нам понять результаты, если бы мы играли на определенном игровом автомате на данном ходу.

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

Теперь пришло время смоделировать игру на игровых автоматах 1000 раз, соблюдая ограничение, заключающееся в том, чтобы играть только на одном автомате за ход.

Используя вложенные циклы «for», с внешним циклом, повторяющимся через каждый ход, и внутренним циклом, повторяющимся через каждый игровой автомат, мы проведем симуляцию. В начале каждого хода мы будем устанавливать для переменной «max_beta» значение -1. Эта переменная поможет нам отслеживать наибольшее значение бета, наблюдаемое для текущего хода.

Для каждого игрового автомата мы возьмем случайное значение из бета-распределения автомата, где форма распределения определяется количеством выигрышей и проигрышей, накопленных при игре на этом конкретном автомате. Мы сравним бета-значение текущего игрового автомата с наибольшим бета-значением, наблюдаемым до сих пор в текущем раунде. Если он больше, мы обновим переменную index_of_machine_to_play, указав индекс текущего игрового автомата.

После изучения бета-значений всех шести игровых автоматов переменная index_of_machine_to_play будет хранить индекс автомата с самым высоким бета-значением для текущего хода. Затем мы будем играть на выбранном игровом автомате, просматривая результат в нашем наборе данных и записывая, был ли это выигрыш или проигрыш, увеличивая соответствующий элемент в массиве «number_of_positive_rewards» или «number_of_negative_rewards».

Этот процесс будет продолжаться до тех пор, пока мы не завершим все 1000 раундов. Наша система искусственного интеллекта будет постоянно учиться у окружающей среды в каждом раунде, используя накопленные знания, чтобы выбирать между разведкой и эксплуатацией. Как только все 1000 раундов будут завершены, мы рассчитаем общее количество раз, когда наш ИИ-агент играл в каждый игровой автомат, и выведем результаты на экран.

Запустив ячейку кода, вы увидите, сколько раз был сыгран каждый игровой автомат. Как видите, наша система искусственного интеллекта, основанная на обучении с подкреплением, успешно определила игровой автомат 4 как имеющий наибольшую вероятность выигрыша. Он решил сыграть на этой машине на 695 из 1000 ходов, пытаясь максимизировать свои совокупные вознаграждения.

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

Запуск ячейки кода покажет сравнение между методом выборки Томпсона и методом случайной выборки. Как видите, метод выборки Томпсона привел к значительно большему количеству выигрышей по сравнению с наивным методом случайной выборки. Таким образом, нашему игроку будет разумно использовать Thompson Sampling!

В этом уроке мы применили знания, полученные в нашей серии, для решения реальной проблемы принятия решений. В частности, мы успешно создали полную систему искусственного интеллекта на основе обучения с подкреплением на Python, которая использует выборку Томпсона для решения реальной проблемы многорукого бандита.

Я надеюсь, что на этом этапе нашей серии вы начинаете понимать полезность инструментов ИИ для поддержки принятия решений. Вы также можете представить умное и инновационное применение этих технологий для решения других реальных проблем.

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

На этом завершается вторая часть нашего урока по обучению с подкреплением в контексте выборки Томпсона и знаменитой задачи о многоруком бандите. Надеюсь, вам был интересен этот урок, и до следующего раза, хорошего дня!

 

Система искусственного интеллекта на основе обучения для максимизации прибыли на Python



Система искусственного интеллекта на основе обучения для максимизации прибыли на Python

Всем добрый день! Говорит доктор Соупер. Сегодня мы рассмотрим всеобъемлющий пример на Python, который демонстрирует, как система искусственного интеллекта на основе обучения с подкреплением может эффективно максимизировать корпоративную прибыль в сложном сценарии, включающем несколько вариантов и миллионы клиентов.

Методы, показанные в этом видео, были представлены и широко обсуждались в предыдущих уроках этой серии. Если у вас не было возможности посмотреть эти предыдущие видео, я настоятельно рекомендую сделать это, прежде чем переходить к этому.

Прежде чем мы углубимся в кодирование на Python, давайте обсудим бизнес-задачу, которую мы стремимся решить в этом видео, используя систему искусственного интеллекта, основанную на обучении с подкреплением выборки Томпсона.

Представьте, что вы работаете в беспроводной компании, которая может похвастаться 10 миллионами клиентов. Компания решила увеличить свою прибыль, запустив программу обновления смартфонов. Чтобы побудить клиентов обновить свои смартфоны, маркетинговая команда компании разработала восемь отдельных рекламных кампаний. Каждая кампания предлагает клиентам определенные функции, акции или скидки. Однако средняя прибыль от каждой кампании будет разной, поскольку соответствующие функции, рекламные акции и скидки влекут за собой различные затраты для компании. Хотя компания может рассчитать стоимость и прибыль на продажу для каждой рекламной кампании, остается неясным, насколько эффективной будет каждая кампания. Некоторые кампании могут оказаться очень эффективными, тогда как другие не принесут значительных результатов.

Наша цель — создать систему искусственного интеллекта, которая сможет максимизировать прибыль компании от программы обновления смартфонов. Важно отметить, что наша цель состоит не только в том, чтобы максимально увеличить количество клиентов, участвующих в программе. Вместо этого мы стремимся оптимизировать прибыль, которая зависит не только от количества клиентов, охваченных каждой рекламной кампанией, но и от эффективности каждой кампании в увеличении продаж и средней прибыли на продажу. Имея четкое представление о бизнес-задаче, давайте переключимся на Python и приступим к реализации.

Прежде чем описывать код в этом блокноте, хочу сообщить, что ссылка на этот блокнот доступна в описании к видео. Не стесняйтесь загружать копию блокнота, чтобы поэкспериментировать с ним или адаптировать его к вашим конкретным требованиям. Как обычно, мы начинаем с импорта необходимых библиотек Python. Для этого проекта нам потребуются две библиотеки: NumPy, которую мы будем использовать для генерации случайных значений из различных вероятностных распределений, и локаль, которую мы будем использовать для соответствующего форматирования денежных значений. Поскольку наша цель — максимизировать прибыль, в этом проекте мы будем активно работать с денежными значениями. Установка нашего текущего языкового стандарта на Соединенные Штаты гарантирует, что Python форматирует значения валюты в доллары США и использует запятые для разделения больших чисел. Если вы предпочитаете другое форматирование валюты, не стесняйтесь соответствующим образом изменить локаль.

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

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

Как вы можете заметить, каждый объект кампании инициализируется предоставлением уникального идентификатора кампании. Функция __init__ впоследствии присваивает кампании случайный коэффициент конверсии от 1% до 20%, используя NumPy для извлечения случайного значения из равномерного распределения вероятностей. Коэффициент конверсии означает процент клиентов, которые захотят обновить свои смартфоны, если им будет показана конкретная рекламная кампания. Стоит отметить, что беспроводной компании не хватает этой информации. Мы также используем NumPy для определения случайной прибыли за успешную продажу в диапазоне от 100 до 200 долларов для каждой кампании. Хотя мы назначаем эти значения прибыли случайным образом, в равной степени можно использовать конкретные значения, предоставленные беспроводной компанией для каждой рекламной кампании. Наконец, класс включает метод get_profit(), который возвращает прибыль за успешную продажу кампании.

Вот код для класса Campaign:

import numpy as np

class Campaign:
    def __init__( self , campaign_id):
         self .campaign_id = campaign_id
         self .conversion_rate = np.random.uniform( 0.01 , 0.20 )
         self .profit_per_sale = np.random.uniform( 100 , 200 )
    
    def get_profit( self ):
         return self .profit_per_sale

Теперь, когда мы определили класс Campaign, мы можем приступить к реализации алгоритма обучения с подкреплением на основе выборки Томпсона. Мы создадим класс ThompsonSampling, который будет инкапсулировать алгоритм.

Класс ThompsonSampling будет иметь следующие атрибуты и методы: num_campaigns: количество рекламных кампаний.

  • кампании: список объектов Campaign, представляющих доступные рекламные кампании.
  • total_sales: список для отслеживания общего количества продаж для каждой кампании.
  • total_profits: список для отслеживания общей прибыли по каждой кампании.
  • num_trials: общее количество испытаний или итераций в алгоритме выборки Томпсона.
  • пробные_результаты: список для хранения результатов каждого испытания, т. е. выбранной кампании и полученной прибыли.

Методы класса ThompsonSampling следующие:

  • initialize_campaigns(): инициализирует список объектов Campaign указанным количеством кампаний.
  • select_campaign(): реализует алгоритм выборки Томпсона для выбора кампании для каждого испытания.
  • update_statistics(): обновляет общий объем продаж и прибыль на основе выбранной кампании и полученной прибыли.
  • run_trials(): запускает указанное количество испытаний и записывает результаты.

Вот код класса ThompsonSampling:

 class ThompsonSampling:
    def __init__( self , num_campaigns, num_trials):
         self .num_campaigns = num_campaigns
         self .campaigns = []
         self .total_sales = [ 0 ] * num_campaigns
         self .total_profits = [ 0 ] * num_campaigns
         self .num_trials = num_trials
         self .trial_results = []
    
    def initialize_campaigns( self ):
         for i in range( self .num_campaigns):
             self .campaigns.append(Campaign(i))
    
    def select_campaign( self ):
        samples = []
         for campaign in self .campaigns:
            profit = campaign.get_profit()
            sample = np.random.normal(profit, 1.0 / campaign.conversion_rate)
            samples.append(sample)
        selected_campaign = np.argmax(samples)
         return selected_campaign
    
    def update_statistics( self , trial, selected_campaign, profit):
         self .total_sales[selected_campaign] += 1
         self .total_profits[selected_campaign] += profit
         self .trial_results.append((trial, selected_campaign, profit))
    
    def run_trials( self ):
         for trial in range( self .num_trials):
            selected_campaign = self .select_campaign()
            profit = self .campaigns[selected_campaign].get_profit()
             self .update_statistics(trial, selected_campaign, profit)

Теперь, когда мы реализовали класс ThompsonSampling, мы можем приступить к созданию экземпляра класса и запуску алгоритма. Для этого примера мы установим количество кампаний равным 8, а количество испытаний равным 1000. После запуска проб мы отобразим общий объем продаж и прибыль для каждой кампании.

Вот код для запуска алгоритма выборки Томпсона:

num_campaigns = 8
num_trials = 1000

ts = ThompsonSampling(num_campaigns, num_trials)
ts.initialize_campaigns()
ts.run_trials()

for i in range(num_campaigns):
    total_sales = ts.total_sales[i]
    total_profits = ts.total_profits[i]
    print(f "Campaign {i}: Total Sales = {total_sales}, Total Profits = {total_profits}" )
Вы можете изменить код в соответствии с вашими конкретными требованиями, такими как количество кампаний и пробных версий. Кроме того, вы можете расширить класс Campaign дополнительными атрибутами и методами для получения дополнительной информации о каждой кампании.
 

Основы Q-обучения



Основы Q-обучения

Всем добрый день! Я доктор Сопер, и сегодня я рад углубиться в основы Q-обучения, мощной техники в области искусственного интеллекта. Прежде чем мы отправимся в это учебное путешествие, я рекомендую посмотреть предыдущее видео из этой серии под названием «Основы обучения с подкреплением», если вы не знакомы с этой концепцией.

На этом уроке мы рассмотрим фундаментальные концепции Q-обучения, включая его характеристики, Q-значения, временные различия, уравнение Беллмана и общий процесс Q-обучения. К концу этого урока вы будете хорошо разбираться в этих концепциях и будете хорошо подготовлены для создания моделей ИИ, основанных на Q-обучении. Итак, без лишних слов, приступим!

Для начала давайте кратко обсудим, что влечет за собой Q-обучение. Как упоминалось ранее, Q-обучение — это форма обучения с подкреплением, когда агент ИИ взаимодействует со средой, состоящей из состояний и вознаграждений. Задача агента — построить оптимальную политику напрямую, взаимодействуя с окружающей средой, без необходимости изучения лежащей в основе математической модели или распределения вероятностей. Q-обучение включает в себя метод проб и ошибок, поскольку агент постоянно пытается решить проблему, используя различные подходы в нескольких эпизодах, обновляя свою политику на основе полученных знаний.

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

Теперь, когда у нас есть понимание характеристик, давайте рассмотрим несколько классических задач Q-обучения. Одной из таких проблем является лабиринт, где каждое место представляет собой состояние, а действия агента включают движение вверх, вправо, вниз или влево. Цель состоит в том, чтобы пройти через лабиринт и добраться до выхода как можно быстрее. Другим классическим примером является задача о ходьбе по обрыву, где агент должен перемещаться по сетке, чтобы добраться до определенного места, не упав с обрыва. В обоих сценариях агент ИИ узнает об окружающей среде, полагаясь на Q-значения и обновляя их.

Итак, что такое Q-значения? Q-значения представляют собой качество конкретного действия (а) в данном состоянии (я). Они указывают ожидаемую сумму будущих вознаграждений, если это действие будет предпринято из текущего состояния. Другими словами, Q-значения оценивают дополнительное вознаграждение, которое агент может получить, предприняв определенное действие и исходя из него оптимальным образом. Агент ИИ стремится максимизировать общее вознаграждение или минимизировать общее количество наказаний в сценариях с отрицательным вознаграждением. Обновляя и уточняя значения Q, агент учится как посредством положительного, так и отрицательного подкрепления.

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

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

Ошибка TD, часто обозначаемая как δ, рассчитывается как разница между значением TD и текущим значением Q для предыдущей пары состояние-действие. Он представляет собой несоответствие между прогнозом агента и фактическим вознаграждением, наблюдаемым в окружающей среде. Ошибка TD используется для обновления значения Q предыдущей пары состояние-действие, тем самым постепенно уточняя значения Q с течением времени.

Теперь давайте представим уравнение Беллмана, лежащее в основе Q-обучения. Уравнение Беллмана выражает связь между Q-значением пары состояние-действие и Q-значением соседних пар состояние-действие. Он определяется следующим образом:

Q(s, а) = R(s, а) + γ * max[Q(s', а')]

В этом уравнении Q(s, a) представляет Q-значение состояния s и действия a, R(s, a) обозначает немедленное вознаграждение, полученное при выполнении действия a в состоянии s, γ (гамма) — коэффициент дисконтирования, который определяет важность будущих вознаграждений по сравнению с немедленными вознаграждениями, s' — это следующее состояние, которое достигается после выполнения действия a в состоянии s, а 'представляет собой наилучшее действие, которое следует предпринять в состоянии s'.

Уравнение Беллмана по существу утверждает, что значение Q пары состояние-действие должно быть равно полученному немедленному вознаграждению плюс дисконтированное максимальное значение Q следующих пар состояние-действие. Повторно применяя уравнение Беллмана и обновляя значения Q на основе наблюдаемых вознаграждений и будущих оценок, агент постепенно приближается к оптимальной политике.

Теперь давайте перейдем к общему процессу Q-обучения. Q-обучение следует итеративному подходу, состоящему из следующих шагов:

  1. Инициализируйте Q-таблицу произвольными значениями или нулями.
  2. Наблюдайте за текущим состоянием.
  3. Выберите действие, основанное на стратегии исследования-эксплуатации, такой как эпсилон-жадность, которая балансирует между изучением новых действий и использованием полученных знаний.
  4. Выполните выбранное действие и наблюдайте за немедленным вознаграждением и следующим состоянием.
  5. Обновите значение Q предыдущей пары состояние-действие, используя уравнение Беллмана и наблюдаемое вознаграждение.
  6. Установите текущее состояние в следующее состояние.
  7. Повторяйте шаги с 3 по 6, пока агент не достигнет терминального состояния или не достигнет предопределенного количества эпизодов.
  8. Повторите шаги со 2 по 7 для нескольких эпизодов, чтобы уточнить значения Q и улучшить политику агента.

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

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

Таким образом, Q-обучение — это мощная техника в области обучения с подкреплением. Он включает в себя изучение оптимальных политик путем проб и ошибок, не требуя математической модели среды. Используя Q-значения для оценки ожидаемой суммы будущих вознаграждений, обновляя их с помощью временных различий и уравнения Беллмана, а также следуя итеративному процессу обучения, агент постепенно улучшает свою политику и достигает лучших результатов в заданной задаче.

Я надеюсь, что этот урок дал вам четкое представление об основах Q-learning. На следующем уроке мы углубимся в детали реализации и рассмотрим практические примеры Q-обучения в действии. Спасибо за внимание, и я с нетерпением жду встречи с вами в следующем видео!

 

Q-Learning: полный пример на Python


Q-Learning: полный пример на Python

Я доктор Сопер, и сегодня я рад представить подробное пошаговое руководство по системе искусственного интеллекта на основе Python с использованием Q-обучения. Этот урок основан на концепциях, обсуждавшихся в предыдущем видео, поэтому, если вы не знакомы с Q-learning, я настоятельно рекомендую посмотреть предыдущее видео, прежде чем переходить к этому.

В этом уроке мы рассмотрим бизнес-проблему, с которой столкнулась растущая компания электронной коммерции. Компания строит новый склад и хочет автоматизировать операции комплектования с помощью складских роботов. Складские роботы — это автономные наземные транспортные средства, предназначенные для выполнения различных складских задач, включая сбор заказов.

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

Чтобы обеспечить максимальную эффективность и производительность, роботы должны изучить кратчайшие пути между зоной упаковки и всеми другими местами на складе, куда им разрешено перемещаться. В этом видео наша цель — использовать Q-learning для выполнения этой задачи.

Во-первых, давайте представим среду для нашего сценария складского робота. Склад можно представить в виде диаграммы, где каждый черный квадрат представляет собой место хранения товара (полка или складское место), а каждый белый квадрат представляет собой проход, по которому роботы могут перемещаться. Зеленый квадрат указывает на расположение области упаковки товара.

Всего на складе 121 локация, и каждая локация представляет собой состояние или ситуацию, в которой робот может оказаться в определенный момент времени. Каждое состояние можно идентифицировать по индексу строки и столбца. Например, область упаковки товара находится в позиции (0, 5). Черные и зеленые квадраты — это терминальные состояния, означающие, что если агент ИИ загонит робота в одну из этих областей во время обучения, тренировочный эпизод будет завершен. Зеленый квадрат представляет целевое состояние, а черные квадраты представляют состояния сбоя, поскольку столкновение робота с местом хранения предметов считается сбоем.

Далее давайте обсудим действия, доступные агенту ИИ. Агент ИИ может выбрать одно из четырех направлений: вверх, вправо, вниз или влево. Задача агента — научиться действиям, которые не позволят роботу врезаться в места хранения предметов.

Теперь давайте рассмотрим структуру вознаграждения для нашего сценария. Каждому состоянию (локации) на складе присваивается значение вознаграждения. Чтобы помочь агенту ИИ учиться, отрицательные награды (наказания) используются для всех состояний, кроме целевого состояния. Область упаковки (целевое состояние) получает значение вознаграждения 100, а все остальные состояния имеют значение вознаграждения -100. Использование отрицательных вознаграждений побуждает агента ИИ находить кратчайший путь к цели, сводя к минимуму свои наказания. Положительные вознаграждения за белые квадраты не используются, потому что цель агента — максимизировать кумулятивные вознаграждения, а использование положительных вознаграждений за белые квадраты может привести к тому, что агент бесцельно накапливает вознаграждения, не достигая цели.

Теперь, когда мы определили среду с ее состояниями, действиями и вознаграждениями, давайте переключимся на Python и более подробно рассмотрим реализацию кода.

Начнем с импорта необходимых библиотек Python. Для этого проекта нам нужна только библиотека numpy, которая будет использоваться для создания многомерных массивов, генерации случайных значений и выполнения числовых задач.

Следующим шагом является определение среды, начиная с состояний. Склад представлен в виде сетки 11x11, что дает 121 возможное состояние. Мы используем трехмерный массив numpy для хранения Q-значений для каждой комбинации состояния и действия. Первые два измерения представляют строки и столбцы состояний, а третье измерение содержит по одному элементу для каждого возможного действия, которое может предпринять агент ИИ.

Далее мы определяем четыре действия, доступные агенту: Вверх, Вправо, Вниз, Влево.

Продолжим реализацию кода.

import numpy as np

# Define the environment
num_rows = 11
num_cols = 11
num_actions = 4

# Create the Q- table
Q = np.zeros((num_rows, num_cols, num_actions))
Теперь, когда мы определили среду и Q-таблицу, мы можем перейти к реализации алгоритма Q-обучения. Алгоритм Q-обучения состоит из следующих шагов:

  1. Инициализируйте Q-таблицу нулями.
  2. Установите гиперпараметры: скорость обучения (альфа), коэффициент дисконтирования (гамма), скорость исследования (эпсилон) и количество эпизодов (num_episodes).
  3. Для каждого эпизода:
    • Установите начальное состояние (current_state).
    • Повторяйте, пока текущее состояние не достигнет терминального состояния:
      • Выберите действие (current_action) на основе эпсилон-жадной политики.
      • Выполните выбранное действие и наблюдайте за следующим состоянием (next_state) и вознаграждением (reward).
      • Обновите Q-значение текущей пары состояние-действие, используя формулу Q-обучения.
      • Обновить текущее состояние (current_state) до следующего состояния (next_state).

Вот код, который реализует алгоритм Q-обучения для нашего сценария складского робота:

# Set the hyperparameters
alpha = 0.1     # Learning rate
gamma = 0.9     # Discount factor
epsilon = 0.1   # Exploration rate
num_episodes = 1000

# Q-learning algorithm
for episode in range(num_episodes):
    # Set the initial state
    current_state = ( 0 , 0 )
    
    # Repeat until the current state reaches a terminal state
    while current_state != ( 0 , 5 ):
        # Select an action based on the epsilon-greedy policy
        if np.random.uniform() < epsilon:
            current_action = np.random.randint(num_actions)
         else :
            current_action = np.argmax(Q[current_state[ 0 ], current_state[ 1 ], :])
        
        # Perform the selected action and observe the next state and the reward
        if current_action == 0 :  # Up
            next_state = (current_state[ 0 ] - 1 , current_state[ 1 ])
        elif current_action == 1 :  # Right
            next_state = (current_state[ 0 ], current_state[ 1 ] + 1 )
        elif current_action == 2 :  # Down
            next_state = (current_state[ 0 ] + 1 , current_state[ 1 ])
         else :  # Left
            next_state = (current_state[ 0 ], current_state[ 1 ] - 1 )
        
        reward = - 1   # Default reward for non-terminal states
        
        # Update the Q- value of the current state- action pair
        Q[current_state[ 0 ], current_state[ 1 ], current_action] = ( 1 - alpha) * Q[current_state[ 0 ], current_state[ 1 ], current_action] + alpha * (reward + gamma * np. max (Q[next_state[ 0 ], next_state[ 1 ], :]))
        
        # Update the current state to the next state
        current_state = next_state
После запуска алгоритма Q-обучения Q-таблица будет содержать изученные Q-значения для каждой пары состояние-действие, представляющие ожидаемые кумулятивные вознаграждения за выполнение определенного действия в заданном состоянии.

Чтобы проверить изученную политику, мы можем использовать Q-таблицу для выбора действий на основе самых высоких значений Q для каждого состояния:

 # Use the learned Q-table to select actions
current_state = ( 0 , 0 )
path = [current_state]

while current_state != ( 0 , 5 ):
    current_action = np.argmax(Q[current_state[ 0 ], current_state[ 1 ], :])
    
     if current_action == 0 :   # Up
        next_state = (current_state[ 0 ] - 1 , current_state[ 1 ])
    elif current_action == 1 :   # Right
        next_state = (current_state[ 0 ], current_state[ 1 ] + 1 )
    elif current_action == 2 :   # Down
        next_state = (current_state[ 0 ] + 1 , current_state[ 1 ])
     else :   # Left
        next_state = (current_state[ 0 ], current_state[ 1 ] - 1 )
    
    current_state = next_state
    path.append(current_state)

print( "Optimal path:" )
for state in path:
    print(state)
Этот код напечатает оптимальный путь от начального состояния (0, 0) до целевого состояния (0, 5) на основе изученных значений Q.
 

Основы искусственных нейронных сетей и глубокого Q-обучения


Основы искусственных нейронных сетей и глубокого Q-обучения

Я доктор Сопер, и сегодня я имею удовольствие обсудить со всеми вами основы искусственных нейронных сетей и глубокого Q-обучения.

Прежде чем мы углубимся в тонкости этих тем, я рекомендую посмотреть предыдущее видео из этой серии под названием «Основы Q-Learning», если вы не знакомы с Q-learning.

Давайте начнем с краткого обобщения того, что вы узнаете на этом уроке.

К концу этого видео вы будете иметь полное представление о:

  1. Что такое искусственные нейроны.
  2. Понятие об активационных функциях.
  3. Как работают нейронные сети.
  4. Процесс обучения нейронных сетей.
  5. Основы глубокого Q-обучения и как оно работает.

Как только мы поймем эти концепции, мы будем полностью подготовлены для создания моделей ИИ, основанных на искусственных нейронных сетях и глубоком Q-обучении.

Без лишних слов, давайте начнем!

Чтобы понять искусственные нейронные сети и их внутреннюю работу, мы должны сначала понять искусственные нейроны и функции активации.

Итак, что же такое искусственный нейрон?

Искусственные нейроны служат основными строительными блоками, на которых строятся все искусственные нейронные сети. Первоначально они были предложены Уорреном МакКаллохом и Уолтером Питтсом в 1943 году в качестве математической модели биологических нейронов, составляющих основу мозга животных, включая человеческий мозг.

Вдохновленная этими биологическими нейронами, появилась модель искусственного нейрона.

Как показано на диаграмме, целью искусственного нейрона является преобразование одного или нескольких входных значений в выходное значение. Каждое входное значение умножается на вес, который регулирует силу ввода. Например, если входное значение равно 0,8, а вес равен 0,5, результирующее умножение даст 0,4. В этом сценарии вес уменьшил силу ввода. И наоборот, если бы вес был больше 1, сила ввода была бы усилена.

Как только взвешенные входные значения рассчитаны, они подвергаются функции активации, которая создает выходное значение искусственного нейрона. Стоит отметить, что веса можно регулировать во время тренировки, чтобы свести к минимуму ошибки — идея, к которой мы вскоре вернемся.

Теперь давайте углубимся в функции активации.

Функция активации — это математическая функция, используемая искусственным нейроном для преобразования взвешенных входных значений в выходные значения. Как показано в уравнении, функция активации принимает одно входное значение, полученное путем умножения каждого входного значения на связанный с ним вес, а затем суммирует все эти результаты. Суммарное значение затем передается через функцию активации для получения выходного значения искусственного нейрона.

Важно отметить, что в искусственном нейроне могут использоваться различные функции активации, каждая из которых ведет себя по-разному при преобразовании входных значений в выходные значения.

Давайте рассмотрим четыре общие функции активации:

  1. Функция пороговой активации: эта функция возвращает либо 0, либо 1 в качестве вывода. Если входное значение больше или равно нулю, возвращается 1; в противном случае он возвращает 0. Следовательно, выходные значения для искусственных нейронов, использующих пороговую функцию активации, всегда будут либо 0, либо 1.

  2. Сигмовидная функция активации: выходной сигнал сигмовидной функции активации находится в диапазоне от 0 до 1. Положительные входные значения приводят к тому, что выходные значения приближаются к 1,0 по мере увеличения входных значений, в то время как отрицательные входные значения дают выходные значения ближе к 0,0 по мере уменьшения входных значений. Следовательно, сигмовидная функция активации всегда выдает результат от 0 до 1.

  3. Функция активации гиперболического тангенса. Функция активации гиперболического тангенса очень похожа на сигмовидную функцию активации, за исключением того, что ее выходное значение всегда находится в диапазоне от -1,0 до +1,0. Положительные входные значения генерируют выходные значения, приближающиеся к +1,0, когда входные значения увеличиваются, а отрицательные входные значения генерируют выходные значения, приближающиеся к -1,0, когда входные значения уменьшаются.

  4. Функция активации Rectified Linear Unit (ReLU): Функция активации ReLU возвращает само входное значение, если оно положительное, и 0, если входное значение отрицательное. Другими словами, ReLU устанавливает все отрицательные значения в 0 и оставляет положительные значения без изменений.

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

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

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

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

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

Основные этапы алгоритма глубокого Q-обучения следующие:

  1. Инициализируйте Q-сеть со случайными весами.
  2. Наблюдайте за текущим состоянием окружающей среды.
  3. Выберите действие, используя стратегию исследования-эксплуатации, такую как эпсилон-жадность, где существует баланс между изучением новых действий и использованием текущих знаний.
  4. Выполните выбранное действие и наблюдайте за наградой и новым состоянием.
  5. Обновите веса Q-сети, используя правило обновления Q-обучения, которое корректирует значение Q выбранного действия на основе наблюдаемого вознаграждения и максимального значения Q нового состояния.
  6. Повторяйте шаги 2–5, пока процесс обучения не сойдется или не достигнет заданного количества итераций.

Путем итеративного обновления Q-сети с использованием алгоритма Q-обучения сеть постепенно учится оценивать оптимальные значения Q для каждой пары состояние-действие. После обучения Q-сеть может использоваться для выбора действия с наивысшим значением Q для данного состояния, что позволяет агенту принимать обоснованные решения в среде обучения с подкреплением. Глубокое Q-обучение успешно применяется в различных областях, включая игры, робототехнику и автономное управление транспортными средствами. Он продемонстрировал замечательную производительность при изучении сложных задач на основе многомерных сенсорных входов. Однако важно отметить, что глубокое Q-обучение имеет определенные ограничения, такие как возможность переоценки Q-значений и сложность обработки непрерывных пространств действий. Исследователи продолжают изучать передовые методы и алгоритмы для решения этих проблем и улучшения возможностей глубокого обучения с подкреплением.

Глубокое Q-обучение — это мощная техника, которая сочетает обучение с подкреплением с глубокими нейронными сетями для обучения оптимальным действиям в заданной среде. Используя способность глубоких нейронных сетей аппроксимировать сложные функции, глубокое Q-обучение продемонстрировало значительный прогресс в различных областях искусственного интеллекта.