官术网_书友最值得收藏!

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í),會用xW等粗體表示,以將它們與單個(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)行。

主站蜘蛛池模板: 濉溪县| 合阳县| 大城县| 乐平市| 新乡县| 中方县| 韶山市| 华阴市| 元阳县| 博野县| 台中县| 贵德县| 神木县| 买车| 隆德县| 晋宁县| 仙居县| 平谷区| 金昌市| 洛宁县| 台前县| 公主岭市| 印江| 宜良县| 望江县| 通江县| 达拉特旗| 大足县| 惠东县| 新昌县| 漯河市| 鲜城| 泰来县| 宁强县| 海口市| 游戏| 青阳县| 靖边县| 邳州市| 舞钢市| 施甸县|