【作者主頁】Francek Chen
【專欄介紹】 ? ? ?PyTorch深度學習 ? ? ? 深度學習 (DL, Deep Learning) 特指基于深層神經網絡模型和方法的機器學習。它是在統計機器學習、人工神經網絡等算法模型基礎上,結合當代大數據和大算力的發展而發展出來的。深度學習最重要的技術特征是具有自動提取特征的能力。神經網絡算法、算力和數據是開展深度學習的三要素。深度學習在計算機視覺、自然語言處理、多模態數據分析、科學探索等領域都取得了很多成果。本專欄介紹基于PyTorch的深度學習算法實現。
【GitCode】專欄資源保存在我的GitCode倉庫:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。
文章目錄
- 一、編碼器
- 二、解碼器
- 三、合并編碼器和解碼器
- 小結
??正如我們在機器翻譯與數據集中所討論的,機器翻譯是序列轉換模型的一個核心問題,其輸入和輸出都是長度可變的序列。為了處理這種類型的輸入和輸出,我們可以設計一個包含兩個主要組件的架構:第一個組件是一個編碼器(encoder):它接受一個長度可變的序列作為輸入,并將其轉換為具有固定形狀的編碼狀態。第二個組件是解碼器(decoder):它將固定形狀的編碼狀態映射到長度可變的序列。這被稱為編碼器-解碼器(encoder-decoder)架構,如圖1所示。
??我們以英語到法語的機器翻譯為例:給定一個英文的輸入序列:“They”“are”“watching”“.”。首先,這種“編碼器-解碼器”架構將長度可變的輸入序列編碼成一個“狀態”,然后對該狀態進行解碼,一個詞元接著一個詞元地生成翻譯后的序列作為輸出:“Ils”“regordent”“.”。由于“編碼器-解碼器”架構是形成后續章節中不同序列轉換模型的基礎,因此本節將把這個架構轉換為接口方便后面的代碼實現。
一、編碼器
??在編碼器接口中,我們只指定長度可變的序列作為編碼器的輸入X
。任何繼承這個Encoder
基類的模型將完成代碼實現。
from torch import nn#@save
class Encoder(nn.Module):"""編碼器-解碼器架構的基本編碼器接口"""def __init__(self, **kwargs):super(Encoder, self).__init__(**kwargs)def forward(self, X, *args):raise NotImplementedError
二、解碼器
??在下面的解碼器接口中,我們新增一個init_state
函數,用于將編碼器的輸出(enc_outputs
)轉換為編碼后的狀態。注意,此步驟可能需要額外的輸入,例如:輸入序列的有效長度,這在機器翻譯與數據集中進行了解釋。為了逐個地生成長度可變的詞元序列,解碼器在每個時間步都會將輸入(例如:在前一時間步生成的詞元)和編碼后的狀態映射成當前時間步的輸出詞元。
#@save
class Decoder(nn.Module):"""編碼器-解碼器架構的基本解碼器接口"""def __init__(self, **kwargs):super(Decoder, self).__init__(**kwargs)def init_state(self, enc_outputs, *args):raise NotImplementedErrordef forward(self, X, state):raise NotImplementedError
三、合并編碼器和解碼器
??總而言之,“編碼器-解碼器”架構包含了一個編碼器和一個解碼器,并且還擁有可選的額外的參數。在前向傳播中,編碼器的輸出用于生成編碼狀態,這個狀態又被解碼器作為其輸入的一部分。
#@save
class EncoderDecoder(nn.Module):"""編碼器-解碼器架構的基類"""def __init__(self, encoder, decoder, **kwargs):super(EncoderDecoder, self).__init__(**kwargs)self.encoder = encoderself.decoder = decoderdef forward(self, enc_X, dec_X, *args):enc_outputs = self.encoder(enc_X, *args)dec_state = self.decoder.init_state(enc_outputs, *args)return self.decoder(dec_X, dec_state)
??“編碼器-解碼器”體系架構中的術語狀態會啟發人們使用具有狀態的神經網絡來實現該架構。在下一節中,我們將學習如何應用循環神經網絡,來設計基于“編碼器-解碼器”架構的序列轉換模型。
小結
- “編碼器-解碼器”架構可以將長度可變的序列作為輸入和輸出,因此適用于機器翻譯等序列轉換問題。
- 編碼器將長度可變的序列作為輸入,并將其轉換為具有固定形狀的編碼狀態。
- 解碼器將具有固定形狀的編碼狀態映射為長度可變的序列。