<jupyter_start><jupyter_text>CartPole-v1环境: action正确,reward=1;action错误,reward=0 1.Policy():定义神经网络结构2.select_action:定义选择动作函数(对每次进行sample的action概率取对数，并记录:$log(\pi(s_i,a_i))$3.finish_episode:定义更新操作,计算出Baseline-R，将每次的-R*log_prob计算求和，计算loss.sum()进行反向传递更新4.训练: 先sample一个序列 P $$，调用finish_episode()函数 更新规则:$$\theta_{t+1} = \theta_t +\alpha \frac{\hat{A}(s,a)\nabla\pi_{\theta_t}(a|s)}{\pi_\theta(a|s)}\\\theta_{t+1} = \theta_t +\alpha\hat{A}(s,a)\nabla_\theta \log\pi_\theta(s|a)$$Loss function:$$\sum(-\hat{A}(s,a)\log\pi(s|a))$$1.$\hat{A}(s,a)$为advantage function,$\pi_\theta(s|a)$为在s采取动作a的可能性，可将其导数理解为在s采取动作a这个向量。2.除上$\pi_\theta(a|s)$是因为让小概率的动作获得较大的增长空间(增长可正可负)3.理解loss function:对loss求导才会有更新操作，所以Loss中没有求导<jupyter_code>x = np.arange(0,10,0.05)
mu, sigma = 5, 2
y = lambda x : -np.exp(-((x-mu)**2)/(2*sigma**2))/(sigma*np.sqrt(2*np.pi))+0.2
plt.plot(x, y(x))
plt.title("Loss function")
plt.xlabel("$\log\pi(s|a))$")
plt.ylabel("$\sum(-\hat{A}(s,a)\log\pi(s|a))$")
plt.annotate(r'rising_edge',xy=(8,y(8)), xycoords='data', xytext=(+30, -30),
             textcoords='offset points', fontsize=16,
             arrowprops=dict(arrowstyle='->', connectionstyle="arc3,rad=.2"))
plt.annotate(r'down_edge',xy=(2,y(2)), xycoords='data', xytext=(+30, -30),
             textcoords='offset points', fontsize=16,
             arrowprops=dict(arrowstyle='->', connectionstyle="arc3,rad=.2"))
plt.show()<jupyter_output><empty_output><jupyter_text>* policy gradient 可以很好的处理连续状态：    神经网络可以很好的映射:从某个state$\rightarrow$action        * 对更新的理解    到最后Loss可以收敛一个趋近于0的值: 考虑到公式$-\hat{A}log\pi(s,a)$，开始训练时$\hat{A}$大的可能少sample，$log\pi(s,a)$会较小(取反会较大)，此时在通过更新Loss Function找到global optimum。$\hat{A}$小的会少sample，$log\pi(s,a)$会较小(取反会较大)、$\hat{A}$大的会多sample，$log\pi(s,a)$会较大(取反会较小)，所以稳定状态总的Loss是趋于0的，也就是说此时的神经网络参数基本稳定。但训练过程中会出现从最高的reward变为较小的reward的现象，可以宏观的理解为可能只达到了local optimum,也就是有些state和action没有搜索到        * 对连续动作的理解        状态动作概率映射函数$\pi(s,a)$本身就可以理解为在某个state从$action\rightarrow\pi(s,a)$的映射,具体可如下图抽象理解* 对$\Delta\pi(s,a)$的理解(先不除$\pi(s,a)$)    此时是对单个state进行考虑,所以横坐标为action的映射，所以沿着导数的方向就可以找到$\pi_(s,a)$最大的action<jupyter_code>x = np.arange(1,10,0.05)
y = 1/x
plt.xlabel("action")
plt.ylabel("$\pi(s,a)$")
plt.plot(x,y)
plt.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.22187218721872187, 'fraction_numerical': 0.024752475247524754, 'mean_word_length': 7.484732824427481, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 11, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '393765', 'license': 'Apache-2.0', 'n_tokens_mistral': 1279, 'n_tokens_neox': 1324, 'n_words': 71, 'path': 'algorithm_implement/.ipynb_checkpoints/REINFORCE-checkpoint.ipynb', 'repo_name': 'sunnyswag/RL_notes_and_codes', 'size': '2222'}