Pytorch里的LSTM單元接受的輸入都必須是3維的張量(Tensors). 值得注意的點 第一維體現的每個句子的長度,因為是喂給網絡模型,一般都設定為確定的長度,也就是我們喂給LSTM神經元的每個句子的長度,當然,如果是其他的帶有帶有序列形式的數據,則表示一個明確分割單位長度,
第二維度體現的是batch_size,也就是一次性喂給網絡多少條句子
第三位體現的是輸入的元素(elements of input),也就是,每個具體的單詞用多少維向量來表示
話不多說,開始啰
在詞性預測任務中,為簡化問題,假設標簽只有名詞(N)、動詞(V)、形容詞(ADG)
將輸入句子中的字/詞轉換為對應的索引,把標簽轉換為對應的索引
初始化
hidden_to_tag :通過一個線性連接層將bilstm隱狀態維度從hiddem_dim 轉變為標簽集合長度
torch.nn.Parameter():,將一個不可訓練的類型Tensor轉換成可以訓練的類型parameter並將這個parameter綁定到這個module里面,使用這個函數的目的也是想讓狀態轉移矩陣在學習的過程中不斷的修改其值以達到最優化
建立轉移矩陣,我們希望:1其他tag無法轉向start。2不會從stop開始轉向其他tag。所以這些位置設為-10000.
BILSTM層
BILSTM層輸出為每個詞的所有標簽的各自得分,注意bilstm 層輸出的標簽是獨立的,缺少相互之間的約束性,這也正是為啥要往上加CRF層get_lstm_feature輸出正是每個token的對應各個標簽的得分,作為CRF層中的非歸一化的發射概率。
經過了embedding,lstm,linear層, 輸出為發射矩陣
輸出如下,以 "girls are beautiful angles"為例,這句話有4個token,標簽集合長度為5(加上START_TAG、STOP_TAG),輸出向量shape 為一句話長度*標簽集合長度
girls 對應的標簽N V ADJ START STOP 得分分別是 -0.1555, -0.0274, 0.1223, -0.0632, 0.0050
2 CRF層
CRF 損失函數=所有路徑總分-真實路徑得分(理論部分就不一一展開洛,可參考)
真實路徑得分對應的函數如下所示:
Score(x,y)=∑logψEMIT(yi→xi)+logψTRANS(yi-1→yi)
所有路徑總分對應的函數如下所示,使用了前向算法來迭代計算所有路徑得分之和。
OK,CRF損失函數 對應的函數是
在前行傳播計算score,根據真實的標簽路徑 得到真實路徑score,再二者差相剪進行反向傳播學習,讓模型朝着差值逐步減小的方向迭代,最理想的情況就是 loss=0,所有路徑得分=真實路徑得分