0%

ACL2020 走馬觀花 - 2 文本生成的新進展

前言
這個系列將會介紹最近研討會的成果,大量地介紹論文,看看他們在解決甚麼問題,有什麼新奇的方法,結果如何。
本篇會介紹以下的論文:
Dice Loss for Data-imbalanced NLP Tasks
Improved Natural Language Generation via Loss Truncation
A Simple, Fast Diverse Decoding Algorithm for Neural Generation

Dice Loss for Data-imbalanced NLP Tasks

https://arxiv.org/abs/1911.02855


類別不平衡,甚至到負樣本太多的情況,會使得模型花費過多的心思去調整。比如將大量樣本的機率從0.8調整到1,其實意義不大 - 我們在預測的時候,只會關注最高項的機率。
因此重點就是,確保最高項機率比別的選項高,就不需要更新下去了。
從dice loss 視覺化也可以看到,x軸是正確項的預測機率,y軸是loss。loss會在預測機率是0.5的時候到達最小,意味著確保目標項會比其他項高(二分類以上才合理,二分類在這個loss上應該完全學不到東西)

想要試看看的話,這裡有pytorch版的CODE

class DiceLoss(nn.Module):
    """DiceLoss implemented from 'Dice Loss for Data-imbalanced NLP Tasks'
    Useful in dealing with unbalanced data
    Add softmax automatically
    """

    def __init__(self):
        super(DiceLoss, self).__init__()

    def forward(self, y_pred, y_true):
        # shape(y_pred) = batch_size, label_num, **
        # shape(y_true) = batch_size, **
        y_pred = torch.softmax(y_pred, dim=1)
        pred_prob = torch.gather(y_pred, dim=1, index=y_true.unsqueeze(1))
        dsc_i = 1 - ((1 - pred_prob) * pred_prob) / ((1 - pred_prob) * pred_prob + 1)
        dice_loss = dsc_i.mean()
        return dice_loss

結果:
在NER/MRC等各類型的task上均有提升(DSC)

思考:

  • 比focal loss有更狠的懲罰,個人嘗試幾個資料集效果都不太好,還是需要根據資料的情況去使用啊。

Improved Natural Language Generation via Loss Truncation

https://arxiv.org/abs/2004.14589


文本生成的過程,是在根據上文去生成下一個字,有時候並不會只有一個結果,比如 一個 後面可以接不同的字。用最小化log loss的方式調整模型方向的話,會導致模型很容易被其他結果影響到。
如下圖,reference是混合兩個高斯分佈的線,我們嘗試用一個高斯分佈的線去fitting它(模擬模型的預測),最小化log loss的方式會得到綠色虛線的結果,意味著模型被其他可能性帶走了。而我們更加期望的,應該像是Min distinguishability這條線一樣,關注在機率更高的樣本上。

論文提出的解決方法也很簡單,既然模型會被機率更低的樣本帶走,那就把這些機率低的樣本拿掉就好。
細節部分看code比較好懂,原文的數學實在太難啃: https://github.com/ddkang/loss_dropper
方法是將每一筆資料的loss都存在list裡面,到10000筆之後,從小到大排序,取某個百分比分位數,如60%位置的數作為threshold,大於這個threshold的loss都直接變0這樣。
經過loss truncation的生成模型,抗干擾更強,還可以避免一些非事實的生成。

A Simple, Fast Diverse Decoding Algorithm for Neural Generation

https://arxiv.org/pdf/1611.08562.pdf


Beamsearch的結果不夠多元化,很多時候是前文句子一樣,後文稍有變化,導致整體看起來變化不大。
因此,需要給前文的高機率的詞一些懲罰,使得其他結果有機會被納入進來。

這個懲罰呢,就是按照機率高到低的順序,最高項為-1,次高項為-2這樣,使得同一個輸入的候選結果被懲罰,越不容易選到同一個輸入的候選詞。
這個懲罰同時會加一個參數$\gamma$,來控制每一個list的懲罰力度(如圖中的$\gamma$為1)
我們希望這個參數可以自適應得到,論文也提出一個運用強化學習來的到自適應的參數。
結果:
論文結果也可以看到,beamsearch的多樣性有效提升了~

思考:
其實也可以算token的overlap,當超過threshold時從beamsearch中拿掉,也可以做到多樣化的效果。