Lesson 5.基本优化思想与最小二乘法
??在正式開始進(jìn)行神經(jīng)網(wǎng)絡(luò)建模之前,我們還需要掌握一些基本數(shù)學(xué)工具,在PyTorch中,最核心的基礎(chǔ)數(shù)學(xué)工具就是梯度計(jì)算工具,也就是PyTorch的AutoGrad(自動(dòng)微分)模塊。雖然對(duì)于任何一個(gè)通用的深度學(xué)習(xí)框架,都會(huì)提供許多自動(dòng)優(yōu)化的算法和現(xiàn)成的loss function,PyTorch也不例外,但如果希望能夠更深入的理解神經(jīng)網(wǎng)絡(luò)、希望對(duì)深度學(xué)習(xí)的建模不僅僅停留在調(diào)包和調(diào)參的層次,那我們就必須深入一些數(shù)學(xué)領(lǐng)域、掌握一些數(shù)學(xué)工具,從底層提升自己的數(shù)學(xué)能力,以期能夠在日后的使用深度學(xué)習(xí)算法的過程中能夠更加靈活的解決問題、取得更好的建模效果。而AutoGrad模塊,就是PyTorch提供的最核心的數(shù)學(xué)工具模塊,我們可以利用其編寫一系列的最優(yōu)化方法,當(dāng)然,要使用好微分工具,就首先需要了解廣泛應(yīng)用于機(jī)器學(xué)習(xí)建模的優(yōu)化思想。
??所謂優(yōu)化思想,指的是利用數(shù)學(xué)工具求解復(fù)雜問題的基本思想,同時(shí)也是近現(xiàn)代機(jī)器學(xué)習(xí)算法在實(shí)際建模過程中經(jīng)常使用基礎(chǔ)理論在實(shí)際建模過程中,我們往往會(huì)先給出待解決問題的數(shù)值評(píng)估指標(biāo),并在此基礎(chǔ)之上構(gòu)建方程、采用數(shù)學(xué)工具、不斷優(yōu)化評(píng)估指標(biāo)結(jié)果,以期達(dá)到可以達(dá)到的最優(yōu)結(jié)果。本節(jié),我們將先從簡(jiǎn)單線性回歸入手,探討如何將機(jī)器學(xué)習(xí)建模問題轉(zhuǎn)化為最優(yōu)化問題,然后考慮使用數(shù)學(xué)方法對(duì)其進(jìn)行求解。
一、簡(jiǎn)單線性回歸的機(jī)器學(xué)習(xí)建模思路
??在《Lesson 4.張量的線性代數(shù)運(yùn)算》結(jié)尾,我們?cè)?jiǎn)單提及線性方程建模問題,彼時(shí),我們將線性回歸問題轉(zhuǎn)化成,求解以線性方程系數(shù)為核心目標(biāo)的線性方程組求解問題,并且將方程組轉(zhuǎn)化為矩陣表示形式,最終使用逆矩陣的方法解出線性方程系數(shù)。線性回歸是較為基礎(chǔ)且通用的模型,但使用矩陣方法求解卻不是一般方法。
??接下來,我們將更進(jìn)一步,將簡(jiǎn)單線性回歸的求解參數(shù)問題轉(zhuǎn)化為最優(yōu)化問題求解問題,這也是機(jī)器學(xué)習(xí)建模過程中的最通用的思想。
1.回顧簡(jiǎn)單線性回歸建模問題
import matplotlib as mpl import matplotlib.pyplot as pltA = torch.arange(1, 5).reshape(2, 2).float() A #tensor([[1., 2.], # [3., 4.]])# 繪制點(diǎn)圖查看兩個(gè)點(diǎn)的位置 plt.plot(A[:,0], A[:, 1], 'o')結(jié)果:
如果更進(jìn)一步,我們希望在二維空間中找到一條直線,來擬合這兩個(gè)點(diǎn),也就是所謂的構(gòu)建一個(gè)線性回歸模型,我們可以設(shè)置線性回歸方程如下:
2.轉(zhuǎn)化為優(yōu)化問題
??上述問題除了可以使用矩陣方法求解以外,還可以將其轉(zhuǎn)化為最優(yōu)化問題,然后通過求解最優(yōu)化問題的方法對(duì)其進(jìn)行求解。總的來說,最優(yōu)化問題的轉(zhuǎn)化分為兩步,其一是確定優(yōu)化數(shù)值指標(biāo),其二則是確定優(yōu)化目標(biāo)函數(shù)。在大多數(shù)問題中,這二者是相輔相成的,確定了優(yōu)化的數(shù)值指標(biāo),也就確定了優(yōu)化的目標(biāo)函數(shù)。
??如果我們希望通過一條直線擬合二維平面空間上分布的點(diǎn),最核心的目標(biāo),毫無疑問,就是希望方程的預(yù)測(cè)值和真實(shí)值相差較小。假設(shè)真實(shí)的y值用y表示,預(yù)測(cè)值用?表示,帶入a、b參數(shù),則有數(shù)值表示如下:
而這兩個(gè)預(yù)測(cè)值和真實(shí)值相差:
? ? ? ?我們希望?和y盡可能接近,因此我們可以考慮計(jì)算上述誤差總和,但為了避免正負(fù)相消(一部分為正、另一部分為負(fù)),在衡量上述兩個(gè)點(diǎn)的誤差總和時(shí),我們使用平方和來進(jìn)行衡量,而不是簡(jiǎn)單的求和:
??上式也就是兩個(gè)點(diǎn)的預(yù)測(cè)值和真實(shí)值的差值的平方和,也就是所謂的,誤差平方和——SSE(Sum of the Squared Errors)。
當(dāng)然,此處我們只帶入了(1, 2)和(3, 4)兩個(gè)點(diǎn)來計(jì)算SSE,也就是帶入了兩條數(shù)據(jù)來訓(xùn)練y = ax + b這個(gè)模型。
不難發(fā)現(xiàn),很多時(shí)候,機(jī)器學(xué)習(xí)的思想都是相對(duì)比較樸素的,很多看似復(fù)雜的概念,出發(fā)點(diǎn)都是一個(gè)非常“簡(jiǎn)單”的想法,在學(xué)習(xí)機(jī)器學(xué)習(xí)的過程中,掌握其底層的樸素思想,能夠幫助大家在很多場(chǎng)景下活學(xué)活用。
??至此,我們已經(jīng)將原問題轉(zhuǎn)化為了一個(gè)最優(yōu)化問題,接下來我們的問題就是,當(dāng)a、b取何值時(shí),SSE取值最小?值得注意的是,SSE方程就是我們優(yōu)化的目標(biāo)方程(求最小值),因此上述方程也被稱為目標(biāo)函數(shù),同時(shí),SSE代表著真實(shí)值和預(yù)測(cè)值之間的差值(誤差平方和),因此也被稱為損失函數(shù)(預(yù)測(cè)值距真實(shí)值的損失)。
換而言之,就是當(dāng)SSE取值最小時(shí),a、b的取值,就是最終線性回歸方程的系數(shù)取值。
值得注意的是,目標(biāo)函數(shù)和損失函數(shù)并不完全等價(jià),但大多數(shù)目標(biāo)函數(shù)都由損失函數(shù)構(gòu)成。
3.最優(yōu)化問題的求解方法
??在機(jī)器學(xué)習(xí)領(lǐng)域,大多數(shù)優(yōu)化問題都是圍繞目標(biāo)函數(shù)(或者損失函數(shù))進(jìn)行求解。在上述問題中,我們需要圍繞SSE求最小值。SSE是一個(gè)關(guān)于a和b的二元函數(shù),要求其最小值,需要借助數(shù)學(xué)工具,也就是所謂的最優(yōu)化方法。選擇優(yōu)化方法并執(zhí)行相應(yīng)計(jì)算,可以說是整個(gè)建模過程中最核心也是相對(duì)較難的部分,很多時(shí)候這個(gè)過程會(huì)直接決定模型的性能。
- 圖形展示目標(biāo)函數(shù)
??為了更好的討論目標(biāo)函數(shù)(SSE)求最小值的過程,對(duì)于上述二元函數(shù)來說,我們可以將其展示在三維空間內(nèi)。此處我們可以使用Python中matplotlib包和Axes3D函數(shù)進(jìn)行三維圖像繪制
from matplotlib import pyplot as plt from mpl_toolkits.mplot3d import Axes3Dx = np.arange(-1,3,0.05) y = np.arange(-1,3,0.05) a, b = np.meshgrid(x, y) SSE = (2 - a - b) ** 2 + (4 - 3 * a - b) ** 2ax = plt.axes(projection='3d')ax.plot_surface(a, b, SSE, cmap='rainbow') ax.contour(a, b, SSE, zdir='z', offset=0, cmap="rainbow") #生成z方向投影,投到x-y平面 plt.show()結(jié)果:?
- 函數(shù)的凹凸性
??初步探索函數(shù)圖像,不難看出,目標(biāo)函數(shù)是個(gè)整體看起來“向下凸”的函數(shù),函數(shù)的凹凸性是函數(shù)的重要性質(zhì),首先我們給出凸函數(shù)的一般定義,對(duì)于任意一個(gè)函數(shù),如果函數(shù)f(x)上存在任意兩個(gè)點(diǎn),𝑥1,𝑥2x1,x2,且
我們就判定,這個(gè)函數(shù)是凸函數(shù)。
典型的,例如𝑦=x^2,我們可以繪制函數(shù)圖像如下:?
x = np.arange(-10,10,0.1) y = x ** 2 plt.plot(x, y, '-') plt.show()結(jié)果:
不難看出,函數(shù)上任意兩個(gè)點(diǎn)的y取值的均值都不小于這兩個(gè)點(diǎn)均值的y的值。
# x1 = 1, x2 = 3 (1 ** 2 + 3 ** 2)/2 #5.0# x1 = 1, x2 = 3 ((1+3)/2) ** 2 #4.0而對(duì)于一個(gè)凸函數(shù)來說,全域最小值明顯存在,基于凸函數(shù)的數(shù)學(xué)定義,我們可以進(jìn)一步給出求解上述SSE凸函數(shù)最小值的一般方法,也就是著名的最小二乘法
- 凸函數(shù)的最小值
??通過𝑦=𝑥^2函數(shù)不難看出,最小值x = 0唯一存在,并且最小值點(diǎn)對(duì)應(yīng)的函數(shù)切線與x軸平行,也就是在最小值點(diǎn),函數(shù)的導(dǎo)數(shù)為0。這其實(shí)也凸函數(shù)求解最小值的一般方法:
a).對(duì)于一元函數(shù),如果存在導(dǎo)數(shù)為0的點(diǎn),則該點(diǎn)就是最小值點(diǎn);
b).對(duì)于多元函數(shù),如果存在某一點(diǎn),使得函數(shù)的各個(gè)自變量的偏導(dǎo)數(shù)都為0,則該點(diǎn)就是最小值點(diǎn)。
因此,對(duì)于凸函數(shù)的最小值求解,最基本的出發(fā)點(diǎn)就是尋找導(dǎo)數(shù)為0的點(diǎn)。而最小二乘法也是基于偏導(dǎo)函數(shù)取值為0聯(lián)立的方程組進(jìn)行的求解。
從更嚴(yán)格的意義上來說,凸函數(shù)的最小值點(diǎn)其實(shí)是根據(jù)邊界點(diǎn)和駐點(diǎn)(導(dǎo)數(shù)為0的點(diǎn))決定,如果沒有邊界點(diǎn)且沒有駐點(diǎn),則函數(shù)沒有最小值(例如y=x),如果存在邊界點(diǎn),但沒有駐點(diǎn),則邊界點(diǎn)的一側(cè)就是最小值點(diǎn),如果存在駐點(diǎn)(且左右兩邊單調(diào)性相反),則駐點(diǎn)就是最小值點(diǎn),例如,對(duì)于𝑦=𝑥^2而言,𝑦′=2𝑥,2x = 0時(shí)x取值為0,也就是0點(diǎn)就是最小值點(diǎn)。
值得注意的是,駐點(diǎn)也可以說是臨界點(diǎn),但不是拐點(diǎn),拐點(diǎn)特指左右兩邊函數(shù)凹凸性發(fā)生變化的點(diǎn),切勿和駐點(diǎn)混淆。
??函數(shù)的凹凸性是函數(shù)的重要性質(zhì),而在使用優(yōu)化方法圍繞目標(biāo)函數(shù)進(jìn)行求解時(shí),函數(shù)本身性質(zhì)是決定使用哪種優(yōu)化方法的重要因素,例如函數(shù)是否可導(dǎo)、是否連續(xù)、函數(shù)凹凸性等等。而要判斷函數(shù)的各種屬性,其實(shí)都需要經(jīng)過非常嚴(yán)格的數(shù)學(xué)證明,也就是說,一般的采用數(shù)學(xué)優(yōu)化方法求解的過程,都是先確定函數(shù)形式、然后探索函數(shù)性質(zhì)、之后尋找優(yōu)化方法、最終執(zhí)行優(yōu)化算法求解。
??當(dāng)然,機(jī)器學(xué)習(xí)建模中的目標(biāo)函數(shù),大多數(shù)時(shí)候都是可導(dǎo)的函數(shù),而凹凸性則是影響使用哪種最優(yōu)化方法的最核心因素。正因如此,凸函數(shù)的最優(yōu)化問題是優(yōu)化方法的一類重要應(yīng)用,甚至圍繞凸函數(shù),還衍生出了凸優(yōu)化相關(guān)的一大類優(yōu)化問題分支學(xué)課,在機(jī)器學(xué)習(xí)中,我們經(jīng)常聽說的最小二乘法就是求解凸優(yōu)化問題的重要工具。當(dāng)然,很多本身不是針對(duì)凸函數(shù)設(shè)計(jì)的最優(yōu)化方法,但鑒于凸函數(shù)在求最小值時(shí)的優(yōu)異特性,我們也會(huì)在凸優(yōu)化過程中應(yīng)用的、例如梯度下降、擬牛頓法等等等等,都是本次課程中重點(diǎn)學(xué)習(xí)的內(nèi)容。
- SSE最小值
而對(duì)于SSE來說,此處雖然不做證明,但對(duì)于簡(jiǎn)單線性回歸的損失函數(shù),SSE是凸函數(shù),因此,對(duì)于𝑆𝑆𝐸(𝑎,𝑏)=(2?𝑎?𝑏)^2+(4?3𝑎?𝑏)^2而言,最小值點(diǎn)就是a、b兩個(gè)參數(shù)求偏導(dǎo)等于0的點(diǎn)
?其中:
此外,還可通過(1)式解出一個(gè)參數(shù)然后帶入(2)式進(jìn)行求解
利用偏導(dǎo)等于0得出的方程組求解線性回歸方程參數(shù),就是最小二乘法求解過程。此處我們求得a=1,b=1時(shí),SSE(a,b)取得最小值,也就是(1,1)是目標(biāo)函數(shù)的最小值點(diǎn)。
4.機(jī)器學(xué)習(xí)建模一般流程
??至此,我們就完成了一個(gè)基本的簡(jiǎn)單線性回歸建模過程。當(dāng)然,對(duì)于線性回歸來說,有很多種建模方式,哪怕是主流的統(tǒng)計(jì)學(xué)和機(jī)器學(xué)習(xí),在利用線性回歸進(jìn)行建模時(shí)都有不一樣的流程(后續(xù)介紹機(jī)器學(xué)習(xí)基礎(chǔ)時(shí)還會(huì)詳細(xì)介紹)。此處我們是通過一個(gè)簡(jiǎn)單的例子,來介紹機(jī)器學(xué)習(xí)、包括深度學(xué)習(xí)的利用優(yōu)化方法建模的一般思想,我們可以將其總結(jié)如下:
- Step 1:提出基本模型
- 如本節(jié)中,我們?cè)噲D利用一條直線(y=ax+b)去擬合二維平面空間中的點(diǎn),這里我們所使用的這條直線,就是我們提出的基本模型。而在后續(xù)的深度學(xué)習(xí)的學(xué)習(xí)過程中,我們還將看到更為強(qiáng)大、同時(shí)也更加通用的神經(jīng)網(wǎng)絡(luò)模型。當(dāng)然,不同的模型能夠適用不同的場(chǎng)景,在提出模型時(shí),我們往往會(huì)預(yù)設(shè)一些影響模型結(jié)構(gòu)或者實(shí)際判別性能的參數(shù),如簡(jiǎn)單線性回歸中的a和b;
- Step 2:確定損失函數(shù)和目標(biāo)函數(shù)
- 接下來,圍繞建模的目標(biāo),我們需要合理設(shè)置損失函數(shù),并在此基礎(chǔ)之上設(shè)置目標(biāo)函數(shù),當(dāng)然,在很多情況下,這二者是相同的。例如,在上述簡(jiǎn)單線性回歸中,我們的建模目標(biāo)就是希望y=ax+b這條直線能夠盡可能的擬合(1,2)、(3,4)這兩個(gè)點(diǎn),或者說盡可能“穿過”這兩個(gè)點(diǎn),因此我們?cè)O(shè)置了SSE作為損失函數(shù),也就是預(yù)測(cè)值和真實(shí)值的差值平方和。當(dāng)然,在計(jì)算過程中不難發(fā)現(xiàn),SSE是一個(gè)包含了a和b這兩個(gè)變量的方程,因此SSE本身也是一個(gè)函數(shù)(a和b的二元函數(shù)),并且在線性回歸中,SSE既是損失函數(shù)(用于衡量真實(shí)值和預(yù)測(cè)值差值的函數(shù)),同時(shí)也是我們的目標(biāo)函數(shù)(接下來需要優(yōu)化、或者說要求最小值的函數(shù))。這里尤其需要注意的是,損失函數(shù)不是模型,而是模型參數(shù)所組成的一個(gè)函數(shù)。
- Step 3:根據(jù)目標(biāo)函數(shù)特性,選擇優(yōu)化方法,求解目標(biāo)函數(shù)
- 之前提到,目標(biāo)函數(shù)既承載了我們優(yōu)化的目標(biāo)(讓預(yù)測(cè)值和真實(shí)值盡可能接近),同時(shí)也是包含了模型參數(shù)的函數(shù),因此完成建模需要確定參數(shù)、優(yōu)化結(jié)果需要預(yù)測(cè)值盡可能接近真實(shí)值這兩方面需求就統(tǒng)一到了求解目標(biāo)函數(shù)最小值的過程中了,也就是說,當(dāng)我們圍繞目標(biāo)函數(shù)求解最小值時(shí),也就完成了模型參數(shù)的求解。當(dāng)然,這個(gè)過程本質(zhì)上就是一個(gè)數(shù)學(xué)的最優(yōu)化過程,求解目標(biāo)函數(shù)最小值本質(zhì)上也就是一個(gè)最優(yōu)化問題,而要解決這個(gè)問題,我們就需要靈活適用一些最優(yōu)化方法。當(dāng)然,在具體的最優(yōu)化方法的選擇上,函數(shù)本身的性質(zhì)是重要影響因素,也就是說,不同類型、不同性質(zhì)的函數(shù)會(huì)影響優(yōu)化方法的選擇。在簡(jiǎn)單線性回歸中,由于目標(biāo)函數(shù)是凸函數(shù),我們根據(jù)凸函數(shù)性質(zhì),判斷偏導(dǎo)函數(shù)取值為0的點(diǎn)就是最小值點(diǎn),進(jìn)而完成a、b的計(jì)算(也就是最小二乘法),其實(shí)就是通過函數(shù)本身的性質(zhì)進(jìn)行最優(yōu)化方法的選取。
二、第一個(gè)優(yōu)化算法:最小二乘法
??前面提到,利用優(yōu)化方法求解目標(biāo)函數(shù)其實(shí)是機(jī)器學(xué)習(xí)建模過程中最為核心的環(huán)節(jié),因此,我們有必要將圍繞上述簡(jiǎn)單線性回歸問題,進(jìn)一步討論最小二乘法背后的數(shù)學(xué)邏輯和優(yōu)化思想,同時(shí)簡(jiǎn)單探討數(shù)據(jù)的矩陣表示方法和基本矩陣運(yùn)算。雖然最小二乘法并不是主流的深度學(xué)習(xí)損失函數(shù)的優(yōu)化算法,但從最小二乘法入手了解優(yōu)化算法背后的數(shù)學(xué)邏輯,卻是非常有必要,同時(shí),線性方程也是構(gòu)建神經(jīng)網(wǎng)絡(luò)模型的基礎(chǔ),因此,我們有必要深入探討線性模型建模細(xì)節(jié)以及最基本的優(yōu)化算法:最小二乘法。
1.最小二乘法的代數(shù)表示方法
??從更加嚴(yán)格的數(shù)學(xué)角度出發(fā),最小二乘法有兩種表示形式,分別是代數(shù)法表示和矩陣表示。我們先看最小二乘法的代數(shù)表示方法。
首先,假設(shè)多元線性方程有如下形式
?令𝑤=(𝑤1,𝑤2,...𝑤𝑑),𝑥=(𝑥1,𝑥2,...𝑥𝑑),則上式可寫為
在機(jī)器學(xué)習(xí)領(lǐng)域,我們將線性回歸自變量系數(shù)命名為w,其實(shí)是weight的簡(jiǎn)寫,意為自變量的權(quán)重。
多元線性回歸的最小二乘法的代數(shù)法表示較為復(fù)雜,此處先考慮簡(jiǎn)單線性回歸的最小二乘法表示形式。在簡(jiǎn)單線性回歸中,w只包含一個(gè)分量,x也只包含一個(gè)分量,我們令此時(shí)的𝑥𝑖就是對(duì)應(yīng)的自變量的取值,此時(shí)求解過程如下
優(yōu)化目標(biāo)可寫為
通過偏導(dǎo)為0求得最終結(jié)果的最小二乘法求解過程為:
?進(jìn)而可得
其中,(𝑥𝑖,𝑦𝑖)代表二維空間中的點(diǎn)。針對(duì)二維空間內(nèi)的(1,2)和(3,4)兩個(gè)點(diǎn),我們可以使用torch中運(yùn)算函數(shù)手動(dòng)計(jì)算w和b,本部分留作練習(xí),用于同學(xué)們課后復(fù)習(xí)對(duì)此前學(xué)習(xí)的張量基本運(yùn)算相關(guān)知識(shí)。
2.最小二乘法的矩陣表示形式
??從《Lesson 4》的矩陣部分內(nèi)容不難理解,對(duì)于線性方程組來說,矩陣表示是一種更加簡(jiǎn)潔的表示方式,并且對(duì)于支持?jǐn)?shù)組運(yùn)算的torch來說,線性方程組的矩陣表示也更貼近代碼的實(shí)際書寫形式。首先先回顧《Lesson 4》中提到的將上述方程轉(zhuǎn)化為矩陣的過程。線性方程如下
?在轉(zhuǎn)化為矩陣表示的過程中,我們令
則原方程組可表示為?
?更為一般的情況下,多元線性回歸方程為
?令
- 𝑤? :方程系數(shù)所組成的向量,并且我們將自變量系數(shù)和截距放到了一個(gè)向量中,此處𝑤??就相當(dāng)于前例中的a、b組成的向量(a,b);
- 𝑥? :方程自變量和1共同組成的向量;
因此,方程可表示為
另外,我們將所有自變量的值放在一個(gè)矩陣中,并且和此前A矩陣類似,為了捕捉截距,添加一列全為1的列在矩陣的末尾,設(shè)總共有m組取值,則
對(duì)應(yīng)到前例中的A矩陣,A矩陣就是擁有一個(gè)自變量、兩個(gè)取值的X矩陣。令y為因變量的取值,則有
此時(shí),SSE可表示為:
根據(jù)最小二乘法的求解過程,令𝐸(𝑤??)對(duì)𝑤? 求導(dǎo)方程取值為0,有
進(jìn)一步可得?
要使得此式有解,等價(jià)于𝑋^𝑇𝑋(也被稱為矩陣的交叉乘積crossprod存在逆矩陣,若存在,則可解出?
3.最小二乘法的簡(jiǎn)單實(shí)現(xiàn)
回到最初的例子,不難發(fā)現(xiàn),有如下對(duì)應(yīng)關(guān)系:
手動(dòng)實(shí)現(xiàn)代碼驗(yàn)證最小二乘法?
X = A X #tensor([[1., 1.], # [3., 1.]])y = B y #tensor([[2.], # [4.]])X.t() #tensor([[1., 3.], # [1., 1.]])w = torch.mm(torch.mm(torch.inverse(torch.mm(X.t(),X)),X.t()),y) w #tensor([[1.0000], # [1.0000]])和此前結(jié)果保持一致。當(dāng)然,最小二乘法作為最優(yōu)化問題的求解方法,我們可以這么理解w最終取值:當(dāng)w取值為(1,1)時(shí),自變量為w的SSE函數(shù)取得全域最小值。
當(dāng)然,我們也可以直接調(diào)用最小二乘法函數(shù)torch.lstsq(B, A)進(jìn)行求解
torch.lstsq(y, X) #先輸入y再輸入x #torch.return_types.lstsq( #solution=tensor([[1.0000], # [1.0000]]), #QR=tensor([[-3.1623, -1.2649], # [ 0.7208, -0.6325]]))對(duì)于lstsq函數(shù)來說,第一個(gè)參數(shù)是因變量張量,第二個(gè)參數(shù)是自變量張量,并且同時(shí)返回結(jié)果還包括QR矩陣分解的結(jié)果,QR分解也是一種矩陣分解方法,后續(xù)在涉及到QR分解內(nèi)容時(shí)會(huì)詳細(xì)進(jìn)行講解。
另外,在最小二乘法數(shù)學(xué)推導(dǎo)過程,涉及到矩陣范數(shù)的運(yùn)算,在PyTorch中,我們使用linalg.norm函數(shù)求向量或矩陣的范數(shù)
注意,老版本教材會(huì)推薦使用norm函數(shù)進(jìn)行求解,但實(shí)際上新版pytorch已經(jīng)開始推薦使用linalg.norm替換norm進(jìn)行范數(shù)運(yùn)算,因此更推薦使用linalg.norm函數(shù)
t = torch.tensor([-1, 2.]) t #tensor([-1., 2.])# 默認(rèn)情況,求解L2范數(shù),個(gè)元素的平方和開平方 torch.linalg.norm(t) #tensor(2.2361)torch.sqrt(torch.tensor(5.)) #tensor(2.2361)# 輸入?yún)?shù),求解L1范數(shù),個(gè)元素的絕對(duì)值之和 torch.linalg.norm(t, 1) tensor(3.)#4.反向驗(yàn)證導(dǎo)數(shù)為零
??當(dāng)然,我們也可以反向驗(yàn)證,看下?lián)p失函數(shù)SSE在a=1,b=1時(shí)偏導(dǎo)數(shù)是否都為0。此時(shí)就需要借助PyTorch中的autograd模塊來進(jìn)行偏導(dǎo)計(jì)算。嚴(yán)格意義上來講,autograd模塊是PyTorch中的自動(dòng)微分模塊,我們可以通過autograd模塊中的函數(shù)進(jìn)行微分運(yùn)算,在神經(jīng)網(wǎng)絡(luò)模型中,通過自動(dòng)微分運(yùn)算求解梯度是模型優(yōu)化的核心。關(guān)于微分計(jì)算梯度進(jìn)而執(zhí)行優(yōu)化的相關(guān)方法我們會(huì)在后續(xù)逐步介紹,此處我們僅適用autograd模塊來進(jìn)行簡(jiǎn)單的微分計(jì)算嘗試,也就是對(duì)SSE進(jìn)行偏導(dǎo)計(jì)算,判斷a、b同時(shí)取值為1時(shí)偏導(dǎo)是否為0。
??對(duì)于目前我們所適用的PyTorch 1.7.1版本來說,我們可以直接在張量Tensor中進(jìn)行微分運(yùn)算。目前市面上流通的PyTorch教材有些會(huì)介紹Variable類,在進(jìn)行微分運(yùn)算時(shí)需提前將Tensor類轉(zhuǎn)化為Variable類,但其實(shí)在PyTorch 0.4版本以后Tensor就已經(jīng)不僅僅是一個(gè)純計(jì)算的載體,而是可以支持微分運(yùn)算,Variable的概念被逐漸弱化,可微分性也變成了Tensor的一個(gè)基本屬性,我們只需要在創(chuàng)建Tensor時(shí),通過設(shè)置requires_grad屬性為True、規(guī)定張量可微分即可。
a = torch.tensor(1.,requires_grad = True) a #tensor(1., requires_grad=True) '''此時(shí)a就是一個(gè)可微分的張量,requires_grad是a的一個(gè)屬性,可以查看可以修改。'''# 查看可微分性 a.requires_grad #True# 修改可微分性 a.requires_grad = False a.requires_grad #Falsea.requires_grad = Trueb = torch.tensor(1.,requires_grad = True) b #tensor(1., requires_grad=True)然后創(chuàng)建損失函數(shù)
sse = torch.pow((2 - a - b), 2) + torch.pow((4 - 3 * a - b), 2) '''使用torch.autograd.grad進(jìn)行偏導(dǎo)運(yùn)算,并輸出a=1、b=1時(shí)偏導(dǎo)數(shù)的值'''torch.autograd.grad(sse,[a, b]) #(tensor(-0.), tensor(-0.))至此,也可驗(yàn)證(1,1)是損失函數(shù)的最小值點(diǎn)。
- torch.autograd.grad函數(shù)
torch.autograd.grad是通用微分函數(shù),當(dāng)只輸入一個(gè)自變量時(shí)計(jì)算結(jié)果就是導(dǎo)數(shù),輸入多個(gè)自變量時(shí)則會(huì)計(jì)算偏導(dǎo)數(shù)。
總結(jié)
以上是生活随笔為你收集整理的Lesson 5.基本优化思想与最小二乘法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lesson 4.张量的线性代数运算
- 下一篇: Lesson 6.动态计算图与梯度下降入