我与导师的聊天记录
雖然導師遠在馬來西亞,但是每次都是很耐心的回答我的問題,真的是非常感激啦!
我就想記錄下來,自己提出的問題,老師給我的解答,算是我研究生生涯的很大一部分生活了吧!
噢~ 還有就是,這些都是微信聊天記錄呦!!!
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
匯報:
結論:
老師回復:
我想在數據里filter掉長度小于6的信任路徑。只訓練那些長度6的信任路徑,如果某個用戶一條長度6的信任路徑也沒有,那么對他的推薦就退化成SAMN。
可以先統計下,這13957個用戶里,有多少能又長度6的路徑的
就是以某個用戶為起點的路徑,長度有6的,那這個用戶就算有信任路徑。統計下,有多少用戶有信任路徑
cici:
我統計了一下有564個用戶有長度為6信任路徑,有點少
老師:
那看來效果不好跟這個路徑數太少應該有關系。之前你跑實驗的時候,一個用戶最多幾條路徑呢?
這564個用戶有長度為6信任路徑,又一共有幾條?
cici:
為每個用戶均勻采樣50條路徑,其中564個用戶存在長度為6的路徑,一共50*13957=697850條路徑中有29979條路徑是長度為6
20191005
匯報:
結論:
老師回復:
這個想法沒有問題。先試一下推薦訓練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上運算
然后就出現了這個問題: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:
老師我將最近的結果發您郵箱啦!
總結
- 上一篇: Android官方开发文档Trainin
- 下一篇: Android官方开发文档Trainin