日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Quora Question Pairs 思路记录

發(fā)布時間:2023/12/16 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Quora Question Pairs 思路记录 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
  • 解惑者
  • 首頁?
  • 小組頻道?
  • Quora Question Pairs
  • Quora Question Pairs?退出小組

    33個成員?2個話題?創(chuàng)建時間:2017-11-30

    Quora Question Pairs比賽思路記錄和交流?置頂?精華

    ?分享收藏發(fā)表于12-06?1409次查看

    此貼用于對學(xué)習(xí)過程中遇到的問題、學(xué)習(xí)到的東西做一下小結(jié),群主會根據(jù)小結(jié)的內(nèi)容給予相應(yīng)的建議。

    編輯?取消加精?取消置頂?只看樓主?倒序查看25回復(fù)
    • 2樓曠野的季節(jié)???12-25

      今天是2017年12月24號,平安夜:)18天前進(jìn)入的這個項目,兩周多的時間,還挺快。

      ?????? 之前學(xué)過解惑者學(xué)院的《垃圾短信識別小試牛刀》課程,有學(xué)過詞向量,因此對于這個判斷兩句話意思是不是相同的問題,自然想到的就是把“詞”-> 向量 的方法進(jìn)行推廣,擴(kuò)展成 “句子”-> 向量。但是至于怎么擴(kuò)展,怎么用向量表達(dá)一句話的意思,感覺還沒有什么思路。另外就算知道了怎么表達(dá)成向量了,還有一個問題是兩個向量到底有多“相似”才是意思一樣,也不是很好判斷的問題。還沒有太多思路。

      ????? 在這兩個問題都不是特別清楚的情況下,面臨的一個問題,是到底要不要直接去kaggle上找現(xiàn)成的解決方案來利用。但是仔細(xì)想了下,想找個方案是很容易的,但是如果只是把方案拿過來實現(xiàn)一下,甚至是有現(xiàn)成的代碼拿來RUN一下,似乎學(xué)不到太多的東西。于是就想先自己思考一下。

      ???? 不過既然是自然語言處理的項目,老師也說了是很常見的問題,就想先學(xué)學(xué)自然語言處理。忘了是怎么找到了斯坦福大學(xué)的CS224N( Deep learning in NLP)這門課了,就先看了大約兩周的時間。里面開始講的是word2vec,又跟著看了一遍,有了更多的理解。然后提到了Glove,講義里說這種向量表示會包含更多的語義信息,估計Quora項目能用的上。就先記下了。至于說這個向量是怎么訓(xùn)練的,暫且沒有太管。

      ??? 然后又看了幾天,里面開始提到了神經(jīng)網(wǎng)絡(luò),RNN, CNN, LSTM,有講到用RNN實現(xiàn)語言模型(什么是語言模型就不說了),這個時候就感覺到可以用RNN做Quora項目。因為想想其實本質(zhì)是一樣的; 都是記錄歷史信息。當(dāng)然也可以用LSTM,因為LSTM和RNN沒有本質(zhì)上的區(qū)別。LSTM對于長期的序列學(xué)習(xí)會更好。

      ??? 此時一開始的疑問之一就解決了。先暫時用RNN(or LSTM)來做。那是不是這樣就是最好的表達(dá)向量的方式呢? CS224N后面會提到,基于Tree-LSTM(可以說成是 Recursive CNN嗎)。 這個方法的動機(jī)是說:一句話的意思,由二方面決定,一是句子的組成結(jié)構(gòu)、二是句子中詞的含義。224N舉的例子是說,語言學(xué)領(lǐng)域(包括其它任何領(lǐng)域),遞歸是一種特別常用的現(xiàn)象。比如" the dog walked into the house"。(隨意編的一句話)。the dog 是主語從句?? walked into the house是謂語(從句?),這二者合并成了完整的這句話。the dog 也可以再遞歸地向下拆分結(jié)構(gòu)。但是這種方法需要parser,來把句子的結(jié)構(gòu)分析出來。看了看這個另外的任務(wù)也可以用神經(jīng)網(wǎng)絡(luò)去做。 不過這種方法會比較麻煩,暫時先不準(zhǔn)備用這種方案。畢竟還是先做個簡單的版本出來吧:)

      ???? 剛開始說的一個疑問(怎么用向量表達(dá)話的意思就明白了),然后是另外一個問題——怎么衡量向量的相似度。恰好還是看CS22N,里面提到了下面的這種結(jié)構(gòu),覺得可以用在此項目上。叫Siamese Nets。

      x1,x2就可以是RNN(LSTM)送出來的句子向量。

      ?

      然后就百度了一下這種網(wǎng)絡(luò),恰好又找到了一篇論文,

      Siamese Recurrent Architectures for learning sentence similarity.

      里面提到了下面的架構(gòu):

      ?

      我感覺這個架構(gòu)可以直接做為參考使用。

      下面把這個思路整理一下:

      1. 用Glove表示詞向量;

      2. 用線性LSTM表示句子

      3. 用Siamese Nets 做成判斷網(wǎng)絡(luò)使用

      不過還有一些細(xì)節(jié)可以思考:

      詞向量需不需要更新(重新學(xué)習(xí))?

      例如最簡單的情況,如果 有一些詞如果在Glove里面沒有,怎么辦? 比如下面的話,注意這個樣本的label是1

      How do we prepare for UPSC?

      How do I prepare for civil service?

      可以推測出來,UPSC應(yīng)該是 civil service 的意思。

      所以說,對于樣本的label=1 的樣本,我們是不是可以利用一下來優(yōu)化詞向量?


      想問一下,這個架構(gòu)可以嗎?

      如有問題或者建議請老師提出。

      ?回復(fù)
    • 3樓Ryan???12-29

      網(wǎng)絡(luò)結(jié)構(gòu)不小心被我刪掉了,能重新發(fā)一下么?

      ?

      這個是非常常用的網(wǎng)絡(luò)結(jié)構(gòu),尤其是需要處理兩個事物之間關(guān)系的時候。他是一個通用的結(jié)構(gòu),你可以替換成你想要的任何方法

      ?回復(fù)
    • 4樓Ryan???12-29

      @曠野的季節(jié)?在做事情之前做了這么多且細(xì)致的工作,大贊一個!

      ?

      首先不透露更多的可能解決問題的思路了,等你做到一定的深度的時候,再來細(xì)說一下這個。個人建議在做一個項目的時候不要參考別人的做法,尤其是剛開始的時候。機(jī)器學(xué)習(xí)是數(shù)據(jù)為基礎(chǔ)的領(lǐng)域,不同的數(shù)據(jù)具有不同的特點,不存在一種方法能解決所有的問題。參考別人的做法,就喪失了自我分析數(shù)據(jù)的過程,這也是機(jī)器學(xué)習(xí)過程中最重要的活動,也是體現(xiàn)水平的時候。其實模型在實際的工程項目中的工作量很小。

      ?

      你的思路可以嘗試,當(dāng)然還有很多問題等待著你去解決。例如,是使用現(xiàn)成的vector還是直接通過訓(xùn)練數(shù)據(jù)去訓(xùn)練,亦或是兩者結(jié)合;是使用RNN還是CNN;多層是否必要;訓(xùn)練速度太慢怎么辦;效果不如預(yù)期,比排行榜上的得分差的太多,原因在哪兒;是否需要引入更多的特征,例如文本類特征;可以做多個模型融合嗎 等等

      ?

      可以多嘗試做一下數(shù)據(jù)分析和深度研究,可以用一些小模型研究看看情況

      ?回復(fù)
    • 5樓曠野的季節(jié)???01-01

      先重新把圖發(fā)一下,下面這個圖是 Siamese Nets, 一種通用的架構(gòu)。

      另外,和垃圾短信類似的做法,是不是也可以先預(yù)處理一下、比如先把停用詞給去掉。或者按照老師上次回復(fù)說的,用一些文本類特征。這么做肯定是可以的,至于怎么利用日后慢慢細(xì)想。

      下面這個圖是初步準(zhǔn)備使用的架構(gòu)圖。單層的LSTM網(wǎng)絡(luò),把兩個句子的最后一級的state(t) 拿出來,后面可以是按照圖中這么做求歐式距離,也可以是再進(jìn)入一個MLP神經(jīng)網(wǎng)絡(luò)。然后再求歐式距離。如果兩個句子意思相同,則歐式距離應(yīng)該盡量小; 如果兩個句子意思不相同,歐式距離應(yīng)該盡量大。然后采用stochastic 梯度下降法做訓(xùn)練。

      ?

      ?回復(fù)
    • 6樓曠野的季節(jié)???01-02

      2017.12.26-2018.1.1? 周總結(jié)

      (1) 目前打算先按照這個架構(gòu)做。 這周主要學(xué)習(xí)了一下tensorflow工具。先看了看最基本的、什么是tensor, 什么是node;? cost 函數(shù)怎么描述,placeholder, optimizer ……

      看的是下面這篇文章:感覺寫的比較詳細(xì)

      http://jorditorres.org/research-teaching/tensorflow/first-contact-with-tensorflow-book/first-contact-with-tensorflow/

      ?

      (2)看懂了上面的文章后,仔細(xì)閱讀了下面這篇文章,該文章通過一個toy project ,即利用RNN解決01二元序列的預(yù)測問題。

      https://r2rt.com/recurrent-neural-networks-in-tensorflow-i.html

      把里面的代碼仔細(xì)看了看,有下面的收獲:

      First, RNN抓住的是 X 在“歷史上”的信息,通過inner state 內(nèi)部反饋實現(xiàn)

      Second,? 這篇文章的tensorflow程序架構(gòu)、可以分為“數(shù)據(jù)發(fā)生器”“計算圖模型”“把數(shù)據(jù)送進(jìn)計算圖”“? run session”這么幾部分,結(jié)構(gòu)還是比較清楚了。 自己寫程序時也要注意一下組織程序的問題。有空時可以讀一下《小試牛刀》里面推薦的那篇 怎么組織tensorflow程序的文章。

      ?

      Third,? Quora Question問題,不同的話的長度是不相同的。即如果用LSTM的話,輸入序列個數(shù)(num_steps)是變化的。 調(diào)研了一下Dynamic RNN的問題。即通過tensorflow中的Dynamic RNN,可以不用做padding。

      ?

      Forth,還有一個細(xì)節(jié)需要思考。 如果用歐式距離做判決的話,這個最終的閾值是怎么確定的。 是否作為參數(shù)之一自動學(xué)習(xí)出來呢? 還是在模型訓(xùn)練的時候,就只是盡量優(yōu)化出一個結(jié)果、即相同意思的句子歐式距離盡可能小,不同意思的話歐式距離盡可能大。最終加一個處理流程,比如統(tǒng)計一下所有的意思相同的話里面,歐式距離最大的值是多少,以此值來作為閾值??這個細(xì)節(jié)還沒有想好應(yīng)該怎么弄。

      ?

      下一步工作:

      1. 先盡快寫出來一個base 版本的程序,用 Train split出來的test集測試一下看看情況

      2. 對數(shù)據(jù)進(jìn)行更深入的研究。 想想是不是有更好的思路。

      ?

      ?收起
      • Ryan?01-02整個思路沒啥問題,可以先做base版本的嘗試。 關(guān)于閾值的部分,項目是以logloss為優(yōu)化目標(biāo),因此從這個角度上來看閾值不重要,重要的是預(yù)測的分布要與實際的分布盡可能的相近。回復(fù)
      我也要說?
  • 7樓曠野的季節(jié)???01-12

    基于RNN的一種實現(xiàn)方式

    ?

    RNN可以捕捉X序列的信息。比如在下面這個例子里面:

    ?

    https://r2rt.com/recurrent-neural-networks-in-tensorflow-i.html

    ?

    X是一個隨機(jī)產(chǎn)生出來的01序列,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]同時為1y[t]=1?的概率是0.5+0.5-0.25=0.75

    可以把X序列拆分成一個個小的序列,送到RNN模型里面去學(xué)習(xí)。最終,RNN可以學(xué)出來這兩個規(guī)律。(X[t-3]X[t-8]對于?y[t]的影響)

    雖然這只是一個簡單的例子,但是從這個例子可以體會到RNN的作用。

    對于Quora項目,也可以使用類似的思路。用兩個相同的RNNor LSTM or GRU,下同)網(wǎng)絡(luò),分別處理s1,s2兩句話。如下圖所示。

    ?

    S1,s2中的每一個單詞都先轉(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ù)測的時候,這個L1?norm(RNN(s1)- RNN(s2) )?多近s1,s2算是意思相同,多遠(yuǎn)算是s1,s2?意思不同呢??關(guān)于這個閾值目前我的想法是當(dāng)成一個參數(shù)來學(xué)習(xí)出來。如下圖所示,橫軸是L1 norm(encoder(s1) – encoder(s2)) ?其中橫軸?0<=x < +INF

    縱軸是exp(-橫軸)?將橫軸壓縮成了(0,1)?exp(-橫軸)中加了一個負(fù)號的目的,是為了與label中的含義(1表示兩句話意思相同,0表示兩句話意思不同)保持一致。

    ?

    ?

    我期望的結(jié)果,是意思相同的pair(label=1)?exp(-L1 norm(encoder(s1) – encoder(s2)))?應(yīng)該會比較大(圖中靠近上面的部分);而意思不同的pair(label=0)?exp(-L1 norm(encoder(s1) – encoder(s2)))應(yīng)該會比較小(圖中靠近下面的部分)。而threshold就是區(qū)別兩者的界限。為了下面描述方便,定義:

    similarity(s1,s2) = exp(- L1 norm(encoder(s1) – encoder(s2))).??————公式(1

    作為相似度度量的指標(biāo),這個指標(biāo)越大,相似度越高。

    關(guān)于上面提到的閾值,目前我準(zhǔn)備采用(一維的)Logistic Regression學(xué)習(xí)出來兩個參數(shù):?w??b?b?就是上面提到的thresholdw的含義目前還沒有想好,先暫時這么定。即:

    Probability(s1,s2 has the same meaning)= 1/ (1+exp(- ?(w*similarity(s1,s2)+b)?? )) –公式(2

    ?

    這個函數(shù)把?similarity從度量距離的空間映射到“概率空間”。這樣以batch?為單位訓(xùn)練的時候,batch內(nèi)所有樣本出來的概率=?各個樣本出現(xiàn)的概率的連乘。然后取其?負(fù)對數(shù)(-log)作為損失函數(shù),各個樣本的損失函數(shù)相加作為一個batch的損失函數(shù)而成為優(yōu)化目標(biāo)。

    losses = - [ ?y * tf.log(probability) + (1-y) * tf.log(1- probability) ]??? --------公式3

    注:y,probability是一個batch的數(shù)據(jù)

    ?

    程序的架構(gòu):

  • RNN_model.py
  • 定義模型(計算圖),?損失函數(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ù)集中每一句話的長度

    Input

    Input_seqlen2

    Int32,[batch_size]

    S2數(shù)據(jù)集中每一句話的長度

    Input

    dropout_keep_prob

    Float32, []

    Dropout keep?概率

    Output

    Loss

    Float32,[]

    損失函數(shù),見公式3

    ?

  • RNN_train.py
  • Train dataDev test data Split

    定義模型的超參數(shù)

    定義train_step()函數(shù)

    定義dev_step()函數(shù)

    定義訓(xùn)練的主循環(huán)?,主循環(huán)里面會調(diào)用next_batch()函數(shù)

    ?

  • Data_helper.py
  • 處理train.csv

    考慮是不是要去掉標(biāo)點??可能不去比較好?

    定義next_batch()函數(shù),生成batch數(shù)據(jù)

    ?

    ?

    詞向量出于訓(xùn)練速度的考慮,可以先使用50維;今后看情況和手頭設(shè)備(GPU)的情況考慮是不是增加到300維(當(dāng)然有沒有效果是另外一回事了)

    ?

    注:word2vec?代碼:

    https://github.com/danielfrg/word2vec

    ?

    目前進(jìn)展情況:

    寫完了RNN_model.py , RNN_train.py

    接下來會寫data_helper.py

    ?

    小組內(nèi)成員情況:

    成員1, 小曙哥,可能會接下來和我一起完成data_herper.py

    成員2,卑戀,近期有其它事務(wù),可能暫時不能加入此項目進(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ù)
  • 8樓Lynn???01-12

    1.? 想法基本上沒有太多的問題,可以先將基本的代碼跑通,只要能夠確定你的代碼能夠?qū)W習(xí)到數(shù)據(jù)集的信息,就行了,至于正則的部分最開始的時候不用考慮,最重要的是讓模型跑起來,這是一個骨架。

    2.? 代碼部分以后最好加上圖片,讓我們能夠看得清,加上圖片的同時最好加上代碼鏈接,以便復(fù)制下來看。

    3.? lstm是個不錯的結(jié)構(gòu)。是不是可以使用雙向lstm和CNN呢,損失函數(shù)是不是可以使用其他的呢,參考論文:http://anthology.aclweb.org/P/P16/P16-1036.pdf。

    4.? 這個比賽當(dāng)中有一點比較重要,就是訓(xùn)練集和測試集的正負(fù)樣本比例。這個會大大影響你的測試結(jié)果。

    5.? 代碼可以參考別人的比較好的代碼,第一是學(xué)習(xí)別人代碼,二是培養(yǎng)一個好的代碼風(fēng)格。

    6.? 還有一個比較大的方向:現(xiàn)在使用的基于Siamese網(wǎng)絡(luò)結(jié)構(gòu),有更好的網(wǎng)路結(jié)構(gòu)嗎?(這個需要將現(xiàn)在的結(jié)構(gòu)跑完在去探索)

    7. 可以拜讀一下2016年的ACL會議的論文,里面有很多論文提到了語義理解和文本匹配。很多有很大的參考價值。

    ?回復(fù)
  • 9樓曠野的季節(jié)???01-12

    好的,謝謝唐老師!

    ?回復(fù)
  • 10樓曠野的季節(jié)???01-29

    2018-01-29

    這兩周一直在調(diào)試代碼,但不是很順利,所以上周沒發(fā)進(jìn)展。先說下目前的調(diào)試過程,再說下現(xiàn)在遇到的問題吧。

    兩周以前寫完了RNN_model.py 和 RNN_train.py 前面說過,RNN_model.py創(chuàng)建了RNN模型(定義placeholders, rnn cell, encoder_s1, encoder_s2, 定義losses, loss);

    RNN_train.py? 定義超參數(shù); 定義train_step, dev_step , 實現(xiàn)訓(xùn)練過程

    data_helper.py 用于讀取原始的數(shù)據(jù),創(chuàng)建glove 詞向量,seq2id,生成mini-batch等輔助工作。

    大約花了一周時間完成data_helper.py并且讓程序跑通了。但是發(fā)現(xiàn)了一個重大的問題——loss函數(shù)無法收斂。還有一些其它問題,先簡單說一下細(xì)節(jié)問題吧,

    (1) 比如data_helper.py創(chuàng)建mini-batch時,train.csv 最后的數(shù)據(jù)量不夠batch_size 這么多了。導(dǎo)致和placeholder的維度不一致、程序報錯退出。但是由于這個小問題存在,RNN模型沒法長時間訓(xùn)練,我一開始就想loss函數(shù)不能收斂是不是由于訓(xùn)練時間不夠長導(dǎo)致的。(其實一開始是先降低了learning-rate ,但是發(fā)現(xiàn)不管用)所以目前為了省事兒,先把train.csv 截取了 batch-size 整數(shù)大小的一部分(一共65536個sample,batch_size=128)

    (2) 程序跑起來很慢。我把40多萬條train.csv 取前面的65536個,這樣應(yīng)該可以吧? 我想著是在65536條example的 "train_small.csv" 上如果確認(rèn)模型能學(xué)到東西了,再換成全部的訓(xùn)練數(shù)據(jù)。這樣跑起來可能還稍微快一點。

    (3) 一開始超參數(shù)不太會選。比如batch_size=128,感覺訓(xùn)練起來速度還能接受,如果batch_size太大,內(nèi)存都不夠用了,直接報OOM (out-of-memory?)。然后學(xué)習(xí)率選的是 1e-3吧,也說不出為什么,就先這么選了。還有模型,就先選的RNN而沒有用LSTM,GRU。想先調(diào)調(diào)基本的模型。

    (4)數(shù)據(jù)清洗可能做的不太夠,比如有的問題就是一個問號,沒有內(nèi)容。這樣RNN模型會需要句子長度len,我之前的程序在這種下會認(rèn)為是0. 導(dǎo)致tensorflow在計算rnn_outputs時報錯。也花了一點時間找這個問題。

    然后再說目前最大的問題,losses 不收斂。

    For review purpose, 公式就是下面的:

    similarity(s1,s2) = exp(- L1 norm(encoder(s1) – encoder(s2))).??————公式(1

    作為相似度度量的指標(biāo),這個指標(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

    一開始遇到loss 不收斂,肯定先想到的就是learning-rate 太大了。然后learning-rate 調(diào)小后,也不起作用。就來看看loss變化有什么規(guī)律沒有。發(fā)現(xiàn)loss 會一點點地變大; 如果把learning-rate 調(diào)小后,loss也同樣會變大,而且是按照比之前較小的速率大變大(learning-rate變小了)

    然后在想是不是我這個模型本來就是不對的?這個模型根本就沒不到東西?我現(xiàn)在要不要換個模型試試?

    但是覺得說不通啊。然后就想是不是因為模型不能長時間訓(xùn)練造成的(前面說過的那些細(xì)節(jié)問題)

    但是65536個sample, batch_size=128情況下,也能訓(xùn)練512個mini-batch了,也不能一點東西學(xué)不到吧(分析是否正確?)

    而且loss 在慢慢變大。這個趨勢本身就不對。后來把細(xì)節(jié)問題解決了,模型能開時間訓(xùn)練了,果然loss 還是變大,趨勢沒有發(fā)生變化。

    所以覺得肯定有別的問題。

    后來還做了下面的嘗試:

    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

    ?

    因為我不知道是模型的原因,還是模型上面包的那層訓(xùn)練過程的原因,我就把loss+ 一個variable

    這個發(fā)現(xiàn)self.val 會慢慢變小。所以肯定不是訓(xùn)練過程的原因了。如果調(diào)整learning-rate 的話—self.val也會跟著變。所以肯定訓(xùn)練過程沒問題。

    這樣又折騰了好幾天。上周六(兩天前)發(fā)現(xiàn)是loss 函數(shù)寫反了。:(

    一開始我代碼里面寫的是

    losses =?? y * tf.log(probability) + (1-y) * tf.log(1- probability)少了個負(fù)號,因此loss不降反升。

    發(fā)現(xiàn)這個問題后,原來以為問題能解決,但是發(fā)現(xiàn)loss現(xiàn)在的確不變大了,但是也不變小。

    然后又開始了新一輪嘗試,是不 是learning-rate太大了。是不是loss 定義的不對?等等;

    但是目前還沒有什么進(jìn)展。

    現(xiàn)在有什么思路能解決這個問題嗎?

    比如把RNN隱藏層的神經(jīng)元數(shù)量變大?

    或者是RNN新一輪的訓(xùn)練沒有用上一輪的訓(xùn)練結(jié)果?

    或者是mini-batch的數(shù)量不合適?(128 )

    還是65536個example 不夠(這個可能性小吧)

    或者是RNN模型有什么地方代碼有問題?比如獲得最后一個stage的rnn_output不對?

    請老師幫忙看看吧。

    代碼在:

    https://github.com/chenaaaaa/rnn-based-quora-question-pair

    謝謝!

    ?

    ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

    ?回復(fù)
  • 11樓曠野的季節(jié)???01-30

    2018-1-30 update

    繼續(xù)昨天的更新一下,

    發(fā)現(xiàn)訓(xùn)練時公式(2)里面的w,b 沒有朝著一個方向變化(變化了一會又反方向變回來了)

    昨天又做了一下嘗試,先簡化了一下模型,即把原公式(2) bypss 讓公式(2)=公式(1)

    公式(3)不變。簡化版本的公式是:

    similarity(s1,s2) = exp(- L1 norm(encoder(s1) – encoder(s2))).??————公式(1

    作為相似度度量的指標(biāo),這個指標(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)--簡化版本公式(2)

    losses = - [ ?y * tf.log(probability) + (1-y) * tf.log(1- probability+very_small_constant) ]??? --------公式3

    (+very_small_constant =1e-16? 是因為有些example 的encoder(s1)=encoder(s2),導(dǎo)致probability是1。第二項的log里面會變成0而導(dǎo)致訓(xùn)練出錯。)

    最后是對batch 里面所有example的loss求和: loss = tf.reduce_sum(losses)

    發(fā)現(xiàn)還是loss 還是上下波動,但是整體上沒有向下變化的趨勢.

    ?

    后來還做過嘗試,把RNN變成GRU,現(xiàn)象也并沒有什么變化啊。。難道RNN模型就不能用嗎?

    ?回復(fù)
  • 12樓Lynn???01-31

    你這個代碼應(yīng)該是參考別人的代碼寫的,有這么幾個問題你可以考慮一下(代碼的話,有點難看):

    1.? 你的給你的訓(xùn)練數(shù)據(jù)訓(xùn)練了多少個epoches

    2. 6萬的數(shù)據(jù)真不一定夠,你可以使用所有的數(shù)據(jù),如果不行,再考慮是不是有問題,RNN是沒有問題的。

    2.? 你用的是對比損失,你現(xiàn)在就先讓對比損失跑起來(我這邊用對比損失的效果,要比log_loss好)

    ? ? ?有這么幾個要點:1. 正負(fù)樣本比例

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2. 你的代碼是不是有問題,我在最開始做這個比賽的時候,也出現(xiàn)了你的問題。

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3. 如果覺得實在是有問題可以使用tf.losses.log_loss

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4. 我出現(xiàn)的問題挺多, 1):數(shù)據(jù)預(yù)處理部分我出現(xiàn)過問題。

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2):句子的長度你取了多少?我取得是55,也取過60

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?3):神經(jīng)網(wǎng)絡(luò)部分的代碼對的嗎?

    ?回復(fù)
  • 13樓曠野的季節(jié)???02-06

    2018-02-06

    1,先說這周獲得的結(jié)論吧,目前確定GRU從數(shù)據(jù)集中學(xué)到了一些東西,但是問題是,基于目前的GRU方案+損失函數(shù)得到的(訓(xùn)練集)準(zhǔn)確率比較低,只有57%左右。剛開始訓(xùn)練時的準(zhǔn)確率(tp+tn/total)大約是33%,訓(xùn)練了大約2?epoch之后,準(zhǔn)確率提升到了43%, 然后我記得經(jīng)過比較長時間了,大約幾十個epoches之后吧,準(zhǔn)確率是57%,而且似乎沒有再上升的趨勢了。另外有時測試還發(fā)現(xiàn),準(zhǔn)確率也并不是一直維持在50%多,可能過一會兒又下降到了40% ,過一會兒又上升到50%多。這個。。。為啥

    另外上周的疑問,這周也確認(rèn)了一下。發(fā)現(xiàn)使用4萬多個樣本訓(xùn)練和使用30多萬個樣本訓(xùn)練得到的訓(xùn)練集準(zhǔn)確率差不多,沒發(fā)現(xiàn)什么區(qū)別。不過現(xiàn)在還是使用了30多萬個樣本訓(xùn)練。

    2,確認(rèn)一下我前上次所說的“LOSS函數(shù)不下降”的問題。發(fā)現(xiàn)那個問題和我當(dāng)時選擇的損失函數(shù)關(guān)系比較大。

    第一個公式應(yīng)該是沒問題:

    similarity(s1,s2) = exp(- L1 norm(encoder(s1) – encoder(s2))).??————公式(1

    ?

    但是下面這個公式:

    Probability(s1,s2 has the same meaning)=?sigmoid(w*similarity(s1,s2)+b)--公式(2)? 這個從道理上好像就不太通;

    ?

    在實踐中,發(fā)現(xiàn)如果用這個公式 的話,(訓(xùn)練集)準(zhǔn)確率就一直在33%左右,根本就沒有變好的趨勢。為了確認(rèn)是不是訓(xùn)練時間不夠長造成的,訓(xùn)練了大約200個 epoches,準(zhǔn)確率都沒有上升。

    ?

    后來不用上面的公式了,而是bypass了公式(2)直接令

    Probability(s1,s2 has the same meaning)=? similarity(s1,s2) ,測試結(jié)果就是第1條所說。

    ?

    3,還有一些其它的細(xì)節(jié)吧

    batch-size 目前取的是8192,是不是太多了啊?老師原來用的batch-size有這么多嗎?

    也試過,如果用比較小的batch-size的話,發(fā)現(xiàn)準(zhǔn)確率跳動地比較厲害了。

    ?

    4,上周老師評論里面,關(guān)于正負(fù)樣本的比例,唐老師的意思,是每個batch內(nèi)部正負(fù)樣本比例都要是50%呢,還是不同的batch之間的正負(fù)樣本比例比較穩(wěn)定、別忽高忽低就可以呢?

    或者是其它意思?

    ?

    “句子的長度你取了多少?我取得是55,也取過60”

    我記得我把所有的train.csv里面的句子,都padding 到了train.csv里面最長的那句話的長度。剛才打印了一下,應(yīng)該139。所以,55指的是?

    ?

    結(jié)合前面兩條說的,看來損失函數(shù)對模型的表現(xiàn)影響比較大,我可能打算先改進(jìn)一下?lián)p失函數(shù)。嘗試上周唐老師所說的對比損失(Contrastive Loss?)。

    http://blog.csdn.net/autocyz/article/details/53149760

    ?

    或者老師有什么別的建議嗎?

    ?

    ?回復(fù)
  • 14樓Lynn???02-10

    這里面有個比較嚴(yán)重的問題,就是句子長度的問題取句子最長為139,在這個里面90%以上的句子長度都不到60,如果句子的長度取139,那么就是在句子后面拼湊了大量的無用信息,雖然說lstm或gru能夠在訓(xùn)練當(dāng)中學(xué)習(xí)到較長的時間序列的信息,但是注意,如果時間序列的長度過長LSTM也是很無力的(如果只取LSTM最后一個單元的輸出)。

    參考的解決方法:在訓(xùn)練集當(dāng)中,每個句子的長度是不固定的,在你的代碼當(dāng)中,需要的是固定長度的輸入,所以這個時候需要你將所有的句子處理成長度一樣,所以這個時候需要人為的指定句子的長度,你在預(yù)處理當(dāng)中應(yīng)該是有這個參數(shù)的,所以將這個參數(shù)設(shè)置成50,然后再進(jìn)行處理和訓(xùn)練,你再看看結(jié)果。

    ?收起
    • 曠野的季節(jié)?02-25我沒有使用截斷的方法,我統(tǒng)計每句話的精確長度L后,把RNN的每L的output給提取出來了;也就是說,batch里面的不同行抽取的的last state位置是不一樣的回復(fù)
    我也要說?
15樓Lynn???02-10

batch_size取的是1500,8912是否過大?如果mini_batch取得過大,會是的它的方向探索性不是很強(qiáng),有沒有考慮過這個問題?

當(dāng)然這只是小問題,大問題在于8912的話,會使得你的代碼非常消耗內(nèi)存,加大了每一輪的計算量,減慢運(yùn)行速度。

?收起
  • 曠野的季節(jié)?02-25對,我重新了解了一下stocastic gradient descent 方法,認(rèn)為您說的很有道理,您的batch-size是1500吧,我現(xiàn)在設(shè)的是2048回復(fù)
我也要說? 16樓Lynn???02-10

還有你說的波動的原因是不是和學(xué)習(xí)率有關(guān)系?你的學(xué)習(xí)率是否過大??

一般來說,如果你的訓(xùn)練結(jié)果波動很大,這個時候你需要考慮減小你的學(xué)習(xí)率。

?收起
  • 曠野的季節(jié)?02-25之前的波動應(yīng)該是架構(gòu)的原因,我在17樓寫了。換了架構(gòu)后,訓(xùn)練的前期可以看到loss在小幅波動中下降的現(xiàn)象,訓(xùn)練到后期因為就穩(wěn)定,只剩下類似于隨機(jī)上下波動的現(xiàn)象了。但是有時訓(xùn)練的太多了,反正效果會變差,即使是訓(xùn)練集效果也會變差? 這正常嗎? 我猜測因為mini-batch算的梯度不完全準(zhǔn)確,訓(xùn)練時間一長可能跳出局部最小值的概率變大,跑到別處去了回復(fù)
我也要說? 17樓曠野的季節(jié)???02-25

謝謝唐老師的回復(fù),過節(jié)回復(fù)晚了:)

1. 對之前l(fā)oss不能收斂問題的解決

發(fā)現(xiàn)之前很多次說的模型學(xué)不到東西,可能是神經(jīng)網(wǎng)絡(luò)架構(gòu)方面的問題

為了完整性,再畫一下,之前的架構(gòu)是下面這個樣子:

注:圖中的“abs"指的是對兩個input相減后取絕對值

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 架構(gòu)一

后面與唐老師溝通后,參考唐老師的方案,改成了下面的架構(gòu):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?架構(gòu)二

后來我思考為什么一開始的架構(gòu)不行,把上面的兩種架構(gòu)整合成了下面的架構(gòu):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?架構(gòu)三

注:圖中的“abs"指的是對兩個input相減后取絕對值

架構(gòu)三與架構(gòu)二的區(qū)別,是在原始特征之后加了一層 ”對應(yīng)位置特征相減“ 的操作。

架構(gòu)三與架構(gòu)一的主要區(qū)別,是去掉了所有abs之后的加和操作。

目前經(jīng)過嘗試,在train && dev set 上架構(gòu)三比架構(gòu)二要好一些,當(dāng)然最終效果如何還要在kaggle網(wǎng)站上提交結(jié)果看一下。

?

2. 為什么一開始架構(gòu)不行的簡要想法。

可能是”求和“以后,不同的”特征“的信息丟失了一些?而這個”求和“到底有什么含義嗎?受word2vec的影響,?一開始,我認(rèn)為GRU的輸出應(yīng)該是一句話映射在語義空間的”話的意思“,這樣如果兩句話s1, s2表達(dá)的意思相同,那么這兩個映射點位置應(yīng)該是相近的才對。 于是才會有之前所做的求Manhattan Distance的做法,但是現(xiàn)在看來這種做法可能并不合適?

但是為什么word2vec ,可能認(rèn)為意思相近的詞得到的詞向量會比較接近呢?

這是因為意思相近的詞,在上下文窗口中出現(xiàn)的概率比較高,訓(xùn)練算法自動會把窗口里的詞的詞向量拉近,把不在窗口里的詞的詞向量拉遠(yuǎn),從而造成了相近的詞的詞向量較接近。

也許GRU的輸出應(yīng)該理解成”特征“更合適一些。

之前也問過唐老師,”為什么RNN的輸出能當(dāng)成特征直接用呢“ 簡要記錄一下唐老師的回答,

"siamese網(wǎng)絡(luò)兩個部分算出來的最終的結(jié)果,無論里面采用的CNN,LSTM,BLSTM,甚至是全連接網(wǎng)絡(luò),這些結(jié)果可以看成是高階特征。在很多論文當(dāng)中,一般來說就是在這些網(wǎng)絡(luò)上面下文章,希望能夠得到更有表達(dá)能力的特征。

只是這些特征不能夠用語言解釋

在傳統(tǒng)機(jī)器學(xué)習(xí)中,很多情況下特征是可以解釋的,這個也是神經(jīng)網(wǎng)絡(luò)的劣勢,可解釋性不是很強(qiáng)。

舉個例子,word2vec訓(xùn)練出來的128位的向量,這128維的向量都可以看成是這個詞匯的特征,只是這個特征不具有很強(qiáng)的解釋性。"

所以其實解釋了前面我所說的,兩個詞的意思相近,詞向量接近,就是各個特征相近。。。

?

3, 那么現(xiàn)在這個網(wǎng)絡(luò)能夠?qū)W習(xí)到訓(xùn)練集的信息么?

這個訓(xùn)練集有點特點,是正負(fù)樣本比較不一樣,大約正樣本37%,負(fù)樣本63% 所以單憑正確率無法判斷模型是否真的學(xué)到了東西。比如說模型把所有的樣本都判斷成負(fù)樣本,此時正確率就是63%,看著是大于50%了,像是比胡亂猜要好,但是其實模型什么都沒有學(xué)到。

回顧一下之前課程學(xué)到的東西,

不解釋,上實驗結(jié)果,每一行是一個mini-batch的evaluate結(jié)果(每次先在一個mini-batch上evaluate ,然后loss opt,然后換一個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%, 此時分類器像是瞎猜 、precision是38%, 因為正樣本的數(shù)量相對較小,所以precison不高。

precision = 0.310469299555 recall = 0.108448930085? recall變小,分類器把更多的樣本都判定成為負(fù)例

precision = 0.300000011921 recall = 0.015306122601? recall繼續(xù)變小

precision = 0.0 recall = 0.0? ? ? ? ? ? 此時recall =0, 分類器一個正樣本都識別不出來了

precision = 0.0 recall = 0.0

precision = nan recall = 0.0? 可以看到,precison 變成了正無窮,原因是TP+FP=0, 即分類器把所有的樣本都判斷成了負(fù)例。

precision = nan recall = 0.0? 重復(fù)好幾個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ù)好幾個mini-batch

precision = 0.20000000298 recall = 0.00272108847275? 此時,recall 不再是0了 ,有一些正樣本被正確地識別了出來

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個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 這次跑沒有打印,可能在75%左右吧。

再說驗證集。
一共有409600個sample(把原始train.csv復(fù)制擴(kuò)大了幾K個樣本)

train-set : 307200

dev-set : 105600

average accuracy = 0.7539746

average precision = 0.67941993

average recall = 0.60883856

有點差啊?

注:神經(jīng)網(wǎng)絡(luò)里面防止過擬合比較常用的是dropout,放假期間嘗試過dropout_keep_rate=1,發(fā)現(xiàn)train和dev 二者的accuracy 差距明顯變大(當(dāng)時還沒有評估precision && recall)。加了dropout后,至少在accuracy上兩者的差值明顯變小了,但是train set 的準(zhǔn)確率也沒有不加dropout 時高了,所以最終似乎也沒有發(fā)現(xiàn)dev set 的準(zhǔn)確性變高。也許是我現(xiàn)在的程序還比較粗糙,dropout這個事件后續(xù)再嘗試。目前dropout_keep_rate = 0.5。

4, 經(jīng)過上面的分析,可以認(rèn)為模型已經(jīng)學(xué)到東西了:)?

先在kaggle上提交一下吧,看看結(jié)果怎么樣,能排在什么水平

我的下一步的改進(jìn)思路,基本按照機(jī)器學(xué)習(xí)的正常流程來說:

1) 數(shù)據(jù)清洗

? ? ? 老外用quora很多都是在手機(jī)上吧?鍵盤那么小,拼錯單詞的情況可能會有吧?(不知道會不會單詞檢查)。那么對于不在glove字典中出現(xiàn)的單詞,也許是由于拼字錯誤造成的,也許是一些專業(yè)性比較強(qiáng)的詞、或者是自行創(chuàng)造的某些生活詞匯。如果能在glove字典中找到非常相似的詞,則認(rèn)為是拼寫錯誤,那么就用glove字典中出現(xiàn)的詞來替代問題中的詞。

2)詞向量是不是可以重新訓(xùn)練? 也就是說,只是把glove的詞向量當(dāng)成是初始的詞向量,而非固定的詞向量。

3)特征工程

? ? ? ? 這個是目前一直沒有考慮的問題。是不是可以考慮用下面的這些特征

? ? ? ?1) 兩句話的最長公共子序列的長度?如果LCS 比較大,是不是意思一樣的概率就會比較大?

? ? ? ?2) 兩句話的長度差值。 如果一句話很長,另外一句話非常短,是不是意思相同的概率會比較低?

? ? ? ?3)主題模型?

?

4) 換不同的模型試試

現(xiàn)在用的是GRU,如果換成LSTM, BLSTM呢?

5) 換損失函數(shù)試試 比如之前提到的對比損失

6) 是不是可以在simense網(wǎng)絡(luò)后,加一個隨機(jī)森林試試? 自己瞎想的:

意思是分兩輪,第一論用softmax訓(xùn)練出來一個simense網(wǎng)絡(luò),等訓(xùn)練了足夠輪之后,認(rèn)為simense網(wǎng)絡(luò)里面的參數(shù)都穩(wěn)定了,此時特征都得到了,然后simense 網(wǎng)絡(luò)就不動了;然后把softmax去掉,替換成random forest,開始第二輪單獨訓(xùn)練random forest ,最終用ramdom forest的輸出當(dāng)成最終的預(yù)測值。

7) 數(shù)據(jù)隨機(jī)擴(kuò)展。

如果s1, s2意思相同的話,那么 s2, s1 的意思也是相同的。因此可以把一個y=1 的樣本(s1, s2, y?)送進(jìn)模型的時候,隨機(jī)決定是送進(jìn)(s1, s2, y ) 還是? (s2, s1, y)。??

目前的想法大概就是這些,如有問題歡迎指正!

?

?

?

??

?回復(fù) 18樓曠野的季節(jié)???03-13

經(jīng)過與唐老師的溝通,目前思路如下:

1) 參考文檔:

http://web.stanford.edu/class/cs224n/reports/2759336.pdf

“ 你之前將抽取出來的兩個高階向量直接連續(xù)起來,它增加了兩個信息,一個是r1-r2,一個是r1.*r2,

將這四個向量連接起來,這個應(yīng)該相對于目前的網(wǎng)絡(luò)結(jié)構(gòu)得到一個挺好的優(yōu)化。”

我模擬了一下這個實驗,accuracy 大概能到83%左右,recall應(yīng)該也比這個要高一些。可能預(yù)處理做的比這個文檔上做的更多一些。

然后還有一個,參考一下下面的這些文檔。

這3個博客是一個系列,最后一個鏈接涉及到了很多自然語言理解的問題

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)練的,這個非常重要”

這個一定要能訓(xùn)練,因為不能的數(shù)據(jù)集有不同的詞語分布,也導(dǎo)致(不同的數(shù)據(jù)集的)向量分布是不一樣的。可以訓(xùn)練的話會導(dǎo)致這個詞向量是最符合我們這個數(shù)據(jù)集要求
?

3,還有一點是keep_dropout_prob ,我現(xiàn)在是0。5,可以把這個參數(shù)先取消,暫時先不做棄權(quán),應(yīng)該先把不做棄權(quán)的效果提上去。若訓(xùn)練集的效果已經(jīng)提高上去,而訓(xùn)練集的(準(zhǔn)確率或loss)和測試集(準(zhǔn)確或loss)的準(zhǔn)確率區(qū)別比較大了,再來做棄權(quán)。相當(dāng)于我現(xiàn)在一上來就做正則,此時我并不知道現(xiàn)在不知道模型處于什么狀態(tài),能達(dá)到什么效果,是不是已經(jīng)過擬合。只有當(dāng)模型已經(jīng)出現(xiàn)過擬合了,再來做正則。

?

4,就我目前的效果來說,先不用考慮CELL是什么。目前還不用考慮是GRU,LSTM,雙向LSTM,比如我就用LSTM,先把效果提上去,提到和別人一樣,比如別人是83%,我是79%,此時可以再換CELL。對于單個模型來說,GRU,LSTM,的差別沒有大到那種程度。

5,數(shù)據(jù)清洗——可以先不考慮。當(dāng)處理個大概以后,再說。先把(結(jié)果)提上去。 ? 怎么提呢,比如網(wǎng)絡(luò)架構(gòu)。要確定網(wǎng)絡(luò)架構(gòu)一定是對的,比如(什么東西,training or dev ?)能到80%?

6, 特征工程,LCSor 長度差值,or 主題模型可以先不考慮(因為對于短句子來說,主題是比較難做的)很少有人做LDA。。先不用考慮這個

7,但是當(dāng)訓(xùn)練結(jié)果到達(dá)一定程度后,考慮LCS or 長度差值,可以再數(shù)據(jù)清洗,拼寫錯誤,語法錯誤,等。就目前來說,先把上面提到的這些做好,網(wǎng)絡(luò)結(jié)構(gòu)稍微變一下就好。

8,損失函數(shù)——“前面提到的對比損失暫時不用改。先把網(wǎng)絡(luò)改一下,網(wǎng)絡(luò)結(jié)構(gòu)改好了后,先看看效果。就目前來說,不同損失函數(shù)的差別沒有那么大”

9, 分類器直接用全連接網(wǎng)絡(luò)就可以了,先不用把神經(jīng)網(wǎng)絡(luò)提取出來的模型送到Random Forest, 這種分類器。"好多碩士的垃圾論文都是這么干的”

10, kaggle上寫給的不是準(zhǔn)確率,是以logloss ,以logloss 為判斷結(jié)果,

11,拿測試集調(diào)參是沒有問題的

12,跑50輪沒有必要,跑的太多,跑的太多會產(chǎn)生非常嚴(yán)重的過擬合,有時要在代碼中加入畫圖的功能,tensorboard,準(zhǔn)確率、召回率、loss 都能打印出來,動態(tài)變化的。可以看測試集,什么時候收斂都可以看出來,可以看什么時候擬合效果是最好的。如果tensorboard費勁,也可以看loss。 訓(xùn)練集的準(zhǔn)確率和loss 到最后不會產(chǎn)生大的波動,但是測試集的準(zhǔn)確率可能不好有太大變化,但是loss會有一個特別大的提升(To be checked)。

12,提交給Kaggle上的是概率。是softmax/sigmoid上的概率。提交0-1結(jié)果是有問題的。

13,用了一下交叉驗證,但是用交叉驗證或不用,差別沒有那么大,一開始進(jìn)不需要使用。

14,“用測試集上調(diào)參用什么指標(biāo)?” 用logloss?就可以。

?

?

?回復(fù) 19樓曠野的季節(jié)???03-16

1,這周的工作,學(xué)習(xí)了tensorboard的使用:

為了和詞向量Trainalbe的結(jié)果做下對比,因此本篇的結(jié)果,是詞向量不可訓(xùn)練。下一篇再上詞向量可訓(xùn)練的。另外此時keep_dropout_prob=1 。目前是為了看一下模型現(xiàn)在處于的狀態(tài)。

把超參數(shù)說明一下:

RUN_MODEL=two-feature-substrate?? 高階特征的組合方式是abs(r1-r2)

BATCH_SIZE=2048?????????????????????????????????????? 一個batch包含的樣本個數(shù)
DROPOUT_KEEP_PROB=1.0?????????????????? 不做棄權(quán)
EMBEDDING_TRAINABLE=False?????????? ? 詞向量不可訓(xùn)練
L2_REG_LAMBDA=0.0???????????????????????????????? 不做正則
NUMBER_UNITS=50??????????????????????????????????? RNN的cell個數(shù)
TRAIN_SAMPLE_PERCENTAGE=0.75???? train/total 比例
TRAIN_SIZE=307200??????????????????????????????????? 訓(xùn)練集的樣本個數(shù)

下面的圖片是訓(xùn)練集,而文字描述是測試集:

Train loss:??? 0.36 :? DEV loss:? 0.5330878?

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

而測試集的情況是:

Train accuracy : 83% Dev accuracy :? 75.68 %

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

?

而測試集的情況是:

Train precison: 77%? Dev precision: 68.22 %

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

?

而測試集的情況是:

Train recall : 77% Test recall:? 61.5%

這四個指標(biāo)的Train && Dev 之間的差距都比較大,因此,我認(rèn)為現(xiàn)在模型處于嚴(yán)重的過擬合狀態(tài)。應(yīng)該考慮加正則或者drop手段來防止過擬合。

?

?

?回復(fù) 20樓曠野的季節(jié)???03-17

與前一篇的區(qū)別,是詞向量是可以訓(xùn)練的。正如唐老師所說,詞向量一定要是可以訓(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?????????????????????????????????????????????????????????????????????????? --一個RNN模型內(nèi)部的hidden-state 個數(shù)
RNN_TYPE=gru??????????????????????????????????????????????????????????????????????????????????? --cell 類型:GRU
TRAIN_SAMPLE_PERCENTAGE=0.75??????????????????????????????????????????? --train/total 比例

訓(xùn)練集loss 能下降到0.1以下:

還有個現(xiàn)象,loss會在每輪(一輪包含150個mini-batch)開始的地方突然有個很大的下降,但是在每輪中間的地方loss 會有緩慢的提升,然后在下一輪開始的地方再突然下降一下子。圖中突然下降了幾次,就代表訓(xùn)練了幾輪。

不只是loss,下面的accuracy, recall, precison 都有這個現(xiàn)象。why?

?

訓(xùn)練集accuracy 提升到97% 左右。還是在每epoch開頭的地方突然上升。所以出現(xiàn)下面這樣的波動形式。

?

訓(xùn)練集recall 最后能提到97% 左右。

訓(xùn)練集precision 能在95%左右。

?

綜上,改成詞向量可以訓(xùn)練之后,神經(jīng)網(wǎng)絡(luò)在訓(xùn)練集上的表現(xiàn)有了巨大的提升。

但是在測試集上的表現(xiàn)就不那么好了。

@ 后面的數(shù)字是min-batch 個數(shù), 1 epoch = 150 mini-batches

?

加粗的幾行是我認(rèn)為loss 最好的幾次迭代,大約是1個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

能得到的信息有這么幾個:

1, 訓(xùn)練的輪數(shù)太多的話,accuracy ,recall, preciosn 也許變化不太大,但是loss? 會先下降隨后一路上升

即使是test表現(xiàn)最好的第一輪未,

train loss = 0.34 dev loss = 0.49

,train && test 區(qū)別也比較大。可見目前模型處于嚴(yán)重的過擬合。

接下來先要解決一下模型的過擬合問題。

?

?回復(fù) 21樓曠野的季節(jié)???24天前

Parameters:

參考了唐老師給出的參考資料

http://web.stanford.edu/class/cs224n/reports/2759336.pdf

神經(jīng)網(wǎng)絡(luò)的架構(gòu)使用的是:

和這個架構(gòu)唯一的區(qū)別,是把r1-r2 替換成了abs(r1-r2),

我一開始沒有用四個向量拼接的方式,只是使用了abs(r1-r2);而如果僅僅用r1-r2,神經(jīng)網(wǎng)絡(luò)基本無法收斂。因此參考這篇文章時,我把四個向量里面的r1-r2 替換成了abs(r1-r2)。

目前的疑問有下面這些:

問題一: 如果詞向量是可以訓(xùn)練的,該怎么訓(xùn)練呢?有下面這兩種方式,哪種是正確的?

方式一: 用glove向量當(dāng)成詞向量的初始值,然后只是在訓(xùn)練時順便把詞向量做成"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的初始值, 同時W的是可以根據(jù)loss做調(diào)整的,使用的是神經(jīng)網(wǎng)絡(luò)最后一層的tf.nn.softmax_cross_entropy_with_logits做損失函數(shù)

方式二: 使用word2vec程序,把traing.txt當(dāng)成語料庫,用CBOW or Skip-Gram模型來學(xué)習(xí)詞向量。

然后學(xué)習(xí)到詞向量之后,再拿過來送進(jìn)現(xiàn)有模型,同時做成不可訓(xùn)練的(or 可訓(xùn)練的?如方式一?)

?

應(yīng)該是使用哪種方式呢?方式一or 方式二? or 都不是?

目前我的程序使用的是方式一

?

問題二:

訓(xùn)練集的loss曲線,

第一輪時loss 下降很快;

第二輪時loss 基本持平;

從第二輪到第三輪切換時,loss有一個大幅度的下降;

為什么從第三輪開始,在每輪內(nèi)部的loss會有小幅的小升?而從第三輪進(jìn)入第四輪時,loss 才會有一個比較大下降?

Note: 每一輪進(jìn)入下一輪時,所有的訓(xùn)練數(shù)據(jù)會全部隨機(jī)shuffle。每個mini-batch會按照順序依次切取一小塊送給模型進(jìn)行訓(xùn)練。

優(yōu)化算法使用的是Adam算法。

?

問題三:

我目前使用50維的詞向量,是不是太小?對結(jié)果影響大嗎?

?

因為我看論文里面說:

使用了200d的詞向量,本來想使用300d的詞向量,因為程序跑起來,慢,才做罷 ~~

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??????????????????????????????????????????????????????? 一個mini-batch包含的樣本數(shù)

DROPOUT_KEEP_PROB=0.5??????????????????????????????????? 四個向量拼接之后,進(jìn)入全連接層之前,做了棄權(quán),0.5
EMBEDDING_TRAINABLE=True??????????????????????????????????使用神經(jīng)網(wǎng)絡(luò)最后的損失來訓(xùn)練詞向量,OK?

L2_REG_LAMBDA=0.0??????????????????????????????????????????????????? 損失函數(shù)沒有做L2

NUMBER_UNITS=50?????????????????????????????????????????????????????? 每一個RNN內(nèi)部的"memory"包含的神經(jīng)元的大小
RNN_TYPE=gru
TRAIN_SAMPLE_PERCENTAGE=0.75??????????????????????? 使用75%的數(shù)據(jù)做訓(xùn)練,其余的25%做測試, OK?
TRAIN_SIZE=307200???????????????????????????????????????????????????????訓(xùn)練集的包含的樣本大小

?

下面是在25%的測試集(共107200個樣本)的測試情況

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

算正常的一個結(jié)果么?

最好的情況我目測在這里

再往后就開始過擬合了。如下面是15輪之后的結(jié)果:

loss會上升的很厲害;所以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

?回復(fù) 22樓曠野的季節(jié)???24天前

上一篇的圖片沒有發(fā)成功,重新發(fā)一次這篇總結(jié):


參考了唐老師給出的參考資料
http://web.stanford.edu/class/cs224n/reports/2759336.pdf
神經(jīng)網(wǎng)絡(luò)的架構(gòu)是:

?


和這個架構(gòu)唯一的區(qū)別,是把r1-r2 替換成了abs(r1-r2),
我一開始沒有用四個向量拼接的方式,只是使用了abs(r1-r2);而如果僅僅用r1-r2,神經(jīng)網(wǎng)絡(luò)基本無法收斂。因此參考這篇文章時,我把四個向量里面的r1-r2 替換成了abs(r1-r2)。
目前的疑問有下面這些:

?

問題一: 如果詞向量是可以訓(xùn)練的,該怎么訓(xùn)練呢?有下面這兩種方式,哪種是正確的?

? ? ? 方式一: 用glove向量當(dāng)成詞向量的初始值,然后只是在訓(xùn)練時順便把詞向量做成"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的初始值, 同時W的是可以根據(jù)loss做調(diào)整的,使用的是神經(jīng)網(wǎng)絡(luò)最后一層的tf.nn.softmax_cross_entropy_with_logits做損失函數(shù)


? ? ? ?方式二: 使用word2vec程序,把traing.txt當(dāng)成語料庫,用CBOW or Skip-Gram模型來學(xué)習(xí)詞向量。
? ? ? ?然后學(xué)習(xí)到詞向量之后,再拿過來送進(jìn)現(xiàn)有模型,同時做成不可訓(xùn)練的(or 可訓(xùn)練的?如方式一?)

應(yīng)該是使用哪種方式呢?方式一or 方式二??or 都不是?
目前我的程序使用的是方式一

問題二:
目前我的訓(xùn)練集的loss曲線長下面這個樣子:

?


第一輪時loss 下降很快;
第二輪時loss 基本持平;
從第二輪到第三輪切換時,loss有一個大幅度的下降;
為什么從第三輪開始,在每輪內(nèi)部的loss會有小幅的小升?而從第三輪進(jìn)入第四輪時,loss 才會有一個比較大下降?
Note: 每一輪進(jìn)入下一輪時,所有的訓(xùn)練數(shù)據(jù)會全部隨機(jī)shuffle。每個mini-batch會按照順序依次切取一小塊送給模型進(jìn)行訓(xùn)練。
優(yōu)化算法使用的是Adam算法。

問題三:
我目前使用50維的詞向量,是不是太小?對結(jié)果影響大嗎?

因為我看論文里面說:
使用了200d的詞向量,本來想使用300d的詞向量,因為程序跑起來,慢,才做罷 ~~

問題四:
測試集上loss最低到0.44, 離0.23還有一段差距啊?怎么辦?
0.23的損失函數(shù)是根據(jù)我目前的架構(gòu)實現(xiàn)的嗎?是不是還有什么其它的技巧呢?

?

附:程序的超參數(shù)如下:

RUN_MODEL=two-feature-substrate-trainable-swap
ALLOW_SOFT_PLACEMENT=True
BATCH_SIZE=2048????????????????????????????????????????????????????????一個mini-batch包含的樣本數(shù)是2048

DROPOUT_KEEP_PROB=0.5????????????????????????????????????四個向量拼接之后,進(jìn)入全連接層之前,做了棄權(quán),0.5
EMBEDDING_TRAINABLE=True??????????????????????????????????使用神經(jīng)網(wǎng)絡(luò)最后的損失來訓(xùn)練詞向量,OK?

L2_REG_LAMBDA=0.0????????????????????????????????????????????????????損失函數(shù)沒有做L2
NUMBER_UNITS=50???????????????????????????????????????????????????????每一個RNN內(nèi)部的"memory"包含的神經(jīng)元的大小是50
RNN_TYPE=gru
TRAIN_SAMPLE_PERCENTAGE=0.75????????????????????????使用75%的數(shù)據(jù)做訓(xùn)練,其余的25%做測試,?比例OK?
TRAIN_SIZE=307200???????????????????????????????????????????????????????訓(xùn)練集的包含的樣本大小

下面是在25%的測試集(共107200個樣本)的測試情況
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
算正常的一個結(jié)果么?
最好的情況我目測在這里
再往后就開始過擬合了。如下面是15輪之后的結(jié)果:
loss會上升的很厲害;所以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
?

?回復(fù) 23樓Lynn???12天前

1.? ?由上面TensorFlow輸出的損失圖可以看出在每個epoch里面,損失函數(shù)是上升的,這個其實已經(jīng)能夠說明在訓(xùn)練的過程當(dāng)中產(chǎn)生了過擬合的情況,實際上是一個嚴(yán)重的過擬合,所以要解決這種情況:下面是建議:

? ? ?1. 加上正則,這是一般做法,但是比較難控制的是正則化系數(shù),需要調(diào)整參數(shù)。

? ? ?2. 棄權(quán),這是神經(jīng)網(wǎng)絡(luò)的做法。

? ? ?3. earlying stopping 這是你在上面已經(jīng)提到了。

? ? ?4. 采用模型集成的想法,比如在這里,你是用的是LSTM,是不是可以使用CNN,或者BLSTM或者是GRU。甚至每一個都可以做一做,然后進(jìn)行stacking,取平均值什么的,也就是類似于Random forest,這種想法能夠降低模型的方差,獲取比較好的預(yù)測結(jié)果。

? ? ?5. 進(jìn)行手動特征工程,這個在很多材料上面都有。

? ? ?6. 數(shù)據(jù)源有些標(biāo)簽是有問題的,需要修改,但是這一塊我還沒有發(fā)現(xiàn)比較好的方法解決。

? ? ??

?回復(fù) 24樓Lynn???12天前

2. 詞向量的問題:詞向量的維度在我看來有點小,我取得是128,僅僅作為參考。

3. 還有損失的問題:測試機(jī)的分布和訓(xùn)練集的分布是不一樣的,你可以考慮重新考慮一下分布(亞采樣?重采樣?)。

4. RNN size可以取大一點。

5. 因為訓(xùn)練數(shù)據(jù)集比較大,所以在分割驗證機(jī)的時候沒有必要那么大(驗證集取一萬就行了,用來查看效果)

6. 還有就是參數(shù)調(diào)整的問題,可以使用交叉驗證(警告:這個非常消耗時間,而且你的電腦那么慢)

7. 建議:最好用TensorBoard將測試集的loss也畫出來,這樣知道early stopping應(yīng)該在哪里stop

?回復(fù) 25樓Lynn???12天前

關(guān)于詞向量的問題,一般來說有3種做法,提前訓(xùn)練好向量和隨機(jī)生成詞向量,還有初始化為one-hot。

?

在我們的這個問題里面最好使用時時訓(xùn)練好的向量,并且可以訓(xùn)練。

?回復(fù) 26樓曠野的季節(jié)???16小時前

根據(jù)唐老師的提議,把 test集上的loss 也畫出來了。過擬合太嚴(yán)重了!

橘黃色的是train 上的; 藍(lán)色的是test集上的。藍(lán)色最低點大約是0.45。隨后很快就一路高漲。

加正則試試?

?

下面是accuracy: 可以看到,測試集的準(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

?回復(fù) 發(fā)表回復(fù)??????????????源碼??發(fā)表 話題作者Ryan解惑者學(xué)院首席講師

新加組員

  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?

熱門小組Quora Question Pairs33?2機(jī)器學(xué)習(xí)入門23?1機(jī)器學(xué)習(xí)項目實戰(zhàn)15?2

我是學(xué)生

  • 如何注冊
  • 如何學(xué)習(xí)
  • 如何互動

我是老師

  • 發(fā)布課程
  • 使用題庫
  • 教學(xué)資料庫

我是管理員

  • 系統(tǒng)設(shè)置
  • 課程設(shè)置
  • 用戶管理

商業(yè)應(yīng)用

  • 會員專區(qū)
  • 題庫增強(qiáng)版
  • 用戶導(dǎo)入導(dǎo)出

關(guān)于我們

  • 解惑者學(xué)院
  • 官方微博
  • 加入我們
?? Powered by?EduSoho v8.1.10??2014-2018?好知網(wǎng)?課程存檔
  • 學(xué)
    習(xí)

  • TOP

總結(jié)

以上是生活随笔為你收集整理的Quora Question Pairs 思路记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。