乙個月前,參加了貝殼找房的房產問答匹配比賽,因為和我的方向比較契合都是屬於mrc的。第一次參加比賽,因此記錄一下。
參加比賽為了讓自己有實戰經驗,簡歷上可以寫上一筆。同時還可以獲取豐厚的獎金(雖然說基本不可能,但是夢想要是要有的),鍛鍊自己的code能力。可謂一舉多得(想的很美)。
1個問題對應多個回答,看對應的回答是否是乙個問答句。這不就是二分類問題。
輸入部分,在網上找到類似的**改了改。
def read_file():
train_query = pd.read_csv(path+'/train/train.query.tsv',sep='\t',header=none)
train_query.columns=['id','q1']
train_reply = pd.read_csv(path+'/train/train.reply.tsv',sep='\t',header=none)
train_reply.columns=['id','id_sub','q2','label']
df_train = train_query.merge(train_reply, how='left')
df_train['q2'] = df_train['q2'].fillna('好的')
test_query = pd.read_csv(path+'/test/test.query.tsv',sep='\t',header=none)
test_query.columns=['id','q1']
test_reply = pd.read_csv(path+'/test/test.reply.tsv',sep='\t',header=none)
test_reply.columns=['id','id_sub','q2']
df_test = test_query.merge(test_reply, how='left')
return df_train, df_test
模型利用huggface的api很快寫出了baseline。這麼簡單(too young too ******)。
之後就是不斷調參和修改**的過程,沒想到這部分才是最折磨人。
寫出乙個baseline,之後提交一看,f1= 0.75097 還不錯,(但是這就是我的最高分,之後再也沒有超過這個分數。。。)
當時沒想到還挺簡單,那且不是有機會拿獎了(心裡竊喜)。
但是沒想到。。。
好一波反向調優。。。 給自己鼓掌
當時在想是不是思路錯了,之後又寫了好幾個baseline,基於sentence-bert的語義匹配、抽取區域性資訊的text_cnn。但是效果並沒有提高。
是不是調優的姿勢不對啊,請教學長、請教同學。
首先 加上focal loss,對樣本不平衡的資料集可以關注較少的、較難的類別。
class focalloss(nn.module):
def __init__(self, gamma=2, weight=none, reduction='mean'):
super(focalloss, self).__init__()
self.gamma = gamma
self.weight = weight
self.reduction = reduction
def forward(self, output, target):
# convert output to pseudo probability
out_target = torch.stack([output[i, t] for i, t in enumerate(target)])
probs = torch.sigmoid(out_target)
focal_weight = torch.pow(1-probs, self.gamma)
# add focal weight to cross entropy
ce_loss = f.cross_entropy(output, target, weight=self.weight, reduction='none')
focal_loss = focal_weight * ce_loss
if self.reduction == 'mean':
focal_loss = (focal_loss/focal_weight.sum()).sum()
elif self.reduction == 'sum':
focal_loss = focal_loss.sum()
return focal_loss
這波應該穩了,**提交一氣呵成。然而並沒有用。
嗯,還不能放棄,考慮考慮對抗學習,樣本量這麼少。果斷加上對抗訓練fast gradient method。
class fgm():
def __init__(self, model):
self.model = model
self.backup = {}
def attack(self, epsilon=1., emb_name='bert.embeddings.word_embeddings.weight'):
# emb_name這個引數要換成你模型中embedding的引數名
for name, param in self.model.named_parameters():
if param.requires_grad and emb_name in name:
self.backup[name] = param.data.clone()
norm = torch.norm(param.grad)
if norm != 0 and not torch.isnan(norm):
r_at = epsilon * param.grad / norm
param.data.add_(r_at)
def restore(self, emb_name='bert.embeddings.word_embeddings.weight'):
# emb_name這個引數要換成你模型中embedding的引數名
for name, param in self.model.named_parameters():
if param.requires_grad and emb_name in name:
assert name in self.backup
param.data = self.backup[name]
self.backup = {}
這波應該錯不了了,信心滿滿。訓練、**、提交。但是分數絲毫沒變。。。。
這,,,心態**。
好吧,之後就慢慢放棄這個比賽,並沒有什麼所謂的逆襲,,,(菜雞好慘)
雖然這次比賽並沒有拿到很好的名次,但是我也從中學習了不少(自我安慰。。),學習了不少小技巧。雖然在比賽並沒有什麼用。賽後,我也搜尋了一些相關參賽的**,人家的baseline的效果都能達到78(比我高了三個點),仔細看看,基本思路一致。都是看作分類問題,但是人家使用五折交叉驗證。好吧,誰叫自己沒有學習機器學習相關知識。。。直接上手深度學習。對於基本的一些機器學習技巧都不知道。。。對於樣本量比較少的資料來說,n折交叉驗證是乙個不浪費資料的乙個好方法。之後,如果sota的方法出來,我也會去學習的。
最後的最後,如果感覺能有大佬帶著參加比賽,會少走很多彎路,如果能和大佬組隊,肯定會學到不少。(那個大佬來帶帶我)。。。
仿貝殼房產中介ERP管理系統
軟體簡介 首家100 開源可定製的仿貝殼房產中介erp管理系統,手機 電腦 微信 pad同步使用,內網 外網高階結合,四網合 一 一站同步 提高工作效率 安全可靠 操作簡單。詳細介紹 開源可定製仿貝殼房產erp解決方案 功能完善的 客源管理,同時提供完備的辦公 財務 決策分析方案,內外一體全面打通 ...
貝殼找房面試之c 基礎問答
1.設計模式了解嗎?2.c 物件導向的方式 面向過程的程式設計思路是,解決乙個問題分別幾個步驟,使用函式來完成各個步驟的任務,不同函式具有不同的功能,按照程式執行的順序呼叫函式,組成乙個可以執行的程式。c 物件導向將問題模組化,抽象出各種類,類包含資料和對資料的操作,將類例項化就得到乙個具體的物件,...
貝殼找房IPO,房產電商依舊難走
配圖來自canva 終於,貝殼找房遞交招股書,赴美ipo。貝殼找房作為全國第二大交易平台,由線下地產經紀巨頭鏈家轉型而來。而此前鏈家一直是中國最大的地產經紀品牌,其綠底白字的招牌一直是深夜城市中最吸引眼球的存在,點綴在城市之中。兩年前的鏈家,覆蓋了全國28個城市,擁有八千多間直營門店。而兩年後,貝殼...