Quora Question Pairs 思路记录
- 解惑者
- 首頁(yè)?
- 小組頻道?
- Quora Question Pairs
- 2樓曠野的季節(jié)???12-25
今天是2017年12月24號(hào),平安夜:)18天前進(jìn)入的這個(gè)項(xiàng)目,兩周多的時(shí)間,還挺快。
?????? 之前學(xué)過(guò)解惑者學(xué)院的《垃圾短信識(shí)別小試牛刀》課程,有學(xué)過(guò)詞向量,因此對(duì)于這個(gè)判斷兩句話意思是不是相同的問(wèn)題,自然想到的就是把“詞”-> 向量 的方法進(jìn)行推廣,擴(kuò)展成 “句子”-> 向量。但是至于怎么擴(kuò)展,怎么用向量表達(dá)一句話的意思,感覺(jué)還沒(méi)有什么思路。另外就算知道了怎么表達(dá)成向量了,還有一個(gè)問(wèn)題是兩個(gè)向量到底有多“相似”才是意思一樣,也不是很好判斷的問(wèn)題。還沒(méi)有太多思路。
????? 在這兩個(gè)問(wèn)題都不是特別清楚的情況下,面臨的一個(gè)問(wèn)題,是到底要不要直接去kaggle上找現(xiàn)成的解決方案來(lái)利用。但是仔細(xì)想了下,想找個(gè)方案是很容易的,但是如果只是把方案拿過(guò)來(lái)實(shí)現(xiàn)一下,甚至是有現(xiàn)成的代碼拿來(lái)RUN一下,似乎學(xué)不到太多的東西。于是就想先自己思考一下。
???? 不過(guò)既然是自然語(yǔ)言處理的項(xiàng)目,老師也說(shuō)了是很常見(jiàn)的問(wèn)題,就想先學(xué)學(xué)自然語(yǔ)言處理。忘了是怎么找到了斯坦福大學(xué)的CS224N( Deep learning in NLP)這門課了,就先看了大約兩周的時(shí)間。里面開(kāi)始講的是word2vec,又跟著看了一遍,有了更多的理解。然后提到了Glove,講義里說(shuō)這種向量表示會(huì)包含更多的語(yǔ)義信息,估計(jì)Quora項(xiàng)目能用的上。就先記下了。至于說(shuō)這個(gè)向量是怎么訓(xùn)練的,暫且沒(méi)有太管。
??? 然后又看了幾天,里面開(kāi)始提到了神經(jīng)網(wǎng)絡(luò),RNN, CNN, LSTM,有講到用RNN實(shí)現(xiàn)語(yǔ)言模型(什么是語(yǔ)言模型就不說(shuō)了),這個(gè)時(shí)候就感覺(jué)到可以用RNN做Quora項(xiàng)目。因?yàn)橄胂肫鋵?shí)本質(zhì)是一樣的; 都是記錄歷史信息。當(dāng)然也可以用LSTM,因?yàn)長(zhǎng)STM和RNN沒(méi)有本質(zhì)上的區(qū)別。LSTM對(duì)于長(zhǎng)期的序列學(xué)習(xí)會(huì)更好。
??? 此時(shí)一開(kāi)始的疑問(wèn)之一就解決了。先暫時(shí)用RNN(or LSTM)來(lái)做。那是不是這樣就是最好的表達(dá)向量的方式呢? CS224N后面會(huì)提到,基于Tree-LSTM(可以說(shuō)成是 Recursive CNN嗎)。 這個(gè)方法的動(dòng)機(jī)是說(shuō):一句話的意思,由二方面決定,一是句子的組成結(jié)構(gòu)、二是句子中詞的含義。224N舉的例子是說(shuō),語(yǔ)言學(xué)領(lǐng)域(包括其它任何領(lǐng)域),遞歸是一種特別常用的現(xiàn)象。比如" the dog walked into the house"。(隨意編的一句話)。the dog 是主語(yǔ)從句?? walked into the house是謂語(yǔ)(從句?),這二者合并成了完整的這句話。the dog 也可以再遞歸地向下拆分結(jié)構(gòu)。但是這種方法需要parser,來(lái)把句子的結(jié)構(gòu)分析出來(lái)。看了看這個(gè)另外的任務(wù)也可以用神經(jīng)網(wǎng)絡(luò)去做。 不過(guò)這種方法會(huì)比較麻煩,暫時(shí)先不準(zhǔn)備用這種方案。畢竟還是先做個(gè)簡(jiǎn)單的版本出來(lái)吧:)
???? 剛開(kāi)始說(shuō)的一個(gè)疑問(wèn)(怎么用向量表達(dá)話的意思就明白了),然后是另外一個(gè)問(wèn)題——怎么衡量向量的相似度。恰好還是看CS22N,里面提到了下面的這種結(jié)構(gòu),覺(jué)得可以用在此項(xiàng)目上。叫Siamese Nets。
x1,x2就可以是RNN(LSTM)送出來(lái)的句子向量。
?
然后就百度了一下這種網(wǎng)絡(luò),恰好又找到了一篇論文,
Siamese Recurrent Architectures for learning sentence similarity.
里面提到了下面的架構(gòu):
?
我感覺(jué)這個(gè)架構(gòu)可以直接做為參考使用。
下面把這個(gè)思路整理一下:
1. 用Glove表示詞向量;
2. 用線性LSTM表示句子
3. 用Siamese Nets 做成判斷網(wǎng)絡(luò)使用
不過(guò)還有一些細(xì)節(jié)可以思考:
詞向量需不需要更新(重新學(xué)習(xí))?
例如最簡(jiǎn)單的情況,如果 有一些詞如果在Glove里面沒(méi)有,怎么辦? 比如下面的話,注意這個(gè)樣本的label是1
How do we prepare for UPSC?
How do I prepare for civil service?
可以推測(cè)出來(lái),UPSC應(yīng)該是 civil service 的意思。
所以說(shuō),對(duì)于樣本的label=1 的樣本,我們是不是可以利用一下來(lái)優(yōu)化詞向量?
想問(wèn)一下,這個(gè)架構(gòu)可以嗎?如有問(wèn)題或者建議請(qǐng)老師提出。
?回復(fù) - 3樓Ryan???12-29
網(wǎng)絡(luò)結(jié)構(gòu)不小心被我刪掉了,能重新發(fā)一下么?
?
這個(gè)是非常常用的網(wǎng)絡(luò)結(jié)構(gòu),尤其是需要處理兩個(gè)事物之間關(guān)系的時(shí)候。他是一個(gè)通用的結(jié)構(gòu),你可以替換成你想要的任何方法
?回復(fù) - 4樓Ryan???12-29
@曠野的季節(jié)?在做事情之前做了這么多且細(xì)致的工作,大贊一個(gè)!
?
首先不透露更多的可能解決問(wèn)題的思路了,等你做到一定的深度的時(shí)候,再來(lái)細(xì)說(shuō)一下這個(gè)。個(gè)人建議在做一個(gè)項(xiàng)目的時(shí)候不要參考別人的做法,尤其是剛開(kāi)始的時(shí)候。機(jī)器學(xué)習(xí)是數(shù)據(jù)為基礎(chǔ)的領(lǐng)域,不同的數(shù)據(jù)具有不同的特點(diǎn),不存在一種方法能解決所有的問(wèn)題。參考別人的做法,就喪失了自我分析數(shù)據(jù)的過(guò)程,這也是機(jī)器學(xué)習(xí)過(guò)程中最重要的活動(dòng),也是體現(xiàn)水平的時(shí)候。其實(shí)模型在實(shí)際的工程項(xiàng)目中的工作量很小。
?
你的思路可以嘗試,當(dāng)然還有很多問(wèn)題等待著你去解決。例如,是使用現(xiàn)成的vector還是直接通過(guò)訓(xùn)練數(shù)據(jù)去訓(xùn)練,亦或是兩者結(jié)合;是使用RNN還是CNN;多層是否必要;訓(xùn)練速度太慢怎么辦;效果不如預(yù)期,比排行榜上的得分差的太多,原因在哪兒;是否需要引入更多的特征,例如文本類特征;可以做多個(gè)模型融合嗎 等等
?
可以多嘗試做一下數(shù)據(jù)分析和深度研究,可以用一些小模型研究看看情況
?回復(fù) - 5樓曠野的季節(jié)???01-01
先重新把圖發(fā)一下,下面這個(gè)圖是 Siamese Nets, 一種通用的架構(gòu)。
另外,和垃圾短信類似的做法,是不是也可以先預(yù)處理一下、比如先把停用詞給去掉。或者按照老師上次回復(fù)說(shuō)的,用一些文本類特征。這么做肯定是可以的,至于怎么利用日后慢慢細(xì)想。
下面這個(gè)圖是初步準(zhǔn)備使用的架構(gòu)圖。單層的LSTM網(wǎng)絡(luò),把兩個(gè)句子的最后一級(jí)的state(t) 拿出來(lái),后面可以是按照?qǐng)D中這么做求歐式距離,也可以是再進(jìn)入一個(gè)MLP神經(jīng)網(wǎng)絡(luò)。然后再求歐式距離。如果兩個(gè)句子意思相同,則歐式距離應(yīng)該盡量小; 如果兩個(gè)句子意思不相同,歐式距離應(yīng)該盡量大。然后采用stochastic 梯度下降法做訓(xùn)練。
?
?回復(fù) - 6樓曠野的季節(jié)???01-02
2017.12.26-2018.1.1? 周總結(jié)
(1) 目前打算先按照這個(gè)架構(gòu)做。 這周主要學(xué)習(xí)了一下tensorflow工具。先看了看最基本的、什么是tensor, 什么是node;? cost 函數(shù)怎么描述,placeholder, optimizer ……
看的是下面這篇文章:感覺(jué)寫的比較詳細(xì)
http://jorditorres.org/research-teaching/tensorflow/first-contact-with-tensorflow-book/first-contact-with-tensorflow/
?
(2)看懂了上面的文章后,仔細(xì)閱讀了下面這篇文章,該文章通過(guò)一個(gè)toy project ,即利用RNN解決01二元序列的預(yù)測(cè)問(wèn)題。
https://r2rt.com/recurrent-neural-networks-in-tensorflow-i.html
把里面的代碼仔細(xì)看了看,有下面的收獲:
First, RNN抓住的是 X 在“歷史上”的信息,通過(guò)inner state 內(nèi)部反饋實(shí)現(xiàn)
Second,? 這篇文章的tensorflow程序架構(gòu)、可以分為“數(shù)據(jù)發(fā)生器”“計(jì)算圖模型”“把數(shù)據(jù)送進(jìn)計(jì)算圖”“? run session”這么幾部分,結(jié)構(gòu)還是比較清楚了。 自己寫程序時(shí)也要注意一下組織程序的問(wèn)題。有空時(shí)可以讀一下《小試牛刀》里面推薦的那篇 怎么組織tensorflow程序的文章。
?
Third,? Quora Question問(wèn)題,不同的話的長(zhǎng)度是不相同的。即如果用LSTM的話,輸入序列個(gè)數(shù)(num_steps)是變化的。 調(diào)研了一下Dynamic RNN的問(wèn)題。即通過(guò)tensorflow中的Dynamic RNN,可以不用做padding。
?
Forth,還有一個(gè)細(xì)節(jié)需要思考。 如果用歐式距離做判決的話,這個(gè)最終的閾值是怎么確定的。 是否作為參數(shù)之一自動(dòng)學(xué)習(xí)出來(lái)呢? 還是在模型訓(xùn)練的時(shí)候,就只是盡量?jī)?yōu)化出一個(gè)結(jié)果、即相同意思的句子歐式距離盡可能小,不同意思的話歐式距離盡可能大。最終加一個(gè)處理流程,比如統(tǒng)計(jì)一下所有的意思相同的話里面,歐式距離最大的值是多少,以此值來(lái)作為閾值??這個(gè)細(xì)節(jié)還沒(méi)有想好應(yīng)該怎么弄。
?
下一步工作:
1. 先盡快寫出來(lái)一個(gè)base 版本的程序,用 Train split出來(lái)的test集測(cè)試一下看看情況
2. 對(duì)數(shù)據(jù)進(jìn)行更深入的研究。 想想是不是有更好的思路。
?
?收起 - 7樓曠野的季節(jié)???01-12
基于RNN的一種實(shí)現(xiàn)方式
?
RNN可以捕捉X序列的信息。比如在下面這個(gè)例子里面:
?
https://r2rt.com/recurrent-neural-networks-in-tensorflow-i.html
?
X是一個(gè)隨機(jī)產(chǎn)生出來(lái)的0,1序列,0/1的概率各是0.5?;Y序列的產(chǎn)生與X序列有關(guān)系。?規(guī)則是下面這幾條:Y[t]=”1”的基礎(chǔ)概率是0.5;?如果X[t-3] = 1,?Y[t] =’1’的概率提高50%;?如果X[t-8]=1?y[t]=’1’的概率降低25%;?如果X[t-3]和X[t-8]同時(shí)為1,y[t]=1?的概率是0.5+0.5-0.25=0.75。
可以把X序列拆分成一個(gè)個(gè)小的序列,送到RNN模型里面去學(xué)習(xí)。最終,RNN可以學(xué)出來(lái)這兩個(gè)規(guī)律。(X[t-3]和X[t-8]對(duì)于?y[t]的影響)
雖然這只是一個(gè)簡(jiǎn)單的例子,但是從這個(gè)例子可以體會(huì)到RNN的作用。
對(duì)于Quora項(xiàng)目,也可以使用類似的思路。用兩個(gè)相同的RNN(or LSTM or GRU,下同)網(wǎng)絡(luò),分別處理s1,s2兩句話。如下圖所示。
?
S1,s2中的每一個(gè)單詞都先轉(zhuǎn)化成glove向量、?然后送入RNN網(wǎng)絡(luò)。第一句話是”He ?is smart” ;?第二句話是”A truly wise man”。在這種encoder架構(gòu)下,我們認(rèn)為h3(a)和h4(b)分別代表了兩句話的意思。
那么怎么比較h3(a)?h4(b)呢??目前我準(zhǔn)備使用的是L1?norm(h3a- h4b)。
比如,
h3(a)?= [ 0.123, -0.343, 0.287]
h4(b)?= [ -0.38, -0.165, 0.403]
h3(a)?- h4(b)?= [0.503, -0.178, -0.116]
|| h3(a)?- h4(b)||1?= abs(0.503) + abs(-0.178) + abs(-0.116) = 0.797
?
那么在做預(yù)測(cè)的時(shí)候,這個(gè)L1?norm(RNN(s1)- RNN(s2) )?多近s1,s2算是意思相同,多遠(yuǎn)算是s1,s2?意思不同呢??關(guān)于這個(gè)閾值目前我的想法是當(dāng)成一個(gè)參數(shù)來(lái)學(xué)習(xí)出來(lái)。如下圖所示,橫軸是L1 norm(encoder(s1) – encoder(s2)) ?其中橫軸?0<=x < +INF
縱軸是exp(-橫軸),?將橫軸壓縮成了(0,1)?。exp(-橫軸)中加了一個(gè)負(fù)號(hào)的目的,是為了與label中的含義(1表示兩句話意思相同,0表示兩句話意思不同)保持一致。
?
?
我期望的結(jié)果,是意思相同的pair(label=1),?exp(-L1 norm(encoder(s1) – encoder(s2)))?應(yīng)該會(huì)比較大(圖中靠近上面的部分);而意思不同的pair(label=0),?exp(-L1 norm(encoder(s1) – encoder(s2)))應(yīng)該會(huì)比較小(圖中靠近下面的部分)。而threshold就是區(qū)別兩者的界限。為了下面描述方便,定義:
similarity(s1,s2) = exp(- L1 norm(encoder(s1) – encoder(s2))).??————公式(1)
作為相似度度量的指標(biāo),這個(gè)指標(biāo)越大,相似度越高。
關(guān)于上面提到的閾值,目前我準(zhǔn)備采用(一維的)Logistic Regression學(xué)習(xí)出來(lái)兩個(gè)參數(shù):?w?和?b。?b?就是上面提到的threshold,w的含義目前還沒(méi)有想好,先暫時(shí)這么定。即:
Probability(s1,s2 has the same meaning)= 1/ (1+exp(- ?(w*similarity(s1,s2)+b)?? )) –公式(2)
?
這個(gè)函數(shù)把?similarity從度量距離的空間映射到“概率空間”。這樣以batch?為單位訓(xùn)練的時(shí)候,batch內(nèi)所有樣本出來(lái)的概率=?各個(gè)樣本出現(xiàn)的概率的連乘。然后取其?負(fù)對(duì)數(shù)(-log)作為損失函數(shù),各個(gè)樣本的損失函數(shù)相加作為一個(gè)batch的損失函數(shù)而成為優(yōu)化目標(biāo)。
losses = - [ ?y * tf.log(probability) + (1-y) * tf.log(1- probability) ]??? --------公式3
注:y,probability是一個(gè)batch的數(shù)據(jù)
?
程序的架構(gòu):
- RNN_model.py
- RNN_train.py
- Data_helper.py
- 8樓Lynn???01-12
1.? 想法基本上沒(méi)有太多的問(wèn)題,可以先將基本的代碼跑通,只要能夠確定你的代碼能夠?qū)W習(xí)到數(shù)據(jù)集的信息,就行了,至于正則的部分最開(kāi)始的時(shí)候不用考慮,最重要的是讓模型跑起來(lái),這是一個(gè)骨架。
2.? 代碼部分以后最好加上圖片,讓我們能夠看得清,加上圖片的同時(shí)最好加上代碼鏈接,以便復(fù)制下來(lái)看。
3.? lstm是個(gè)不錯(cuò)的結(jié)構(gòu)。是不是可以使用雙向lstm和CNN呢,損失函數(shù)是不是可以使用其他的呢,參考論文:http://anthology.aclweb.org/P/P16/P16-1036.pdf。
4.? 這個(gè)比賽當(dāng)中有一點(diǎn)比較重要,就是訓(xùn)練集和測(cè)試集的正負(fù)樣本比例。這個(gè)會(huì)大大影響你的測(cè)試結(jié)果。
5.? 代碼可以參考別人的比較好的代碼,第一是學(xué)習(xí)別人代碼,二是培養(yǎng)一個(gè)好的代碼風(fēng)格。
6.? 還有一個(gè)比較大的方向:現(xiàn)在使用的基于Siamese網(wǎng)絡(luò)結(jié)構(gòu),有更好的網(wǎng)路結(jié)構(gòu)嗎?(這個(gè)需要將現(xiàn)在的結(jié)構(gòu)跑完在去探索)
7. 可以拜讀一下2016年的ACL會(huì)議的論文,里面有很多論文提到了語(yǔ)義理解和文本匹配。很多有很大的參考價(jià)值。
?回復(fù) - 9樓曠野的季節(jié)???01-12
好的,謝謝唐老師!
?回復(fù) - 10樓曠野的季節(jié)???01-29
2018-01-29
這兩周一直在調(diào)試代碼,但不是很順利,所以上周沒(méi)發(fā)進(jìn)展。先說(shuō)下目前的調(diào)試過(guò)程,再說(shuō)下現(xiàn)在遇到的問(wèn)題吧。
兩周以前寫完了RNN_model.py 和 RNN_train.py 前面說(shuō)過(guò),RNN_model.py創(chuàng)建了RNN模型(定義placeholders, rnn cell, encoder_s1, encoder_s2, 定義losses, loss);
RNN_train.py? 定義超參數(shù); 定義train_step, dev_step , 實(shí)現(xiàn)訓(xùn)練過(guò)程
data_helper.py 用于讀取原始的數(shù)據(jù),創(chuàng)建glove 詞向量,seq2id,生成mini-batch等輔助工作。
大約花了一周時(shí)間完成data_helper.py并且讓程序跑通了。但是發(fā)現(xiàn)了一個(gè)重大的問(wèn)題——loss函數(shù)無(wú)法收斂。還有一些其它問(wèn)題,先簡(jiǎn)單說(shuō)一下細(xì)節(jié)問(wèn)題吧,
(1) 比如data_helper.py創(chuàng)建mini-batch時(shí),train.csv 最后的數(shù)據(jù)量不夠batch_size 這么多了。導(dǎo)致和placeholder的維度不一致、程序報(bào)錯(cuò)退出。但是由于這個(gè)小問(wèn)題存在,RNN模型沒(méi)法長(zhǎng)時(shí)間訓(xùn)練,我一開(kāi)始就想loss函數(shù)不能收斂是不是由于訓(xùn)練時(shí)間不夠長(zhǎng)導(dǎo)致的。(其實(shí)一開(kāi)始是先降低了learning-rate ,但是發(fā)現(xiàn)不管用)所以目前為了省事兒,先把train.csv 截取了 batch-size 整數(shù)大小的一部分(一共65536個(gè)sample,batch_size=128)
(2) 程序跑起來(lái)很慢。我把40多萬(wàn)條train.csv 取前面的65536個(gè),這樣應(yīng)該可以吧? 我想著是在65536條example的 "train_small.csv" 上如果確認(rèn)模型能學(xué)到東西了,再換成全部的訓(xùn)練數(shù)據(jù)。這樣跑起來(lái)可能還稍微快一點(diǎn)。
(3) 一開(kāi)始超參數(shù)不太會(huì)選。比如batch_size=128,感覺(jué)訓(xùn)練起來(lái)速度還能接受,如果batch_size太大,內(nèi)存都不夠用了,直接報(bào)OOM (out-of-memory?)。然后學(xué)習(xí)率選的是 1e-3吧,也說(shuō)不出為什么,就先這么選了。還有模型,就先選的RNN而沒(méi)有用LSTM,GRU。想先調(diào)調(diào)基本的模型。
(4)數(shù)據(jù)清洗可能做的不太夠,比如有的問(wèn)題就是一個(gè)問(wèn)號(hào),沒(méi)有內(nèi)容。這樣RNN模型會(huì)需要句子長(zhǎng)度len,我之前的程序在這種下會(huì)認(rèn)為是0. 導(dǎo)致tensorflow在計(jì)算rnn_outputs時(shí)報(bào)錯(cuò)。也花了一點(diǎn)時(shí)間找這個(gè)問(wèn)題。
然后再說(shuō)目前最大的問(wèn)題,losses 不收斂。
For review purpose, 公式就是下面的:
similarity(s1,s2) = exp(- L1 norm(encoder(s1) – encoder(s2))).??————公式(1)
作為相似度度量的指標(biāo),這個(gè)指標(biāo)越大,相似度越高。
比如如果encoder(s1)-encoder(s2)=0, similarity(s1,s2)=1;
else 如果encoder(s1)-encoder(s2) 很大,similarity(s1,s2)約等于0
Probability(s1,s2 has the same meaning)=sigmoid(w*similarity(s1,s2)+b)??? –公式(2) 其中w,b 我認(rèn)為是某種“閾值信息”
losses = - [ ?y * tf.log(probability) + (1-y) * tf.log(1- probability) ]??? --------公式3
一開(kāi)始遇到loss 不收斂,肯定先想到的就是learning-rate 太大了。然后learning-rate 調(diào)小后,也不起作用。就來(lái)看看loss變化有什么規(guī)律沒(méi)有。發(fā)現(xiàn)loss 會(huì)一點(diǎn)點(diǎn)地變大; 如果把learning-rate 調(diào)小后,loss也同樣會(huì)變大,而且是按照比之前較小的速率大變大(learning-rate變小了)
然后在想是不是我這個(gè)模型本來(lái)就是不對(duì)的?這個(gè)模型根本就沒(méi)不到東西?我現(xiàn)在要不要換個(gè)模型試試?
但是覺(jué)得說(shuō)不通啊。然后就想是不是因?yàn)槟P筒荒荛L(zhǎng)時(shí)間訓(xùn)練造成的(前面說(shuō)過(guò)的那些細(xì)節(jié)問(wèn)題)
但是65536個(gè)sample, batch_size=128情況下,也能訓(xùn)練512個(gè)mini-batch了,也不能一點(diǎn)東西學(xué)不到吧(分析是否正確?)
而且loss 在慢慢變大。這個(gè)趨勢(shì)本身就不對(duì)。后來(lái)把細(xì)節(jié)問(wèn)題解決了,模型能開(kāi)時(shí)間訓(xùn)練了,果然loss 還是變大,趨勢(shì)沒(méi)有發(fā)生變化。
所以覺(jué)得肯定有別的問(wèn)題。
后來(lái)還做了下面的嘗試:
self.loss?=?tf.reduce_sum(self.losses)?## shape [1,] ? ## just for test-purpose of the wrapper of this file, NO Actual Ustage ##self.val = tf.Variable(initial_value=2.4) ##self.loss += self.val
?
因?yàn)槲也恢朗悄P偷脑?#xff0c;還是模型上面包的那層訓(xùn)練過(guò)程的原因,我就把loss+ 一個(gè)variable
這個(gè)發(fā)現(xiàn)self.val 會(huì)慢慢變小。所以肯定不是訓(xùn)練過(guò)程的原因了。如果調(diào)整learning-rate 的話—self.val也會(huì)跟著變。所以肯定訓(xùn)練過(guò)程沒(méi)問(wèn)題。
這樣又折騰了好幾天。上周六(兩天前)發(fā)現(xiàn)是loss 函數(shù)寫反了。:(
一開(kāi)始我代碼里面寫的是
losses =?? y * tf.log(probability) + (1-y) * tf.log(1- probability)少了個(gè)負(fù)號(hào),因此loss不降反升。
發(fā)現(xiàn)這個(gè)問(wèn)題后,原來(lái)以為問(wèn)題能解決,但是發(fā)現(xiàn)loss現(xiàn)在的確不變大了,但是也不變小。
然后又開(kāi)始了新一輪嘗試,是不 是learning-rate太大了。是不是loss 定義的不對(duì)?等等;
但是目前還沒(méi)有什么進(jìn)展。
現(xiàn)在有什么思路能解決這個(gè)問(wèn)題嗎?
比如把RNN隱藏層的神經(jīng)元數(shù)量變大?
或者是RNN新一輪的訓(xùn)練沒(méi)有用上一輪的訓(xùn)練結(jié)果?
或者是mini-batch的數(shù)量不合適?(128 )
還是65536個(gè)example 不夠(這個(gè)可能性小吧)
或者是RNN模型有什么地方代碼有問(wèn)題?比如獲得最后一個(gè)stage的rnn_output不對(duì)?
請(qǐng)老師幫忙看看吧。
代碼在:
https://github.com/chenaaaaa/rnn-based-quora-question-pair
謝謝!
?
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
?回復(fù) - 11樓曠野的季節(jié)???01-30
2018-1-30 update
繼續(xù)昨天的更新一下,
發(fā)現(xiàn)訓(xùn)練時(shí)公式(2)里面的w,b 沒(méi)有朝著一個(gè)方向變化(變化了一會(huì)又反方向變回來(lái)了)
昨天又做了一下嘗試,先簡(jiǎn)化了一下模型,即把原公式(2) bypss 讓公式(2)=公式(1)
公式(3)不變。簡(jiǎn)化版本的公式是:
similarity(s1,s2) = exp(- L1 norm(encoder(s1) – encoder(s2))).??————公式(1)
作為相似度度量的指標(biāo),這個(gè)指標(biāo)越大,相似度越高。最大是1,最小是近似0
?
Probability(s1,s2 has the same meaning)=?sigmoid(w*similarity(s1,s2)+b)??–原公式(2)去掉
Probability(s1,s2 has the same meaning) = similarity(s1,s2)--簡(jiǎn)化版本公式(2)
losses = - [ ?y * tf.log(probability) + (1-y) * tf.log(1- probability+very_small_constant) ]??? --------公式3
(+very_small_constant =1e-16? 是因?yàn)橛行〆xample 的encoder(s1)=encoder(s2),導(dǎo)致probability是1。第二項(xiàng)的log里面會(huì)變成0而導(dǎo)致訓(xùn)練出錯(cuò)。)
最后是對(duì)batch 里面所有example的loss求和: loss = tf.reduce_sum(losses)
發(fā)現(xiàn)還是loss 還是上下波動(dòng),但是整體上沒(méi)有向下變化的趨勢(shì).
?
后來(lái)還做過(guò)嘗試,把RNN變成GRU,現(xiàn)象也并沒(méi)有什么變化啊。。難道RNN模型就不能用嗎?
?回復(fù) - 12樓Lynn???01-31
你這個(gè)代碼應(yīng)該是參考別人的代碼寫的,有這么幾個(gè)問(wèn)題你可以考慮一下(代碼的話,有點(diǎn)難看):
1.? 你的給你的訓(xùn)練數(shù)據(jù)訓(xùn)練了多少個(gè)epoches
2. 6萬(wàn)的數(shù)據(jù)真不一定夠,你可以使用所有的數(shù)據(jù),如果不行,再考慮是不是有問(wèn)題,RNN是沒(méi)有問(wèn)題的。
2.? 你用的是對(duì)比損失,你現(xiàn)在就先讓對(duì)比損失跑起來(lái)(我這邊用對(duì)比損失的效果,要比log_loss好)
? ? ?有這么幾個(gè)要點(diǎn):1. 正負(fù)樣本比例
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2. 你的代碼是不是有問(wèn)題,我在最開(kāi)始做這個(gè)比賽的時(shí)候,也出現(xiàn)了你的問(wèn)題。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3. 如果覺(jué)得實(shí)在是有問(wèn)題可以使用tf.losses.log_loss
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4. 我出現(xiàn)的問(wèn)題挺多, 1):數(shù)據(jù)預(yù)處理部分我出現(xiàn)過(guò)問(wèn)題。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2):句子的長(zhǎng)度你取了多少?我取得是55,也取過(guò)60
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?3):神經(jīng)網(wǎng)絡(luò)部分的代碼對(duì)的嗎?
?回復(fù) - 13樓曠野的季節(jié)???02-06
2018-02-06
1,先說(shuō)這周獲得的結(jié)論吧,目前確定GRU從數(shù)據(jù)集中學(xué)到了一些東西,但是問(wèn)題是,基于目前的GRU方案+損失函數(shù)得到的(訓(xùn)練集)準(zhǔn)確率比較低,只有57%左右。剛開(kāi)始訓(xùn)練時(shí)的準(zhǔn)確率(tp+tn/total)大約是33%,訓(xùn)練了大約2?epoch之后,準(zhǔn)確率提升到了43%, 然后我記得經(jīng)過(guò)比較長(zhǎng)時(shí)間了,大約幾十個(gè)epoches之后吧,準(zhǔn)確率是57%,而且似乎沒(méi)有再上升的趨勢(shì)了。另外有時(shí)測(cè)試還發(fā)現(xiàn),準(zhǔn)確率也并不是一直維持在50%多,可能過(guò)一會(huì)兒又下降到了40% ,過(guò)一會(huì)兒又上升到50%多。這個(gè)。。。為啥
另外上周的疑問(wèn),這周也確認(rèn)了一下。發(fā)現(xiàn)使用4萬(wàn)多個(gè)樣本訓(xùn)練和使用30多萬(wàn)個(gè)樣本訓(xùn)練得到的訓(xùn)練集準(zhǔn)確率差不多,沒(méi)發(fā)現(xiàn)什么區(qū)別。不過(guò)現(xiàn)在還是使用了30多萬(wàn)個(gè)樣本訓(xùn)練。
2,確認(rèn)一下我前上次所說(shuō)的“LOSS函數(shù)不下降”的問(wèn)題。發(fā)現(xiàn)那個(gè)問(wèn)題和我當(dāng)時(shí)選擇的損失函數(shù)關(guān)系比較大。
第一個(gè)公式應(yīng)該是沒(méi)問(wèn)題:
similarity(s1,s2) = exp(- L1 norm(encoder(s1) – encoder(s2))).??————公式(1)
?
但是下面這個(gè)公式:
Probability(s1,s2 has the same meaning)=?sigmoid(w*similarity(s1,s2)+b)--公式(2)? 這個(gè)從道理上好像就不太通;
?
在實(shí)踐中,發(fā)現(xiàn)如果用這個(gè)公式 的話,(訓(xùn)練集)準(zhǔn)確率就一直在33%左右,根本就沒(méi)有變好的趨勢(shì)。為了確認(rèn)是不是訓(xùn)練時(shí)間不夠長(zhǎng)造成的,訓(xùn)練了大約200個(gè) epoches,準(zhǔn)確率都沒(méi)有上升。
?
后來(lái)不用上面的公式了,而是bypass了公式(2)直接令
Probability(s1,s2 has the same meaning)=? similarity(s1,s2) ,測(cè)試結(jié)果就是第1條所說(shuō)。
?
3,還有一些其它的細(xì)節(jié)吧
batch-size 目前取的是8192,是不是太多了啊?老師原來(lái)用的batch-size有這么多嗎?
也試過(guò),如果用比較小的batch-size的話,發(fā)現(xiàn)準(zhǔn)確率跳動(dòng)地比較厲害了。
?
4,上周老師評(píng)論里面,關(guān)于正負(fù)樣本的比例,唐老師的意思,是每個(gè)batch內(nèi)部正負(fù)樣本比例都要是50%呢,還是不同的batch之間的正負(fù)樣本比例比較穩(wěn)定、別忽高忽低就可以呢?
或者是其它意思?
?
“句子的長(zhǎng)度你取了多少?我取得是55,也取過(guò)60”
我記得我把所有的train.csv里面的句子,都padding 到了train.csv里面最長(zhǎng)的那句話的長(zhǎng)度。剛才打印了一下,應(yīng)該139。所以,55指的是?
?
結(jié)合前面兩條說(shuō)的,看來(lái)?yè)p失函數(shù)對(duì)模型的表現(xiàn)影響比較大,我可能打算先改進(jìn)一下?lián)p失函數(shù)。嘗試上周唐老師所說(shuō)的對(duì)比損失(Contrastive Loss?)。
http://blog.csdn.net/autocyz/article/details/53149760
?
或者老師有什么別的建議嗎?
?
?回復(fù) - 14樓Lynn???02-10
這里面有個(gè)比較嚴(yán)重的問(wèn)題,就是句子長(zhǎng)度的問(wèn)題取句子最長(zhǎng)為139,在這個(gè)里面90%以上的句子長(zhǎng)度都不到60,如果句子的長(zhǎng)度取139,那么就是在句子后面拼湊了大量的無(wú)用信息,雖然說(shuō)lstm或gru能夠在訓(xùn)練當(dāng)中學(xué)習(xí)到較長(zhǎng)的時(shí)間序列的信息,但是注意,如果時(shí)間序列的長(zhǎng)度過(guò)長(zhǎng)LSTM也是很無(wú)力的(如果只取LSTM最后一個(gè)單元的輸出)。
參考的解決方法:在訓(xùn)練集當(dāng)中,每個(gè)句子的長(zhǎng)度是不固定的,在你的代碼當(dāng)中,需要的是固定長(zhǎng)度的輸入,所以這個(gè)時(shí)候需要你將所有的句子處理成長(zhǎng)度一樣,所以這個(gè)時(shí)候需要人為的指定句子的長(zhǎng)度,你在預(yù)處理當(dāng)中應(yīng)該是有這個(gè)參數(shù)的,所以將這個(gè)參數(shù)設(shè)置成50,然后再進(jìn)行處理和訓(xùn)練,你再看看結(jié)果。
?收起
Quora Question Pairs?退出小組
33個(gè)成員?2個(gè)話題?創(chuàng)建時(shí)間:2017-11-30Quora Question Pairs比賽思路記錄和交流?置頂?精華
?分享收藏發(fā)表于12-06?1409次查看此貼用于對(duì)學(xué)習(xí)過(guò)程中遇到的問(wèn)題、學(xué)習(xí)到的東西做一下小結(jié),群主會(huì)根據(jù)小結(jié)的內(nèi)容給予相應(yīng)的建議。
編輯?取消加精?取消置頂?只看樓主?倒序查看25回復(fù)定義模型(計(jì)算圖),?損失函數(shù)
模型的超參數(shù):
?
Hyper-Parameters | Value Space | Notes: |
Rnn_type | “rnn” , “l(fā)stm”, “gru” | Encoder里面的記憶單元采用RNN?還是LSTM?還是GRU |
Nonlinear_type | “sigmoid” or “ReLU”?? | 把similarity(s1,s2)映射到概率空間的函數(shù) |
l2_reg_lambda | R1?>=0 | L2正則化的系數(shù) |
number_units | 大于等于1的整數(shù) | Encoder里面神經(jīng)元的數(shù)量 |
embedding_trainable | True / False | 詞向量是否可以再訓(xùn)練 |
batch_size | 大于等于1的整數(shù) | Batch-size |
? | ? | ? |
?
模型的輸入輸出(tensor)
Input or Output | Variable | Data type and Shape | Notes |
Input | Input_s1 | int32,[batch_size, None] | 輸入的是詞的ID |
Input | Input_s2 | int32,[batch_size, None] | 輸入的是詞的ID |
Input | Input_y | Int32,[batch_size] | Label, 1 for same mearing , 0 otherwise |
Input | Input_seqlen1 | Int32, [batch_size] | S1數(shù)據(jù)集中每一句話的長(zhǎng)度 |
Input | Input_seqlen2 | Int32,[batch_size] | S2數(shù)據(jù)集中每一句話的長(zhǎng)度 |
Input | dropout_keep_prob | Float32, [] | Dropout keep?概率 |
Output | Loss | Float32,[] | 損失函數(shù),見(jiàn)公式3 |
?
Train data和Dev test data Split;
定義模型的超參數(shù)
定義train_step()函數(shù)
定義dev_step()函數(shù)
定義訓(xùn)練的主循環(huán)?,主循環(huán)里面會(huì)調(diào)用next_batch()函數(shù)
?
處理train.csv
考慮是不是要去掉標(biāo)點(diǎn)??可能不去比較好?
定義next_batch()函數(shù),生成batch數(shù)據(jù)
?
?
詞向量出于訓(xùn)練速度的考慮,可以先使用50維;今后看情況和手頭設(shè)備(GPU)的情況考慮是不是增加到300維(當(dāng)然有沒(méi)有效果是另外一回事了)
?
注:word2vec?代碼:
https://github.com/danielfrg/word2vec
?
目前進(jìn)展情況:
寫完了RNN_model.py , RNN_train.py
接下來(lái)會(huì)寫data_helper.py
?
小組內(nèi)成員情況:
成員1, 小曙哥,可能會(huì)接下來(lái)和我一起完成data_herper.py
成員2,卑戀,近期有其它事務(wù),可能暫時(shí)不能加入此項(xiàng)目進(jìn)度
?
RNN_model.py
?
import tensorflow as tf
import numpy as np
from data_helper import build_glove_dic
class TextRNN(object):
? ? """
? ? A RNN model for quora question pair problem
? ? """
?
? ? def __init__(self,
? ? ? ## architecture hyper-parameters
? ? ? rnn_type = "rnn", ## or lstm or gru ?
? ? ? nonlinear_type = "sigmoid", ## or relu ? temp use sigmoid.
? ? ? l2_reg_lambda=0.0,
? ? ? number_units=64,
? ? ? embedding_trainable=True ??
? ? ? ##train-related-parameters
? ? ? batch_size=64, ??
? ? ??
? ? ## hyper-parameters finish
? ? ):
? ? ? ? #placeholders for input, output and dropout
? ? ? ? ##input_s1,input_s2 輸入ID而不是word_embedding
? ? ? ? self.input_s1 = tf.placeholder(int32,[batch_size, None],name="s1")
? ? ? ? self.input_s2 = tf.placeholder(int32,[batch_size, None],name="s2")
? ? ? ? ## Quora question pair label , 1 for same meaning, 0 otherwise
? ? ? ? self.input_y ?= tf.placeholder(int32,[batch_size],name="label")
? ? ? ??
? ? ? ? ## based on tensor-flow rnn model, we should know advance the sequence length of the sentence
? ? ? ? self.input_seqlen1 = tf.placeholder(int32, [batch_size],name="seqlen1") ? ? ? ?
? ? ? ? self.input_seqlen2 = tf.placeholder(int32, [batch_size],name="seqlen2") ?
? ? ? ? ## prevent overfitting
? ? ? ? self.dropout_keep_prob = tf.placeholder(tf.float32,name="dropout_keep_prob")
? ? ? ? ###placeholder finish
? ? ? ??
? ? ? ? ##hyper-parameters
? ? ? ? self.rnn_type ? ? ? = rnn_type
? ? ? ? self.nonlinear_type ?= nonlinear_type
? ? ? ? self.batch_size ? ? = batch_size
? ? ? ? self.number_units ? = number_units
? ? ? ? self.embedding_trainable = embedding_trainable ??
? ? ? ? self.l2_reg_lambda ?= l2_reg_lambda
? ? ? ? #Keeping track of l2 regularization loss(optional)
? ? ? ? self.l2_loss = tf.constant(0.0)
? ? ? ??
? ? ? ? self.init_weight()
? ? ? ? self.add_encoder()
? ? ? ? self.add_dropout()
? ? ? ? self.add_final_state()
? ? ? ??
? ? ? ??
? ? def init_weight(self):
? ? ? ? ##Embedding layer
? ? ? ? with tf.device('/cpu:0'), tf.name_scope("embedding"):
? ? ? ? ? ? _, self.word_embedding = build_glove_dic()
? ? ? ? ? ? self.embedding_size = self.word_embedding.shape[1]
? ? ? ? ? ? self.W = tf.get_variable(name='word_embedding', shape = self.word_embedding.shape,dtype=float32,
? ? ? ? ? ? initializer=tf.constant_initializer(self.word_embedding), trainable=self.embedding_trainable)
? ? ? ? ? ? ## s1,s2 的形狀是[batch_size, sequence_length, embedding_size]
? ? ? ? ? ? self.s1 = tf.nn.embedding_lookup(self.W, self.input_s1)
? ? ? ? ? ? self.s2 = tf.nn.embedding_lookup(self.W, self.input_s2)
? ? ? ? ? ? self.x1 = self.s1
? ? ? ? ? ? self.x2 = self.s2
? ? ? ? ? ??
? ? ? ? ? ??
? ? ? ? ? ??
? ? def add_encoder():
? ? ? ? if self.rnn_type=="rnn":
? ? ? ? ? ? cell = tf.contrib.rnn.BasicRNNCell(self.number_units)
? ? ? ? elif self.rnn_type=="lstm":
? ? ? ? ? ? cell = tf.contrib.rnn.BasicLSTMCell(self.number_units, state_is_tuple=True)
? ? ? ? elif self.rnn_type=="gru": ##needs to check
? ? ? ? ? ? cell = tf.nn.rnn_cell.GRUCell(self.num_units, input_size=None, activation=tanh)
? ? ? ??
? ? ? ? init_state = tf.get_variable('init_state', [1,num_units],
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? initializer = tf.constant_initializer(0.0))
? ? ? ? init_state = tf.tile(init_state, [self.batch_size,1])
? ? ? ??
? ? ? ? rnn_outputs1, final_state1 = tf.nn.dynamic_rnn(cell, self.x1, sequence_length = self.input_seqlen1, initial_state=init_state)
? ? ? ? rnn_outputs2, final_state2 = tf.nn.dynamic_rnn(cell, self.x2, sequence_length = self.input_seqlen2, initial_state=init_state)
? ? ? ?
? ? def add_dropout():
? ? ? ? #add droptout, as the model otherwise quickly overfits . really ??
? ? ? ? rnn_outputs1 = tf.nn.dropout(rnn_outputs1, self.dropout_keep_prob)
? ? ? ? rnn_outputs2 = tf.nn.dropout(rnn_outputs2, self.dropout_keep_prob)
? ? ? ??
? ? def add_final_state():
? ? ? ? idx1 = tf.range(self.batch_size)* tf.shape(rnn_outputs1)[1] + (self.input_seqlen1-1)
? ? ? ? idx2 = tf.range(self.batch_size)* tf.shape(rnn_outputs2)[1] + (self.input_seqlen2-1)
? ? ? ??
? ? ? ? last_rnn_output1 = tf.gather(tf.reshape(rnn_outputs1, [-1, num_units]),idx1)
? ? ? ? last_rnn_output2 = tf.gather(tf.reshape(rnn_outputs2, [-1, num_units]),idx2)
? ? ? ??
? ? def add_loss():
? ? ? ? ## caculte "difference" between encoder output of sentense1 and sentense2
? ? ? ? ## caculate the norm1 distance ? ?
? ? ? ? diff ? ? = last_rnn_output1 - last_rnn_output2 ? ? ? ? ?##shape [batch_size, num_units]
? ? ? ? diff_abs = tf.abs(diff) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ##shape [batch_size, num_units]
? ? ? ? diff_abs_sum = reduce_sum(diff_abs, axis=1) ? ? ? ? ? ? ##shape [batch_size]
? ? ? ??
? ? ? ? ## squeeze the norm1 distance between (0,1)
? ? ? ? diff_exp = tf.exp(-diff_abs_sum) ##shape [batch_size],?
? ? ? ??
? ? ? ? ## automatically learn the "threshold"?
? ? ? ? ##"use this nolinear to map exp(-||x1-x2||) (L1 norm diff) to probability")
? ? ? ? with tf.name_scope("threshold"):
? ? ? ? ? ? W = tf.variable([1.0], name="W")
? ? ? ? ? ? b = tf.variable([tf.log(0.5)], name="b")
? ? ? ? ? ? wx_plus_b = diff_exp * W + b ? ? ? ? ? ? ? ## shape [batch_size]
? ? ? ? ##apply sigmoid OR relu ??
? ? ? ? if (self.nonlinear_type == "sigmoid"):
? ? ? ? ? ? prob = (1+exp(-1.0 * wx_pls_b)) ## shape[batch_size]
? ? ? ? elif self.nonlinear_type == "relu":
? ? ? ? ? ? prob = maximum(0,wx_plus_b) ## ?
? ? ? ? ? ??
? ? ? ? ## use logistic regression (softmax) cost
? ? ? ? ## if y=1, prob = prob
? ? ? ? ## if y=0, prob = 1-prob
? ? ? ? losses = y * tf.log(prob) + (1-y) * tf.log(1-prob) ? ? ## shape [batch_size]
? ? ? ? self.loss = tf.reduce_sum(losses) ? ? ? ? ? ? ? ? ? ? ? ## shape [1,]
? ? ? ? ? ??
?
?回復(fù)batch_size取的是1500,8912是否過(guò)大?如果mini_batch取得過(guò)大,會(huì)是的它的方向探索性不是很強(qiáng),有沒(méi)有考慮過(guò)這個(gè)問(wèn)題?
當(dāng)然這只是小問(wèn)題,大問(wèn)題在于8912的話,會(huì)使得你的代碼非常消耗內(nèi)存,加大了每一輪的計(jì)算量,減慢運(yùn)行速度。
?收起還有你說(shuō)的波動(dòng)的原因是不是和學(xué)習(xí)率有關(guān)系?你的學(xué)習(xí)率是否過(guò)大??
一般來(lái)說(shuō),如果你的訓(xùn)練結(jié)果波動(dòng)很大,這個(gè)時(shí)候你需要考慮減小你的學(xué)習(xí)率。
?收起謝謝唐老師的回復(fù),過(guò)節(jié)回復(fù)晚了:)
1. 對(duì)之前l(fā)oss不能收斂問(wèn)題的解決
發(fā)現(xiàn)之前很多次說(shuō)的模型學(xué)不到東西,可能是神經(jīng)網(wǎng)絡(luò)架構(gòu)方面的問(wèn)題
為了完整性,再畫一下,之前的架構(gòu)是下面這個(gè)樣子:
注:圖中的“abs"指的是對(duì)兩個(gè)input相減后取絕對(duì)值
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 架構(gòu)一
后面與唐老師溝通后,參考唐老師的方案,改成了下面的架構(gòu):
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?架構(gòu)二
后來(lái)我思考為什么一開(kāi)始的架構(gòu)不行,把上面的兩種架構(gòu)整合成了下面的架構(gòu):
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?架構(gòu)三
注:圖中的“abs"指的是對(duì)兩個(gè)input相減后取絕對(duì)值
架構(gòu)三與架構(gòu)二的區(qū)別,是在原始特征之后加了一層 ”對(duì)應(yīng)位置特征相減“ 的操作。
架構(gòu)三與架構(gòu)一的主要區(qū)別,是去掉了所有abs之后的加和操作。
目前經(jīng)過(guò)嘗試,在train && dev set 上架構(gòu)三比架構(gòu)二要好一些,當(dāng)然最終效果如何還要在kaggle網(wǎng)站上提交結(jié)果看一下。
?
2. 為什么一開(kāi)始架構(gòu)不行的簡(jiǎn)要想法。
可能是”求和“以后,不同的”特征“的信息丟失了一些?而這個(gè)”求和“到底有什么含義嗎?受word2vec的影響,?一開(kāi)始,我認(rèn)為GRU的輸出應(yīng)該是一句話映射在語(yǔ)義空間的”話的意思“,這樣如果兩句話s1, s2表達(dá)的意思相同,那么這兩個(gè)映射點(diǎn)位置應(yīng)該是相近的才對(duì)。 于是才會(huì)有之前所做的求Manhattan Distance的做法,但是現(xiàn)在看來(lái)這種做法可能并不合適?
但是為什么word2vec ,可能認(rèn)為意思相近的詞得到的詞向量會(huì)比較接近呢?
這是因?yàn)橐馑枷嘟脑~,在上下文窗口中出現(xiàn)的概率比較高,訓(xùn)練算法自動(dòng)會(huì)把窗口里的詞的詞向量拉近,把不在窗口里的詞的詞向量拉遠(yuǎn),從而造成了相近的詞的詞向量較接近。
也許GRU的輸出應(yīng)該理解成”特征“更合適一些。
之前也問(wèn)過(guò)唐老師,”為什么RNN的輸出能當(dāng)成特征直接用呢“ 簡(jiǎn)要記錄一下唐老師的回答,
"siamese網(wǎng)絡(luò)兩個(gè)部分算出來(lái)的最終的結(jié)果,無(wú)論里面采用的CNN,LSTM,BLSTM,甚至是全連接網(wǎng)絡(luò),這些結(jié)果可以看成是高階特征。在很多論文當(dāng)中,一般來(lái)說(shuō)就是在這些網(wǎng)絡(luò)上面下文章,希望能夠得到更有表達(dá)能力的特征。
只是這些特征不能夠用語(yǔ)言解釋
在傳統(tǒng)機(jī)器學(xué)習(xí)中,很多情況下特征是可以解釋的,這個(gè)也是神經(jīng)網(wǎng)絡(luò)的劣勢(shì),可解釋性不是很強(qiáng)。
舉個(gè)例子,word2vec訓(xùn)練出來(lái)的128位的向量,這128維的向量都可以看成是這個(gè)詞匯的特征,只是這個(gè)特征不具有很強(qiáng)的解釋性。"
所以其實(shí)解釋了前面我所說(shuō)的,兩個(gè)詞的意思相近,詞向量接近,就是各個(gè)特征相近。。。
?
3, 那么現(xiàn)在這個(gè)網(wǎng)絡(luò)能夠?qū)W習(xí)到訓(xùn)練集的信息么?
這個(gè)訓(xùn)練集有點(diǎn)特點(diǎn),是正負(fù)樣本比較不一樣,大約正樣本37%,負(fù)樣本63% 所以單憑正確率無(wú)法判斷模型是否真的學(xué)到了東西。比如說(shuō)模型把所有的樣本都判斷成負(fù)樣本,此時(shí)正確率就是63%,看著是大于50%了,像是比胡亂猜要好,但是其實(shí)模型什么都沒(méi)有學(xué)到。
回顧一下之前課程學(xué)到的東西,
不解釋,上實(shí)驗(yàn)結(jié)果,每一行是一個(gè)mini-batch的evaluate結(jié)果(每次先在一個(gè)mini-batch上evaluate ,然后loss opt,然后換一個(gè)batch,重復(fù))
architec is two-feature-substrate
batch_i(th) = 0
epoch_i = 0.0
batch_size = 2048
data_file = train.csv
neural-network type is gru
keep-drop-prob = 0.5
precision = 0.383912235498 recall = 0.549738228321? ? ? recall 約= 50%, 此時(shí)分類器像是瞎猜 、precision是38%, 因?yàn)檎龢颖镜臄?shù)量相對(duì)較小,所以precison不高。
precision = 0.310469299555 recall = 0.108448930085? recall變小,分類器把更多的樣本都判定成為負(fù)例
precision = 0.300000011921 recall = 0.015306122601? recall繼續(xù)變小
precision = 0.0 recall = 0.0? ? ? ? ? ? 此時(shí)recall =0, 分類器一個(gè)正樣本都識(shí)別不出來(lái)了
precision = 0.0 recall = 0.0
precision = nan recall = 0.0? 可以看到,precison 變成了正無(wú)窮,原因是TP+FP=0, 即分類器把所有的樣本都判斷成了負(fù)例。
precision = nan recall = 0.0? 重復(fù)好幾個(gè)mini-batch
precision = nan recall = 0.0
precision = nan recall = 0.0
precision = nan recall = 0.0
precision = nan recall = 0.0
precision = nan recall = 0.0
precision = nan recall = 0.0
precision = nan recall = 0.0
precision = nan recall = 0.0
precision = nan recall = 0.0
precision = nan recall = 0.0
precision = nan recall = 0.0
precision = nan recall = 0.0
precision = nan recall = 0.0
precision = nan recall = 0.0
precision = nan recall = 0.0
precision = nan recall = 0.0
precision = nan recall = 0.0
precision = nan recall = 0.0??重復(fù)好幾個(gè)mini-batch
precision = 0.20000000298 recall = 0.00272108847275? 此時(shí),recall 不再是0了 ,有一些正樣本被正確地識(shí)別了出來(lái)
precision = 0.352941185236 recall = 0.0078125? ?recall 繼續(xù)增大
precision = 0.428571432829 recall = 0.00757575780153? ?recall 繼續(xù)增大
precision = 0.479999989271 recall = 0.0155844157562??recall 繼續(xù)增大
precision = 0.555555582047 recall = 0.019430052489
precision = 0.584905683994 recall = 0.0418918915093
precision = 0.660000026226 recall = 0.0424710437655
precision = 0.714285731316 recall = 0.0604838691652
precision = 0.677419364452 recall = 0.0859481617808
precision = 0.726315796375 recall = 0.0875634551048
precision = 0.672727286816 recall = 0.0962288677692
precision = 0.701388895512 recall = 0.136856362224
precision = 0.69938647747 recall = 0.14267835021
precision = 0.707006394863 recall = 0.157446801662
precision = 0.658682644367 recall = 0.14030611515
precision = 0.72327041626 recall = 0.140931367874
precision = 0.617021262646 recall = 0.150845259428
precision = 0.617021262646 recall = 0.163610726595
precision = 0.615384638309 recall = 0.1892247051
precision = 0.645914375782 recall = 0.219576716423
precision = 0.663865566254 recall = 0.210106387734
precision = 0.613445401192 recall = 0.198100402951
precision = 0.684426248074 recall = 0.212198227644
precision = 0.62365591526 recall = 0.216957598925
precision = 0.665517270565 recall = 0.246487870812
precision = 0.649700582027 recall = 0.296448081732
precision = 0.680473387241 recall = 0.303030312061
precision = 0.663580238819 recall = 0.29614326357
precision = 0.680327892303 recall = 0.318007647991
precision = 0.649595677853 recall = 0.319205284119
precision = 0.632947981358 recall = 0.295148253441
precision = 0.630854010582 recall = 0.313698619604
precision = 0.659846544266 recall = 0.332903236151
precision = 0.639423072338 recall = 0.358008086681
precision = 0.66749382019 recall = 0.333746910095
precision = 0.573732733727 recall = 0.331557929516
precision = 0.640495896339 recall = 0.403645843267
precision = 0.656521737576 recall = 0.391699105501? ?recall 繼續(xù)增大
LOG比較多,省略了
最終訓(xùn)練了大約56個(gè)epoch(RUN了2天多吧)
precision = 0.703311264515 recall = 0.708000004292
precision = 0.691078543663 recall = 0.691999971867
precision = 0.714480876923 recall = 0.665394425392
precision = 0.671562075615 recall = 0.682496607304
precision = 0.701492547989 recall = 0.66882276535
precision = 0.707571804523 recall = 0.702983140945
precision = 0.678861796856 recall = 0.67702704668
precision = 0.697333335876 recall = 0.693633973598
precision = 0.689961910248 recall = 0.711664497852
precision = 0.686351716518 recall = 0.674838721752
?
在訓(xùn)練集中recall 大約70%, precision 也大約70%, accuracy 這次跑沒(méi)有打印,可能在75%左右吧。
再說(shuō)驗(yàn)證集。
一共有409600個(gè)sample(把原始train.csv復(fù)制擴(kuò)大了幾K個(gè)樣本)
train-set : 307200
dev-set : 105600
average accuracy = 0.7539746
average precision = 0.67941993
average recall = 0.60883856
有點(diǎn)差啊?
注:神經(jīng)網(wǎng)絡(luò)里面防止過(guò)擬合比較常用的是dropout,放假期間嘗試過(guò)dropout_keep_rate=1,發(fā)現(xiàn)train和dev 二者的accuracy 差距明顯變大(當(dāng)時(shí)還沒(méi)有評(píng)估precision && recall)。加了dropout后,至少在accuracy上兩者的差值明顯變小了,但是train set 的準(zhǔn)確率也沒(méi)有不加dropout 時(shí)高了,所以最終似乎也沒(méi)有發(fā)現(xiàn)dev set 的準(zhǔn)確性變高。也許是我現(xiàn)在的程序還比較粗糙,dropout這個(gè)事件后續(xù)再嘗試。目前dropout_keep_rate = 0.5。
4, 經(jīng)過(guò)上面的分析,可以認(rèn)為模型已經(jīng)學(xué)到東西了:)?
先在kaggle上提交一下吧,看看結(jié)果怎么樣,能排在什么水平
我的下一步的改進(jìn)思路,基本按照機(jī)器學(xué)習(xí)的正常流程來(lái)說(shuō):
1) 數(shù)據(jù)清洗
? ? ? 老外用quora很多都是在手機(jī)上吧?鍵盤那么小,拼錯(cuò)單詞的情況可能會(huì)有吧?(不知道會(huì)不會(huì)單詞檢查)。那么對(duì)于不在glove字典中出現(xiàn)的單詞,也許是由于拼字錯(cuò)誤造成的,也許是一些專業(yè)性比較強(qiáng)的詞、或者是自行創(chuàng)造的某些生活詞匯。如果能在glove字典中找到非常相似的詞,則認(rèn)為是拼寫錯(cuò)誤,那么就用glove字典中出現(xiàn)的詞來(lái)替代問(wèn)題中的詞。
2)詞向量是不是可以重新訓(xùn)練? 也就是說(shuō),只是把glove的詞向量當(dāng)成是初始的詞向量,而非固定的詞向量。
3)特征工程
? ? ? ? 這個(gè)是目前一直沒(méi)有考慮的問(wèn)題。是不是可以考慮用下面的這些特征
? ? ? ?1) 兩句話的最長(zhǎng)公共子序列的長(zhǎng)度?如果LCS 比較大,是不是意思一樣的概率就會(huì)比較大?
? ? ? ?2) 兩句話的長(zhǎng)度差值。 如果一句話很長(zhǎng),另外一句話非常短,是不是意思相同的概率會(huì)比較低?
? ? ? ?3)主題模型?
?
4) 換不同的模型試試
現(xiàn)在用的是GRU,如果換成LSTM, BLSTM呢?
5) 換損失函數(shù)試試 比如之前提到的對(duì)比損失
6) 是不是可以在simense網(wǎng)絡(luò)后,加一個(gè)隨機(jī)森林試試? 自己瞎想的:
意思是分兩輪,第一論用softmax訓(xùn)練出來(lái)一個(gè)simense網(wǎng)絡(luò),等訓(xùn)練了足夠輪之后,認(rèn)為simense網(wǎng)絡(luò)里面的參數(shù)都穩(wěn)定了,此時(shí)特征都得到了,然后simense 網(wǎng)絡(luò)就不動(dòng)了;然后把softmax去掉,替換成random forest,開(kāi)始第二輪單獨(dú)訓(xùn)練random forest ,最終用ramdom forest的輸出當(dāng)成最終的預(yù)測(cè)值。
7) 數(shù)據(jù)隨機(jī)擴(kuò)展。
如果s1, s2意思相同的話,那么 s2, s1 的意思也是相同的。因此可以把一個(gè)y=1 的樣本(s1, s2, y?)送進(jìn)模型的時(shí)候,隨機(jī)決定是送進(jìn)(s1, s2, y ) 還是? (s2, s1, y)。??
目前的想法大概就是這些,如有問(wèn)題歡迎指正!
?
?
?
??
?回復(fù) 18樓曠野的季節(jié)???03-13經(jīng)過(guò)與唐老師的溝通,目前思路如下:
1) 參考文檔:
http://web.stanford.edu/class/cs224n/reports/2759336.pdf
“ 你之前將抽取出來(lái)的兩個(gè)高階向量直接連續(xù)起來(lái),它增加了兩個(gè)信息,一個(gè)是r1-r2,一個(gè)是r1.*r2,
將這四個(gè)向量連接起來(lái),這個(gè)應(yīng)該相對(duì)于目前的網(wǎng)絡(luò)結(jié)構(gòu)得到一個(gè)挺好的優(yōu)化。”
我模擬了一下這個(gè)實(shí)驗(yàn),accuracy 大概能到83%左右,recall應(yīng)該也比這個(gè)要高一些。可能預(yù)處理做的比這個(gè)文檔上做的更多一些。
然后還有一個(gè),參考一下下面的這些文檔。
這3個(gè)博客是一個(gè)系列,最后一個(gè)鏈接涉及到了很多自然語(yǔ)言理解的問(wèn)題
1.https://explosion.ai/blog/quora-deep-text-pair-classification#example-neural-network
2.https://explosion.ai/blog/supervised-similarity-siamese-cnn
3.https://explosion.ai/blog/
?
2) “詞向量改成可以訓(xùn)練的,這個(gè)非常重要”
這個(gè)一定要能訓(xùn)練,因?yàn)椴荒艿臄?shù)據(jù)集有不同的詞語(yǔ)分布,也導(dǎo)致(不同的數(shù)據(jù)集的)向量分布是不一樣的。可以訓(xùn)練的話會(huì)導(dǎo)致這個(gè)詞向量是最符合我們這個(gè)數(shù)據(jù)集要求
?
3,還有一點(diǎn)是keep_dropout_prob ,我現(xiàn)在是0。5,可以把這個(gè)參數(shù)先取消,暫時(shí)先不做棄權(quán),應(yīng)該先把不做棄權(quán)的效果提上去。若訓(xùn)練集的效果已經(jīng)提高上去,而訓(xùn)練集的(準(zhǔn)確率或loss)和測(cè)試集(準(zhǔn)確或loss)的準(zhǔn)確率區(qū)別比較大了,再來(lái)做棄權(quán)。相當(dāng)于我現(xiàn)在一上來(lái)就做正則,此時(shí)我并不知道現(xiàn)在不知道模型處于什么狀態(tài),能達(dá)到什么效果,是不是已經(jīng)過(guò)擬合。只有當(dāng)模型已經(jīng)出現(xiàn)過(guò)擬合了,再來(lái)做正則。
?
4,就我目前的效果來(lái)說(shuō),先不用考慮CELL是什么。目前還不用考慮是GRU,LSTM,雙向LSTM,比如我就用LSTM,先把效果提上去,提到和別人一樣,比如別人是83%,我是79%,此時(shí)可以再換CELL。對(duì)于單個(gè)模型來(lái)說(shuō),GRU,LSTM,的差別沒(méi)有大到那種程度。
5,數(shù)據(jù)清洗——可以先不考慮。當(dāng)處理個(gè)大概以后,再說(shuō)。先把(結(jié)果)提上去。 ? 怎么提呢,比如網(wǎng)絡(luò)架構(gòu)。要確定網(wǎng)絡(luò)架構(gòu)一定是對(duì)的,比如(什么東西,training or dev ?)能到80%?
6, 特征工程,LCSor 長(zhǎng)度差值,or 主題模型可以先不考慮(因?yàn)閷?duì)于短句子來(lái)說(shuō),主題是比較難做的)很少有人做LDA。。先不用考慮這個(gè)
7,但是當(dāng)訓(xùn)練結(jié)果到達(dá)一定程度后,考慮LCS or 長(zhǎng)度差值,可以再數(shù)據(jù)清洗,拼寫錯(cuò)誤,語(yǔ)法錯(cuò)誤,等。就目前來(lái)說(shuō),先把上面提到的這些做好,網(wǎng)絡(luò)結(jié)構(gòu)稍微變一下就好。
8,損失函數(shù)——“前面提到的對(duì)比損失暫時(shí)不用改。先把網(wǎng)絡(luò)改一下,網(wǎng)絡(luò)結(jié)構(gòu)改好了后,先看看效果。就目前來(lái)說(shuō),不同損失函數(shù)的差別沒(méi)有那么大”
9, 分類器直接用全連接網(wǎng)絡(luò)就可以了,先不用把神經(jīng)網(wǎng)絡(luò)提取出來(lái)的模型送到Random Forest, 這種分類器。"好多碩士的垃圾論文都是這么干的”
10, kaggle上寫給的不是準(zhǔn)確率,是以logloss ,以logloss 為判斷結(jié)果,
11,拿測(cè)試集調(diào)參是沒(méi)有問(wèn)題的
12,跑50輪沒(méi)有必要,跑的太多,跑的太多會(huì)產(chǎn)生非常嚴(yán)重的過(guò)擬合,有時(shí)要在代碼中加入畫圖的功能,tensorboard,準(zhǔn)確率、召回率、loss 都能打印出來(lái),動(dòng)態(tài)變化的。可以看測(cè)試集,什么時(shí)候收斂都可以看出來(lái),可以看什么時(shí)候擬合效果是最好的。如果tensorboard費(fèi)勁,也可以看loss。 訓(xùn)練集的準(zhǔn)確率和loss 到最后不會(huì)產(chǎn)生大的波動(dòng),但是測(cè)試集的準(zhǔn)確率可能不好有太大變化,但是loss會(huì)有一個(gè)特別大的提升(To be checked)。
12,提交給Kaggle上的是概率。是softmax/sigmoid上的概率。提交0-1結(jié)果是有問(wèn)題的。
13,用了一下交叉驗(yàn)證,但是用交叉驗(yàn)證或不用,差別沒(méi)有那么大,一開(kāi)始進(jìn)不需要使用。
14,“用測(cè)試集上調(diào)參用什么指標(biāo)?” 用logloss?就可以。
?
?
?回復(fù) 19樓曠野的季節(jié)???03-161,這周的工作,學(xué)習(xí)了tensorboard的使用:
為了和詞向量Trainalbe的結(jié)果做下對(duì)比,因此本篇的結(jié)果,是詞向量不可訓(xùn)練。下一篇再上詞向量可訓(xùn)練的。另外此時(shí)keep_dropout_prob=1 。目前是為了看一下模型現(xiàn)在處于的狀態(tài)。
把超參數(shù)說(shuō)明一下:
RUN_MODEL=two-feature-substrate?? 高階特征的組合方式是abs(r1-r2)
BATCH_SIZE=2048?????????????????????????????????????? 一個(gè)batch包含的樣本個(gè)數(shù)
DROPOUT_KEEP_PROB=1.0?????????????????? 不做棄權(quán)
EMBEDDING_TRAINABLE=False?????????? ? 詞向量不可訓(xùn)練
L2_REG_LAMBDA=0.0???????????????????????????????? 不做正則
NUMBER_UNITS=50??????????????????????????????????? RNN的cell個(gè)數(shù)
TRAIN_SAMPLE_PERCENTAGE=0.75???? train/total 比例
TRAIN_SIZE=307200??????????????????????????????????? 訓(xùn)練集的樣本個(gè)數(shù)
下面的圖片是訓(xùn)練集,而文字描述是測(cè)試集:
Train loss:??? 0.36 :? DEV loss:? 0.5330878?
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
而測(cè)試集的情況是:
Train accuracy : 83% Dev accuracy :? 75.68 %
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
?
而測(cè)試集的情況是:
Train precison: 77%? Dev precision: 68.22 %
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
?
而測(cè)試集的情況是:
Train recall : 77% Test recall:? 61.5%
這四個(gè)指標(biāo)的Train && Dev 之間的差距都比較大,因此,我認(rèn)為現(xiàn)在模型處于嚴(yán)重的過(guò)擬合狀態(tài)。應(yīng)該考慮加正則或者drop手段來(lái)防止過(guò)擬合。
?
?
?回復(fù) 20樓曠野的季節(jié)???03-17與前一篇的區(qū)別,是詞向量是可以訓(xùn)練的。正如唐老師所說(shuō),詞向量一定要是可以訓(xùn)練的,效果有了很大的變化:
還是先看訓(xùn)練集,結(jié)果好的不得了. 超參數(shù)是這些:
RUN_MODEL=two-feature-substrate-trainable??????????????????????? -- 模型的高階特征處理方式: abs(r1-r2)
BATCH_SIZE=2048??????????????????????????????????????????????????????????????????????????????
DROPOUT_KEEP_PROB=1.0?????????????????????????????????????????????????????????? --不做棄權(quán)
EMBEDDING_TRAINABLE=True????????????????????????????????????????????????????? --詞向量可訓(xùn)練
L2_REG_LAMBDA=0.0??????????????????????????????????????????????????????????????????????? --損失函數(shù)(cross-entropy)不做正則
NUMBER_UNITS=50?????????????????????????????????????????????????????????????????????????? --一個(gè)RNN模型內(nèi)部的hidden-state 個(gè)數(shù)
RNN_TYPE=gru??????????????????????????????????????????????????????????????????????????????????? --cell 類型:GRU
TRAIN_SAMPLE_PERCENTAGE=0.75??????????????????????????????????????????? --train/total 比例
訓(xùn)練集loss 能下降到0.1以下:
還有個(gè)現(xiàn)象,loss會(huì)在每輪(一輪包含150個(gè)mini-batch)開(kāi)始的地方突然有個(gè)很大的下降,但是在每輪中間的地方loss 會(huì)有緩慢的提升,然后在下一輪開(kāi)始的地方再突然下降一下子。圖中突然下降了幾次,就代表訓(xùn)練了幾輪。
不只是loss,下面的accuracy, recall, precison 都有這個(gè)現(xiàn)象。why?
?
訓(xùn)練集accuracy 提升到97% 左右。還是在每epoch開(kāi)頭的地方突然上升。所以出現(xiàn)下面這樣的波動(dòng)形式。
?
訓(xùn)練集recall 最后能提到97% 左右。
訓(xùn)練集precision 能在95%左右。
?
綜上,改成詞向量可以訓(xùn)練之后,神經(jīng)網(wǎng)絡(luò)在訓(xùn)練集上的表現(xiàn)有了巨大的提升。
但是在測(cè)試集上的表現(xiàn)就不那么好了。
@ 后面的數(shù)字是min-batch 個(gè)數(shù), 1 epoch = 150 mini-batches
?
加粗的幾行是我認(rèn)為loss 最好的幾次迭代,大約是1個(gè)epoch的位置
DEV loss: 0.6659 ; accuracy: 0.6341 ; recall: 0.0088 ; precison: 0.3312 ; DEV@ 0
DEV loss: 0.6705 ; accuracy: 0.6372 ; recall: 0.0000 ; precison: nan ; DEV@ 10
DEV loss: 0.6531 ; accuracy: 0.6360 ; recall: 0.0174 ; precison: 0.4557 ; DEV@ 20
DEV loss: 0.5838 ; accuracy: 0.7217 ; recall: 0.4242 ; precison: 0.6891 ; DEV@ 50
DEV loss: 0.5438 ; accuracy: 0.7354 ; recall: 0.4776 ; precison: 0.6976 ; DEV@ 60
DEV loss: 0.5235 ; accuracy: 0.7445 ; recall: 0.4851 ; precison: 0.7191 ; DEV@ 70
DEV loss: 0.5229 ; accuracy: 0.7465 ; recall: 0.4742 ; precison: 0.7326 ; DEV@ 80
DEV loss: 0.5157 ; accuracy: 0.7517 ; recall: 0.5194 ; precison: 0.7180 ; DEV@ 90
DEV loss: 0.5093 ; accuracy: 0.7561 ; recall: 0.5289 ; precison: 0.7240 ; DEV@ 100
DEV loss: 0.5049 ; accuracy: 0.7633 ; recall: 0.5578 ; precison: 0.7258 ; DEV@ 110
DEV loss: 0.4961 ; accuracy: 0.7668 ; recall: 0.5774 ; precison: 0.7235 ; DEV@ 120
DEV loss: 0.5035 ; accuracy: 0.7675 ; recall: 0.5558 ; precison: 0.7382 ; DEV@ 130
DEV loss: 0.5041 ; accuracy: 0.7700 ; recall: 0.5509 ; precison: 0.7483 ; DEV@ 140
DEV loss: 0.4950 ; accuracy: 0.7728 ; recall: 0.5776 ; precison: 0.7389 ; DEV@ 150
DEV loss: 0.5051 ; accuracy: 0.7743 ; recall: 0.6171 ; precison: 0.7203 ; DEV@ 160
DEV loss: 0.5158 ; accuracy: 0.7724 ; recall: 0.6085 ; precison: 0.7203 ; DEV@ 170
DEV loss: 0.5139 ; accuracy: 0.7694 ; recall: 0.6014 ; precison: 0.7170 ; DEV@ 180
DEV loss: 0.5311 ; accuracy: 0.7699 ; recall: 0.5740 ; precison: 0.7335 ; DEV@ 190
DEV loss: 0.5285 ; accuracy: 0.7698 ; recall: 0.5702 ; precison: 0.7354 ; DEV@ 200
DEV loss: 0.5063 ; accuracy: 0.7774 ; recall: 0.6331 ; precison: 0.7193 ; DEV@ 210
DEV loss: 0.5225 ; accuracy: 0.7733 ; recall: 0.6100 ; precison: 0.7218 ; DEV@ 220
DEV loss: 0.5283 ; accuracy: 0.7746 ; recall: 0.5955 ; precison: 0.7328 ; DEV@ 230
DEV loss: 0.5235 ; accuracy: 0.7766 ; recall: 0.5916 ; precison: 0.7401 ; DEV@ 240
DEV loss: 0.5041 ; accuracy: 0.7798 ; recall: 0.6475 ; precison: 0.7177 ; DEV@ 250
DEV loss: 0.5089 ; accuracy: 0.7818 ; recall: 0.6295 ; precison: 0.7311 ; DEV@ 260
DEV loss: 0.5253 ; accuracy: 0.7764 ; recall: 0.5726 ; precison: 0.7514 ; DEV@ 270
DEV loss: 0.5222 ; accuracy: 0.7777 ; recall: 0.5740 ; precison: 0.7540 ; DEV@ 280
DEV loss: 0.5385 ; accuracy: 0.7776 ; recall: 0.5600 ; precison: 0.7634 ; DEV@ 290
DEV loss: 0.5249 ; accuracy: 0.7796 ; recall: 0.5941 ; precison: 0.7461 ; DEV@ 300
DEV loss: 0.5537 ; accuracy: 0.7815 ; recall: 0.6159 ; precison: 0.7381 ; DEV@ 310
DEV loss: 0.5536 ; accuracy: 0.7813 ; recall: 0.6280 ; precison: 0.7309 ; DEV@ 320
DEV loss: 0.5699 ; accuracy: 0.7792 ; recall: 0.6148 ; precison: 0.7331 ; DEV@ 330
DEV loss: 0.5710 ; accuracy: 0.7779 ; recall: 0.6352 ; precison: 0.7192 ; DEV@ 340
DEV loss: 0.5712 ; accuracy: 0.7768 ; recall: 0.6316 ; precison: 0.7188 ; DEV@ 350
DEV loss: 0.5867 ; accuracy: 0.7749 ; recall: 0.6006 ; precison: 0.7306 ; DEV@ 360
DEV loss: 0.5844 ; accuracy: 0.7773 ; recall: 0.6140 ; precison: 0.7290 ; DEV@ 370
DEV loss: 0.5889 ; accuracy: 0.7761 ; recall: 0.6173 ; precison: 0.7244 ; DEV@ 380
DEV loss: 0.5766 ; accuracy: 0.7761 ; recall: 0.6131 ; precison: 0.7266 ; DEV@ 390
DEV loss: 0.6048 ; accuracy: 0.7731 ; recall: 0.5612 ; precison: 0.7499 ; DEV@ 400
DEV loss: 0.5857 ; accuracy: 0.7776 ; recall: 0.5921 ; precison: 0.7424 ; DEV@ 410
DEV loss: 0.5886 ; accuracy: 0.7756 ; recall: 0.5774 ; precison: 0.7464 ; DEV@ 420
DEV loss: 0.5653 ; accuracy: 0.7805 ; recall: 0.6122 ; precison: 0.7380 ; DEV@ 430
?DEV loss: 0.5659 ; accuracy: 0.7827 ; recall: 0.6333 ; precison: 0.7314 ; DEV@ 440
DEV loss: 0.6109 ; accuracy: 0.7763 ; recall: 0.5629 ; precison: 0.7579 ; DEV@ 450
DEV loss: 0.6445 ; accuracy: 0.7774 ; recall: 0.6011 ; precison: 0.7366 ; DEV@ 460
DEV loss: 0.6201 ; accuracy: 0.7810 ; recall: 0.6366 ; precison: 0.7257 ; DEV@ 470
DEV loss: 0.6452 ; accuracy: 0.7789 ; recall: 0.6210 ; precison: 0.7291 ; DEV@ 480
DEV loss: 0.6480 ; accuracy: 0.7775 ; recall: 0.6272 ; precison: 0.7227 ; DEV@ 490
DEV loss: 0.6481 ; accuracy: 0.7769 ; recall: 0.6292 ; precison: 0.7201 ; DEV@ 500
DEV loss: 0.6588 ; accuracy: 0.7776 ; recall: 0.6170 ; precison: 0.7282 ; DEV@ 510
DEV loss: 0.6349 ; accuracy: 0.7803 ; recall: 0.6447 ; precison: 0.7200 ; DEV@ 520
DEV loss: 0.6468 ; accuracy: 0.7786 ; recall: 0.6313 ; precison: 0.7228 ; DEV@ 530
DEV loss: 0.6670 ; accuracy: 0.7768 ; recall: 0.6149 ; precison: 0.7274 ; DEV@ 540
DEV loss: 0.6969 ; accuracy: 0.7715 ; recall: 0.5670 ; precison: 0.7420 ; DEV@ 550
DEV loss: 0.6397 ; accuracy: 0.7818 ; recall: 0.6284 ; precison: 0.7320 ; DEV@ 560
DEV loss: 0.6683 ; accuracy: 0.7772 ; recall: 0.6120 ; precison: 0.7298 ; DEV@ 570
DEV loss: 0.6534 ; accuracy: 0.7753 ; recall: 0.5944 ; precison: 0.7353 ; DEV@ 580
DEV loss: 0.6742 ; accuracy: 0.7757 ; recall: 0.5806 ; precison: 0.7445 ; DEV@ 590
DEV loss: 0.6560 ; accuracy: 0.7773 ; recall: 0.5958 ; precison: 0.7393 ; DEV@ 600
DEV loss: 0.7081 ; accuracy: 0.7763 ; recall: 0.5930 ; precison: 0.7386 ; DEV@ 610
DEV loss: 0.6917 ; accuracy: 0.7772 ; recall: 0.6255 ; precison: 0.7229 ; DEV@ 620
DEV loss: 0.7018 ; accuracy: 0.7785 ; recall: 0.6231 ; precison: 0.7271 ; DEV@ 630
DEV loss: 0.7143 ; accuracy: 0.7763 ; recall: 0.6365 ; precison: 0.7154 ; DEV@ 640
DEV loss: 0.7307 ; accuracy: 0.7764 ; recall: 0.6059 ; precison: 0.7315 ; DEV@ 650
DEV loss: 0.7487 ; accuracy: 0.7763 ; recall: 0.5971 ; precison: 0.7363 ; DEV@ 660
DEV loss: 0.7326 ; accuracy: 0.7756 ; recall: 0.6419 ; precison: 0.7111 ; DEV@ 670
DEV loss: 0.7562 ; accuracy: 0.7755 ; recall: 0.5941 ; precison: 0.7361 ; DEV@ 680
DEV loss: 0.7530 ; accuracy: 0.7746 ; recall: 0.5833 ; precison: 0.7399 ; DEV@ 690
DEV loss: 0.7605 ; accuracy: 0.7730 ; recall: 0.5841 ; precison: 0.7354 ; DEV@ 700
DEV loss: 0.7301 ; accuracy: 0.7743 ; recall: 0.6192 ; precison: 0.7194 ; DEV@ 710
DEV loss: 0.7036 ; accuracy: 0.7807 ; recall: 0.6542 ; precison: 0.7164 ; DEV@ 720
DEV loss: 0.7296 ; accuracy: 0.7731 ; recall: 0.6245 ; precison: 0.7142 ; DEV@ 730
DEV loss: 0.7083 ; accuracy: 0.7776 ; recall: 0.6297 ; precison: 0.7218 ; DEV@ 740
DEV loss: 0.7306 ; accuracy: 0.7750 ; recall: 0.6092 ; precison: 0.7265 ; DEV@ 750
DEV loss: 0.7493 ; accuracy: 0.7791 ; recall: 0.6185 ; precison: 0.7311 ; DEV@ 760
DEV loss: 0.7832 ; accuracy: 0.7747 ; recall: 0.6100 ; precison: 0.7252 ; DEV@ 770
DEV loss: 0.7836 ; accuracy: 0.7777 ; recall: 0.6179 ; precison: 0.7281 ; DEV@ 780
DEV loss: 0.8177 ; accuracy: 0.7737 ; recall: 0.6059 ; precison: 0.7249 ; DEV@ 790
DEV loss: 0.7961 ; accuracy: 0.7770 ; recall: 0.6333 ; precison: 0.7185 ; DEV@ 800
DEV loss: 0.8156 ; accuracy: 0.7740 ; recall: 0.6264 ; precison: 0.7150 ; DEV@ 810
DEV loss: 0.8091 ; accuracy: 0.7749 ; recall: 0.6227 ; precison: 0.7190 ; DEV@ 820
DEV loss: 0.8161 ; accuracy: 0.7732 ; recall: 0.6260 ; precison: 0.7133 ; DEV@ 830
DEV loss: 0.7899 ; accuracy: 0.7778 ; recall: 0.6267 ; precison: 0.7235 ; DEV@ 840
DEV loss: 0.8163 ; accuracy: 0.7748 ; recall: 0.6033 ; precison: 0.7288 ; DEV@ 850
DEV loss: 0.8356 ; accuracy: 0.7717 ; recall: 0.5829 ; precison: 0.7329 ; DEV@ 860
DEV loss: 0.8385 ; accuracy: 0.7724 ; recall: 0.5911 ; precison: 0.7298 ; DEV@ 870
DEV loss: 0.7942 ; accuracy: 0.7769 ; recall: 0.6284 ; precison: 0.7206 ; DEV@ 880
DEV loss: 0.7872 ; accuracy: 0.7755 ; recall: 0.6318 ; precison: 0.7157 ; DEV@ 890
DEV loss: 0.8127 ; accuracy: 0.7751 ; recall: 0.6028 ; precison: 0.7300 ; DEV@ 900
DEV loss: 0.8680 ; accuracy: 0.7722 ; recall: 0.5751 ; precison: 0.7387 ; DEV@ 910
DEV loss: 0.8479 ; accuracy: 0.7749 ; recall: 0.6110 ; precison: 0.7250 ; DEV@ 920
DEV loss: 0.8654 ; accuracy: 0.7768 ; recall: 0.6170 ; precison: 0.7262 ; DEV@ 930
DEV loss: 0.8799 ; accuracy: 0.7737 ; recall: 0.6088 ; precison: 0.7233 ; DEV@ 940
DEV loss: 0.8527 ; accuracy: 0.7752 ; recall: 0.6235 ; precison: 0.7194 ; DEV@ 950
DEV loss: 0.8872 ; accuracy: 0.7745 ; recall: 0.6102 ; precison: 0.7244 ; DEV@ 960
DEV loss: 0.8974 ; accuracy: 0.7709 ; recall: 0.6066 ; precison: 0.7178 ; DEV@ 970
DEV loss: 0.8966 ; accuracy: 0.7715 ; recall: 0.6148 ; precison: 0.7152 ; DEV@ 980
DEV loss: 0.9059 ; accuracy: 0.7710 ; recall: 0.6144 ; precison: 0.7141 ; DEV@ 990
DEV loss: 0.8862 ; accuracy: 0.7730 ; recall: 0.6271 ; precison: 0.7124 ; DEV@ 1000
DEV loss: 0.8957 ; accuracy: 0.7738 ; recall: 0.6306 ; precison: 0.7124 ; DEV@ 1010
DEV loss: 0.8694 ; accuracy: 0.7731 ; recall: 0.6358 ; precison: 0.7086 ; DEV@ 1020
DEV loss: 0.8972 ; accuracy: 0.7709 ; recall: 0.5963 ; precison: 0.7234 ; DEV@ 1030
DEV loss: 0.8937 ; accuracy: 0.7729 ; recall: 0.5862 ; precison: 0.7341 ; DEV@ 1040
DEV loss: 0.8588 ; accuracy: 0.7716 ; recall: 0.6160 ; precison: 0.7148 ; DEV@ 1050
DEV loss: 0.9108 ; accuracy: 0.7722 ; recall: 0.6133 ; precison: 0.7175 ; DEV@ 1060
DEV loss: 0.9231 ; accuracy: 0.7712 ; recall: 0.6160 ; precison: 0.7140 ; DEV@ 1070
DEV loss: 0.9258 ; accuracy: 0.7721 ; recall: 0.6234 ; precison: 0.7123 ; DEV@ 1080
DEV loss: 0.9140 ; accuracy: 0.7718 ; recall: 0.6518 ; precison: 0.6988 ; DEV@ 1090
DEV loss: 0.9197 ; accuracy: 0.7745 ; recall: 0.6333 ; precison: 0.7129 ; DEV@ 1100
DEV loss: 0.9350 ; accuracy: 0.7713 ; recall: 0.6194 ; precison: 0.7125 ; DEV@ 1110
DEV loss: 0.9336 ; accuracy: 0.7753 ; recall: 0.6355 ; precison: 0.7137 ; DEV@ 1120
DEV loss: 0.9476 ; accuracy: 0.7710 ; recall: 0.6301 ; precison: 0.7068 ; DEV@ 1130
DEV loss: 0.9473 ; accuracy: 0.7719 ; recall: 0.6193 ; precison: 0.7139 ; DEV@ 1140
DEV loss: 1.0057 ; accuracy: 0.7704 ; recall: 0.5846 ; precison: 0.7286 ; DEV@ 1150
DEV loss: 0.9972 ; accuracy: 0.7719 ; recall: 0.5840 ; precison: 0.7328 ; DEV@ 1160
DEV loss: 0.9716 ; accuracy: 0.7715 ; recall: 0.6060 ; precison: 0.7198 ; DEV@ 1170
DEV loss: 0.9594 ; accuracy: 0.7731 ; recall: 0.6132 ; precison: 0.7199 ; DEV@ 1180
DEV loss: 0.9689 ; accuracy: 0.7730 ; recall: 0.5972 ; precison: 0.7278 ; DEV@ 1190
DEV loss: 0.9508 ; accuracy: 0.7709 ; recall: 0.6027 ; precison: 0.7200 ; DEV@ 1200
DEV loss: 0.9960 ; accuracy: 0.7695 ; recall: 0.5949 ; precison: 0.7206 ; DEV@ 1210
DEV loss: 0.9898 ; accuracy: 0.7696 ; recall: 0.6113 ; precison: 0.7126 ; DEV@ 1220
DEV loss: 1.0158 ; accuracy: 0.7668 ; recall: 0.5986 ; precison: 0.7126 ; DEV@ 1230
DEV loss: 0.9878 ; accuracy: 0.7729 ; recall: 0.6259 ; precison: 0.7129 ; DEV@ 1240
DEV loss: 1.0076 ; accuracy: 0.7689 ; recall: 0.6303 ; precison: 0.7019 ; DEV@ 1250
DEV loss: 1.0095 ; accuracy: 0.7706 ; recall: 0.6357 ; precison: 0.7032 ; DEV@ 1260
DEV loss: 1.0291 ; accuracy: 0.7692 ; recall: 0.6103 ; precison: 0.7121 ; DEV@ 1270
DEV loss: 1.0177 ; accuracy: 0.7688 ; recall: 0.6104 ; precison: 0.7112 ; DEV@ 1280
DEV loss: 1.0118 ; accuracy: 0.7724 ; recall: 0.6133 ; precison: 0.7181 ; DEV@ 1290
DEV loss: 1.0196 ; accuracy: 0.7729 ; recall: 0.6320 ; precison: 0.7100 ; DEV@ 1300
DEV loss: 1.0118 ; accuracy: 0.7725 ; recall: 0.6272 ; precison: 0.7114 ; DEV@ 1310
DEV loss: 1.0268 ; accuracy: 0.7683 ; recall: 0.6026 ; precison: 0.7140 ; DEV@ 1320
DEV loss: 1.0056 ; accuracy: 0.7719 ; recall: 0.6126 ; precison: 0.7171 ; DEV@ 1330
DEV loss: 0.9959 ; accuracy: 0.7699 ; recall: 0.6298 ; precison: 0.7044 ; DEV@ 1340
DEV loss: 0.9999 ; accuracy: 0.7693 ; recall: 0.6238 ; precison: 0.7058 ; DEV@ 1350
DEV loss: 1.0659 ; accuracy: 0.7672 ; recall: 0.5919 ; precison: 0.7169 ; DEV@ 1360
DEV loss: 1.0352 ; accuracy: 0.7720 ; recall: 0.6186 ; precison: 0.7144 ; DEV@ 1370
DEV loss: 1.0618 ; accuracy: 0.7720 ; recall: 0.6082 ; precison: 0.7196 ; DEV@ 1380
DEV loss: 1.0594 ; accuracy: 0.7723 ; recall: 0.6082 ; precison: 0.7203 ; DEV@ 1390
DEV loss: 1.0625 ; accuracy: 0.7713 ; recall: 0.6135 ; precison: 0.7154 ; DEV@ 1400
DEV loss: 1.0484 ; accuracy: 0.7711 ; recall: 0.6214 ; precison: 0.7111 ; DEV@ 1410
DEV loss: 1.0742 ; accuracy: 0.7684 ; recall: 0.6077 ; precison: 0.7116 ; DEV@ 1420
DEV loss: 1.0538 ; accuracy: 0.7710 ; recall: 0.6298 ; precison: 0.7068 ; DEV@ 1430
DEV loss: 1.0473 ; accuracy: 0.7710 ; recall: 0.6262 ; precison: 0.7086 ; DEV@ 1440
DEV loss: 1.0861 ; accuracy: 0.7683 ; recall: 0.5924 ; precison: 0.7193 ; DEV@ 1450
DEV loss: 1.0943 ; accuracy: 0.7680 ; recall: 0.5950 ; precison: 0.7170 ; DEV@ 1460
DEV loss: 1.0661 ; accuracy: 0.7693 ; recall: 0.6275 ; precison: 0.7041 ; DEV@ 1470
DEV loss: 1.0624 ; accuracy: 0.7662 ; recall: 0.6073 ; precison: 0.7067 ; DEV@ 1480
DEV loss: 1.0819 ; accuracy: 0.7691 ; recall: 0.5919 ; precison: 0.7212 ; DEV@ 1490
DEV loss: 1.0587 ; accuracy: 0.7688 ; recall: 0.6016 ; precison: 0.7156 ; DEV@ 1500
DEV loss: 1.1026 ; accuracy: 0.7681 ; recall: 0.5976 ; precison: 0.7158 ; DEV@ 1510
DEV loss: 1.0929 ; accuracy: 0.7708 ; recall: 0.6197 ; precison: 0.7112 ; DEV@ 1520
DEV loss: 1.1367 ; accuracy: 0.7682 ; recall: 0.5863 ; precison: 0.7222 ; DEV@ 1530
DEV loss: 1.1140 ; accuracy: 0.7690 ; recall: 0.5962 ; precison: 0.7188 ; DEV@ 1540
DEV loss: 1.1122 ; accuracy: 0.7695 ; recall: 0.6075 ; precison: 0.7142 ; DEV@ 1550
DEV loss: 1.1027 ; accuracy: 0.7701 ; recall: 0.6246 ; precison: 0.7073 ; DEV@ 1560
DEV loss: 1.0887 ; accuracy: 0.7696 ; recall: 0.6323 ; precison: 0.7027 ; DEV@ 1570
DEV loss: 1.1285 ; accuracy: 0.7686 ; recall: 0.6307 ; precison: 0.7013 ; DEV@ 1580
DEV loss: 1.1198 ; accuracy: 0.7696 ; recall: 0.6143 ; precison: 0.7113 ; DEV@ 1590
DEV loss: 1.1425 ; accuracy: 0.7676 ; recall: 0.6001 ; precison: 0.7136 ; DEV@ 1600
DEV loss: 1.1145 ; accuracy: 0.7680 ; recall: 0.6187 ; precison: 0.7055 ; DEV@ 1610
DEV loss: 1.1620 ; accuracy: 0.7661 ; recall: 0.6014 ; precison: 0.7093 ; DEV@ 1620
DEV loss: 1.1395 ; accuracy: 0.7671 ; recall: 0.6028 ; precison: 0.7110 ; DEV@ 1630
DEV loss: 1.1194 ; accuracy: 0.7689 ; recall: 0.6141 ; precison: 0.7095 ; DEV@ 1640
DEV loss: 1.1028 ; accuracy: 0.7699 ; recall: 0.6187 ; precison: 0.7097 ; DEV@ 1650
DEV loss: 1.1536 ; accuracy: 0.7654 ; recall: 0.5890 ; precison: 0.7140 ; DEV@ 1660
DEV loss: 1.1395 ; accuracy: 0.7683 ; recall: 0.6080 ; precison: 0.7113 ; DEV@ 1670
DEV loss: 1.1600 ; accuracy: 0.7703 ; recall: 0.6085 ; precison: 0.7157 ; DEV@ 1680
DEV loss: 1.1918 ; accuracy: 0.7658 ; recall: 0.5858 ; precison: 0.7169 ; DEV@ 1690
DEV loss: 1.2008 ; accuracy: 0.7662 ; recall: 0.5822 ; precison: 0.7197 ; DEV@ 1700
DEV loss: 1.1987 ; accuracy: 0.7692 ; recall: 0.6003 ; precison: 0.7173 ; DEV@ 1710
DEV loss: 1.2023 ; accuracy: 0.7701 ; recall: 0.6110 ; precison: 0.7138 ; DEV@ 1720
DEV loss: 1.2142 ; accuracy: 0.7701 ; recall: 0.5901 ; precison: 0.7249 ; DEV@ 1730
DEV loss: 1.1778 ; accuracy: 0.7699 ; recall: 0.6045 ; precison: 0.7168 ; DEV@ 1740
能得到的信息有這么幾個(gè):
1, 訓(xùn)練的輪數(shù)太多的話,accuracy ,recall, preciosn 也許變化不太大,但是loss? 會(huì)先下降隨后一路上升
即使是test表現(xiàn)最好的第一輪未,
train loss = 0.34 dev loss = 0.49
,train && test 區(qū)別也比較大。可見(jiàn)目前模型處于嚴(yán)重的過(guò)擬合。
接下來(lái)先要解決一下模型的過(guò)擬合問(wèn)題。
?
?回復(fù) 21樓曠野的季節(jié)???24天前Parameters:
參考了唐老師給出的參考資料
http://web.stanford.edu/class/cs224n/reports/2759336.pdf
神經(jīng)網(wǎng)絡(luò)的架構(gòu)使用的是:
和這個(gè)架構(gòu)唯一的區(qū)別,是把r1-r2 替換成了abs(r1-r2),
我一開(kāi)始沒(méi)有用四個(gè)向量拼接的方式,只是使用了abs(r1-r2);而如果僅僅用r1-r2,神經(jīng)網(wǎng)絡(luò)基本無(wú)法收斂。因此參考這篇文章時(shí),我把四個(gè)向量里面的r1-r2 替換成了abs(r1-r2)。
目前的疑問(wèn)有下面這些:
問(wèn)題一: 如果詞向量是可以訓(xùn)練的,該怎么訓(xùn)練呢?有下面這兩種方式,哪種是正確的?
方式一: 用glove向量當(dāng)成詞向量的初始值,然后只是在訓(xùn)練時(shí)順便把詞向量做成"Trainable",如下面的代碼:
??????????? self.W =?tf.get_variable(name='word_embedding', shape = self.word_emm
bedding.shape,dtype=tf.float32,
??????????? initializer=tf.constant_initializer(self.word_embedding), trainable==
self.embedding_trainable)????使用glove向量當(dāng)成W的初始值, 同時(shí)W的是可以根據(jù)loss做調(diào)整的,使用的是神經(jīng)網(wǎng)絡(luò)最后一層的tf.nn.softmax_cross_entropy_with_logits做損失函數(shù)
方式二: 使用word2vec程序,把traing.txt當(dāng)成語(yǔ)料庫(kù),用CBOW or Skip-Gram模型來(lái)學(xué)習(xí)詞向量。
然后學(xué)習(xí)到詞向量之后,再拿過(guò)來(lái)送進(jìn)現(xiàn)有模型,同時(shí)做成不可訓(xùn)練的(or 可訓(xùn)練的?如方式一?)
?
應(yīng)該是使用哪種方式呢?方式一or 方式二? or 都不是?
目前我的程序使用的是方式一
?
問(wèn)題二:
訓(xùn)練集的loss曲線,
第一輪時(shí)loss 下降很快;
第二輪時(shí)loss 基本持平;
從第二輪到第三輪切換時(shí),loss有一個(gè)大幅度的下降;
為什么從第三輪開(kāi)始,在每輪內(nèi)部的loss會(huì)有小幅的小升?而從第三輪進(jìn)入第四輪時(shí),loss 才會(huì)有一個(gè)比較大下降?
Note: 每一輪進(jìn)入下一輪時(shí),所有的訓(xùn)練數(shù)據(jù)會(huì)全部隨機(jī)shuffle。每個(gè)mini-batch會(huì)按照順序依次切取一小塊送給模型進(jìn)行訓(xùn)練。
優(yōu)化算法使用的是Adam算法。
?
問(wèn)題三:
我目前使用50維的詞向量,是不是太小?對(duì)結(jié)果影響大嗎?
?
因?yàn)槲铱凑撐睦锩嬲f(shuō):
使用了200d的詞向量,本來(lái)想使用300d的詞向量,因?yàn)槌绦蚺芷饋?lái),慢,才做罷 ~~
Table 1:Model performance comparisonIn all of these models, we used a word embedding pre-trained using the GloVe algorithmusing 27 billion Twitter tweets. The vectors chosen were?200d, as these were the largestdimensionality vectors available with this dataset. Using 300d vectors with Wikipedia datawas also explored, but training time was prohibitively slow, and Twitter vectors appeared tooutperform 200d Wikipedia vectors on this datase
RUN_MODEL=two-feature-substrate-trainable-swap
ALLOW_SOFT_PLACEMENT=True
BATCH_SIZE=2048??????????????????????????????????????????????????????? 一個(gè)mini-batch包含的樣本數(shù)
DROPOUT_KEEP_PROB=0.5??????????????????????????????????? 四個(gè)向量拼接之后,進(jìn)入全連接層之前,做了棄權(quán),0.5
EMBEDDING_TRAINABLE=True??????????????????????????????????使用神經(jīng)網(wǎng)絡(luò)最后的損失來(lái)訓(xùn)練詞向量,OK?
L2_REG_LAMBDA=0.0??????????????????????????????????????????????????? 損失函數(shù)沒(méi)有做L2
NUMBER_UNITS=50?????????????????????????????????????????????????????? 每一個(gè)RNN內(nèi)部的"memory"包含的神經(jīng)元的大小
RNN_TYPE=gru
TRAIN_SAMPLE_PERCENTAGE=0.75??????????????????????? 使用75%的數(shù)據(jù)做訓(xùn)練,其余的25%做測(cè)試, OK?
TRAIN_SIZE=307200???????????????????????????????????????????????????????訓(xùn)練集的包含的樣本大小
?
下面是在25%的測(cè)試集(共107200個(gè)樣本)的測(cè)試情況
DEV loss: 0.6602 ; accuracy: 0.6372 ; recall: 0.0000 ; precison: nan ; DEV@ 0
DEV loss: 0.6296 ; accuracy: 0.6408 ; recall: 0.0142 ; precison: 0.7647 ; DEV@ 4
...
DEV loss: 0.4783 ; accuracy: 0.7680 ; recall: 0.5416 ; precison: 0.7487 ; DEV@ 84
DEV loss: 0.4790 ; accuracy: 0.7671 ; recall: 0.5396 ; precison: 0.7477 ; DEV@ 88
DEV loss: 0.4753 ; accuracy: 0.7700 ; recall: 0.5496 ; precison: 0.7489 ; DEV@ 92
DEV loss: 0.4774 ; accuracy: 0.7701 ; recall: 0.5457 ; precison: 0.7520 ; DEV@ 96
DEV loss: 0.4735 ; accuracy: 0.7727 ; recall: 0.5623 ; precison: 0.7480 ; DEV@ 100
...
DEV loss: 0.4601 ; accuracy: 0.7824 ; recall: 0.6044 ; precison: 0.7470 ; DEV@ 136
DEV loss: 0.4839 ; accuracy: 0.7711 ; recall: 0.5027 ; precison: 0.7895 ; DEV@ 140
DEV loss: 0.4692 ; accuracy: 0.7783 ; recall: 0.5572 ; precison: 0.7678 ; DEV@ 144
DEV loss: 0.4668 ; accuracy: 0.7796 ; recall: 0.5829 ; precison: 0.7534 ; DEV@ 148
read next epoch!, epoch =? 1
DEV loss: 0.4857 ; accuracy: 0.7768 ; recall: 0.5419 ; precison: 0.7747 ; DEV@ 152
DEV loss: 0.4657 ; accuracy: 0.7875 ; recall: 0.6334 ; precison: 0.7427 ; DEV@ 156
DEV loss: 0.4649 ; accuracy: 0.7870 ; recall: 0.6116 ; precison: 0.7543 ; DEV@ 160
...
DEV loss: 0.4892 ; accuracy: 0.7839 ; recall: 0.5779 ; precison: 0.7687 ; DEV@ 208
DEV loss: 0.4711 ; accuracy: 0.7875 ; recall: 0.6249 ; precison: 0.7475 ; DEV@ 212
DEV loss: 0.4765 ; accuracy: 0.7859 ; recall: 0.6004 ; precison: 0.7588 ; DEV@ 216
DEV loss: 0.4726 ; accuracy: 0.7883 ; recall: 0.6231 ; precison: 0.7505 ; DEV@ 220
DEV loss: 0.4805 ; accuracy: 0.7854 ; recall: 0.5926 ; precison: 0.7626 ; DEV@ 224
DEV loss: 0.4614 ; accuracy: 0.7902 ; recall: 0.6439 ; precison: 0.7433 ; DEV@ 228
...
DEV loss: 0.4588 ; accuracy: 0.7935 ; recall: 0.6361 ; precison: 0.7555 ; DEV@ 284
DEV loss: 0.4734 ; accuracy: 0.7918 ; recall: 0.5950 ; precison: 0.7783 ; DEV@ 288
DEV loss: 0.4579 ; accuracy: 0.7959 ; recall: 0.6472 ; precison: 0.7547 ; DEV@ 292
DEV loss: 0.4723 ; accuracy: 0.7901 ; recall: 0.5766 ; precison: 0.7874 ; DEV@ 296
read next epoch!, epoch =? 2
DEV loss: 0.4484 ; accuracy: 0.7975 ; recall: 0.6784 ; precison: 0.7412 ; DEV@ 300 --> after?2?epoch
算正常的一個(gè)結(jié)果么?
最好的情況我目測(cè)在這里
再往后就開(kāi)始過(guò)擬合了。如下面是15輪之后的結(jié)果:
loss會(huì)上升的很厲害;所以Early Stop很重要啊~~
DEV loss: 0.8380 ; accuracy: 0.8047 ; recall: 0.6548 ; precison: 0.7718 ; DEV@ 2428? --> 16.18 epoch
DEV loss: 0.8379 ; accuracy: 0.8036 ; recall: 0.6684 ; precison: 0.7609 ; DEV@ 2432
DEV loss: 0.8187 ; accuracy: 0.8029 ; recall: 0.6808 ; precison: 0.7522 ; DEV@ 2436
DEV loss: 0.8403 ; accuracy: 0.8038 ; recall: 0.6404 ; precison: 0.7792 ; DEV@ 2440
DEV loss: 0.8190 ; accuracy: 0.8047 ; recall: 0.6836 ; precison: 0.7547 ; DEV@ 2444
DEV loss: 0.8504 ; accuracy: 0.8035 ; recall: 0.6501 ; precison: 0.7720 ; DEV@ 2448
DEV loss: 0.8257 ; accuracy: 0.8025 ; recall: 0.6702 ; precison: 0.7572 ; DEV@ 2452 --> 16.34 epoch
上一篇的圖片沒(méi)有發(fā)成功,重新發(fā)一次這篇總結(jié):
參考了唐老師給出的參考資料
http://web.stanford.edu/class/cs224n/reports/2759336.pdf
神經(jīng)網(wǎng)絡(luò)的架構(gòu)是:
?
和這個(gè)架構(gòu)唯一的區(qū)別,是把r1-r2 替換成了abs(r1-r2),
我一開(kāi)始沒(méi)有用四個(gè)向量拼接的方式,只是使用了abs(r1-r2);而如果僅僅用r1-r2,神經(jīng)網(wǎng)絡(luò)基本無(wú)法收斂。因此參考這篇文章時(shí),我把四個(gè)向量里面的r1-r2 替換成了abs(r1-r2)。
目前的疑問(wèn)有下面這些:
?
問(wèn)題一: 如果詞向量是可以訓(xùn)練的,該怎么訓(xùn)練呢?有下面這兩種方式,哪種是正確的?
? ? ? 方式一: 用glove向量當(dāng)成詞向量的初始值,然后只是在訓(xùn)練時(shí)順便把詞向量做成"Trainable",如下面的代碼:
? ? ? ? ? ? ? ? ? ? self.W = tf.get_variable(name='word_embedding', shape = self.word_emmbedding.shape,dtype=tf.float32,
? ? ? ? ? ? ? ? ? ? initializer=tf.constant_initializer(self.word_embedding),
? ? ? ? ? ? ? ? ? ? ?trainable==True)
? ? 使用glove向量當(dāng)成W的初始值, 同時(shí)W的是可以根據(jù)loss做調(diào)整的,使用的是神經(jīng)網(wǎng)絡(luò)最后一層的tf.nn.softmax_cross_entropy_with_logits做損失函數(shù)
? ? ? ?方式二: 使用word2vec程序,把traing.txt當(dāng)成語(yǔ)料庫(kù),用CBOW or Skip-Gram模型來(lái)學(xué)習(xí)詞向量。
? ? ? ?然后學(xué)習(xí)到詞向量之后,再拿過(guò)來(lái)送進(jìn)現(xiàn)有模型,同時(shí)做成不可訓(xùn)練的(or 可訓(xùn)練的?如方式一?)
應(yīng)該是使用哪種方式呢?方式一or 方式二??or 都不是?
目前我的程序使用的是方式一
問(wèn)題二:
目前我的訓(xùn)練集的loss曲線長(zhǎng)下面這個(gè)樣子:
?
第一輪時(shí)loss 下降很快;
第二輪時(shí)loss 基本持平;
從第二輪到第三輪切換時(shí),loss有一個(gè)大幅度的下降;
為什么從第三輪開(kāi)始,在每輪內(nèi)部的loss會(huì)有小幅的小升?而從第三輪進(jìn)入第四輪時(shí),loss 才會(huì)有一個(gè)比較大下降?
Note: 每一輪進(jìn)入下一輪時(shí),所有的訓(xùn)練數(shù)據(jù)會(huì)全部隨機(jī)shuffle。每個(gè)mini-batch會(huì)按照順序依次切取一小塊送給模型進(jìn)行訓(xùn)練。
優(yōu)化算法使用的是Adam算法。
問(wèn)題三:
我目前使用50維的詞向量,是不是太小?對(duì)結(jié)果影響大嗎?
因?yàn)槲铱凑撐睦锩嬲f(shuō):
使用了200d的詞向量,本來(lái)想使用300d的詞向量,因?yàn)槌绦蚺芷饋?lái),慢,才做罷 ~~
問(wèn)題四:
測(cè)試集上loss最低到0.44, 離0.23還有一段差距啊?怎么辦?
0.23的損失函數(shù)是根據(jù)我目前的架構(gòu)實(shí)現(xiàn)的嗎?是不是還有什么其它的技巧呢?
?
附:程序的超參數(shù)如下:
RUN_MODEL=two-feature-substrate-trainable-swap
ALLOW_SOFT_PLACEMENT=True
BATCH_SIZE=2048????????????????????????????????????????????????????????一個(gè)mini-batch包含的樣本數(shù)是2048
DROPOUT_KEEP_PROB=0.5????????????????????????????????????四個(gè)向量拼接之后,進(jìn)入全連接層之前,做了棄權(quán),0.5
EMBEDDING_TRAINABLE=True??????????????????????????????????使用神經(jīng)網(wǎng)絡(luò)最后的損失來(lái)訓(xùn)練詞向量,OK?
L2_REG_LAMBDA=0.0????????????????????????????????????????????????????損失函數(shù)沒(méi)有做L2
NUMBER_UNITS=50???????????????????????????????????????????????????????每一個(gè)RNN內(nèi)部的"memory"包含的神經(jīng)元的大小是50
RNN_TYPE=gru
TRAIN_SAMPLE_PERCENTAGE=0.75????????????????????????使用75%的數(shù)據(jù)做訓(xùn)練,其余的25%做測(cè)試,?比例OK?
TRAIN_SIZE=307200???????????????????????????????????????????????????????訓(xùn)練集的包含的樣本大小
下面是在25%的測(cè)試集(共107200個(gè)樣本)的測(cè)試情況
DEV loss: 0.6602 ; accuracy: 0.6372 ; recall: 0.0000 ; precison: nan ; DEV@ 0
DEV loss: 0.6296 ; accuracy: 0.6408 ; recall: 0.0142 ; precison: 0.7647 ; DEV@ 4
DEV loss: 0.5885 ; accuracy: 0.6993 ; recall: 0.4305 ; precison: 0.6242 ; DEV@ 8
DEV loss: 0.5899 ; accuracy: 0.7101 ; recall: 0.4230 ; precison: 0.6557 ; DEV@ 12
DEV loss: 0.5807 ; accuracy: 0.7132 ; recall: 0.3489 ; precison: 0.7141 ; DEV@ 16
DEV loss: 0.5485 ; accuracy: 0.7296 ; recall: 0.4527 ; precison: 0.6951 ; DEV@ 20
DEV loss: 0.5287 ; accuracy: 0.7381 ; recall: 0.4870 ; precison: 0.6994 ; DEV@ 24
DEV loss: 0.5195 ; accuracy: 0.7440 ; recall: 0.5616 ; precison: 0.6771 ; DEV@ 28
DEV loss: 0.5250 ; accuracy: 0.7416 ; recall: 0.4626 ; precison: 0.7253 ; DEV@ 32
DEV loss: 0.5511 ; accuracy: 0.7302 ; recall: 0.3781 ; precison: 0.7558 ; DEV@ 36
DEV loss: 0.5113 ; accuracy: 0.7515 ; recall: 0.5925 ; precison: 0.6806 ; DEV@ 40
DEV loss: 0.5283 ; accuracy: 0.7356 ; recall: 0.3861 ; precison: 0.7697 ; DEV@ 44
。。。。。。
DEV loss: 0.4605 ; accuracy: 0.7883 ; recall: 0.6857 ; precison: 0.7179 ; DEV@ 168
DEV loss: 0.4723 ; accuracy: 0.7854 ; recall: 0.5999 ; precison: 0.7578 ; DEV@ 172
DEV loss: 0.4781 ; accuracy: 0.7838 ; recall: 0.5803 ; precison: 0.7667 ; DEV@ 176
DEV loss: 0.4648 ; accuracy: 0.7889 ; recall: 0.6491 ; precison: 0.7372 ; DEV@ 180
DEV loss: 0.4884 ; accuracy: 0.7823 ; recall: 0.5601 ; precison: 0.7773 ; DEV@ 184
DEV loss: 0.4577 ; accuracy: 0.7902 ; recall: 0.6831 ; precison: 0.7229 ; DEV@ 188
DEV loss: 0.4721 ; accuracy: 0.7862 ; recall: 0.5919 ; precison: 0.7650 ; DEV@ 192
。。。。。。
DEV loss: 0.4588 ; accuracy: 0.7935 ; recall: 0.6361 ; precison: 0.7555 ; DEV@ 284
DEV loss: 0.4734 ; accuracy: 0.7918 ; recall: 0.5950 ; precison: 0.7783 ; DEV@ 288
DEV loss: 0.4579 ; accuracy: 0.7959 ; recall: 0.6472 ; precison: 0.7547 ; DEV@ 292
DEV loss: 0.4723 ; accuracy: 0.7901 ; recall: 0.5766 ; precison: 0.7874 ; DEV@ 296
read next epoch!, epoch =??2
DEV loss: 0.4484 ; accuracy: 0.7975 ; recall: 0.6784 ; precison: 0.7412 ; DEV@ 300 --> after 2 epoch
算正常的一個(gè)結(jié)果么?
最好的情況我目測(cè)在這里
再往后就開(kāi)始過(guò)擬合了。如下面是15輪之后的結(jié)果:
loss會(huì)上升的很厲害;所以Early Stop很重要啊~~
DEV loss: 0.8380 ; accuracy: 0.8047 ; recall: 0.6548 ; precison: 0.7718 ; DEV@ 2428??--> 16.18 epoch
DEV loss: 0.8379 ; accuracy: 0.8036 ; recall: 0.6684 ; precison: 0.7609 ; DEV@ 2432
DEV loss: 0.8187 ; accuracy: 0.8029 ; recall: 0.6808 ; precison: 0.7522 ; DEV@ 2436
DEV loss: 0.8403 ; accuracy: 0.8038 ; recall: 0.6404 ; precison: 0.7792 ; DEV@ 2440
DEV loss: 0.8190 ; accuracy: 0.8047 ; recall: 0.6836 ; precison: 0.7547 ; DEV@ 2444
DEV loss: 0.8504 ; accuracy: 0.8035 ; recall: 0.6501 ; precison: 0.7720 ; DEV@ 2448
DEV loss: 0.8257 ; accuracy: 0.8025 ; recall: 0.6702 ; precison: 0.7572 ; DEV@ 2452 --> 16.34 epoch
?
1.? ?由上面TensorFlow輸出的損失圖可以看出在每個(gè)epoch里面,損失函數(shù)是上升的,這個(gè)其實(shí)已經(jīng)能夠說(shuō)明在訓(xùn)練的過(guò)程當(dāng)中產(chǎn)生了過(guò)擬合的情況,實(shí)際上是一個(gè)嚴(yán)重的過(guò)擬合,所以要解決這種情況:下面是建議:
? ? ?1. 加上正則,這是一般做法,但是比較難控制的是正則化系數(shù),需要調(diào)整參數(shù)。
? ? ?2. 棄權(quán),這是神經(jīng)網(wǎng)絡(luò)的做法。
? ? ?3. earlying stopping 這是你在上面已經(jīng)提到了。
? ? ?4. 采用模型集成的想法,比如在這里,你是用的是LSTM,是不是可以使用CNN,或者BLSTM或者是GRU。甚至每一個(gè)都可以做一做,然后進(jìn)行stacking,取平均值什么的,也就是類似于Random forest,這種想法能夠降低模型的方差,獲取比較好的預(yù)測(cè)結(jié)果。
? ? ?5. 進(jìn)行手動(dòng)特征工程,這個(gè)在很多材料上面都有。
? ? ?6. 數(shù)據(jù)源有些標(biāo)簽是有問(wèn)題的,需要修改,但是這一塊我還沒(méi)有發(fā)現(xiàn)比較好的方法解決。
? ? ??
?回復(fù) 24樓Lynn???12天前2. 詞向量的問(wèn)題:詞向量的維度在我看來(lái)有點(diǎn)小,我取得是128,僅僅作為參考。
3. 還有損失的問(wèn)題:測(cè)試機(jī)的分布和訓(xùn)練集的分布是不一樣的,你可以考慮重新考慮一下分布(亞采樣?重采樣?)。
4. RNN size可以取大一點(diǎn)。
5. 因?yàn)橛?xùn)練數(shù)據(jù)集比較大,所以在分割驗(yàn)證機(jī)的時(shí)候沒(méi)有必要那么大(驗(yàn)證集取一萬(wàn)就行了,用來(lái)查看效果)
6. 還有就是參數(shù)調(diào)整的問(wèn)題,可以使用交叉驗(yàn)證(警告:這個(gè)非常消耗時(shí)間,而且你的電腦那么慢)
7. 建議:最好用TensorBoard將測(cè)試集的loss也畫出來(lái),這樣知道early stopping應(yīng)該在哪里stop
?回復(fù) 25樓Lynn???12天前關(guān)于詞向量的問(wèn)題,一般來(lái)說(shuō)有3種做法,提前訓(xùn)練好向量和隨機(jī)生成詞向量,還有初始化為one-hot。
?
在我們的這個(gè)問(wèn)題里面最好使用時(shí)時(shí)訓(xùn)練好的向量,并且可以訓(xùn)練。
?回復(fù) 26樓曠野的季節(jié)???16小時(shí)前根據(jù)唐老師的提議,把 test集上的loss 也畫出來(lái)了。過(guò)擬合太嚴(yán)重了!
橘黃色的是train 上的; 藍(lán)色的是test集上的。藍(lán)色最低點(diǎn)大約是0.45。隨后很快就一路高漲。
加正則試試?
?
下面是accuracy: 可以看到,測(cè)試集的準(zhǔn)確率(大約0.8)遠(yuǎn)遠(yuǎn)小于train上的。
recall && precision類似,就不上圖了。
附:
Parameters:
DROPOUT_KEEP_PROB=0.5
EMBEDDING_TRAINABLE=True
L2_REG_LAMBDA=0.0
NUMBER_UNITS=100
RNN_TYPE=gru
SENTENCE_CUT_LENGTH=60
TRAIN_BATCH_SIZE=2500
TRAIN_SAMPLE_PERCENTAGE=0.96
TRAIN_SIZE=388115
新加組員
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
熱門小組Quora Question Pairs33?2機(jī)器學(xué)習(xí)入門23?1機(jī)器學(xué)習(xí)項(xiàng)目實(shí)戰(zhàn)15?2
我是學(xué)生
- 如何注冊(cè)
- 如何學(xué)習(xí)
- 如何互動(dòng)
我是老師
- 發(fā)布課程
- 使用題庫(kù)
- 教學(xué)資料庫(kù)
我是管理員
- 系統(tǒng)設(shè)置
- 課程設(shè)置
- 用戶管理
商業(yè)應(yīng)用
- 會(huì)員專區(qū)
- 題庫(kù)增強(qiáng)版
- 用戶導(dǎo)入導(dǎo)出
關(guān)于我們
- 解惑者學(xué)院
- 官方微博
- 加入我們
總結(jié)
以上是生活随笔為你收集整理的Quora Question Pairs 思路记录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何创建像 Quora 这样的问答网站:
- 下一篇: python布尔值使用_Python布尔