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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

我与导师的聊天记录

發布時間:2024/7/5 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我与导师的聊天记录 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

雖然導師遠在馬來西亞,但是每次都是很耐心的回答我的問題,真的是非常感激啦!
我就想記錄下來,自己提出的問題,老師給我的解答,算是我研究生生涯的很大一部分生活了吧!
噢~ 還有就是,這些都是微信聊天記錄呦!!!


20190919

提問
https://blog.csdn.net/qq_38412868/article/details/83748553

這里面提到的LSTM實現的方式

比如一條路勁:U1 -> f1 ->f2 ->f3 -> f4 -> f5
訓練時X:U1 f1 f2 f3 f4
Y:f1 f2 f3 f4 f5
會得到5個cell輸出: c1、c2、c3、c4、c5
則損失函數:Loss = sum( ( [c1 c2 c3 c4 c5] - [f1 f2 f3 f4 f5] ) **2 )

這樣計算損失的方式是否可取,這樣好像就不需要負采樣了。
我感覺這樣的計算方式挺合理的。

但是 是不是進行訓練的時候必須有正樣本和負樣本?

采用負樣本的目的是為了把推薦問題看成一個二分類問題嗎?

老師回答:
負采樣訓練不是一般性機器學習模型必備的
但是在我們的問題里,最后評估模型質量的那些measure,是評估模型是否能將positive樣本的估分比negative樣本的估分高
因此在訓練的過程中,我們就要引入negative樣本,在訓練數據上優化使得正樣本比負樣本的評分高
這么做是因為這一類型的推薦問題大家公認的評估方式決定的。
如果做推薦評分預測問題,模型評估的時候就只是估計分數的誤差,那么訓練的時候就不需要用負樣本了


20190920

提問:
LSTM的五個狀態進行concatenate處理后5*8 的向量轉換為8 的向量時:
使用 [40,20,8] 還是直接使用 [40,8]

是不是數據量很大的時候才采用塔形(減半)的方式設置MLP,數據量少的時候一個全連接層就可以了。

老師回答:
使用 [40,20,8] 還是直接使用 [40,8] 這個不好說,都是測試完才知道效果,我會先實驗第一種減半的方法


20190923

1、評估階段:(假設user embedding=8)用LSTM對用戶信任路徑做處理,將每個hidden state進行concatenate得到path embedding 8*5,通過MLP處理得到 path embedding 8,與user embedding進行向量內積得到鏈路預測用戶得分,這里可能需要對score用sigmoid函數處理。
2、Loss計算:(有一丟丟印象,但還是沒有理解這里的計算)還有一個很重要的問題就是,如果這樣計算損失的話,評估階段使用的MLP里面的參數并沒有在訓練階段的到訓練。

老師回答:
這里可能需要對score用sigmoid函數處理 -》 這個沒問題,最后需要得到一個預測分數值的時候,一般都是會通過sigmoid

評估階段使用的MLP里面的參數并沒有在訓練階段的到訓練 -》 沒理解你的意思,訓練和測試用的模型要是一樣的架構,同一個模型

因為最后一層是輸出一個概率,一般一定會通過一層用sigmoid當激活函數的MLP。只是在這層(d=8)前是否還有別的MLP(如d=20)可以自己試驗一下,不好說效果好不好

測試和訓練的模型,最后一層都放一個sigmoid的mlp

還有目前訓練的時候,對于6個節點的路徑,記得先寫成 利用1預測2,利用(1, 2) 預測 3, 利用(1,2,3) 預測4 。。。 我前天發給你的兩篇論文應該都是這樣訓練

雖然我覺得這樣模型間接的知道了(1,2) 后是 3了,因為有個訓練數據是(1,2,3) 。但是大部分這一類論文都還用這種方法

提問:
不知道我理解的對不對?

老師回答:
數學上是對的 但是實現的時候這樣算會很慢。要像上次說的那樣算S_1->2的時候P和U要是矩陣,相當于要是數據里有100個像你寫的S_1->2的公式計算,程序里要把這100個拼成一次計算


20191004

匯報:

結論:

  • 從實驗結果來看,效果沒有提升,反而下降。信任部分出現了問題。
  • 非均勻采樣的效果要比均勻好一點,采樣200比50好一點。采樣500時效果出現明顯下降。因為用戶之間的信任link只有用戶數量的4倍,意味著很多用戶沒有信任的人,很多用戶信任的人的數量也不多,所以sample到的很多路徑是用max_user值padding得到的,以至于效果不好。(200非均勻應該是最好的設置)
  • 老師回復:
    我想在數據里filter掉長度小于6的信任路徑。只訓練那些長度6的信任路徑,如果某個用戶一條長度6的信任路徑也沒有,那么對他的推薦就退化成SAMN。
    可以先統計下,這13957個用戶里,有多少能又長度6的路徑的
    就是以某個用戶為起點的路徑,長度有6的,那這個用戶就算有信任路徑。統計下,有多少用戶有信任路徑
    cici:
    我統計了一下有564個用戶有長度為6信任路徑,有點少
    老師:
    那看來效果不好跟這個路徑數太少應該有關系。之前你跑實驗的時候,一個用戶最多幾條路徑呢?
    這564個用戶有長度為6信任路徑,又一共有幾條?
    cici:
    為每個用戶均勻采樣50條路徑,其中564個用戶存在長度為6的路徑,一共50*13957=697850條路徑中有29979條路徑是長度為6


    20191005

    匯報:

    結論:

  • loss在減少,recall卻沒有提升。模型過擬合。
  • 推薦部分和信任部分應該以不同的速度或者說頻率進行訓練,因為他們收斂的速度不同。(推薦部分在epoch100次的整個過程中性能有持續逐步的提升,信任部分epoch10次以上就不行了)(也就是說這兩個任務的損失函數不應該加在一起,而是訓練10次推薦,再訓練1次信任)
  • 老師回復:
    這個想法沒有問題。先試一下推薦訓練1次trust訓練1次的效果,再試試推薦訓練10次trust訓練1次這樣??梢园颜麄€訓練過程中,trust部分和推薦部分的loss畫折線圖看一下趨勢

    提問:
    一些我的理解不知道對不對:
    MLP的最后一層,如果是一個輸出的0-1分類問題,一般使用sigmoid激活函數;
    如果是多個輸出的分類問題(比如手寫數字分類),一般使用softmax激活函數;
    而在本實驗中,是通過LSTM的每個狀態的concat中學習路徑的表示,最后一層應該是不需要使用激活函數的。

    老師回復:
    這里數學理論上是不需要在最后加激活函數了
    但是實際實現里要加sigmoid,來保證計算機計算的時候的數值穩定性
    https://www.tensorflow.org/api_docs/python/tf/nn/sigmoid_cross_entropy_with_logits 如果是TensorFlow的話,我們做的這種問題需要訓練negative sample的,一般會用這個loss
    你看他的說明里面模型最后的輸出就先傳到sigmoid再傳入loss
    這樣在計算每一個sample的時候,能保證輸出一定在[0,1]這個range里。如果不加這個限制,在一些異常數據點上,或者出現梯度爆炸問題的時候,可能有一些輸出值特別大
    比如超過了計算機的數值范圍,導致結果是nan。這種情況蠻常見的,不一定是程序寫錯。有可能就是剃度爆炸了。所以一般最后還是加上sigmoid再傳入loss函數了

    匯報:

    Trust部分對MLP改進:
    1 * 128、2 * 128、3 * 128使用一層,未使用激活函數未使用dropout。
    4 * 128、5 * 128使用兩層,中間層激活函數使用Relu,為防止過擬合設置keep_prob=0.75。最后一層未使用激活函數未使用dropout。

    結論:
    性能只有了短暫的提升,很奇怪

    所以說,現在的問題是信任預測這個任務采用目前的方式得不到很好的效果。對推薦任務沒有起到很好的輔助效果。

    接下來我也不知道該從那個部分對信任任務進行改進了。。。

    老師回復:
    最早做的那個版本,是不是NCF,然后信任部分不是用路徑而是類似NCF做法?
    就是推薦部分和信任部分其實都是NCF?
    cici:
    是的,推薦部分和信任部分都是NCF
    老師:
    剛才你匯報的路徑29979條,不好說這個數據量夠不夠。但是只分布在500多個用戶,確實有些問題。
    我想現在你試試用SAMN當推薦部分,信任部分用之前寫的NCF版的信任邊預測。這樣的結果看看如何。
    以路徑建模寫代碼會比較麻煩,再嘗試更復雜的路徑方法前。先拿之前的部分代碼和現在的合起來看看效果,會比較容易點
    cici:
    可以的,那我這樣試一試。


    20191012

    匯報:



    老師:

    我看了兩個結果??偨Y來說,兩個任務一起學習的話,信任部分是越來越差的。但是如果單獨學習信任部分,NCF的架構又是能看到recall逐漸變好
    我覺得 兩個任務間共享參數的方法 以及multi-task優化的方法。這兩塊我明天想想一些方法試一下,看看能不能實現trust在多任務學習的時候也有提升
    現在這個模型設計,應該只有直接共享最底層item embedding這做了共享。挺粗糙的

    cici:
    對,只有直接共享user embedding。
    https://blog.csdn.net/weixin_37913042/article/details/102498802 我也看了一些文章,然后,然后好像也不是很清楚該怎么改進

    老師:
    我們其實是這里的硬共享。比較初期,在上面的layer那沒有共享學習,所以有問題也還說得過去。我想一下上面層如何共享.
    我把下一步的想法,發郵件給你了
    修改模型的時候要哪里不清楚,直接問我
    以后發實驗結果也可以用郵件附件發給我,微信經常查看以前的word文件就失效打不開了

    cici:
    嗯!好的!


    20191012

    cici:

    “ 注意這個shared layer的參數是共享的,即它定義的embedding size就是用戶的總數 ” 這里“embedding size就是用戶的總數”沒太理解.
    還有一個問題是這個共享操作,只能在向量輸入MLP之前做,因為輸入到MLP的向量是user和item的concate(推薦)、user1和user2的concate(信任),所以沒有你說的第三點,將共享操作分享到第二層、第三層等等。

    老師:
    embedding size不是指的dimension。那句話的意思就是要是在左邊和右邊的用戶如果是同一個id即同一個用戶,那么傳到share 層的時候這兩個embedding要乘以同一個權重,加上同一個bias
    第二個問題,就只做一次共享操作先試試好了

    cici:
    好的,我清楚了!


    20191015

    cici:
    老師,我把結果發你郵箱啦!


    20191016

    老師:
    我看文檔看不出問題。你告訴我代碼在服務器上的路徑,我今天下課看一下
    cici:
    /home/lyli/MNCF/MNCF3.py
    老師:
    明天白天你看看51行這是不是應該是input_dim=num_users?這兩部分share的是user吧
    現在已經很晚了,不需要急著看
    cici:
    嗯,對的 應該是user,
    老師:
    我明早再看看其他部分
    cici:
    好的,真是麻煩老師了


    20191017

    cici:
    老師,單把那里改正確的話,還是有問題。主要是,X操作采用元素相乘就沒問題,池化操作和cancate就有問題,理論上來說不應該這樣。
    老師:
    我今早寫了個版本,急著上課沒法給你
    這個用concate操作結果救市政策的那種

    這個用concate操作結果就是正常的那種
    但是我為了找出問題,把模型簡化掉了。ncf里的矩陣分解部分刪掉了
    我不經常用keras寫代碼。我看你的實現,可能的問題是共享層那里用的是Embedding
    應該要用Dense才對吧。然后我這個文件里的52行的Dense創建的Shared_User_Layer,在rec和trust部分同時被調用
    當然這樣把MF刪掉了,性能應該變差了。你可以試試再把MF部分加上去會怎么樣

    cici:

    老師:
    你說的有道理,我查了keras的dense,不帶embedding功能。用keras實現共享功能,得自己定義共享參數為embedding
    我再看看其他部分有沒問題
    cici:
    我用keras主要是原作者用了keras,我怕我用tensorflow重寫一遍的話,有些地方可能會寫錯,就直接在上面接著改了!
    老師:
    沒關系,這個基于NCF的版本只是拿來測試下想法,最后的模型應該會擺脫NCF。到時候再考慮要不要用別的寫也來得及
    cici:
    好的

    20191105

    cici:
    我之前遇到
    RuntimeError: [enforce fail at CPUAllocator.cpp:64] . DefaultCPUAllocator: can’t allocate memory: you tried to allocate 15851784844900 bytes. Error code 12 (Cannot allocate memory)
    這個問題
    然后我就百度pytorch如何使用GPU
    然后我就在代碼里加了CUDA,把模型放到GPU上運算

    device = torch.device("cuda:3") model = model.to(device)

    然后就出現了這個問題:RuntimeError: CUDA out of memory. Tried to allocate 14763.13 GiB (GPU 3; 10.73 GiB total capacity; 165.28 MiB already allocated; 9.61 GiB free; 10.72 MiB cached)
    然后我覺得GPU上內存應該是能滿足一般需求了的吧是我的model太大的原因嗎???
    之前一個可以運行的demo是160,686個link,這個有899,322個link Ls:

    老師:
    根據提示是方法寫的不對,要加載1TB的數據到GPU:Tried to allocate 14763.13 GiB
    你看下數據切割有沒問題,一般會把train數據分batch訓練,每個batch的數據加載到GPU上
    https://zhuanlan.zhihu.com/p/30934236
    每次只把這個data.to(device)

    cici:
    好,我改改方法!

    20191109

    cici:
    老師我將最近的結果發您郵箱啦!

    總結

    以上是生活随笔為你收集整理的我与导师的聊天记录的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。