人工智能開發


深度學習演算法

深度學習是一種基於人工神經網路的機器學習方法,使用多層的神經網路來自動學習數據的特徵。以下是幾種常見的深度學習演算法:

1. 前饋神經網路 (Feedforward Neural Network, FNN)

前饋神經網路是最基本的深度學習架構,其中數據沿著一個方向通過網路,不會形成循環。FNN 對於分類和迴歸問題非常有效。

2. 卷積神經網路 (Convolutional Neural Network, CNN)

CNN 是專門用於處理圖像數據的深度學習網路,它使用卷積層來自動提取圖像中的空間特徵。常用於圖像分類、物體檢測等任務。

3. 循環神經網路 (Recurrent Neural Network, RNN)

RNN 可以處理序列數據,如時間序列、語言模型等。它利用循環結構使網路能夠記憶之前的輸入,廣泛應用於語音識別、自然語言處理等。

長短期記憶網路 (Long Short-Term Memory, LSTM)

LSTM 是 RNN 的一種改進版本,解決了傳統 RNN 中的長期依賴問題,使其能夠在較長的序列中保持關鍵信息。

4. 自編碼器 (Autoencoder)

自編碼器是一種無監督學習方法,用於降維和數據去噪。它將輸入數據壓縮到一個低維的隱藏層,然後嘗試還原原始數據。

5. 生成對抗網路 (Generative Adversarial Network, GAN)

GAN 包含一個生成器和一個鑑別器,生成器試圖生成逼真的數據,而鑑別器則試圖區分真實數據和生成數據。GAN 被廣泛應用於圖像生成、風格遷移等任務。

6. Transformer

Transformer 是一種基於注意力機制的模型,尤其在自然語言處理中表現突出。它能夠處理長序列數據,並且與 RNN 相比,訓練速度更快。



TensorFlow 機器學習框架

1. 基本定義與架構

TensorFlow 是由 Google Brain 團隊開發的開源機器學習框架。它採用資料流圖(Data Flow Graphs)的概念,讓開發者能夠構建複雜的類神經網路。其名稱源自於「Tensor」(張量,即多維陣列)在運算圖中的「Flow」(流動)。

2. 核心組件與階層

TensorFlow 的設計分為多個層次,以平衡靈活性與開發效率:

3. 模型開發生命週期

在 TensorFlow 中開發模型的典型流程如下:

階段 說明
資料準備 使用 tf.data API 進行資料讀取、清洗與預處理。
建立模型 透過 tf.keras.Sequential 或 Functional API 定義網路層。
編譯與訓練 設定優化器 (Optimizer) 與損失函數 (Loss Function),並執行 model.fit()
評估與部署 驗證模型準確度,並匯出為 SavedModel 格式進行部署。

4. 主要優勢與應用

5. 簡單範例程式碼

以下是使用 Keras 建立簡單線性回歸模型的範例:

import tensorflow as tf
import numpy as np

# 建立模型
model = tf.keras.Sequential([
    tf.keras.layers.Dense(units=1, input_shape=[1])
])

# 編譯模型
model.compile(optimizer='sgd', loss='mean_squared_error')

# 準備測試資料
xs = np.array([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
ys = np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float)

# 訓練模型
model.fit(xs, ys, epochs=500, verbose=0)

# 進行預測
print("預測結果:", model.predict([10.0]))


Keras 深度學習 API

1. 基本定義與定位

Keras 是一個用 Python 編寫的高階神經網路 API,旨在實現快速實驗。它最初由 François Chollet 開發,現在作為 TensorFlow 的官方高階介面(tf.keras)。Keras 的核心設計原則是使用者友好、模組化以及易於擴充,讓開發者能以最少的程式碼構建深度學習模型。

2. 核心設計理念

3. 模型建構的三種方式

方式 特點 適用場景
Sequential API 簡單的層堆疊,一層接著一層。 單輸入、單輸出的線性堆疊模型。
Functional API 可定義複雜圖形,支援多輸入/輸出。 殘差網路(ResNet)、多分支模型。
Subclassing 透過繼承 Model 類別自定義行為。 需要完全控制前向傳播邏輯的研發場景。

4. 標準開發流程

在 Keras 中完成一個機器學習任務通常包含以下五個步驟:

  1. 定義模型: 建立模型架構並加入隱藏層。
  2. 編譯模型: 指定優化器(如 Adam)、損失函數(如 CrossEntropy)及評估指標。
  3. 訓練模型: 使用 fit() 函數餵入資料進行學習。
  4. 評估模型: 使用 evaluate() 檢查在測試集上的表現。
  5. 預測: 使用 predict() 產出新資料的預測結果。

5. 程式碼範例

以下是使用 Keras 構建簡單影像分類網路(如 MNIST)的標準寫法:

from tensorflow.keras import layers, models

# 1. 定義 Sequential 模型
model = models.Sequential([
    layers.Flatten(input_shape=(28, 28)), # 輸入層
    layers.Dense(128, activation='relu'), # 隱藏層
    layers.Dropout(0.2),                  # 防止過擬合
    layers.Dense(10, activation='softmax') # 輸出層
])

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

# 3. 訓練 (假設已有 x_train, y_train)
# model.fit(x_train, y_train, epochs=5)

6. Keras 與 TensorFlow 的關係

自 TensorFlow 2.0 起,Keras 已成為其預設的高階 API。這意味著您可以使用 Keras 的簡單語法,同時享有 TensorFlow 底層的分散式訓練、TPU 加速以及強大的部署能力(如 TensorFlow Serving)。



Keras 圖層核心組件

1. 基本定義

在 Keras 中,Layer 是建構神經網路的基本單位。每個圖層封裝了特定的計算邏輯(如矩陣乘法)與狀態(權重權重 weights)。模型本質上就是將多個圖層連接起來,形成資料流向的結構。

2. 核心圖層類型對照表

類別 常用圖層 (tf.keras.layers) 主要功能
基礎層 (Core) Dense 全連接層,執行 \(y = f(Wx + b)\)。
卷積層 (Convolutional) Conv2D, Conv1D 用於特徵提取,常用於影像或時間序列。
池化層 (Pooling) MaxPooling2D, AveragePooling2D 降維並減少計算量,保留關鍵特徵。
循環層 (Recurrent) LSTM, GRU, SimpleRNN 處理序列資料(如文字、股價),具備記憶性。
正規化層 (Regularization) Dropout, BatchNormalization 防止過擬合(Overfitting)並加速收斂。

3. 重要參數說明

4. 常用操作與輔助層

除了計算特徵的圖層外,還有一些用於轉換資料結構的特殊層:

5. 程式碼實作範例

以下展示了在一個影像處理模型中,各類圖層如何協作:

from tensorflow.keras import layers, models

model = models.Sequential([
    # 卷積層提取空間特徵
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)),
    # 池化層壓縮特徵
    layers.MaxPooling2D((2, 2)),
    # 拉平層準備進入全連接
    layers.Flatten(),
    # 全連接層進行學習
    layers.Dense(64, activation='relu'),
    # Dropout 防止過擬合
    layers.Dropout(0.5),
    # 輸出層 (假設 10 個類別)
    layers.Dense(10, activation='softmax')
])

6. 權重與參數計算

每個圖層都有可訓練參數(Trainable Params)。例如 Dense(units=10) 若輸入維度為 50,則參數數量為 \(50 \times 10\)(權重)+ \(10\)(偏置)= \(510\)。您可以使用 model.summary() 來查看各圖層的參數分布情形。



Keras 前饋神經網路

1. FNN 基本定義

前饋神經網路(Feedforward Neural Network, FNN)是最基本的類神經網路架構。資料從輸入層進入,經過一層或多層隱藏層的計算,最後由輸出層產出結果。資料流始終朝向前方,不存在循環或回饋路徑。

2. 建立 FNN 模型範例

以下使用 tf.keras.Sequential 建立一個標準的多層感知器(MLP),適用於結構化資料分類(如 Iris 鳶尾花資料集或房價預測):

from tensorflow.keras import layers, models

def build_fnn_model(input_dim, num_classes):
    model = models.Sequential([
        # 輸入層與第一個隱藏層
        layers.Dense(64, activation='relu', input_shape=(input_dim,)),
        
        # 第二個隱藏層
        layers.Dense(32, activation='relu'),
        
        # 正規化層(選配),減少過擬合
        layers.Dropout(0.2),
        
        # 輸出層 (多分類使用 softmax,回歸則通常不加或加 linear)
        layers.Dense(num_classes, activation='softmax')
    ])
    return model

# 假設輸入特徵有 20 個,分類目標有 3 類
model = build_fnn_model(input_dim=20, num_classes=3)
model.summary()

3. 模型編譯與執行

編譯時需根據任務類型選擇合適的損失函數(Loss Function):

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

# 執行訓練
# model.fit(x_train, y_train, epochs=50, batch_size=32, validation_split=0.2)

4. FNN 關鍵組件對照表

組件名稱 常用設定 功能說明
Dense (全連接層) units=64 將前一層的所有神經元與本層連接,學習特徵間的非線性組合。
ReLU (激活函數) activation='relu' 解決梯度消失問題,是目前隱藏層最常用的激活函數。
Softmax (輸出函數) activation='softmax' 將輸出轉化為機率分佈,所有類別機率總和為 1。
Adam (優化器) optimizer='adam' 自動調整學習率的演算法,通常能獲得較快且穩定的收斂。

5. 應用場景與局限



Keras CNN 範例

1. CNN 核心架構說明

卷積神經網路(Convolutional Neural Network, CNN)主要由卷積層(Convolutional Layer)、池化層(Pooling Layer)以及全連接層(Dense Layer)組成。卷積層負責提取影像空間特徵,池化層負責縮減資料維度,最後由全連接層進行分類決策。

2. 建立 CNN 模型範例

以下使用 tf.keras.Sequential 建立一個經典的 CNN 模型,適用於處理如 MNIST 或 CIFAR-10 的影像分類任務:

from tensorflow.keras import layers, models

def build_cnn_model(input_shape, num_classes):
    model = models.Sequential([
        # 第一組卷積與池化:提取基礎特徵
        layers.Conv2D(32, (3, 3), activation='relu', input_shape=input_shape),
        layers.MaxPooling2D((2, 2)),
        
        # 第二組卷積與池化:提取高階特徵
        layers.Conv2D(64, (3, 3), activation='relu'),
        layers.MaxPooling2D((2, 2)),
        
        # 第三組卷積:進一步強化特徵
        layers.Conv2D(64, (3, 3), activation='relu'),
        
        # 平坦化與全連接層:將特徵圖轉換為分類結果
        layers.Flatten(),
        layers.Dense(64, activation='relu'),
        layers.Dense(num_classes, activation='softmax')
    ])
    return model

# 建立模型 (假設輸入影像為 28x28 灰階,分類數為 10)
model = build_cnn_model(input_shape=(28, 28, 1), num_classes=10)
model.summary()

3. 模型編譯與訓練

建立模型後,需要指定優化器、損失函數與評估指標。對於多分類問題,通常使用 Adam 優化器與 SparseCategoricalCrossentropy

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

# 假設已有準備好的訓練資料 x_train, y_train
# model.fit(x_train, y_train, epochs=10, batch_size=64)

4. 關鍵圖層功能對照表

圖層名稱 關鍵參數範例 主要作用
Conv2D filters=32, kernel_size=(3,3) 透過卷積核與影像運算,提取邊緣、紋理等局部特徵。
MaxPooling2D pool_size=(2,2) 選取區域最大值,降低解析度以減少計算量並避免過擬合。
Flatten 將多維的張量拉平為一維向量,以便進入最後的分類器。
Dense units=10, activation='softmax' 將提取出的特徵映射到具體的類別機率上。

5. 偵錯與效能優化建議



Keras RNN 循環神經網路

1. RNN 核心概念

循環神經網路(Recurrent Neural Network, RNN)專門用於處理序列資料,如時間序列、語音或自然語言。與 FNN 不同,RNN 具備「記憶」能力,隱藏層的神經元會將目前的資訊傳遞給下一個時間步(Time Step),從而捕捉資料中的前後文關聯。

2. 建立 RNN 模型範例

在實際應用中,為了避免長序列產生的「梯度消失」問題,通常使用 LSTMGRU 圖層。以下建立一個簡單的 LSTM 模型來預測時間序列(例如股價或氣溫):

from tensorflow.keras import layers, models

def build_rnn_model(timesteps, features):
    model = models.Sequential([
        # LSTM 層:需要 3D 輸入 (samples, timesteps, features)
        layers.LSTM(50, activation='relu', input_shape=(timesteps, features), return_sequences=True),
        
        # 第二層 LSTM:如果不回傳序列,則 return_sequences=False (預設)
        layers.LSTM(50, activation='relu'),
        
        # 全連接層進行最終輸出
        layers.Dense(25),
        layers.Dense(1) # 假設是回歸問題,預測下一個數值
    ])
    return model

# 假設觀測過去 10 天的資料,每天有 5 個特徵
model = build_rnn_model(timesteps=10, features=5)
model.summary()

3. 資料維度說明

RNN 圖層對於輸入資料的 Shape 要求非常嚴格,這是初學者最常報錯的地方:

維度名稱 說明 範例
Samples 訓練樣本的總數。 1000 筆資料
Timesteps 序列的長度(時間窗口)。 觀察過去 30 天
Features 每個時間點擁有的特徵數量。 開盤價、收盤價、成交量

4. 常用循環圖層對照表

圖層名稱 特點 建議場景
SimpleRNN 最基礎結構,運算快但記憶力極短。 極短序列或簡單模式。
LSTM 具備閘門機制(Gate),能保留長期記憶。 長文本處理、複雜時間序列預測。
GRU LSTM 的簡化版,參數較少,訓練較快。 運算資源有限時的 LSTM 替代方案。

5. 訓練與偵錯建議

# 編譯範例
model.compile(optimizer='adam', loss='mean_squared_error')


Keras LSTM 時間序列預測

1. LSTM 核心架構

長短期記憶網路(Long Short-Term Memory, LSTM)是一種特殊的 RNN,設計初衷是為了解決傳統 RNN 在處理長序列時發生的梯度消失問題。它透過「閘門機制」(遺忘閘、輸入閘、輸出閘)來控制資訊的保留與丟棄,使其能捕捉資料中的長期依賴關係。

2. 建立 LSTM 模型範例

以下建立一個兩層堆疊的 LSTM 模型,常用於股價預測、電力負載預測或氣象感測資料分析:

from tensorflow.keras import layers, models

def build_lstm_model(timesteps, features):
    model = models.Sequential([
        # 第一層 LSTM:必須設定 return_sequences=True 才能將序列傳遞給下一層
        layers.LSTM(units=50, return_sequences=True, input_shape=(timesteps, features)),
        layers.Dropout(0.2), # 防止過擬合
        
        # 第二層 LSTM:最後一層通常不回傳序列
        layers.LSTM(units=50, return_sequences=False),
        layers.Dropout(0.2),
        
        # 全連接層輸出
        layers.Dense(units=1) # 預測單一數值
    ])
    
    model.compile(optimizer='adam', loss='mean_squared_error')
    return model

# 範例:觀測過去 60 個時間點,每個點有 1 個特徵(如價格)
model = build_lstm_model(timesteps=60, features=1)
model.summary()

3. 資料維度轉換 (Reshape)

LSTM 的輸入必須是三維張量 (Samples, Timesteps, Features)。在將資料餵入模型前,通常需要使用 NumPy 進行轉換:

import numpy as np

# 假設原始資料是一維序列
data = np.random.rand(1000, 1) 

# 轉換為 (樣本數, 時間步, 特徵數)
# 例如:每 60 筆預測 1 筆
X_train = []
for i in range(60, 1000):
    X_train.append(data[i-60:i, 0])
X_train = np.array(X_train)
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))

4. 關鍵參數說明

參數名稱 說明
units 隱藏層中的神經元數量,代表模型的記憶容量。
return_sequences 若為 True,輸出整個序列;若為 False,僅輸出最後一個時間步。
input_shape 格式為 (時間長度, 特徵數量),不包含樣本數。
Dropout 在訓練期間隨機將部分單元設為 0,能有效降低模型的過擬合風險。

5. 偵錯建議



Keras 自動編碼器

1. 自動編碼器核心概念

自動編碼器(Autoencoder) 是一種非監督式學習的神經網路,旨在將輸入資料壓縮成低維度的表徵(編碼),再從中重建出原始資料(解碼)。它主要由兩部分組成:

2. 建立簡易自動編碼器範例

以下使用 Keras Functional API 建立一個用於影像去噪或降維的基礎自動編碼器:

from tensorflow.keras import layers, models

# 設定輸入維度 (假設為 28x28 影像拉平後)
input_dim = 784
encoding_dim = 32  # 壓縮後的特徵維度

# 1. 定義編碼器 (Encoder)
input_img = layers.Input(shape=(input_dim,))
encoded = layers.Dense(encoding_dim, activation='relu')(input_img)

# 2. 定義解碼器 (Decoder)
decoded = layers.Dense(input_dim, activation='sigmoid')(encoded)

# 3. 建立自動編碼器模型 (包含輸入到重建輸出)
autoencoder = models.Model(input_img, decoded)

# 4. 建立單獨的編碼器模型 (用於提取特徵)
encoder = models.Model(input_img, encoded)

# 5. 編譯模型 (通常使用 MSE 作為損失函數)
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')

3. 常見應用場景對照表

應用類型 主要用途 特點
資料降維 取代 PCA 能捕捉非線性的特徵關係。
影像去噪 (Denoising) 移除圖片雜訊 輸入含雜訊圖片,目標為原始乾淨圖片。
異常檢測 偵測信用卡盜刷、設備故障 重建誤差 (Reconstruction Error) 過大者即為異常。
生成模型 VAE (變分自動編碼器) 可從編碼空間隨機取樣生成新資料。

4. 深度卷積自動編碼器 (CAE)

處理影像時,使用卷積層效果更佳。編碼器使用 Conv2DMaxPooling2D,解碼器則使用 UpSampling2DConv2DTranspose

# 編碼器部分
x = layers.Conv2D(16, (3, 3), activation='relu', padding='same')(input_img_2d)
x = layers.MaxPooling2D((2, 2), padding='same')(x)

# 解碼器部分
x = layers.Conv2D(16, (3, 3), activation='relu', padding='same')(x)
x = layers.UpSampling2D((2, 2))(x)
decoded = layers.Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)

5. 訓練與效能監控



Keras 生成對抗網路

1. GAN 核心運作機制

生成對抗網路(Generative Adversarial Network, GAN)由兩個相互競爭的神經網路組成:

兩者在訓練過程中不斷進化:生成器學習產生更真實的資料,而辨別器學習成為更敏銳的檢查員。這種動態平衡最終使生成器能夠產生高品質的擬真資料。

2. 建立 GAN 模型組件

以下展示一個基礎的 GAN 結構,用於產生類似 MNIST 的手寫數字:

from tensorflow.keras import layers, models, optimizers

# 1. 定義生成器
def build_generator(latent_dim):
    model = models.Sequential([
        layers.Dense(128, input_dim=latent_dim),
        layers.LeakyReLU(alpha=0.2),
        layers.Dense(256),
        layers.LeakyReLU(alpha=0.2),
        layers.Dense(784, activation='tanh') # 輸出範圍介於 -1 到 1
    ])
    return model

# 2. 定義辨別器
def build_discriminator():
    model = models.Sequential([
        layers.Dense(256, input_dim=784),
        layers.LeakyReLU(alpha=0.2),
        layers.Dropout(0.3),
        layers.Dense(1, activation='sigmoid') # 二元分類:真或假
    ])
    model.compile(loss='binary_crossentropy', optimizer=optimizers.Adam(0.0002, 0.5))
    return model

# 3. 定義對抗網路 (組合模型)
def build_gan(generator, discriminator):
    discriminator.trainable = False # 在組合模型中固定辨別器
    model = models.Sequential([generator, discriminator])
    model.compile(loss='binary_crossentropy', optimizer=optimizers.Adam(0.0002, 0.5))
    return model

3. 訓練流程對照表

GAN 的訓練與一般模型不同,需要交替訓練辨別器與生成器:

訓練階段 操作步驟 訓練目標
訓練辨別器 輸入一半真實圖片、一半偽造圖片,並給予標籤 (1 與 0)。 最大化辨識真偽的準確率。
訓練生成器 透過對抗網路輸入隨機雜訊,並將標籤全部設為 1 (假裝是真貨)。 最小化辨別器識破偽造品的機率。

4. 深度卷積 GAN (DCGAN)

在處理影像時,改用卷積層能大幅提升生成品質。生成器會使用 Conv2DTranspose(轉置卷積)來放大特徵圖:

# 生成器中的轉置卷積層範例
model.add(layers.Conv2DTranspose(128, (4,4), strides=(2,2), padding='same'))
model.add(layers.LeakyReLU(alpha=0.2))

5. 訓練難點與建議



Keras Transformer 模型

1. Transformer 核心機制

Transformer 是一種捨棄了傳統 RNN 循環結構,完全基於注意力機制 (Attention Mechanism) 的架構。它的核心在於「多頭自注意力層」(Multi-Head Self-Attention),能夠同時處理序列中的所有位置,完美解決了長距離依賴問題,是目前 BERT、GPT 等大模型的基石。

2. 建立 Transformer Block

在 Keras 中,我們通常會將 Transformer 的核心單元封裝成一個自定義層或函數。一個標準的 Transformer Block 包含多頭注意力、加法與正規化 (Add & Norm) 以及前饋網路 (Feed Forward)。

from tensorflow import keras
from tensorflow.keras import layers

def transformer_encoder(inputs, head_size, num_heads, ff_dim, dropout=0):
    # 1. 多頭自注意力 (Multi-Head Self-Attention)
    x = layers.MultiHeadAttention(
        key_dim=head_size, num_heads=num_heads, dropout=dropout
    )(inputs, inputs)
    x = layers.Dropout(dropout)(x)
    res = x + inputs # 殘差連接
    x = layers.LayerNormalization(epsilon=1e-6)(res)

    # 2. 前饋網路 (Feed Forward Network)
    x_ff = layers.Dense(ff_dim, activation="relu")(x)
    x_ff = layers.Dropout(dropout)(x_ff)
    x_ff = layers.Dense(inputs.shape[-1])(x_ff)
    x = x_ff + x # 殘差連接
    return layers.LayerNormalization(epsilon=1e-6)(x)

3. 完整分類模型範例

以下展示如何將 Transformer 套用於序列分類任務(如情感分析或時間序列分類):

def build_transformer_model(input_shape, head_size, num_heads, ff_dim, num_transformer_blocks, mlp_units, num_classes, dropout=0):
    inputs = keras.Input(shape=input_shape)
    x = inputs
    
    # 堆疊多個 Transformer Encoder 層
    for _ in range(num_transformer_blocks):
        x = transformer_encoder(x, head_size, num_heads, ff_dim, dropout)

    # 全域平均池化與最後的分類層
    x = layers.GlobalAveragePooling1D(data_format="channels_last")(x)
    for dim in mlp_units:
        x = layers.Dense(dim, activation="relu")(x)
        x = layers.Dropout(dropout)(x)
    
    outputs = layers.Dense(num_classes, activation="softmax")(x)
    return keras.Model(inputs, outputs)

# 範例參數
model = build_transformer_model(
    input_shape=(100, 64), # 100 個時間點,每個點 64 個特徵
    head_size=256,
    num_heads=4,
    ff_dim=4,
    num_transformer_blocks=4,
    mlp_units=[128],
    num_classes=2,
    dropout=0.1
)
model.summary()

4. 關鍵組件對照表

組件名稱 功能說明
MultiHeadAttention 計算序列中不同位置之間的關聯強度,捕捉上下文資訊。
Positional Encoding 由於 Transformer 並行處理,需額外加入位置資訊(通常加在輸入層)。
LayerNormalization 穩定神經元的活動,加速訓練收斂,與 CNN 常用的 Batch Norm 不同。
Residual Connection 透過 x + inputs 讓梯度更容易傳遞,防止深層網路退化。

5. 訓練與偵錯建議



PyTorch 深度學習框架

1. 基本定義與背景

PyTorch 是一個基於 Torch 庫的開源機器學習框架,主要由 Meta(原 Facebook)的 AI 研究團隊開發。它以 Python 優先(Python-first)為設計理念,強調靈活性與動態性,目前已成為學術研究界最受歡迎的框架,並在工業界廣泛應用。

2. 核心特性

3. 核心組件對照表

組件名稱 主要用途
torch.nn 包含各種神經網路層(如 Linear, Conv2d)與損失函數。
torch.optim 提供優化演算法,如 SGD, Adam, RMSprop。
torch.utils.data 處理資料載入,包含 DatasetDataLoader
torchvision 專為電腦視覺設計的工具包,包含常用資料集、模型架構與影像轉換。

4. 標準開發流程

在 PyTorch 中開發模型通常遵循以下步驟:

  1. 準備資料: 繼承 Dataset 類別並使用 DataLoader 進行批次處理。
  2. 定義模型: 繼承 nn.Module,在 __init__ 中定義層,在 forward 中定義前向傳播邏輯。
  3. 設定訓練工具: 選擇損失函數與優化器。
  4. 訓練循環: 執行前向傳播、計算損失、清空梯度、反向傳播、更新參數。

5. 程式碼範例

以下是一個簡單的線性回歸模型實作:

import torch
import torch.nn as nn

# 1. 定義模型架構
class LinearModel(nn.Module):
    def __init__(self):
        super(LinearModel, self).__init__()
        self.linear = nn.Linear(1, 1) # 輸入 1, 輸出 1

    def forward(self, x):
        return self.linear(x)

model = LinearModel()

# 2. 定義損失函數與優化器
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

# 3. 訓練循環 (簡化版)
# for inputs, targets in dataloader:
#     outputs = model(inputs)
#     loss = criterion(outputs, targets)
#     optimizer.zero_grad()
#     loss.backward()
#     optimizer.step()

6. 與 TensorFlow 的比較



使用 PyTorch 建立多組時間序列數據的分類器

透過 PyTorch 架構的分類器模型,對多組時間序列數據進行分類

步驟 1:數據準備

假設多組時間序列數據為已標記的數據集,包含不同的分類標籤。我們需要將數據預處理成適合 PyTorch 的 DatasetDataLoader 格式,以便用於訓練和測試。

資料準備範例:

import torch
from torch.utils.data import DataLoader, Dataset

# 假設每組數據有多個時間點的特徵
class TimeSeriesDataset(Dataset):
def __init__(self, data, labels):
self.data = data
self.labels = labels
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
return torch.tensor(self.data[idx], dtype=torch.float32), torch.tensor(self.labels[idx], dtype=torch.long)

步驟 2:建立分類模型

此處使用一個簡單的 長短期記憶網絡(LSTM) 模型來處理時間序列數據,並將最終的輸出分類為多個類別。以下是一個簡單的 LSTM 模型範例。

LSTM 分類模型範例:

import torch.nn as nn

class LSTMClassifier(nn.Module):
def __init__(self, input_size, hidden_size, num_layers, num_classes):
super(LSTMClassifier, self).__init__()
self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, num_classes)

def forward(self, x):
h0 = torch.zeros(num_layers, x.size(0), hidden_size).to(x.device)
c0 = torch.zeros(num_layers, x.size(0), hidden_size).to(x.device)

out, _ = self.lstm(x, (h0, c0))
out = self.fc(out[:, -1, :])
return out

步驟 3:訓練模型

接下來,設定損失函數和優化器,將數據送入模型進行訓練。

訓練範例:

import torch.optim as optim

# 模型參數
input_size = 10 # 每個時間點的特徵數
hidden_size = 64
num_layers = 2
num_classes = 3 # 分類類別數量

model = LSTMClassifier(input_size, hidden_size, num_layers, num_classes)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 訓練迴圈
for epoch in range(num_epochs):
for inputs, labels in train_loader:
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
print(f'Epoch {epoch+1}/{num_epochs}, Loss: {loss.item()}')

步驟 4:測試模型

在測試數據上評估模型的表現。

測試範例:

model.eval()
correct = 0
total = 0

with torch.no_grad():
for inputs, labels in test_loader:
outputs = model(inputs)
_, predicted = torch.max(outputs, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()

print(f'測試準確率: {100 * correct / total:.2f}%')


PyTorch 從支援 CPU 更改為 GPU

問題

一般無法啟用 GPU 的主要原因在於您安裝的 PyTorch 版本是 +cpu 版本。

步驟一:解除安裝現有的 CPU 版 PyTorch

在安裝支援 GPU 的版本前,必須先移除現有的純 CPU 版本,以避免函式庫衝突:

pip uninstall torch torchvision torchaudio

步驟二:安裝支援 CUDA 的 PyTorch 版本

若您的 CUDA 版本是 13.1,您需要安裝對應或相容的 PyTorch 指令。請注意,PyTorch 官方通常會針對特定的 CUDA 版本進行編譯。

請執行以下指令(安裝支援最新 CUDA 版本的 PyTorch):

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124

註:截至目前,PyTorch 官方穩定版可能尚未完全標示 cu131 的標籤,但通常 cu124 或最新的 CUDA 編譯版可以與 13.x 驅動向下相容。

步驟三:驗證 GPU 是否啟用

安裝完成後,請再次執行您的檢查腳本。如果成功,您應該會看到以下結果:

常見注意事項



Transformers

簡介

transformers 是由 Hugging Face 開發的強大套件,專為自然語言處理(NLP)及其他機器學習任務設計。它提供多種預訓練模型的便捷使用方式,使開發者能以最少的設定使用最先進的技術。

主要功能

安裝方式

可以使用 pip 安裝 transformers 套件:

pip install transformers

快速上手

以下是一個使用預訓練模型進行文本分類的簡單範例:

from transformers import pipeline

# 載入情感分析管道
classifier = pipeline("sentiment-analysis")

# 執行情感分析
results = classifier("Hugging Face 的 Transformers 套件非常棒!")
print(results)

常見應用場景

結論

transformers 套件是 NLP 領域開發者與研究人員的重要工具。其豐富的模型庫與友善的 API 讓它成為構建與部署最先進機器學習應用的首選。



Transformers 模型生成

基本範例

from transformers import AutoModelForCausalLM, AutoTokenizer

# 選擇預訓練模型,例如 GPT-2
model_name = "gpt2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)

# 輸入提示
prompt = "很久很久以前,在一個遙遠的國度,"

# 將輸入轉換為模型的編碼格式
input_ids = tokenizer.encode(prompt, return_tensors="pt")

# 使用模型生成文本
output = model.generate(
    input_ids,
    max_length=50,  # 生成的最大字數
    num_return_sequences=1,  # 返回的文本數量
    temperature=0.7,  # 控制生成的多樣性
    top_k=50,  # 限制候選單字的範圍
    top_p=0.9,  # 使用核取樣
    do_sample=True  # 啟用抽樣以產生多樣的輸出
)

# 將生成的編碼轉回文本
generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
print(generated_text)

參數說明

簡單應用範例

創意文本生成

prompt = "在未來的人工智能時代,"
output = model.generate(
    tokenizer.encode(prompt, return_tensors="pt"),
    max_length=100,
    temperature=1.0,
    top_p=0.95,
    do_sample=True
)
print(tokenizer.decode(output[0], skip_special_tokens=True))

技術文件補全

prompt = "人工智慧的主要功能是"
output = model.generate(
    tokenizer.encode(prompt, return_tensors="pt"),
    max_length=50,
    temperature=0.5,
    do_sample=False  # 使用確定性生成
)
print(tokenizer.decode(output[0], skip_special_tokens=True))

結論

上述範例展示了如何使用 transformers 模型進行文本生成。根據不同需求,您可以調整參數來生成多樣化或精確的文本,適用於創意生成、補全技術文件等場景。



更改 Transformers 模型的快取目錄

設定快取目錄

在使用 Hugging Face 的 transformers 套件時,模型和分詞器的預訓練檔案會下載並儲存在預設的快取目錄中。若需更改快取目錄,可在載入模型或分詞器時指定 cache_dir 參數。

範例:更改模型快取目錄

from transformers import AutoModel, AutoTokenizer

# 自訂快取目錄
cache_directory = "./my_custom_cache"

# 載入模型與分詞器,指定快取目錄
model = AutoModel.from_pretrained("bert-base-uncased", cache_dir=cache_directory)
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased", cache_dir=cache_directory)

範例:全域設定快取目錄

您也可以透過設定環境變數來更改全域的快取目錄,確保所有模型和分詞器均使用相同的快取位置。

import os
from transformers import AutoModel, AutoTokenizer

# 設定全域快取目錄
os.environ["TRANSFORMERS_CACHE"] = "./my_global_cache"

# 載入模型與分詞器
model = AutoModel.from_pretrained("bert-base-uncased")
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

檢查快取目錄

要檢查預設快取目錄的位置,可以使用以下程式碼:

from transformers.utils import default_cache_path

print("預設快取目錄:", default_cache_path)

應用場景

結論

透過設定 cache_dir 或環境變數,您可以輕鬆管理 Transformers 套件的快取目錄,提升專案的靈活性和資源管理效率。



AI 模型預設下載目錄及更改方式

1. 預設下載目錄

大部分 AI 框架(如 Hugging Face Transformers)的模型在下載時會存放到預設的目錄中,以便重複使用。以下是一些常見框架的預設目錄:

2. 更改預設下載目錄的方法

有些模型檔案很大,需要做一些管理。可以透過環境變數或程式參數更改預設下載目錄,以下是一些具體方法:

2.1 Hugging Face Transformers

透過環境變數 HF_HOMETRANSFORMERS_CACHE 修改。

export HF_HOME=/your/custom/path
export TRANSFORMERS_CACHE=/your/custom/path
    

或在程式中指定:

from transformers import AutoModel

import os
os.environ["HF_HOME"] = "/your/custom/path"
os.environ["TRANSFORMERS_CACHE"] = "/your/custom/path"

model = AutoModel.from_pretrained("model-name")
    

2.2 TensorFlow Hub

設定環境變數 TFHUB_CACHE_DIR

export TFHUB_CACHE_DIR=/your/custom/path
    

在程式中設定:

import os
os.environ["TFHUB_CACHE_DIR"] = "/your/custom/path"
    

2.3 PyTorch Hub

設定環境變數 TORCH_HOME

export TORCH_HOME=/your/custom/path
    

在程式中設定:

import os
os.environ["TORCH_HOME"] = "/your/custom/path"
    

3. 確認目錄是否正確

確認模型是否下載到指定目錄,可以檢查目錄內容:

ls /your/custom/path
    

或者在程式中列印當前目錄:

import os
print(os.environ.get("HF_HOME"))
print(os.environ.get("TRANSFORMERS_CACHE"))
    

4. 常見注意事項



GPU 模型檔案格式

1. FP16(半精度浮點)模型

檔案類型: 標準 Hugging Face 模型檔案(pytorch_model.bin),轉換為 FP16 格式。

用途: 相較於 FP32,FP16 降低了記憶體使用量並提高計算效能。

使用情境: 常用於 PyTorch 或 TensorFlow 的 GPU 推理。

儲存為 FP16 的方法:

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("model_name")
model.half()  # 轉換為 FP16 格式
model.save_pretrained("./fp16_model")

2. BF16(Brain Floating Point)模型

檔案類型: 與 FP16 類似,但設計上具備更好的數值穩定性。

用途: 在支援 BF16 的 GPU(例如 NVIDIA A100、H100)上進行穩定的推理與訓練。

使用方法:

model = AutoModelForCausalLM.from_pretrained("model_name", torch_dtype="torch.bfloat16").cuda()

3. INT8 量化模型

檔案類型: 經 INT8 量化後的 Hugging Face 模型檔案。

用途: 顯著降低記憶體使用量,效能損失較小。

儲存 INT8 模型的方法:

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("model_name", device_map="auto", load_in_8bit=True)
model.save_pretrained("./int8_model")

4. ONNX(開放神經網路交換格式)模型

檔案類型: .onnx

用途: 跨平台 GPU 推理,支援 ONNX Runtime 和 TensorRT。

轉換為 ONNX 的方法:

pip install optimum[onnxruntime]
optimum-cli export onnx --model=model_name ./onnx_model

ONNX 推理範例:

from onnxruntime import InferenceSession

session = InferenceSession("model.onnx", providers=["CUDAExecutionProvider"])

5. TensorRT 模型

檔案類型: .engine

用途: NVIDIA 專屬格式,用於高效能推理,支援 FP16 和 INT8。

轉換為 TensorRT 的方法:

trtexec --onnx=model.onnx --saveEngine=model.engine --fp16

TensorRT 推理範例:

import tensorrt as trt

6. 其他 GPU 相關格式

TorchScript 模型: 使用 PyTorch 的 .pt 格式。

儲存範例:

scripted_model = torch.jit.script(model)
scripted_model.save("model.pt")

格式比較

格式 檔案副檔名 最佳化用途 框架
FP16 .bin 通用 GPU 推理 PyTorch, TensorFlow
BF16 .bin 數值穩定性 PyTorch, TensorFlow
INT8 .bin 低記憶體 GPU Hugging Face + bitsandbytes
ONNX .onnx 跨平台 GPU ONNX Runtime, TensorRT
TensorRT .engine NVIDIA GPU TensorRT


GGML

概念

GGML(General Graphical Model Layer)是一種針對高效能和低資源場景設計的機器學習模型格式。其核心目的是實現模型的高效存儲和推理,特別適用於內存受限的設備。

特點

用途

工具和庫

模型轉換

將機器學習模型轉換為 GGML 格式的步驟:

  1. 下載原始模型檔案(如 PyTorch 格式的 pytorch_model.bin)。
  2. 使用量化工具進行轉換,例如 llama.cpp 提供的轉換腳本。
  3. 生成 GGML 格式的模型檔案,例如 model.ggml.q4_0.bin

優勢



Llama 模型

1. Llama 模型是什麼?

Llama(Large Language Model Meta AI)是由 Meta 開發的大型語言模型,專為生成自然語言文本、回答問題以及進行語言理解任務而設計。

這些模型以其高效性著稱,能在相對較少的硬體資源下提供高品質的文本生成結果。

2. Llama 的應用場景

自然語言生成: 用於創作故事、文章或對話。

問答系統: 支援用戶查詢並生成準確答案。

語言翻譯: 支援多種語言間的翻譯任務。

語言理解: 適用於摘要、情感分析等任務。

3. Llama 的特點

效率高: 相較於其他大型模型,Llama 訓練所需資源更少。

開放性: Meta 提供了對研究與商業應用的支持,促進了社群的發展。

靈活性: 模型可以在多種硬體平台上運行,包括 CPU 和 GPU。

4. 如何使用 Llama 模型

1. 安裝所需工具:

pip install transformers
pip install sentencepiece

2. 加載模型:

from transformers import AutoModelForCausalLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b")
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b").cuda()

input_text = "Llama 是什麼?"
input_ids = tokenizer(input_text, return_tensors="pt").input_ids.cuda()

output = model.generate(input_ids, max_length=50)
print(tokenizer.decode(output[0]))

5. 模型版本

Llama 提供了多個版本,主要區分在於模型的參數量(如 7B、13B、70B):

6. 在 CPU 和 GPU 上使用

CPU: 可以使用 GGUF 格式進行高效推理。

GPU: 支援 FP16 或 BF16 格式以提升性能。

7. 模型的優化和量化

FP16 量化: 降低記憶體使用並提高推理速度。

INT8 量化: 適用於資源受限的設備,減少性能損失。



Mistral 模型

1. Mistral 是什麼?

Mistral 是一款由 Mistral AI 開發的大型語言模型,專注於提供高效、精確的自然語言處理能力。

該模型以其高度優化的架構和精簡的運算資源需求而著稱,適用於各類語言生成與理解任務。

2. Mistral 的特點

高效性: Mistral 採用最新的 Transformer 架構設計,提供快速且準確的推理能力。

開放性: Mistral 模型是開源的,允許用戶在本地運行並進行自定義。

可擴展性: 模型支持多種量化格式,適用於不同的硬體環境。

隱私保護: 可在本地環境中部署,避免數據洩漏的風險。

3. Mistral 的應用場景

內容生成: 包括文章撰寫、對話生成和文案創作。

語言理解: 用於文本分類、情感分析等任務。

教育應用: 提供教學輔助,解答學術問題。

自動化系統: 集成到客服系統或其他自動化流程中。

4. 如何使用 Mistral 模型

1. 安裝依賴:

pip install transformers

2. 下載模型: 從 Hugging Face 或其他官方來源下載 Mistral 模型檔案。

3. 加載模型:

from transformers import AutoModelForCausalLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B")
model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B").cuda()

input_text = "Mistral 是什麼?"
input_ids = tokenizer(input_text, return_tensors="pt").input_ids.cuda()

output = model.generate(input_ids, max_length=50)
print(tokenizer.decode(output[0]))

5. 支援的硬體架構

CPU: 支援高效能的 CPU 推理,可使用 GGUF 格式進行優化。

GPU: 支援 FP16 或 BF16 格式,可在 NVIDIA GPU 上提供最佳性能。

6. 模型版本

Mistral 提供多種版本,主要區別在於參數量和性能:

7. 優化與量化

量化格式: 使用 INT8 或 GGUF 格式降低記憶體需求,提升推理效率。

性能優化: 利用硬體特性(如 AVX 指令集或 CUDA 加速)實現高效運算。



Gemma 模型

1. Gemma 是什麼?

Gemma 是一種專為高效自然語言處理任務設計的開源大型語言模型。

該模型以其多功能性和可擴展性為核心,支援文本生成、語言理解以及多種語言的翻譯任務。

2. Gemma 的特點

多語言支持: Gemma 能夠處理多種語言,使其適合於全球化應用場景。

輕量化: 模型針對資源受限的硬體進行了高度優化。

可擴展性: 支持在多種硬體環境下運行,包括 CPU 和 GPU。

開源性: 開放源代碼,方便用戶進行二次開發和自定義。

3. Gemma 的應用場景

自然語言生成: 適用於內容創作、文章撰寫和對話生成。

語言理解: 包括情感分析、主題分類以及文本摘要等任務。

機器翻譯: 提供高準確度的多語言翻譯服務。

教育與研究: 作為教學輔助工具或研究分析平台。

4. 如何使用 Gemma 模型

1. 安裝依賴:

pip install gemma

2. 下載模型: 從官方網站或模型庫中下載適合的 Gemma 模型檔案。

3. 加載模型:

from gemma import GemmaModel, GemmaTokenizer

# 初始化 Tokenizer 和模型
tokenizer = GemmaTokenizer.from_pretrained("gemma-ai/gemma-base")
model = GemmaModel.from_pretrained("gemma-ai/gemma-base").cuda()

# 準備輸入文本
input_text = "Gemma 是什麼?"
input_ids = tokenizer(input_text, return_tensors="pt").input_ids.cuda()

# 生成輸出
outputs = model.generate(input_ids, max_length=50)
print(tokenizer.decode(outputs[0]))

5. 模型版本

Gemma 提供多個版本,滿足不同需求:

6. 支援的硬體架構

CPU: 支援 CPU 推理,適合低資源環境。

GPU: 在支持 CUDA 的 GPU 上運行以實現高效能。

7. 優化與量化

量化技術: 支援 INT8 和 FP16 格式,減少記憶體占用的同時保持性能穩定。

硬體優化: 利用硬體特性(如 AVX 指令集)進一步提升推理速度。



GPT4All

1. GPT4All 是什麼?

GPT4All 是一種開源的大型語言模型,旨在在本地設備上進行自然語言處理,無需雲端依賴。

該模型提供了高效的文本生成能力,適用於多種語言應用場景,並專為低資源硬體設計。

2. GPT4All 的特點

開源性: GPT4All 是完全開源的,可以根據需求進行自定義。

本地運行: 支援在個人電腦、筆記型電腦或伺服器上運行,不需網路連線。

輕量化: 可運行於 CPU 和低規格 GPU 上,降低硬體需求。

隱私保護: 由於所有運算在本地完成,用戶數據不會洩漏到外部伺服器。

3. GPT4All 的應用場景

內容創作: 用於撰寫文章、故事、博客或技術文檔。

問答系統: 創建可離線使用的問答助手。

教育輔助: 作為學習和解題工具,幫助用戶理解複雜概念。

開發輔助: 用於生成代碼或提供程式開發建議。

4. 如何下載和使用 GPT4All

1. 安裝依賴:

pip install gpt4all

2. 下載模型檔案: 從 GPT4All 官方網站下載所需的模型檔案(如 .bin.gguf 格式)。

3. 加載模型:

from gpt4all import GPT4All

model = GPT4All("gpt4all-lora-quantized.bin")
response = model.generate("你好,GPT4All 是什麼?", max_tokens=100)
print(response)

5. 支援的檔案格式

.bin: 常見的量化模型格式,適用於大多數設備。

.gguf: 為 CPU 優化的格式,適合低資源設備進行高效推理。

6. 在 CPU 和 GPU 上運行

CPU: GPT4All 支援高效能的 CPU 推理,適合無 GPU 的環境。

GPU: 若有 NVIDIA GPU,可使用 PyTorch 或其他框架進行加速。

7. 優化與量化

量化模型: 使用 INT8 或其他量化技術以降低記憶體占用。

性能優化: 利用硬體特性(如 AVX 指令集)提升推理速度。




email: [email protected]
T:0000
資訊與搜尋 | 回dev首頁
email: Yan Sa [email protected] Line: 阿央
電話: 02-27566655 ,03-5924828
阿央
泱泱科技
捷昱科技泱泱企業