NLP中的樣本不平衡 長句問題

2021-10-05 21:39:14 字數 2164 閱讀 7189

這次關係抽取任務,在資料方面,遇到了兩個問題。

關係最多實體對有4w多個,最少的只有十幾條。

句子長度從短句(個位數長度)到300不等。

從驗證集分析後,模型對於訓練樣本中關係數目少以及長句均不是有很好地表現。

從資料的角度進行提公升自然想到了資料增強。

在機器學習中,對於結構化資料的樣本不平衡問題,常見的做法有過取樣以及欠取樣。

資料不平衡的處理(文字)

但對於文字資料,embedding之後的向量的插值是否意義?或者對於乙個句子,我用個編碼器將其變為sentence vertor,然後進行取樣?這樣做法十分少見。

經過調研,對於文字資料,資料增強兩個思路。

對於第乙個,參考這個**對應的工具包eda_nlp

對於生成,回譯通常是呼叫現有翻譯工具的api來進行,生成模型也有相關**,個人想到就是生成對抗網路,編碼解碼的方式來重構文字。

但是,如果要保留文字中特定的資訊,比如實體、關係,用生成模型就會很不穩定;回譯沒有測試過,但應該也會有雜訊。

因此,最終對於不平衡的樣本就採用了eda的方式,在原來工具包基礎上進行了修改,主要是固定實體的位置,保證其不被替換,刪除。

結合語料的預訓練模型

參考:邱錫鵬老師團隊的文章:how to fine-tune bert for text classification?裡面有提到如何用bert融合語料進行深入預訓練。專案倉庫

其實就是在bert的基礎上,繼續用其預訓練的辦法,mask lm與next sentence prediction。主要看你的語料適合哪一種。

但其實,如果是中文的語料,ernie的效果可能會更好。bert和ernie誰更強?

樣本不平衡會導致什麼問題?答案很顯然,如果1:99的樣本,全部**為0,(負樣本)也會有99%的正確率。

從損失函式的角度,就是誤分類的代價太小了,全部**為負樣本,意味著我只分錯乙個樣本,而其他都分對了,這是因為對於錯分與正確分類,我是平等的看待。

做法:

focal loss的效果

試著簡單寫了多標籤分類的例子,直觀體驗下focal loss。

alpha =

0.5gamma =

2labels = np.array([1

,0,1

,0])

logits = np.array(

[0.7

,0.25

,0.1

,0.8])

log_logits = np.log(logits)

log_logits_neg = np.log(

1-logits)

pos = labels *

(labels - logits )

neg =(1

- labels)

* logits

fl_loss =0.

- alpha *

(pos ** gamma)

* log_logits -(1

- alpha)

*(neg ** gamma)

* log_logits_neg--

----

----

----

-y_true = tf.cast(tf.convert_to_tensor(labels)

,dtype = tf.float32)

y_pred = tf.cast(tf.convert_to_tensor(logits)

,dtype = tf.float32)

tf.nn.sigmoid_cross_entropy_with_logits(y_true,y_pred)

fl loss = [0.01605037, 0.00899006, 0.93254696, 0.51502013]

ce loss = [0.40318602, 0.8259394 , 0.64439666, 1.1711006 ]

結果十分直觀,可以看出,對focal loss而言,誤分類與正確分類的損失不是乙個數量級,相差較多。而交叉熵的loss則沒有那麼明顯。

這邊有兩個超引數γ與α

\gamma與\alpha

γ與α。

在文字分類任務中,有哪些**中很少提及卻對效能有重要影響的tricks?

煉丹筆記三:資料增強

cv層面解讀focal loss

樣本不平衡問題

樣本不平衡是指 不同類別的樣本差別比較大,比如說正類和負類的樣本比例為50 1。處理樣本不平衡的原因 一般而已,如果類別不平衡比例超過4 1,那麼其分類器會大大地因為資料不平衡性而無法滿足分類要求的。因此在構建分類模型之前,需要對分類不均衡性問題進行處理。在前面,我們使用準確度這個指標來評價分類質量...

樣本不平衡問題小記

來準備用vgg來做些fine tuning快速交個差,結果半天卡在0.3公升不上去 入行沒多久,不能肯定是方向有問題,找了個pascal voc跑跑分類 結果發現總是卡在0.2左右,在metric.py裡改了幾行 草根就該用mxnet 把predict label和ground truth打出來,發...

keras中處理樣本不平衡

參考文獻 兩者的區別為 class weight 主要針對的上資料不均衡問題,比如 異常檢測的二項分類問題,異常資料僅佔1 正常資料佔99 此時就要設定不同類對loss的影響。sample weight 主要解決的是樣本質量不同的問題,比如前1000個樣本的可信度,那麼它的權重就要高,後1000個樣...