Tôi đang cố gắng cung cấp ngữ cảnh cho vấn đề kẻ cướp ngữ cảnh (https://medium.com/emergent-future/simple-reinforcement-learning-with-tensorflow-part-1-5-contextual-bandits-bff01d1aad9c) để triển khai độ dốc chính sách.
Tôi đang định nghĩa một mô hình trong tensorflow để sử dụng mộtĐã kết nối đầy đủ lớp giải quyết vấn đề này.
Tôi đang thử các API khác nhau từ tensorflow nhưng tôi muốn tránh sử dụng đóng góp
gói vì nó không được tensorflow hỗ trợ. Tôi quan tâm đến việc sử dụng máy ảnh
API này rất thú vị vì tôi đã quen với giao diện chức năng của nó, hiện được triển khai dưới dạng tf.keras
. Tuy nhiên, tôi dường như chỉ có thể sử dụng tf.contrib.slim.full_connected
hoặc tf.contrib.layers.full_connected
(Cái trước gọi cái sau) để lấy kết quả.
Hai đoạn mã sau hoạt động tốt (one_hot_encoded_state_input
Và số_hành động
tất cả đều phù hợp với hình dạng tensor dự kiến của lớp).
nhập tensorflow.contrib.slim dưới dạng mỏng
action_probability_distribution = slim.full_connected(
one_hot_encoded_state_input, \
num_actions, \
biases_initializer=Không có, \
kích hoạt_fn=tf.nn.sigmoid, \
Weights_initializer=tf.ones_initializer())
Và
từ tensorflow.contrib.layers nhập đầy đủ_connected
action_probability_distribution = được kết nối đầy đủ(
one_hot_encoded_state_input,
num_actions,\
biases_initializer=Không có, \
kích hoạt_fn=tf.nn.sigmoid, \
Weights_initializer=tf.ones_initializer())
Mặt khác, không có tác dụng nào sau đây:
action_probability_distribution = tf.layers.dense(
one_hot_encoded_state_input, \
num_actions, \
kích hoạt=tf.nn.sigmoid, \
bias_initializer=Không có, \
kernel_initializer=tf.ones_initializer())
cũng không
action_probability_distribution = tf.keras.layers.Dense(
num_actions, \
kích hoạt='sigmoid', \
bias_initializer=Không có, \
kernel_initializer = 'Ones')(one_hot_encoded_state_input)
Hai trường hợp cuối cùng sử dụng API cấp cao của tensorflow lớp
Vàmáy ảnh
. Lý tưởng nhất là tôi muốn biếtCó phải tôi đã triển khai sai hai trường hợp đầu tiên khi sử dụng hai trường hợp sau không, và vấn đề duy nhất tôi gặp phải làHai trường hợp sau không tương đương với hai trường hợp đầu.
Để hoàn thiện, đây là tất cả mã cần thiết để chạy nó (lưu ý: python 3.5.6 và tensorflow 1.12.0 đã được sử dụng).
nhập tensorflow astf
nhập numpy dưới dạng np
tf.reset_default_graph()
num_state = 3
num_actions = 4
learning_rate = 1e-3
state_input = tf.placeholder(shape=(None,),dtype=tf.int32, name='state_input')
one_hot_encoded_state_input = tf.one_hot(state_input, num_states)
# KHÔNG LÀM VIỆC
action_probability_distribution = tf.keras.layers.Dense(num_actions, activate='sigmoid', Bias_initializer=Không, kernel_initializer = 'Ones')(one_hot_encoded_state_input)
# CÔNG TRÌNH
# nhập tensorflow.contrib.slim as slim
# action_probability_distribution = slim.full_connected(one_hot_encoded_state_input,num_actions,\
#biases_initializer=Không,activation_fn=tf.nn.sigmoid,weights_initializer=tf.ones_initializer())
# CÔNG TRÌNH
# từ tensorflow.contrib.layers nhập đầy đủ_connected
# action_probability_distribution =full_connected(one_hot_encoded_state_input,num_actions,\
#biases_initializer=Không,activation_fn=tf.nn.sigmoid,weights_initializer=tf.ones_initializer())
# KHÔNG LÀM VIỆC
# action_probability_distribution = tf.layers.dense(one_hot_encoded_state_input,num_actions, activate=tf.nn.sigmoid,bias_initializer=None, kernel_initializer=tf.ones_initializer())
action_probability_distribution = tf.squeeze(action_probability_distribution)
action_chosen = tf.argmax(action_probability_distribution)
bonus_input = tf.placeholder(shape=(Không có,), dtype=tf.float32, name='reward_input')
action_input = tf.placeholder(shape=(None,), dtype=tf.int32, name='action_input')
chịu trách nhiệm_weight = tf.slice(action_probability_distribution, action_input, [1])
thua = -(tf.log(responsible_weight)*reward_input)
trình tối ưu hóa = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)
cập nhật = tối ưu hóa.minimize(mất)
kẻ cướp = np.array([[0.2,0,-0.0,-5],
[0,1,-5,1,0,25],
[-5,5,5,5]])
khẳng định kẻ cướp.shape == (num_states, num_actions)
def get_reward(state, action): # giá trị của kẻ cướp[state][action] càng thấp thì khả năng nhận được phần thưởng càng cao
nếu np.random.randn() > kẻ cướp[trạng thái] [hành động]:
return 1
trở lại -1
max_tập = 10000
epsilon=0,1
với tf.Session() là sess:
sess.run(tf.global_variables_initializer())
phần thưởng = np.zeros(num_states)
cho tập trong phạm vi (max_episodes):
trạng thái = np.random.randint(0,num_states)
hành động = sess.run(action_chosen, Feed_dict={state_input:[state]})
nếu np.random.Rand(1) < epsilon:
hành động = np.random.randint(0, num_actions)
phần thưởng = get_reward(trạng thái, hành động)
sess.run([update, action_probability_distribution, loss], Feed_dict = {reward_input: [reward], action_input: [action], state_input: [state]})
phần thưởng[trạng thái] += phần thưởng
nếu tập%500 == 0:
in (phần thưởng)
Khi sử dụng chú thích như #ĐÂY CÓ HIỆU QUẢ
chặn, tác nhân sẽ tìm hiểu và tối đa hóa phần thưởng ở cả ba trạng thái. Mặt khác, những ý kiến đó#Điều này không hiệu quả#
Những người không tìm hiểu thường sẽ hội tụ lại để chọn một Hành động rất nhanh. Ví dụ,đang làm việc Hành vi sẽ in một mức tăng tích cực của phần thưởng
Danh sách (phần thưởng tích lũy tốt cho từng bang). không làm việc Hành vi trông giống như mộtphần thưởng
Danh sách trong đó chỉ có một Hành động sẽ tăng phần thưởng tích lũy, thường gây thiệt hại cho một Hành động khác (phần thưởng tích lũy âm).
Tôi là một lập trình viên xuất sắc, rất giỏi!