最近在作意看法釋挖掘項目中解釋性意見分類任務,嘗試將解釋性意見分類和意看法釋抽取任務聯合訓練,在這裏對最近的工做作一下整理。由於是實驗室的天然科學基金項目中的子任務,項目數據暫時還未公開,在這裏就不展開介紹具體任務了。性能
1、思路優化
解釋性意見句的類別是依據意見句中的意看法釋的內容進行定義的,那麼在對句子進行分類以前,若是模型獲取到了意見句中的意看法釋信息,是否有助於模型進行分類呢?spa
一樣的,意看法釋抽取任務是在乎見句中識別句中的意看法釋片斷,那麼在識別片斷以前,若是模型獲取到了句子的類別特徵,是否有助於模型進行片斷識別呢?設計
基於上述的思考,我提出將這兩個任務放在一塊兒訓練,創建聯合模型獲取更多的特徵用於訓練,但願能同時提升這兩個模型的效果。調試
2、設計模型排序
首先,我須要獲得這兩個任務的pipeline模型的性能,做爲接下來進行聯合模型訓練時的參照。這裏就選用單層的BILSTM模型做爲pipeline模型。ip
而後,聯合訓練的話大致上有這麼兩個思路:it
1. 先訓練分類模型,而後將分類的結果做爲新的特徵加入片斷識別模型中;pip
2. 先訓練片斷識別模型,而後將識別出的片斷的模型隱層信息做爲新的特徵加入分類模型中。class
其中,分類模型和片斷識別模型能夠共用一個BILSTM,模型之間能夠共享參數,也可使用不一樣的BILSTM,兩個模型分別訓練參數。
3、實驗狀況
針對前面提到的幾點思路,設計瞭如下幾個實驗:
3.1 提取分類特徵用於片斷識別
實驗嘗試一:
joint-model-5-sgd-200:分類和片斷識別使用的是不一樣的LSTM,用的是SGD優化器,將分類的預測結果embedding以後加入片斷識別中。在訓練了500輪以後,片斷識別再加入分類提取的特徵;
joint-model-3-adam:分類和片斷識別使用的是不一樣的LSTM,用的是Adam優化器;
joint-model-4-adam-20:分類和片斷識別使用的是不一樣的LSTM,用的是Adam優化器,分類的特徵映射爲20維的向量,做爲新特徵加入片斷識別中;
joint-model-4-adam-50:將分類的特徵映射改成50維,其餘設置與上個模型相同;
joint-model-5-adam-20:分類和片斷識別使用的是不一樣的LSTM,用的是Adam優化器,分類的預測標籤embedding以後,做爲新特徵加入片斷識別中,embed_size設爲20;
joint-model-5-adam-50:將embed_size設爲50,其餘設置與上個模型相同;
結果分析:
(1)joint-model-3-adam模型的片斷抽取距離pipeline還有2個點,形成這種狀況的緣由多是種子還未固定,由於原數據是按類別排序的,太整齊,因此只是在每一個程序訓練以前打亂了1000次,以後每次運行再打亂1次,若種子未固定,則隨機的狀況會差異比較大。可是鑑於分類的性能和pipeline一摸同樣,這個緣由可能並不成立。還須要再排查一下緣由。
(2)受到AAAI分詞論文的影響,調了一下加入特徵的維度,對比joint-model-4-adam-50和joint-model-4-adam-20模型,都運行到180+輪時,50維的性能是比20維的好的,因此能夠繼續調試維度,加大維度可能能提升性能;
(3)對比joint-model-5-adam-20和joint-model-5-adam-50模型,發現都運行到170+輪時,50維的性能就不好了,20維的性能還算正常範圍,結合joint-model-5-sgd-200模型的運行狀況,發現若加入的是embedding特徵,可能維度小一些較好;
(4)對比(2)和(3)分析的狀況,發現針對不一樣的特徵融合方法,調參仍是不太同樣的,多是由於模型5中加入的是全新的embedding向量,這種隨機初始的可能會形成很大的噪聲影響,因此維度要小一些,而模型4中加入的是lstm以後的結果,二者不太同樣。這是個人一些猜想。
實驗嘗試二:
根據以前的實驗狀況,對模型進行了一下調整,保存pipeline的最好模型,做爲pretrain的參數導入模型,並且在分類上再也不backward,提取分類特徵用於片斷識別。
joint-model-4-adam-20:分類和片斷識別使用的是不一樣的LSTM,用的是Adam優化器,分類的特徵映射爲20維的向量,做爲新特徵加入片斷識別中;
joint-model-4-adam-100:將分類的特徵映射改成100維,其餘設置與上個模型相同;
joint-model-5-adam-16:分類和片斷識別使用的是不一樣的LSTM,用的是Adam優化器,分類的預測標籤embedding以後,做爲新特徵加入片斷識別中,embed_size設爲16;
實驗嘗試三:
保存了pipeline的最好模型,做爲pretrain的參數導入模型,在分類上繼續backward,提取分類特徵用於片斷識別:
joint-model-4-adam-10:分類和片斷識別使用的是不一樣的LSTM,用的是Adam優化器,分類的特徵映射爲10維的向量,做爲新特徵加入片斷識別中;
joint-model-5-adam-8:分類和片斷識別使用的是不一樣的LSTM,用的是Adam優化器,分類的預測標籤embedding以後,做爲新特徵加入片斷識別中,embed_size設爲8;
實驗嘗試四:
分別運行了pipeline模型,保存了pipeline的最好模型,在聯合模型中,保存的最好模型做爲pretrain的參數導入模型,在分類上繼續backward,提取分類特徵用於片斷識別:
joint-model-4-adam-20:分類和片斷識別使用的是不一樣的LSTM,用的是Adam優化器,分類的特徵映射爲20維的向量,做爲新特徵加入片斷識別中;
joint-model-4-adam-50:分類的特徵映射爲50維的向量;
joint-model-4-adam-80:分類的特徵映射爲80維的向量;
joint-model-4-adam-100:分類的特徵映射爲100維的向量;
joint-model-5-adam-16:分類和片斷識別使用的是不一樣的LSTM,用的是Adam優化器,分類的預測標籤embedding以後,做爲新特徵加入片斷識別中,embed_size設爲16;
joint-model-5-adam-50:embed_size設爲50;
joint-model-5-adam-80:embed_size設爲80;
joint-model-5-adam-100:embed_size設爲100;
3.2 提取片斷特徵用於分類模型
將pipeline保存的最好模型做爲pretrain的參數導入模型,在片斷抽取任務上繼續backward,提取片斷特徵用於分類:
joint-model-7-adam:分類和片斷識別使用的是不一樣的LSTM,用的是Adam優化器,將預測的片斷的lstm輸出,通過max pooling以後和分類的lstm輸出cat到一塊兒,最後預測分類結果;
joint-model-8-adam:分類和片斷識別使用的是不一樣的LSTM,用的是Adam優化器,將預測的片斷的lstm輸出作lstm的相減操做,結果和分類的lstm輸出cat到一塊兒,最後預測分類結果;
模型實現過程當中的注意點:
對這兩個任務進行聯合訓練時,須要對這兩個任務分別backward,同時又須要任務之間共享特徵,因此backward的時候不能清空計算圖,想要不清空計算圖能夠這麼作:
pytorch實現:loss.backward(retain_graph=True)
這樣就能夠保留計算圖上的節點了
。