深度學習是機器學習中一種基于對數據進行表征學習的算法。觀測值(例如一幅草莓照片)可以使用
多種方式來表示,如每個像素強度值的向量,或者更抽象地表示成一系列邊、特定形狀的區域等。
深度學習的最主要特征是使用神經網絡作爲計算模型。神經網絡模型 得名于其對于動物神經元傳遞信息方式的模拟。
實際上,現在的神經網絡模型,和神經,已經沒有特别大的關系了。
深度學習的深度,一般指神經網絡的層數。一般有2-3個隐藏層;深層神經網絡,隐藏層可能有150層;
背景知識梳理:
神經網絡的定義
神經網絡(Neural Networks)是一種模拟人腦神經元連接方式的計算模型,用于處理信息、學習和識别模式。它由大量相互連接的神經元(或稱爲節點、單元)組成,每個神經元接收來自其他神經元的輸入信号,并根據這些信号産生輸出。神經網絡通過調整神經元之間的連接權重來學習和适應新數據。
發展脈絡
- 起源:神經網絡的靈感來源于生物學中的神經系統。1943年,心理學家Warren McCulloch和數學家Walter Pitts提出了第一個基于生物神經系統的計算模型。
- 感知機:1957年,Frank Rosenblatt發明了感知機(Perceptron),這是一種簡單的二元線性分類器,可以學習并解決一些基本問題。然而,它不能處理異或(XOR)等非線性問題。
- 反向傳播算法:1986年,Rumelhart、Hinton和Williams提出了反向傳播(Backpropagation)算法,這是訓練多層神經網絡的關鍵技術。它允許網絡學習更複雜的非線性模式。
- 深度學習:2006年,Hinton等人提出了“深度學習”的概念,并展示了如何使用無監督預訓練和有監督微調來訓練深度置信網絡(DBN)。這标志着深度學習時代的開始。
- 卷積神經網絡(CNN):Yann LeCun等人在1998年提出了卷積神經網絡(Convolutional Neural Networks, CNN),用于圖像識别。CNN在圖像處理任務中表現出色。
- 循環神經網絡(RNN):RNN是爲了處理序列數據而設計的,它能夠捕捉序列中的時間依賴性。RNN在自然語言處理(NLP)和語音識别等領域有廣泛應用。
- 生成對抗網絡(GAN):2014年,Goodfellow等人提出了生成對抗網絡(Generative Adversarial Networks, GAN),它由生成器和判别器兩個神經網絡組成,用于生成逼真的新數據。
- Transformer架構:2017年,Vaswani等人提出了Transformer架構,它完全基于自注意力機制(self-attention),并在自然語言處理任務中取得了巨大成功,如BERT、GPT等模型。
神經網絡的類型與關鍵技術構成
- 前饋神經網絡:信息從輸入層單向傳遞到輸出層,沒有循環或反饋連接。關鍵技術包括激活函數(如ReLU、sigmoid、tanh等)、權重初始化和正則化(如L1、L2正則化)。
- 卷積神經網絡(CNN):專門用于處理圖像數據。關鍵技術包括卷積層、池化層、全連接層和激活函數。CNN通過卷積層提取圖像特征,并通過池化層降低數據維度。
- 循環神經網絡(RNN):處理序列數據,如文本或時間序列數據。關鍵技術包括循環連接、長短時記憶單元(LSTM)和門控循環單元(GRU),用于捕捉序列中的長期依賴性。
- 生成對抗網絡(GAN):由生成器和判别器組成,通過對抗性訓練生成新數據。關鍵技術包括生成器和判别器的設計、損失函數的選擇以及訓練策略。
- 自編碼器:用于無監督學習,嘗試複制其輸入到輸出。關鍵技術包括編碼器和解碼器的設計,以及損失函數(如均方誤差)的選擇。
- Transformer架構:基于自注意力機制處理序列數據。關鍵技術包括多頭自注意力機制、位置編碼和前饋神經網絡層。
如何構建神經網絡
構建神經網絡通常涉及以下步驟:
- 定義網絡結構:确定輸入層、隐藏層和輸出層的神經元數量以及層與層之間的連接方式。
- 初始化權重和偏置:随機初始化神經元的權重和偏置值。
- 選擇激活函數:爲神經網絡的每一層選擇一個激活函數。
- 定義損失函數:根據任務類型(分類、回歸等)選擇合适的損失函數。
- 選擇優化器:如梯度下降、随機梯度下降(SGD)、Adam等,用于更新權重和偏置以最小化損失函數。
- 訓練網絡:使用訓練數據集進行前向傳播計算損失,然後通過反向傳播算法計算梯度并更新權重和偏置。
- 評估網絡性能:使用驗證數據集評估網絡的性能,并根據需要進行調整(如超參數調優)。
- 應用網絡:使用測試數據集評估網絡的最終性能,并将其應用于實際任務中。
示例
使用TensorFlow構建簡單的神經網絡進行MNIST手寫數字分類
Python
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.losses import SparseCategoricalCrossentropy
from tensorflow.keras.optimizers import Adam
# 加載MNIST數據集
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# 數據預處理:歸一化和展平
train_images = train_images.reshape((60000, 28 * 28)) / 255.0
test_images = test_images.reshape((10000, 28 * 28)) / 255.0
# 構建神經網絡模型
model = Sequential([
Dense(128, activation='relu', input_shape=(28 * 28,)), # 輸入層與第一個隐藏層
Dense(64, activation='relu'), # 第二個隐藏層
Dense(10, activation='softmax') # 輸出層,10個類别(0-9)
])
# 編譯模型:指定損失函數、優化器和評估指标
model.compile(optimizer=Adam(),
loss=SparseCategoricalCrossentropy(),
metrics=['accuracy'])
# 訓練模型
model.fit(train_images, train_labels, epochs=5, batch_size=32)
# 評估模型性能
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f'Test accuracy: {test_acc}')
這段代碼使用TensorFlow庫構建了一個簡單的三層神經網絡(包括輸入層、兩個隐藏層和一個輸出層),用于對MNIST手寫數字數據集進行分類。通過調整網絡結構、激活函數、損失函數和優化器等組件,可以進一步優化模型的性能。