返回文章列表

深度學習模型對抗性攻擊與防禦策略

本文探討深度學習模型中的對抗性攻擊與防禦策略,包含白箱攻擊、黑箱攻擊以及模型蒸餾、標籤平滑等防禦方法。同時,文章也詳細介紹了Transformer架構及其在BERT和GPT-2模型中的應用,並提供PyTorch實作範例,涵蓋文字生成、

深度學習 資安

深度學習模型雖然在各領域展現出強大能力,但也面臨著對抗性攻擊的威脅。攻擊者只需對輸入資料加入微小擾動,就能誤導模型產生錯誤輸出,對自動駕駛、醫療診斷等應用造成嚴重安全風險。為此,研究者們提出了多種防禦策略,例如模型蒸餾,透過訓練更簡單的模型來提升魯棒性;標籤平滑則藉由降低模型過度自信來增強防禦能力。除了這些方法,理解Transformer架構及其相關模型如BERT和GPT-2,對於提升模型安全性也至關重要。這些模型在自然語言處理領域取得了顯著成果,並被廣泛應用於文字生成、情感分析等任務。此外,ULMFiT模型作為一種根據RNN的語言模型,在特定分類別任務上也展現出其獨特優勢,提供另一種防禦思路。

對抗性攻擊與防禦策略

在深度學習領域,模型的準確性與安全性一直是研究者關注的重點。對抗性攻擊(Adversarial Attack)是一種透過在輸入資料中加入微小的擾動,使模型產生錯誤輸出的攻擊方式。這種攻擊方式對許多應用領域,如自動駕駛系統、癌症檢測等,具有極大的威脅。

白箱攻擊與黑箱攻擊

白箱攻擊(White-Box Attack)是指攻擊者能夠存取模型的內部結構和引數,從而能夠進行梯度計算等操作,以產生對抗性樣本。在前面的例子中,我們利用模型的梯度資訊來產生對抗性影像。然而,在大多數情況下,模型的內部結構是不可見的,這就引出了黑箱攻擊(Black-Box Attack)的概念。

黑箱攻擊是指攻擊者只能存取模型的輸入和輸出,而無法取得模型的內部資訊。在這種情況下,攻擊者可以透過訓練一個代理模型(Proxy Model)來模擬目標模型的行為,從而進行對抗性攻擊。

防禦對抗性攻擊

目前,研究者已經提出了多種方法來防禦對抗性攻擊,包括:

  • 模型蒸餾(Model Distillation):透過將一個複雜的模型蒸餾成一個更簡單的模型,可以提高模型的魯棒性。
  • 標籤平滑(Label Smoothing):透過平滑標籤,可以減少模型的過度自信,從而提高模型的魯棒性。
  • 輸入驗證(Input Validation):透過對輸入資料進行驗證,可以檢測出對抗性樣本並防止其進入模型。

使用 Plantuml 圖表展示防禦策略

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 對抗性攻擊與防禦策略架構

package "攻擊類型" {
    component [白箱攻擊] as whitebox
    component [黑箱攻擊] as blackbox
    component [代理模型] as proxy
}

package "攻擊手法" {
    component [梯度計算] as gradient
    component [輸入擾動] as perturbation
    component [對抗樣本] as adversarial
}

package "防禦策略" {
    component [模型蒸餾] as distillation
    component [標籤平滑] as smoothing
    component [輸入驗證] as validation
}

package "應用模型" {
    component [Transformer] as transformer
    component [BERT] as bert
    component [GPT-2] as gpt2
}

whitebox --> gradient : 內部存取
blackbox --> proxy : 行為模擬
proxy --> gradient : 梯度近似
gradient --> perturbation : 擾動方向
perturbation --> adversarial : 生成樣本
adversarial --> distillation : 防禦輸入
adversarial --> smoothing : 防禦輸入
adversarial --> validation : 檢測過濾

note right of whitebox
  白箱攻擊:
  - 存取模型結構
  - 存取模型引數
  - 直接梯度計算
end note

note right of distillation
  防禦方法:
  - 模型簡化
  - 降低過度自信
  - 輸入異常檢測
end note

@enduml

此圖示展示了輸入驗證的基本流程。

Transformer 架構

Transformer 是一種新穎的深度學習架構,主要用於處理序列資料,如文字。該架構的核心是自注意力機制(Self-Attention Mechanism),它允許模型在處理序列資料時,能夠動態地調整注意力焦點。

自注意力機制

自注意力機制是一種能夠允許模型在處理序列資料時,動態地調整注意力焦點的機制。透過使用自注意力機制,模型能夠更好地捕捉序列資料中的長距離依賴關係。

import torch
import torch.nn as nn
import torch.nn.functional as F

class SelfAttention(nn.Module):
    def __init__(self, embed_dim, num_heads):
        super(SelfAttention, self).__init__()
        self.embed_dim = embed_dim
        self.num_heads = num_heads
        self.query_linear = nn.Linear(embed_dim, embed_dim)
        self.key_linear = nn.Linear(embed_dim, embed_dim)
        self.value_linear = nn.Linear(embed_dim, embed_dim)

    def forward(self, x):
        # 計算 query、key 和 value
        query = self.query_linear(x)
        key = self.key_linear(x)
        value = self.value_linear(x)
        
        # 計算注意力權重
        attention_weights = torch.matmul(query, key.T) / math.sqrt(self.embed_dim)
        attention_weights = F.softmax(attention_weights, dim=-1)
        
        # 計算輸出
        output = torch.matmul(attention_weights, value)
        return output

#### 內容解密:
此程式碼實作了自注意力機制的核心邏輯包括計算 querykey 和 value以及計算注意力權重和輸出其中,`query_linear`、`key_linear``value_linear` 是用於線性變換的層,`attention_weights` 是計算出的注意力權重,`output` 是最終的輸出結果自注意力機制的優點在於能夠動態地調整注意力焦點從而更好地捕捉序列資料中的長距離依賴關係

Transformer架構深度解析與實務應用

Transformer架構自問世以來,已成為自然語言處理(NLP)領域的革命性技術。本文將探討Transformer的核心概念、BERT與GPT-2兩大代表性模型,並透過PyTorch實作展示其在實際應用中的強大能力。

BERT模型詳解與實務應用

BERT(Bidirectional Encoder Representations from Transformers)是由Google於2018年提出的大語言模型。該模型透過預訓練方式學習語言結構,在多項NLP任務中取得突破性成果。

BERT的關鍵技術

  1. 預訓練機制:BERT採用遮蔽語言模型(Masked Language Model, MLM)預訓練方法,隨機遮蔽15%的輸入文字並強制模型預測被遮蔽部分。
  2. Transformer編碼器架構:BERT根據Transformer編碼器構建,能有效捕捉雙向上下文資訊。
  3. 大規模訓練資料:BERT使用Wikipedia和BookCorpus等大規模文字資料進行預訓練。

使用FastBERT進行情感分析

FastBERT結合Hugging Face的Transformers函式庫與fast.ai API,提供便捷的BERT模型微調介面。以下範例展示如何使用FastBERT對Sentiment140推特資料集進行情感分析:

import torch
import logging
from pytorch_transformers.tokenization import BertTokenizer
from fast_bert.data import BertDataBunch
from fast_bert.learner import BertLearner
from fast_bert.metrics import accuracy

# 設定裝置與日誌記錄器
device = torch.device('cuda')
logger = logging.getLogger()

# 定義評估指標
metrics = [{'name': 'accuracy', 'function': accuracy}]

# 載入BERT Tokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased', do_lower_case=True)

# 建立資料批次物件
databunch = BertDataBunch(
    [PATH_TO_DATA],
    [PATH_TO_LABELS],
    tokenizer,
    train_file=[TRAIN_CSV],
    val_file=[VAL_CSV],
    test_data=[TEST_CSV],
    text_col=[TEST_FEATURE_COL],
    label_col=[0],
    bs=64,
    maxlen=140,
    multi_gpu=False,
    multi_label=False
)

# 建立BERT學習器
learner = BertLearner.from_pretrained_model(
    databunch,
    'bert-base-uncased',
    metrics,
    device,
    logger,
    is_fp16=False,
    multi_gpu=False,
    multi_label=False
)

# 進行模型微調
learner.fit(3, lr='1e-2')

程式碼解析

  1. 資料準備:使用BertDataBunch建立訓練、驗證和測試資料批次。
  2. 模型載入:透過BertLearner.from_pretrained_model載入預訓練BERT模型。
  3. 訓練過程:呼叫learner.fit方法進行模型微調。

GPT-2模型詳解與文字生成

GPT-2是由OpenAI開發的另一個根據Transformer的語言模型,主要用於文字生成任務。

GPT-2的關鍵特性

  1. 自迴歸架構:GPT-2採用自迴歸架構,透過預測下一個詞來學習語言模型。
  2. 大規模模型與資料:GPT-2的最大版本擁有15億引數,並在800萬個網站的文字資料上進行訓練。

GPT-2文字生成範例

GPT-2能夠生成高度真實的文字內容。以下是一個生成的文字範例:

Jack and Jill went up the hill on a bike ride. 
The sky was a grey white and the wind was blowing, causing a heavy snowfall. It was really 
difficult to drive down the hill, I had to lean forward on a bit of gear to get it on. But then there was a moment of freedom that I would never forget: 
The bike was at a complete stop on the mountain side and I was in the middle of it.

使用PyTorch實作GPT-2文字生成

儘管GPT-2的官方實作是根據TensorFlow,但Hugging Face提供了PyTorch版本的實作。本文將展示如何使用PyTorch版本的GPT-2進行文字生成。

# GPT-2文字生成實作
from transformers import GPT2LMHeadModel, GPT2Tokenizer

# 載入GPT-2模型與Tokenizer
model = GPT2LMHeadModel.from_pretrained('gpt2')
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')

# 生成文字
input_ids = tokenizer.encode("Jack and Jill went up the hill", return_tensors='pt')
output = model.generate(input_ids, max_length=100)

# 解碼生成的文字
generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
print(generated_text)

程式碼解析

  1. 模型載入:使用GPT2LMHeadModelGPT2Tokenizer載入預訓練GPT-2模型及其對應的Tokenizer。
  2. 文字生成:呼叫model.generate方法生成文字。
  3. 結果解碼:使用Tokenizer將生成的ID序列解碼為可讀文字。

微調GPT-2與ULMFiT於自然語言處理任務

使用Colab進行GPT-2微調

首先,我們需要在Google Colab中安裝gpt-2-simple函式庫,這是一個包裝了GPT-2微調功能的工具。安裝指令如下:

!pip3 install gpt-2-simple

接下來,下載一個公開的文字資料集,例如PG Wodehouse的《My Man Jeeves》:

!wget http://www.gutenberg.org/cache/epub/8164/pg8164.txt

內容解密:

  • !pip3 install gpt-2-simple:安裝gpt-2-simple函式庫,用於簡化GPT-2模型的微調過程。
  • !wget http://www.gutenberg.org/cache/epub/8164/pg8164.txt:下載文字資料集,用於訓練GPT-2模型。

進行GPT-2微調

在Colab筆記本中執行以下程式碼以進行GPT-2的微調:

import gpt_2_simple as gpt2

gpt2.download_gpt2(model_name="117M")
sess = gpt2.start_tf_sess()
gpt2.finetune(sess, "pg8164.txt", model_name="117M", steps=1000)

內容解密:

  • gpt2.download_gpt2(model_name="117M"):下載預訓練的GPT-2模型。
  • gpt2.start_tf_sess():啟動TensorFlow會話。
  • gpt2.finetune:對下載的文字資料進行GPT-2模型的微調,steps=1000表示進行1000步的訓練。

將訓練好的模型權重轉換為PyTorch格式

首先,將訓練好的模型權重從Colab複製到Google Drive:

gpt2.copy_checkpoint_to_gdrive()

然後,在本地或PyTorch環境中,下載並解壓縮權重檔案,接著重新命名一些檔案以與Hugging Face的GPT-2實作相容:

mv encoder.json vocab.json
mv vocab.bpe merges.txt

使用pytorch-transformers中的指令碼將TensorFlow權重轉換為PyTorch格式:

python [REPO_DIR]/pytorch_transformers/convert_gpt2_checkpoint_to_pytorch.py --gpt2_checkpoint_path [SAVED_TENSORFLOW_MODEL_DIR] --pytorch_dump_folder_path [SAVED_TENSORFLOW_MODEL_DIR]

內容解密:

  • gpt2.copy_checkpoint_to_gdrive():將訓練好的模型權重儲存到Google Drive。
  • 檔案重新命名是為了使TensorFlow訓練的模型權重能被PyTorch載入使用。
  • convert_gpt2_checkpoint_to_pytorch.py指令碼負責將TensorFlow的模型權重轉換為PyTorch相容的格式。

載入轉換好的PyTorch模型

在PyTorch中,可以直接載入轉換好的模型:

from pytorch_transformers import GPT2LMHeadModel

model = GPT2LMHeadModel.from_pretrained([SAVED_TENSORFLOW_MODEL_DIR])

內容解密:

  • GPT2LMHeadModel.from_pretrained:從指定的路徑載入已經轉換為PyTorch格式的GPT-2模型。

ULMFiT模型簡介與使用

ULMFiT是一種根據RNN(迴圈神經網路)的語言模型,使用AWD-LSTM架構。與BERT和GPT-2不同,ULMFiT在某些分類別任務上表現出色。ULMFiT通常與fast.ai函式庫一起使用。

使用fast.ai進行ULMFiT微調

首先,準備資料:

data_lm = (TextList.from_csv("./twitter-data/", 'train-processed.csv', cols=5, vocab=data_lm.vocab)
           .split_by_rand_pct()
           .label_from_df(cols=0)
           .databunch())

然後,建立一個learner物件並進行微調:

learn = language_model_learner(data_lm, AWD_LSTM, drop_mult=0.3)
learn.lr_find()
learn.recorder.plot()
learn.fit_one_cycle(1, 1e-2)
learn.save_encoder('twitter_encoder')

內容解密:

  • TextList.from_csv:從CSV檔案中載入文字資料。
  • language_model_learner:建立一個用於語言模型的learner物件,使用AWD-LSTM架構。
  • lr_findrecorder.plot:用於尋找最佳的學習率。
  • fit_one_cycle:使用1cycle學習排程器進行模型訓練。
  • save_encoder:儲存微調後的編碼器(encoder)。

深度學習中的文字分類別與生成模型

在深度學習的廣泛應用中,文字分類別和生成模型是兩個重要的研究領域。本章將探討如何利用PyTorch及其相關函式庫來實作這些模型。

微調語言模型

首先,我們需要微調一個語言模型,以便更好地理解文字資料的上下文和語義。以下是一個使用TextList從CSV檔案中載入資料並建立Databunch的示例:

twitter_classifier_bunch = TextList.from_csv("./twitter-data/", 'train-processed.csv', cols=5, vocab=data_lm.vocab)
.split_by_rand_pct()
.label_from_df(cols=0)
.databunch()

內容解密:

  1. TextList.from_csv:從指定的CSV檔案中載入文字資料,並指定列索引為5的資料作為輸入文字。
  2. vocab=data_lm.vocab:使用預訓練語言模型的詞彙表,以確保詞彙對映的一致性。
  3. .split_by_rand_pct():按照隨機百分比劃分資料集,用於訓練和驗證。
  4. .label_from_df(cols=0):從資料框的第0列提取標籤,用於文字分類別。
  5. .databunch():將資料封裝成Databunch物件,方便後續的模型訓練。

建立文字分類別器

接下來,我們使用text_classifier_learner來建立一個文字分類別模型,並載入之前微調好的編碼器:

learn = text_classifier_learner(data_clas, drop_mult=0.5)
learn.load_encoder('fine_tuned_enc')
learn.lr_find()
learn.recorder.plot()
learn.fit_one_cycle(1, 2e-2, moms=(0.8,0.7))

內容解密:

  1. text_classifier_learner:建立一個文字分類別學習器,使用指定的資料和dropout倍數。
  2. load_encoder:載入之前微調好的編碼器,以利用其學習到的特徵表示。
  3. lr_find()recorder.plot():用於找到最佳的學習率,並繪製學習率與損失之間的關係圖。
  4. fit_one_cycle:使用一週期訓練策略進行模型訓練,指定學習率、動量等超引數。

選擇合適的模型

在眾多的文字模型中,如何選擇合適的模型是一個重要的問題。一般來說,對於分類別問題,ULMFiT是一個不錯的起點。BERT雖然表現出色,但ULMFiT在準確度上具有競爭力,並且不需要太多的計算資源。

未來的研究方向包括探索新的模型架構、改進現有的訓練方法以及將深度學習技術應用於更多領域。同時,利用像GPT-2這樣的生成模型進行資料增強也是一個有前景的研究方向。

參考資源

  • Ian Goodfellow的GAN講座
  • You Only Look Once (YOLO) 快速目標檢測模型
  • CleverHans,對抗樣本生成技術函式庫
  • The Illustrated Transformer,Transformer架構的深入解析

值得關注的Twitter帳號

  • @jeremyphoward,fast.ai的共同創始人
  • @miles_brundage,OpenAI的研究科學家
  • @BrundageBot,每天總結arXiv上最新論文的Twitter機器人
  • @pytorch,官方PyTorch帳號