PCNN实践
學習了這份代碼, 但我出了bug沒有跑起來
PCNN的原理省略. 這個模型希望通過已知實體的上中下三部分的文本環境, 基于環境判斷關系是否存在.
 使用CNN我猜是因為textCNN的影響. textCNN可以無視輸入句子尺寸地進行訓練, 依靠max pooling和卷積層強大的信息提取能力, 保證訓練結果. PCNN需要同樣的機制.
PCNN+ATT
主要是想總結一下attention的使用.
 關系抽取方面, 因為數據過于難搞, 所以大多用多示例學習+遠程監督的方式, 即搜羅很多包含a和b的句子, 然后假定這些句子里必有一個表示a和b關系的句子, 就把這些句子打個包, 給這個包標上a和b的關系.
 PCNN+ONE是在訓練過程中通過最大熵的計算, 獲得那個最有可能存在關系的句子, 只做這個句子的輸出.
 PCNN+ATT認為ONE的處理太硬性, 其實其他的句子也可能包含一些能學到的東西, 所以利用attention做一個輸出與標簽之間的相似度, 相似度歸一化后用它來決定每個句子的輸出信息保留多少. 這里的attention用xAr, 其中x就是每個句子的輸出特征矩陣, r是標簽矩陣, A是轉移矩陣. 如果這里用xr, 那就是PCNN+ONE. 因為對一個包來說只有一個關系標簽, 所以r就是個零一矩陣, 只有對應的關系上是1. 也就相當于Ar是在選擇A的某一個向量, 也就相當于A是所有關系在高維空間上的映射.
這一點很重要
接上文, 如果A是標簽的映射, 那xA就必然是特征經轉移矩陣到關系空間的路徑, xAr可以計算相似度, 那xA+b就肯定能得到對應的關系標簽. 所以這個A既作為attention的矩陣, 又作為預測關系的W.
代碼: mask機制
此mask與bert中的訓練詞向量的mask不同, 它只是一個計算時的小trick. 這個trick來源于openNRE的PCNN實現.
 PCNN要對三部分矩陣分別進行max pooling, 那就要在pooling之前把卷積結果分割, 再求pooling.
 mask是這樣做的. 為方便我就以實例來說明:
 有一個句子, 一共5個詞, 所以它某個核卷積后的結果是[3,4,7,1,5]. 正常方法是分割成[3,4],[7,1],[5], 然后逐段做pooling得到[4,7,5].
 而mask將這個矩陣變成這樣:
 [[103, 3, 3],
 [104, 4, 4]
 [7, 107, 7]
 [1, 101, 1]
 [5, 5, 105]]
 另: mask矩陣是這樣
 [[100, 0, 0],
 [100, 0, 0],
 [0, 100, 0],
 [0, 100, 0],
 [0, 0, 100]]
 可以看到, 第一個矩陣是[3,4,7,1,5]T^TT+第二個矩陣的結果, 這個預先處理的mask矩陣可以把一句話的三部分有效地摘出來, 只要在列向量上求max. 對其求max后獲得[104, 17, 105], 同時減去100, 結果為[4,7,5], 和普通的pooling操作結果一致, 空間占用*3, 但由于不用逐個句子切割所以pooling速度大大加快.
總結
                            
                        - 上一篇: 独家 | 精彩!这27本书籍,每位数据科
 - 下一篇: HTML前端数据管理,前端数据管理