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