書名: 深度學(xué)習(xí)進(jìn)階:自然語言處理作者名: (日)齋藤康毅本章字?jǐn)?shù): 2359字更新時(shí)間: 2021-02-07 09:25:55
1.1 數(shù)學(xué)和Python的復(fù)習(xí)
我們先來復(fù)習(xí)一下數(shù)學(xué)。具體來說,就是以神經(jīng)網(wǎng)絡(luò)的計(jì)算所需的向量、矩陣等為主題展開討論。為了順利地切入神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn),這里將一并展示相應(yīng)的Python代碼,特別是基于NumPy的代碼。
1.1.1 向量和矩陣
在神經(jīng)網(wǎng)絡(luò)中,向量和矩陣(或者張量)隨處可見。本節(jié)將對這些術(shù)語進(jìn)行簡單的整理,為讀者閱讀本書做準(zhǔn)備。
我們從向量開始。向量是同時(shí)擁有大小和方向的量。向量可以表示為排成一排的數(shù)字集合,在Python實(shí)現(xiàn)中可以處理為一維數(shù)組。與此相對,矩陣是排成二維形狀(長方陣)的數(shù)字集合。向量和矩陣的例子如圖1-1所示。

圖1-1 向量和矩陣的例子
如圖1-1所示,向量和矩陣可以分別用一維數(shù)組和二維數(shù)組表示。另外,在矩陣中,將水平方向上的排列稱為行(row),將垂直方向上的排列稱為列(column)。因此,圖1-1中的矩陣可以稱為“3行2列的矩陣”,記為“3×2的矩陣”。
將向量和矩陣擴(kuò)展到N維的數(shù)據(jù)集合,就是張量。
向量是一個(gè)簡單的概念,請注意有兩種方式表示向量。如圖1-2所示,一種是在垂直方向上排列(列向量)的方法,另一種是在水平方向上排列(行向量)的方法。

圖1-2 向量的表示方法
在數(shù)學(xué)和深度學(xué)習(xí)等許多領(lǐng)域,向量一般作為列向量處理。不過,考慮到實(shí)現(xiàn)層面的一致性,本書將向量作為行向量處理(每次都會注明是行向量)。此外,在數(shù)學(xué)式中寫向量或矩陣時(shí),會用x或W等粗體表示,以將它們與單個(gè)元素(標(biāo)量)區(qū)分開。在源代碼中,會用x或W這樣的字體表示。
在Python的實(shí)現(xiàn)中,在將向量作為行向量處理的情況下,會將向量明確變形為水平方向上的矩陣。比如,當(dāng)向量的元素個(gè)數(shù)是N時(shí),將其處理為形狀為1×N的矩陣。我們后面會看一個(gè)具體的例子。
下面,我們使用Python的對話模式來生成向量和矩陣。當(dāng)然,這里將使用處理矩陣的標(biāo)準(zhǔn)庫NumPy。
>>> import numpy as np >>> x = np.array([1 , 2 , 3]) >>> x. class # 輸出類名 <class 'numpy.ndarray'> >>> x.shape (3,) >>> x.ndim 1 >>> W = np.array([[1 , 2 , 3] , [4 , 5 , 6]]) >>> W.shape (2, 3) >>> W.ndim 2
如上所示,可以使用np.array()方法生成向量或矩陣。該方法會生成NumPy的多維數(shù)組類np.ndarray。np.ndarray類有許多便捷的方法和實(shí)例變量。上面的例子中使用了實(shí)例變量shape和ndim。shape表示多維數(shù)組的形狀,ndim表示維數(shù)。從上面的結(jié)果可知,x是一維數(shù)組,是一個(gè)元素個(gè)數(shù)為3的向量;而W是一個(gè)二維數(shù)組,是一個(gè)2×3(2行3列)的矩陣。
1.1.2 矩陣的對應(yīng)元素的運(yùn)算
前面我們把數(shù)字的集合組織為了向量或矩陣,現(xiàn)在利用它們進(jìn)行一些簡單的運(yùn)算。首先,我們看一下“對應(yīng)元素的運(yùn)算”。順便說一下,“對應(yīng)元素的”的英文是“element-wise”。
>>> W = np.array([[1 , 2 , 3] , [4 , 5 , 6]]) >>> X = np.array([[0 , 1 , 2] , [3 , 4 , 5]]) >>> W + X array([[ 1, 3, 5], [ 7, 9, 11]]) >>> W * X array([[ 0, 2, 6], [12, 20, 30]])
這里對NumPy多維數(shù)組執(zhí)行了+、*等運(yùn)算。此時(shí),運(yùn)算是對應(yīng)多維數(shù)組中的元素(獨(dú)立)進(jìn)行的,這就是NumPy數(shù)組中的對應(yīng)元素的運(yùn)算。
1.1.3 廣播
在NumPy多維數(shù)組中,形狀不同的數(shù)組之間也可以進(jìn)行運(yùn)算,比如下面這個(gè)計(jì)算。
>>> A = np.array([[1 , 2] , [3 , 4]]) >>> A * 10 array([[10, 20], [30, 40]])
這個(gè)計(jì)算是一個(gè)2×2的矩陣A乘以標(biāo)量10。此時(shí),如圖1-3所示,標(biāo)量10先被擴(kuò)展為2×2的矩陣,之后進(jìn)行對應(yīng)元素的運(yùn)算。這個(gè)靈巧的功能稱為廣播(broadcast)。

圖1-3 廣播的例子1:標(biāo)量10被處理為2 × 2的矩陣
下面再看另一個(gè)廣播的例子。
>>> A = np.array([[1 , 2] , [3 , 4]]) >>> b = np.array([10 , 20]) >>> A * b array([[10, 40], [30, 80]])
在這個(gè)計(jì)算中,如圖1-4所示,一維數(shù)組b被“靈巧地”擴(kuò)展成了與二維數(shù)組A相同的形狀。

圖1-4 廣播的例子2
像這樣,因?yàn)镹umPy有廣播功能,所以可以智能地執(zhí)行不同形狀的數(shù)組之間的運(yùn)算。
為了使NumPy的廣播功能生效,多維數(shù)組的形狀需要滿足幾個(gè)規(guī)則。關(guān)于廣播的詳細(xì)規(guī)則,請參考文獻(xiàn)[1]。
1.1.4 向量內(nèi)積和矩陣乘積
接著,我們來看一下向量內(nèi)積和矩陣乘積的相關(guān)內(nèi)容。首先,向量內(nèi)積可以表示為

這里假設(shè)有x=(x1,···, xn)和y=(y1,···, yn)兩個(gè)向量。此時(shí),如式(1.1)所示,向量內(nèi)積是兩個(gè)向量對應(yīng)元素的乘積之和。
向量內(nèi)積直觀地表示了“兩個(gè)向量在多大程度上指向同一方向”。如果限定向量的大小為1,當(dāng)兩個(gè)向量完全指向同一方向時(shí),它們的向量內(nèi)積是1。反之,如果兩個(gè)向量方向相反,則內(nèi)積為-1。
下面再來看一下矩陣乘積。矩陣乘積可以按照圖1-5所示的步驟計(jì)算。

圖1-5 矩陣乘積的計(jì)算方法
如圖1-5所示,矩陣乘積通過“左側(cè)矩陣的行向量(水平方向)”和“右側(cè)矩陣的列向量(垂直方向)”的內(nèi)積(對應(yīng)元素的乘積之和)計(jì)算得出。此時(shí),計(jì)算結(jié)果保存在新矩陣的對應(yīng)元素中。比如,A的第1行和B的第1列的結(jié)果保存在第1行第1列的元素中,A的第2行和B的第1列的結(jié)果保存在第2行第1列的元素中。
現(xiàn)在,我們用Python實(shí)現(xiàn)一下向量內(nèi)積和矩陣乘積。為此,可以利用np.dot()。
# 向量內(nèi)積 >>> a = np.array([1 , 2 , 3]) >>> b = np.array([4 , 5 , 6]) >>> np.dot(a , b) 32 # 矩陣乘積 >>> A = np.array([[1 , 2] , [3 , 4]]) >>> B = np.array([[5 , 6] , [7 , 8]]) >>> np.dot(A , B) array([[19, 22], [43, 50]])
如上所示,向量內(nèi)積和矩陣乘積中都使用了np.dot()。當(dāng)np.dot(x, y)的參數(shù)都是一維數(shù)組時(shí),計(jì)算向量內(nèi)積。當(dāng)參數(shù)都是二維數(shù)組時(shí),計(jì)算矩陣乘積。
除了這里看到的np.dot()方法外,NumPy還有很多其他的進(jìn)行矩陣計(jì)算的便捷方法。如果能熟練掌握這些方法,神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)就會更順利。
熟能生巧
要掌握NumPy,實(shí)際動手練習(xí)是最有效的。比如,“100 numpy exercises”[2]中準(zhǔn)備了100道NumPy的練習(xí)題。如果你想積累NumPy經(jīng)驗(yàn),請?zhí)魬?zhàn)一下。
1.1.5 矩陣的形狀檢查
在使用矩陣和向量的計(jì)算中,很重要的一點(diǎn)就是要注意它們的形狀。這里,我們留意著矩陣的形狀,再來看一下矩陣乘積。前面已經(jīng)介紹過了矩陣乘積的計(jì)算步驟,所以這里我們將重點(diǎn)放在圖1-6所示的“形狀檢查”上。

圖1-6 形狀檢查:在矩陣乘積中,要使對應(yīng)維度的元素個(gè)數(shù)一致
圖1-6展示了基于3×2的矩陣A和2×4的矩陣B生成3×4的矩陣C的示例。此時(shí),如該圖所示,需要對齊矩陣A和矩陣B的對應(yīng)維度的元素個(gè)數(shù)。作為計(jì)算結(jié)果的矩陣C的形狀由A的行數(shù)和B的列數(shù)組成。這就是矩陣的形狀檢查。
在矩陣乘積等計(jì)算中,注意矩陣的形狀并觀察其變化的形狀檢查非常重要。據(jù)此,神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)可以更順利地進(jìn)行。
- 智能機(jī)器的未來
- 解構(gòu)ChatGPT
- COMSOL Multiphysics工程實(shí)踐與理論仿真
- 創(chuàng)造性思維:人工智能之父馬文·明斯基論教育
- DeepSeek高效提問指南:提出好問題,才有好答案
- 自己動手制作無人機(jī)
- 人工智能初探2
- 圖解大模型:生成式AI原理與實(shí)戰(zhàn)
- 機(jī)器人智能視覺感知與深度學(xué)習(xí)應(yīng)用
- 人工智能算法
- 計(jì)算機(jī)視覺的對象級場景理解及其應(yīng)用
- 人工智能初學(xué)者指南
- 深入淺出圖神經(jīng)網(wǎng)絡(luò):GNN原理解析
- 如何創(chuàng)造可信的AI
- 機(jī)器人驅(qū)動與控制及應(yīng)用實(shí)例