強化學習--基礎篇

背景:由於返校的原因,手頭的筆記本無法完成在Windows下運行虛擬機的操作,所以選擇在Windows下進行一些學習。(不得不吐槽下“微星筆記本”)
最近在看“強化學習”有關書籍,其中前幾章爲基礎知識。現做個總結:
在這裏插入圖片描述

  1. 書中多采用python實例,不可避免的又要和python打交道,於是配置了相關vscode的python環境。電腦本身是裝有numpy,和matplotlib包的(忘了什麼時候安裝的了)
    首先在vscode中, ctrl+shift+P找到下圖所示配置地方
    在這裏插入圖片描述
    添加語句如下所示:
    在這裏插入圖片描述
{
    "python.pythonPath": "E:\\software\\anaconda\\python.exe"
}

其中,路徑爲python.exe所在路徑。這樣,在Vscode中就可以關聯找到numpy,以及mathplotlib包了。

  1. Python也是腳本語言,這點和Matlab的.m文件挺像的。
  2. 略過書中有關矩陣基本形式的介紹(書中着重強調了對稱矩陣的性質,不知道後續內容是否有涉及)
  3. 概率部分,貝葉斯定理:
    P(YX)=P(XY)P(Y)P(X) P(Y|X)=\frac{P(X|Y)\cdot P(Y)}{P(X)}
  4. 重要性採樣:當原分佈函數比較複雜的時候,無法直接利用原分佈函數進行求期望,方差等操作。這個時候,可以採用“曲線救國”的方式,基於大數定理,用採樣的樣本近似逼近原分佈,採用的是np.random.normal()實現。附上書中的例子,慢慢琢磨:
import numpy as np
import math
import matplotlib.pyplot as plt
def gaussian(x,u ,sigma):
    return math.exp(-(x-u)**2/(2*sigma*sigma))/math.sqrt(2*math.pi*sigma*sigma)

def importance_sampling_test(ori_sigma, sample_sigma):
    origin = []
    for n in range(10):
        sum = 0
        for i in range(10000):
            a = np.random.normal(1.0,ori_sigma)
            sum += a
        origin.append(sum)

    isample = []
    for n in range(10):
        sum2 = 0
        for i in range(10000):
            a = np.random.normal(1.0,sample_sigma)
            ua = gaussian(a,1.0,sample_sigma)
            na = gaussian(a,1.0,ori_sigma)
            sum2 += a*na/ua
        isample.append(sum2)

    origin = np.array(origin)
    isample = np.array(isample)
    np_mean = np.mean(origin)
    np_std = np.std(origin)
    print(np_mean,end="") 
    print("\t",end="")#np.std(origin)
    print(np_std)
    np_mean = np.mean(isample)
    np_std = np.std(isample)
    print(np_mean,end="") #np.std(origin)
    print("\t",end="")
    print(np_std)

importance_sampling_test(1.0,1.0)
importance_sampling_test(1.0,0.5)
importance_sampling_test(1.0,2)

xs = np.linspace(-5,6,301)
y1 = [gaussian(x,1.0,1.0) for x in xs]
y2 = [gaussian(x,1.0,0.5) for x in xs]
y3 = [gaussian(x,1.0,2) for x in xs]

fig = plt.figure(figsize=(8,5))
plt.plot(xs,y1,label='sigma=1.0')
plt.plot(xs,y2,label='sigma=0.5',linestyle=':')
plt.plot(xs,y3,label='sigma=2.0',linestyle='--')
plt.legend()
plt.show()

在VScode中,單機右上角的運行按鈕後,可以得到下圖:
在這裏插入圖片描述

  1. 信息論基礎:熵,書中又名“驚喜度”。事件發生的概率越小,驚喜度越大。表示熵的函數需要時連續的。f(0.5)=1f(0.5)=1。於是找到一個滿足的函數爲:
    entropy=entropy=xp(x)logp(x) entropy = entropy=-\sum_{x}p(x)logp(x)
    連續變量上定義爲
    entropy=xp(x)logp(x)entropy=-\int_{x}p(x)logp(x)
    書中將擲硬幣的例子編寫曲線表示,假如有字的一面朝上的概率爲pp,有花的一面的朝上的概率爲1p1-p,則有關熵的公式爲:
    entropy(p)=plogp(1p)log(1p)entropy(p) = -plogp-(1-p)log(1-p)
    Python代碼如下:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,1,101)
y = -x*np.log2(x)-(1-x)*np.log2(1-x)
y[np.isnan(y)] = 0
plt.plot(x,y)
plt.show()

在這裏插入圖片描述

  1. KL散度:描述兩個概率分佈的差異。表徵兩個概率分佈之間的距離。當兩個分佈越接近,則KL散度越小;反之,兩個分佈越遠,KL散度就越大。 (書中有一大堆公式推導,略)
  2. 凸函數及其性質:其實高中數學中就已經普及函數的凹凸性質了,以前確實沒有注意到這個知識點。機器學習概念篇:一文詳解凸函數和凸優化,乾貨滿滿
    凸函數,凸集的優點:如果一個點是凸函數的局部最優值,那麼這個點就是函數的全局最優值。更進一步,如果這個函數是強凸函數,那麼這個點是函數唯一的全局最優值。(詳細證明見書中 P39-P41)
  3. 機器學習概念: Python中,有scikit-learn工具包可以完成可視化的迴歸問題,通過pip list查看。可以參考鏈接爲:機器學習算法的隨機數據生成 ,plot的顏色和線條設置可以參看python中matplotlib的顏色及線條控制
 import numpy
import sklearn.datasets as d
import matplotlib.pyplot as plt
reg_data = d.make_regression(100,1,1,1,1.0)
x,y = d.make_classification(100,2,2,0,0,2)
plt.subplot(121)
plt.plot(reg_data[0],reg_data[1])
plt.subplot(122)
plt.plot(x[:,0],x[:,1],marker=',')
plt.show()

在這裏插入圖片描述

  1. 交叉熵:舉一個例子,如果有兩個服從伯努利分佈的隨機變量P和Q,他們的交叉熵H(P,Q)H(P,Q)
    H(P,Q)=P(0)logQ(0)(1P(0))log(1Q(0)) H(P,Q)=-P(0)logQ(0)-(1-P(0))log(1-Q(0))
    用python畫出來爲
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = Axes3D(fig)
X = np.linspace(0.01,0.99,101)
Y = np.linspace(0.01,0.99,101)
X,Y = np.meshgrid(X,Y)
Z = -X*np.log2(Y) -(1-X)*np.log2(1-Y)
ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap='rainbow')
plt.show()

在這裏插入圖片描述
如果最終輸出爲的結果是迴歸問題的一個連續變量,使用平方損失函數更合適;如果最終輸出是分類問題的一個離散變量,那麼交叉熵損失函數更合適

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章