Why Gym ?
Học tăng cường (RL) là trường con của học máy liên quan đến việc ra quyết định và điều khiển động cơ. Nó nghiên cứu cách một đại lý có thể học cách đạt được mục tiêu trong một môi trường phức tạp, không chắc chắn. Thật thú vị vì hai lý do:
- RL rất chung chung, bao gồm tất cả các vấn đề liên quan đến việc đưa ra một chuỗi quyết định: ví dụ: điều khiển động cơ của rô-bốt để rô-bốt có thể chạy và nhảy, đưa ra các quyết định kinh doanh như định giá và quản lý hàng tồn kho hoặc chơi trò chơi điện tử và trò chơi trên bàn. RL thậm chí có thể được áp dụng cho các vấn đề học tập có giám sát với đầu ra tuần tự hoặc có cấu trúc.
- Các thuật toán RL đã bắt đầu đạt được kết quả tốt trong nhiều môi trường khó khăn. RL có một lịch sử lâu đời, nhưng cho đến khi có những tiến bộ gần đây trong học sâu, nó đòi hỏi rất nhiều kỹ thuật cụ thể cho từng vấn đề. Các kết quả của DeepMind’s Atari, BRETT từ nhóm của Pieter Abbeel và AlphaGo đều sử dụng các thuật toán RL sâu không đưa ra quá nhiều giả định về môi trường của chúng và do đó có thể được áp dụng trong các cài đặt khác.
Gym là một bộ công cụ để phát triển và so sánh các thuật toán học tăng cường. Nó không định nghĩa gì về cấu trúc agent của bạn và nó tương thích với bất kỳ thư viện tính toán, chẳng hạn như TensorFlow hoặc Theano.
Cài đặt
Để bắt đầu, bạn cần cài đặt Python 3.5+. Đơn giản chỉ cần cài đặt Gym bằng cách sử dụng pip:
pip install gym
Environments - Môi trường
Dưới đây là một ví dụ tối thiểu về việc vận hành một thứ gì đó. Thao tác này sẽ chạy một phiên bản của môi trường CartPole-v0 trong 1000 bước(step), hiển thị môi trường ở mỗi bước. Bạn sẽ thấy một cửa sổ bật lên hiển thị một trò chơi có thể bạn đã biết:
import gym
env = gym.make('CartPole-v0')
env.reset()
for _ in range(1000):
env.render()
env.step(env.action_space.sample()) # chọn một hành động ngẫu nhiên
env.close()
Nó sẽ trông giống như thế này:

Môi trường bạn có thể hiểu nó theo nghĩa đen giống như môi trường sống để cho AI của chúng ta có thể tương tác và học hỏi từ môi trường.
Observations - Quan sát
Nếu chúng ta muốn làm tốt hơn thay vì thực hiện các hành động ngẫu nhiên ở mỗi bước, thì có lẽ sẽ rất tốt nếu chúng ta thực sự biết hành động của chúng ta đang làm gì đối với môi trường.
Hàm step
của môi trường trả về chính xác những gì chúng ta cần. Trên thực tế, bước trả về bốn giá trị.
Đó là:
observation
(object): một đối tượng dành riêng cho môi trường đại diện cho sự quan sát của bạn về môi trường. Ví dụ: dữ liệu pixel từ máy ảnh, các góc và vận tốc của rô bốt hoặc trạng thái bàn cờ trong trò chơi trên bàn cờ.
reward
(float): số lượng phần thưởng đạt được bởi hành động trước đó. Quy mô khác nhau giữa các môi trường, nhưng mục tiêu luôn là tăng tổng phần thưởng của bạn.
done
(boolean): đã đến lúc reset
môi trường chưa. Hầu hết (nhưng không phải tất cả) nhiệm vụ được chia thành các tập được xác định rõ ràng và done
là True
cho biết tập đã kết thúc. (Ví dụ, có lẽ cái cột đã nghiêng quá xa, hoặc bạn đã chơi hết lượt của mình.)
info
(dict): thông tin chẩn đoán hữu ích để gỡ lỗi. Nó đôi khi có thể hữu ích cho việc học (ví dụ: nó có thể chứa các xác suất đằng sau sự thay đổi trạng thái cuối cùng của môi trường). Tuy nhiên, các đánh giá chính thức agent của bạn không được phép sử dụng điều này để học.
Đây chỉ là một triển khai của “agent-environment loop” cổ điển. Mỗi bước thời gian, tác nhân chọn một action
và environment trả về một observation
và một reward
.

Quá trình bắt đầu bằng cách gọi reset()
. trả về một observation
ban đầu.
import gym
env = gym.make('CartPole-v0')
for i_episode in range(20):
observation = env.reset()
for t in range(100):
env.render()
print(observation)
action = env.action_space.sample()
observation, reward, done, info = env.step(action)
if done:
print("Episode finished after {} timesteps".format(t+1))
break
env.close()
Điều này sẽ tạo ra kết quả như sau: video
[-0.061586 -0.75893141 0.05793238 1.15547541]
[-0.07676463 -0.95475889 0.08104189 1.46574644]
[-0.0958598 -1.15077434 0.11035682 1.78260485]
[-0.11887529 -0.95705275 0.14600892 1.5261692 ]
[-0.13801635 -0.7639636 0.1765323 1.28239155]
[-0.15329562 -0.57147373 0.20218013 1.04977545]
Episode finished after 14 timesteps
[-0.02786724 0.00361763 -0.03938967 -0.01611184]
[-0.02779488 -0.19091794 -0.03971191 0.26388759]
[-0.03161324 0.00474768 -0.03443415 -0.04105167]
Spaces
Trong các ví dụ trên, chúng ta đã lấy mẫu các hành động ngẫu nhiên từ không gian hành động của môi trường.
Nhưng những hành động đó thực sự là gì? Mỗi môi trường đi kèm với một action_space
và một Obser_space
. Các thuộc tính này thuộc loại Space
và chúng mô tả định dạng của các action
và observations
hợp lệ:
import gym
env = gym.make('CartPole-v0')
print(env.action_space)
#> Discrete(2)
print(env.observation_space)
#> Box(4,)
Không gian Discrete
cho phép một phạm vi cố định gồm các số không âm, vì vậy trong trường hợp này, các hành động hợp lệ là 0 hoặc 1. Không gian Box
biểu thị một hộp n chiều, vì vậy các observations
hợp lệ sẽ là một mảng 4 số. Chúng ta cũng có thể kiểm tra giới hạn của Box
:
print(env.observation_space.high)
#> array([ 2.4 , inf, 0.20943951, inf])
print(env.observation_space.low)
#> array([-2.4 , -inf, -0.20943951, -inf])
Việc xem xét nội tâm này có thể hữu ích để viết mã chung hoạt động cho nhiều môi trường khác nhau.
Box
và Discrete
là những Space
phổ biến nhất. Bạn có thể lấy mẫu từ Space
hoặc kiểm tra xem có thứ gì thuộc về Space
đó không:
from gym import spaces
space = spaces.Discrete(8) # Set with 8 elements {0, 1, 2, ..., 7}
x = space.sample()
assert space.contains(x)
assert space.n == 8