返回文章列表

深度學習入門建構神經網路

本文探討深度學習核心技術,包含建構神經網路、反向傳播機制、過擬合問題與最佳化策略、啟用函式選擇及詞嵌入分析。文章以 MNIST 手寫數字辨識和電影評論情感分析為例,闡述如何應用這些技術提升模型效能,並透過程式碼範例與圖表解析,讓讀者更清晰地理解深度學習的運作方式與實務應用。

深度學習 機器學習

深度學習模型的建構並非單純堆積疊網路層,更需理解資料特性與模型學習模式。透過非線性啟用函式與反向傳播機制,深度神經網路能有效建立輸入與輸出間的複雜關聯。為避免過擬合,則需運用早期停止、Dropout 等正則化技術。針對不同任務,選擇合適的啟用函式如 ReLU、Sigmoid、Tanh 與 Softmax 至關重要。此外,詞嵌入技術能捕捉詞彙間的語義關係,提升自然語言處理任務的效能。

破解資料關聯的迷思:建構深度神經網路的基礎

在探討深度學習的過程中,我們經常面臨輸入資料與輸出結果之間缺乏直接關聯性的挑戰。單一神經網路的訓練往往難以奏效,因為它僅僅尋找輸入層和輸出層之間的直接關聯,而忽略了資料本身的複雜特性。

曾經在一個街道號誌辨識專案中,我們遇到了類別似的問題:新的資料集輸入和輸出之間毫無明顯的關聯。單純增加網路層數並不能解決問題,因為連續的線性變換本質上等同於單一線性變換,只是計算成本更高。

流程解密:上圖對比了單一網路和堆積疊網路的結構差異,展示了堆積疊網路如何透過多層隱藏層處理複雜資料。

雖然堆積疊網路看起來更為複雜,但如果沒有適當的非線性機制,它並不能比單一網路提供更多的能力。解決方案在於巧妙地運用堆積疊網路,透過多層非線性變換來建立輸入資料與輸出結果之間的複雜關聯。

建立關聯性:堆積疊網路的實作技巧

我們可以利用第一個網路建立一個中間資料集,使其與輸出資料產生有限的關聯性。接著,第二個網路便能利用這層有限的關聯性來準確預測輸出。這種方法就像搭建橋樑,將原本不相連的輸入和輸出資料連線起來。

流程解密:此圖展示瞭如何利用兩個串聯的網路來建立輸入資料與輸出結果之間的複雜對映關係。

反向傳播:深度神經網路的核心訓練機制

堆積疊網路的關鍵在於反向傳播(Backpropagation)機制,它是一種將誤差訊號從輸出層傳遞回隱藏層的方法。透過反向傳播,我們可以計算每個權重對誤差的貢獻程度,並據此調整權重以降低誤差。

內容解密:反向傳播機制使得深度神經網路能夠有效地學習複雜的資料表示,透過逐層傳遞誤差訊號來最佳化網路引數。

非線性啟用函式:突破線性變換的侷限

堆積疊網路的另一個關鍵要素是非線性啟用函式的運用。如果沒有非線性啟用函式,堆積疊網路的效能將會受到限制,因為連續的線性變換等同於單一線性變換。非線性啟用函式(如ReLU)能夠引入非線性特性,使網路能夠學習更複雜的資料表示。

內容解密:非線性啟用函式的引入使得深度神經網路能夠學習和表示更複雜的函式,從而解決許多實際問題。

建構你的第一個深度神經網路:實戰

以下是一個完整的Python程式碼範例,展示瞭如何建構一個三層神經網路並進行訓練:

import numpy as np

np.random.seed(1)

def relu(x):
    return (x > 0) * x

def relu2deriv(output):
    return output > 0

alpha = 0.2
hidden_size = 4

streetlights = np.array([[1, 0, 1],
                         [0, 1, 1],
                         [0, 0, 1],
                         [1, 1, 1]])

walk_vs_stop = np.array([[1, 1, 0, 0]]).T

weights_0_1 = 2 * np.random.random((3, hidden_size)) - 1
weights_1_2 = 2 * np.random.random((hidden_size, 1)) - 1

for iteration in range(60):
    layer_2_error = 0
    for i in range(len(streetlights)):
        layer_0 = streetlights[i:i+1]
        layer_1 = relu(np.dot(layer_0, weights_0_1))
        layer_2 = np.dot(layer_1, weights_1_2)

        layer_2_error += np.sum((layer_2 - walk_vs_stop[i:i+1]) ** 2)
        
        layer_2_delta = (layer_2 - walk_vs_stop[i:i+1])
        layer_1_delta = layer_2_delta.dot(weights_1_2.T) * relu2deriv(layer_1)

        weights_1_2 -= alpha * layer_1.T.dot(layer_2_delta)
        weights_0_1 -= alpha * layer_0.T.dot(layer_1_delta)

    if(iteration % 10 == 9):
        print("Error:", str(layer_2_error))

程式碼解密:

  • weights_0_1weights_1_2 分別代表輸入層到隱藏層,以及隱藏層到輸出層的權重矩陣。
  • relu函式用於引入非線性特性,使隱藏層能夠學習更複雜的資料表示。
  • 反向傳播過程透過計算layer_2_deltalayer_1_delta來更新權重,最小化預測誤差。

深度學習中的過度擬合挑戰與最佳化策略

在機器學習領域,特別是在深度學習的應用中,過度擬合(overfitting)是一個常見且棘手的問題。本章節將探討過度擬合的成因、影響以及在MNIST手寫數字資料集上訓練三層神經網路的最佳化策略,以提升模型的泛化能力。

過度擬合的定義與影響

過度擬合是指機器學習模型在訓練資料上表現出色,但對於未見過的測試資料卻表現不佳的現象。這種情況通常發生在模型過於複雜,而訓練資料相對有限時。過度擬合的模型就像一個學生死記硬背了考試題目,卻無法理解題目背後的知識點,因此在遇到新的題目時表現不佳。

過度擬合的成因

  1. 模型複雜度過高:當模型的引數過多,而訓練資料不足時,模型容易學習到訓練資料中的噪聲和細節,而非資料的整體特徵。
  2. 訓練時間過長:長時間的訓練可能導致模型過度學習訓練資料,從而忽略了模型的泛化能力。
  3. 資料量不足:當訓練資料量太少時,模型無法充分學習到資料的普遍規律,容易過度擬合。

MNIST資料集上的三層神經網路

MNIST是一個手寫數字資料集,包含60,000個訓練樣本和10,000個測試樣本。我們使用一個具有ReLU啟用函式的隱藏層的三層神經網路來訓練這個資料集。

程式碼實作

import numpy as np
from keras.datasets import mnist

# 載入MNIST資料集
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 資料預處理
x_train = x_train.reshape(60000, 784).astype('float32') / 255
x_test = x_test.reshape(10000, 784).astype('float32') / 255

# 定義神經網路模型
def relu(x):
    return (x > 0) * x

def relu2deriv(output):
    return output > 0

# 初始化權重
np.random.seed(0)
weights_0_1 = 2 * np.random.random((784, 100)) - 1
weights_1_2 = 2 * np.random.random((100, 10)) - 1

# 訓練模型
alpha = 0.005
iterations = 300

for iteration in range(iterations):
    layer_2_error = 0
    for i in range(len(x_train)):
        # 前向傳播
        layer_0 = x_train[i:i+1]
        layer_1 = relu(np.dot(layer_0, weights_0_1))
        layer_2 = np.dot(layer_1, weights_1_2)

        # 誤差計算
        layer_2_error += np.sum((layer_2 - y_train[i:i+1]) ** 2)

        # 反向傳播
        layer_2_delta = (layer_2 - y_train[i:i+1])
        layer_1_delta = layer_2_delta.dot(weights_1_2.T) * relu2deriv(layer_1)

        # 權重更新
        weights_1_2 -= alpha * layer_1.T.dot(layer_2_delta)
        weights_0_1 -= alpha * layer_0.T.dot(layer_1_delta)

    if (iteration % 10 == 9):
        print("Error:" + str(layer_2_error))

神經網路結構視覺化

內容解密: 此Plantuml圖表展示了我們使用的三層神經網路結構,包括具有784個節點的輸入層、100個節點的隱藏層以及10個節點的輸出層。這種結構能夠有效地處理MNIST資料集中的手寫數字影像。

最佳化策略

為了避免過度擬合並提升模型的泛化能力,我們可以採用以下幾種策略:

  1. 正則化技術:在損失函式中新增正則化項,以懲罰過大的權重,從而簡化模型。
  2. 提前停止:監控模型在驗證集上的表現,當表現開始下降時停止訓練,以防止過度擬合。
  3. 資料增強:透過對訓練資料進行旋轉、縮放等變換,增加資料的多樣性,從而提升模型的泛化能力。
  4. Dropout:在訓練過程中隨機丟棄部分神經元,以減少模型的複雜度並防止過度擬合。

透過這些策略,我們可以有效地提升神經網路在MNIST資料集上的表現,並避免過度擬合的問題。這些技術不僅適用於MNIST資料集,也能夠推廣到其他影像分類別任務中,為深度學習模型的最佳化提供了寶貴的經驗。

透過早期停止與Dropout技術避免神經網路過擬合

在訓練神經網路時,一個常見的挑戰是如何避免過擬合。過擬合是指模型過於精確地學習訓練資料,以至於無法有效地泛化到未見過的資料。玄貓將透過一個簡單的比喻來解釋這個現象,並介紹兩種常用的正則化技術:早期停止和Dropout。

想像一下,你正在製作一個模具,用來識別餐叉。你用一堆積三叉的餐叉、湯匙和刀子來製作這個模具。你反覆將餐叉壓入濕黏土中,塑造出一個餐叉的輪廓。乾燥後,你發現湯匙和刀子都無法放入模具,但所有三叉的餐叉都可以。

但是,如果有人給你一個四叉的餐叉呢?你的模具只學習了三叉餐叉的形狀,因此四叉餐叉無法放入。儘管它也是餐叉,但模具過於精確地擬合了訓練資料(三叉餐叉),導致它無法識別新的餐叉型別。

過擬合的成因與解決方案

過擬合的產生是因為網路學習了資料中的雜訊,而不是僅根據真實訊號做出決策。在餐叉的例子中,雜訊是指餐叉的叉齒數量。在影像中,雜訊是指那些超出“狗”本質的獨特之處,例如背景、光線等。

那麼,如何讓神經網路只學習訊號而忽略雜訊呢?一種方法是早期停止。大量的雜訊來自於影像的細粒度細節,而大多數訊號(對於物體)存在於影像的整體形狀和顏色中。

早期停止:最簡單的正則化方法

早期停止的核心思想很簡單:當網路的效能開始下降時,停止訓練。在餐叉模具的例子中,需要多次壓印才能創造出完美的三叉餐叉輪廓。最初的幾次壓印通常只捕捉到餐叉的淺層輪廓。神經網路也是如此。因此,早期停止是最簡單與經濟的正則化形式。

要判斷何時停止訓練,需要使用驗證集。驗證集是用於評估模型效能的資料集,它不同於訓練集和測試集。

Dropout:業界標準的正則化技術

Dropout是一種更強大的正則化技術。在訓練過程中,隨機將網路中的神經元設定為 0。這使得神經網路只能使用其隨機子集進行訓練,有效地防止網路過度依賴任何單個神經元或特徵。

流程解密: 上圖展示了一個簡單的神經網路結構,包含輸入層、兩個隱藏層和輸出層。Dropout技術會在訓練過程中隨機停用隱藏層中的神經元,如圖中以不同顏色標示的節點。

Dropout 的有效性可能源於它迫使網路學習更魯棒的特徵表示,使其不易受到個別神經元或特徵的影響。

Dropout:模擬小型網路的訓練方式

Dropout 的核心概念是在訓練過程中隨機關閉部分神經元,使大型網路在訓練時表現得像小型網路。透過隨機選擇不同的子網路進行訓練,整個網路仍然保持其表達能力,同時降低了過擬合的風險。

流程解密: 上圖展示了 Dropout 的作用方式。Dropout Mask 會隨機關閉隱藏層的部分神經元,使網路在訓練過程中更加簡潔。

Dropout 的原理:整合學習的應用

Dropout 可以視為一種整合學習方法。每個經過 Dropout 訓練的子網路都略有不同,它們會學習到不同的雜訊,但都能捕捉到主要的訊號。當這些子網路進行預測時,它們的雜訊會相互抵消,而共同學習到的訊號則會被保留下來。

Dropout 的程式碼實作

以下程式碼片段展示瞭如何在 MNIST 分類別模型中應用 Dropout:

i = 0
layer_0 = images[i:i+1]
dropout_mask = np.random.randint(2,size=layer_1.shape)
layer_1 *= dropout_mask * 2
layer_2 = np.dot(layer_1, weights_1_2)
# ... 後續程式碼 ...

內容解密:

這段程式碼的核心在於 dropout_mask。它是一個由 0 和 1 組成的隨機矩陣,用於模擬神經元的關閉。layer_1 *= dropout_mask * 2layer_1 中的數值與 dropout_mask 相乘,相當於隨機關閉了一半的神經元。乘以 2 的目的是為了彌補關閉神經元帶來的數值損失,確保訓練和測試時 layer_1 的數值範圍一致。

輸出層啟用函式的選擇:Sigmoid 與 Softmax 的深入比較

在神經網路架構中,輸出層啟用函式的選擇對於模型的效能和預測準確性至關重要。對於不同型別的分類別問題,Sigmoid 和 Softmax 函式提供了不同的解決方案。本文將探討這兩種函式的特性、數學原理及其在實際應用中的差異。

Sigmoid 函式:獨立機率建模

Sigmoid 函式是一種將輸入值對映到 0 和 1 之間的啟用函式,常用於二元分類別問題。其數學表示式為:

σ(x) = 1 / (1 + e^(-x))

在多標籤分類別問題中,Sigmoid 函式可以獨立地為每個輸出節點建模機率。這意味著每個類別的預測是獨立的,不會直接影響其他類別的機率。

Sigmoid 的優缺點

  • 優點:能夠處理多標籤分類別問題,每個標籤的預測是獨立的。
  • 缺點:在單標籤分類別問題中,可能導致機率解釋不明確,因為它沒有強制各類別機率之間的競爭關係。

Softmax 函式:互斥機率建模

Softmax 函式主要用於單標籤多類別分類別問題,能夠將多個類別的預測值轉化為一個機率分佈。其數學表示式為:

Softmax(x_i) = e^(x_i) / Σ_j e^(x_j)

其中,x_i 是第 i 個類別的輸入,Σ_j e^(x_j) 是所有類別輸入的指數和。

Softmax 的特性

  1. 機率歸一化:Softmax 確保所有類別的機率之和為 1,形成一個有效的機率分佈。
  2. 競爭機制:Softmax 函式透過指數運算放大了不同類別之間的差異,使得機率分佈更加集中在最可能的類別上。
  3. 敏感性:Softmax 對輸入值的微小變化非常敏感,特別是在輸入值接近時。

Sigmoid 與 Softmax 的比較

| 特性 | Sigmoid | Softmax | |


|


–|


–| | 適用場景 | 多標籤分類別 | 單標籤多類別分類別 | | 機率解釋 | 獨立機率 | 相對機率 | | 競爭關係 | 無直接競爭 | 有競爭關係 | | 輸出特性 | 各標籤機率獨立 | 各標籤機率之和為 1 |

實務應用中的選擇

  1. 單標籤分類別:優先選擇 Softmax,因為它能夠提供清晰的單一預測結果。
  2. 多標籤分類別:使用 Sigmoid,因為它允許每個標籤獨立預測。

程式碼範例

以下是一個使用 Python 和 NumPy 實作 Sigmoid 和 Softmax 函式的範例:

import numpy as np

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def softmax(x):
    e_x = np.exp(x - np.max(x))  # 提高數值穩定性
    return e_x / e_x.sum(axis=0)

# 示例輸入
x = np.array([1, 2, 3, 4, 5])

# Sigmoid 輸出
sigmoid_output = sigmoid(x)
print("Sigmoid 輸出:", sigmoid_output)

# Softmax 輸出
softmax_output = softmax(x)
print("Softmax 輸出:", softmax_output)

內容解密:

這段程式碼展示了 Sigmoid 和 Softmax 函式的實作。Sigmoid 函式將每個輸入值獨立對映到 0 和 1 之間,而 Softmax 函式則將輸入值轉化為一個機率分佈。在實際應用中,應根據具體的分類別任務選擇合適的啟用函式,以最佳化模型的效能。

深度學習啟用函式:ReLU 與 Sigmoid 的反向傳播技巧解析

在神經網路的前向傳播中,增加啟用函式相對簡單,但在反向傳播中如何正確地處理啟用函式則更為微妙。本文將探討 ReLU 和 Sigmoid 啟用函式在反向傳播中的作用機制,並以 MNIST 手寫數字辨識為例,展示如何應用這些技術提升模型效能。

ReLU 啟用函式與反向傳播

先前在設計分散式系統時,我發現一個有趣的現象:ReLU 函式會將小於零的輸入值強制設為零。在反向傳播計算 layer_1_delta 時,我們也對應地將 ReLU 輸出為零的神經元之 delta 設為零。進一步研究後發現,這背後有更深層次的原理。

觀察 ReLU 函式的圖形,其在正數區間的斜率為 1,在負數區間的斜率為 0。這意味著,微小的輸入變化對正數輸出有 1:1 的影響,而對負數輸出則沒有影響。這個斜率代表 ReLU 輸出對輸入變化的敏感度。

由於 delta 的作用是告知前一層如何調整輸入以減少誤差,因此將反向傳播的 delta 乘以 ReLU 的斜率至關重要。如此一來,delta 便能反映每個神經元對誤差的貢獻程度。程式碼實作如下:

def relu(x):
    return (x >= 0) * x

def relu2deriv(output):
    return output >= 0

# ... 在反向傳播中 ...
layer_1_delta = layer_2_delta.dot(weights_1_2.T) * relu2deriv(layer_1)

內容解密:

這段程式碼展示瞭如何使用 relu2deriv 函式計算 ReLU 啟用函式的導數。在反向傳播過程中,這個導數與 layer_2_delta 相乘,用於更新隱藏層的權重。ReLU 的導數在輸出大於或等於零時為 1,否則為 0,這使得只有對最終輸出有貢獻的神經元才會被更新。

Sigmoid 啟用函式與反向傳播

ReLU 和 Sigmoid 的關鍵區別在於斜率的變化方式。Sigmoid 的斜率隨著輸入變化而平滑地改變。

流程解密:

此 Plantuml 圖表展示了 ReLU 和 Sigmoid 函式的不同處理路徑。ReLU 將負值設為零,而 Sigmoid 將輸入壓縮到 0 和 1 之間。

Sigmoid 函式的斜率在輸入接近 0 時最大,而在輸入趨近正無窮或負無窮時趨近於 0。這意味著,當 Sigmoid 神經元的輸入非常大或非常小時,權重的小幅調整對其輸出的影響很小。這種特性使得網路在訓練過程中能夠穩定地學習。

MNIST 手寫數字辨識模型最佳化

理論上,Tanh 函式更適合作為隱藏層的啟用函式,而 Softmax 更適合作為輸出層的啟用函式。實際測試也證實了這一點,使用 Tanh 和 Softmax 的模型達到了更高的準確率。

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def sigmoid_deriv(output):
    return output * (1 - output)

def tanh(x):
    return np.tanh(x)

def tanh_deriv(output):
    return 1 - (output ** 2)

內容解密:

這段程式碼展示瞭如何使用不同的啟用函式及其導數。在實際應用中,選擇合適的啟用函式可以顯著提升模型的效能。例如,Tanh 函式能夠避免梯度消失問題,而 Softmax 能夠將輸出轉換為機率分佈,方便進行多分類別任務。

卷積神經網路的深度解析與實踐應用

卷積神經網路(CNN)作為深度學習的核心技術之一,在影像處理領域展現出卓越的效能。本文將探討CNN的核心概念、技術實作及其在實際場景中的應用價值。

CNN架構解析

CNN的核心架構由輸入層、卷積層、池化層、全連線層和輸出層組成。其中,卷積層是CNN的核心元件,負責提取輸入資料的特徵。

卷積運算原理

卷積運算是CNN中的關鍵技術,其本質是利用可學習的卷積核在輸入資料上進行滑動視窗操作,提取區域性特徵。以3x3的卷積核為例,其運算過程可表示為:

import numpy as np

def convolution(input_data, kernel):
    output = np.zeros((input_data.shape[0] - kernel.shape[0] + 1, 
                       input_data.shape[1] - kernel.shape[1] + 1))
    for i in range(output.shape[0]):
        for j in range(output.shape[1]):
            output[i, j] = np.sum(input_data[i:i+kernel.shape[0], j:j+kernel.shape[1]] * kernel)
    return output

# 示例:3x3卷積核的應用
input_data = np.random.rand(5, 5)
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])
output = convolution(input_data, kernel)
print("卷積輸出結果:\n", output)

內容解密:

上述程式碼展示了基本的卷積運算實作。核心要點包括:

  1. 輸入資料與卷積核的尺寸比對驗證
  2. 滑動視窗的步長控制(本例中為1)
  3. 對應元素相乘累加的運算過程

CNN的技術優勢

  1. 權重分享機制
    CNN透過權重分享機制大幅減少了模型引數數量,提高了訓練效率並降低了過擬合風險。

  2. 階層式特徵提取
    CNN能夠自動從低階特徵(如邊緣、紋理)逐層抽象出高階語義特徵(如物體部件、整體結構)。

實戰案例分析

以MNIST手寫數字辨識任務為例,我們構建了一個簡單的CNN模型:

from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential([
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    layers.MaxPooling2D((2, 2)),
    layers.Flatten(),
    layers.Dense(64, activation='relu'),
    layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

內容解密:

該模型架構包含以下關鍵元件:

  1. 卷積層(Conv2D):使用32個3x3的卷積核提取特徵
  2. 最大池化層(MaxPooling2D):採用2x2的池化視窗降低特徵維度
  3. 全連線層(Dense):最終輸出10類別的機率分佈

CNN的最佳實踐

在實際應用中,應根據具體任務特點選擇合適的CNN架構:

  1. 適當調整卷積核大小以比對特徵尺度
  2. 合理組態池化層以平衡特徵保留和維度降低
  3. 採用適當的啟用函式以增強模型的非線性表達能力

CNN憑藉其強大的特徵提取能力和靈活的架構設計,在電腦視覺領域取得了令人矚目的成就。未來,隨著技術的不斷進步,CNN有望在更多實際場景中發揮重要作用。

從詞彙關聯到語義理解:探索電影評論神經網路的學習模式

在電影評論情感分析的神經網路訓練中,我們觀察到網路準確度逐步提升:

Iter:0 Progress:95.99% Training Accuracy:0.832%
Iter:1 Progress:95.99% Training Accuracy:0.8663333333333333%
Test Accuracy:0.849

這顯示網路正在學習輸入資料(詞彙)與輸出資料(情感標籤)之間的關聯。然而,僅僅找到關聯並不等於理解語言。更重要的是,要理解網路能學習到哪些語言模式,以及哪些模式是它無法捕捉的。

電影評論網路學到了什麼?

網路的輸入是每篇評論的詞彙,輸出是正面或負面標籤。根據關聯總結,我們預期網路至少能識別出與正面或負面標籤具有相關性的詞彙。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 深度神經網路建構架構

package "網路結構" {
    component [輸入層] as input
    component [隱藏層 1] as hidden1
    component [隱藏層 2] as hidden2
    component [輸出層] as output
}

package "啟用函式" {
    component [ReLU] as relu
    component [Sigmoid] as sigmoid
    component [Tanh] as tanh
    component [Softmax] as softmax
}

package "正則化技術" {
    component [Dropout] as dropout
    component [早期停止] as early_stop
    component [L2 正則化] as l2
}

package "應用案例" {
    component [MNIST 手寫辨識] as mnist
    component [情感分析] as sentiment
    component [詞嵌入分析] as embedding
}

input --> hidden1
hidden1 --> relu
relu --> hidden2
hidden2 --> output
output --> softmax

dropout --> hidden1
dropout --> hidden2
early_stop --> output
l2 --> hidden1

softmax --> mnist
sigmoid --> sentiment
embedding --> sentiment

note right of relu
  非線性轉換:
  - 建立複雜關聯
  - 打破線性限制
  - 提升表達能力
end note

note right of dropout
  防止過擬合:
  - 隨機丟棄神經元
  - 提升泛化能力
  - 減少共適應
end note

@enduml

流程解密:

此圖示展示了監督式 NLP 的基本流程,從原始文字輸入到神經網路預測輸出。其中,文字轉換是關鍵步驟,它決定了輸入資料的表示方式,直接影響模型的學習效果。

網路架構如何影響學習?

一個兩層網路(單個權重矩陣直接連線輸入和輸出層)足以識別直接關聯。但我們使用了包含隱藏層的網路。隱藏層的作用是什麼?

隱藏層將前一層的資料點分組。每個隱藏神經元判斷一個資料點是否屬於其分組。有效的資料點分組必須滿足兩個條件:

  1. 有助於預測輸出標籤:如果分組對輸出預測沒有幫助,網路就不會學習這個分組。
  2. 反映資料中的實際現象:好的分組能捕捉到有用的語言現象,而不只是記憶資料。

例如,區分 “terrible” 和 “not terrible” 對於情感分析至關重要。理想情況下,我們希望有一個神經元在看到 “awful” 時關閉,在看到 “not awful” 時開啟。

然而,由於網路的輸入是評論的詞彙,“it was great, not terrible” 和 “it was terrible, not great” 會產生相同的 layer_1 值。因此,網路很難建立理解否定的隱藏神經元。

詞彙與隱藏神經元的權重關係

具有相似預測能力的詞彙應屬於相似的分組(隱藏神經元組態)。這意味著與相似標籤相關聯的詞彙,它們與各個隱藏神經元的連線權重也應相似。這是因為網路會將它們歸類別到相似的隱藏神經元中,以便最後一層 (weights_1_2) 做出正確的預測。

如何視覺化權重相似性?

我們可以使用歐幾裡得距離比較每個詞彙的權重向量(矩陣的行),找出最相似的詞彙:

from collections import Counter
import math

def similar(target='terrible'):
    target_index = word2index[target]
    weights = weights_0_1[target_index]
    closest = float('inf')
    closest_word = None
    
    for word, index in word2index.items():
        if word == target:
            continue
        weight = weights_0_1[index]
        distance = np.linalg.norm(weights - weight)
        
        if distance < closest:
            closest = distance
            closest_word = word
            
    return closest_word

print(similar('terrible'))  # 輸出與 'terrible' 最相似的詞彙

內容解密:

此程式碼片段展示瞭如何計算與目標詞彙(如 “terrible”)最相似的詞彙。它透過比較目標詞彙在嵌入層中的權重向量與其他詞彙的權重向量之間的歐幾裡得距離來實作。距離最近的詞彙被視為最相似的詞彙。

透過這種視覺化和分析,我們可以更深入地理解神經網路如何學習語言模式,以及它在情感分析任務中的表現。這有助於我們進一步最佳化模型和改進訓練方法,以獲得更好的效能和更準確的結果。

神經網路中的詞嵌入分析與相似度計算

在自然語言處理(NLP)任務中,神經網路透過學習詞嵌入(word embeddings)來捕捉詞彙之間的語義關係。詞嵌入是一種將詞彙對映到高維向量空間的技術,使得具有相似語義的詞彙在向量空間中距離較近。本文將探討神經網路如何透過詞嵌入學習語言模式,並分析詞彙之間的相似度。

詞嵌入的生成與意義

在神經網路訓練過程中,詞嵌入是作為網路權重的一部分被學習的。這些權重反映了詞彙與預測目標之間的關聯。在一個簡單的情感分析模型中,詞嵌入根據詞彙對正面或負面情感的預測貢獻進行組織。這意味著詞嵌入的意義完全由其對預測目標的貢獻決定。

詞彙相似度計算程式碼解析

以下程式碼展示瞭如何計算詞彙之間的相似度:

def similar(target='beautiful'):
    target_index = word2index[target]
    scores = Counter()
    for word, index in word2index.items():
        raw_difference = weights_0_1[index] - weights_0_1[target_index]
        squared_difference = raw_difference * raw_difference
        scores[word] = -math.sqrt(sum(squared_difference))
    return scores.most_common(10)

print(similar('beautiful'))
print(similar('terrible'))

內容解密:

這段程式碼的核心功能是透過比較詞彙對應的權重向量來計算它們之間的歐幾裡得距離,從而評估詞彙之間的相似度。具體步驟如下:

  1. 取得目標詞彙的索引:透過word2index字典查詢目標詞彙的索引。
  2. 初始化相似度評分:使用Counter物件scores儲存每個詞彙與目標詞彙的相似度得分。
  3. 計算歐幾裡得距離:遍歷所有詞彙,計算它們與目標詞彙權重向量之間的歐幾裡得距離,並將結果(取負值)作為相似度得分儲存。
  4. 傳回最相似的詞彙:透過most_common(10)方法傳回與目標詞彙最相似的前10個詞彙。
內容解讀:

理解關聯總結現象對於深入理解神經網路的工作原理至關重要。它揭示了神經網路如何透過學習資料中的模式來組織內部表示,從而有效地進行預測。此外,這種現象也強調了詞嵌入的上下文依賴性,即詞嵌入的意義是由其所處的預測任務所決定的。