fast.ai Lesson 7. Collaborative filtering 參考筆記

這是課程官方論壇中,一位 Daniel 學長的筆記,資料來源放最下方。

前面的數字,是影片播放的秒數,後面文字是他的筆記(或是 YouTube 自動產生的逐字稿)。

圖檔的部分,還沒複製過來(因為目前只是英翻中後 copy/paste),之後如果有機會再慢慢補上。


00:00 我們在先前的講座中探索了最簡單的具有完全連接的線性層的神經網路。在本次講座中,我們將專注於調整第一層和最後一層,在接下來的幾週內,我們將專注於調整神經網路的中間部分。

01:04 回顧筆記本Road to Top 第 2 部分 ,恭喜 fastai 學生名列第一和第二,擊敗 Jeremy

02:47 使用更大的模型有什麼好處?較大的模型有哪些問題?(耗盡 GPU 內存,因為 GPU 不像 CPU 那麼聰明,會想辦法釋放自己;所以大型模型需要非常昂貴的 GPU)當 GPU 內存不足時我們該怎麼辦?首先,重新啟動筆記本;然後 Jeremy 即將向我們展示一個技巧,使我們能夠在 Kaggle 上訓練超大型模型,哇!

04:39 Kaggle GPU 有多大?有時您是否必須在 Kaggle 上運行筆記本以進行程式碼競賽?為什麼使用 Kaggle Notebook 贏得排行榜是好的、公平的?

05:58 Jeremy 如何使用 24G GPU 來了解 16G GPU 可以做什麼?Jeremy 如何確定模型將使用多少 GPU 記憶體?Jeremy 如何選擇最小的圖像子組作為訓練集?訓練模型時間越長會佔用更多記憶體嗎?(否)因此,最小訓練集 + 1 epoch 訓練可以快速告訴我們模型需要多少記憶體。

07:08 然後,傑里米訓練了不同的模型,看看他們消耗了多少記憶。convnext-small 模型需要多少記憶體?Jeremy 使用哪行程式碼找出模型使用的 GPU 記憶體?Jeremy 使用哪兩行程式碼來釋放不必要佔用的 GPU 內存,以便不需要重新啟動核心來運行下一個模型?

import gc
def report_gpu():
    print(torch.cuda.list_gpu_processes())
    gc.collect()
    torch.cuda.empty_cache()

08:04 如果模型導致cuda記憶體不足崩潰問題怎麼辦?什麼是梯度累積?什麼是整數除法?( // )。

def train(arch, size, item=Resize(480, method='squish'), accum=1, finetune=True, epochs=12):
    dls = ImageDataLoaders.from_folder(trn_path, valid_pct=0.2, item_tfms=item,
        batch_tfms=aug_transforms(size=size, min_scale=0.75), bs=64//accum)
    cbs = GradientAccumulation(64) if accum else []
    learn = vision_learner(dls, arch, metrics=error_rate, cbs=cbs).to_fp16()
    if finetune:
        learn.fine_tune(epochs, 0.01)
        return learn.tta(dl=dls.test_dl(tst_files))
    else:
        learn.unfreeze()
        learn.fit_one_cycle(epochs, 0.01)

使用較小的批量大小會出現什麼問題?(batch size越小,學習率和權重的波動性越大)如何才能讓模型在較小的batch size中訓練得像在大batch size中一樣?如何在程式碼中解釋GradientAccumulation?

圖片

12:54 使用 GradientAccumulation 有何意義?使用和不使用 GradientAccumulation 的數值結果有多大差異?造成差異的主要原因是什麼?

15:15 更多問題:應該是count >= 64 上面程式碼中做GradientAccumulation的時候;lr_find 使用 DataLoader 中的批次大小;

15:55 為什麼不直接使用較小的批次大小而不是 GradientAccumulation?選擇批量大小的經驗法則是什麼?根據批量大小調整學習率怎麼樣?

18:00 Jeremy 如何使用 GradientAccumulation 來找出accum 在 Kaggle 的 16G GPU 上運行這些大型模型需要多少個?(accum=1 總是記憶體不足,但accum=2 適用於所有大型模型)。

圖片

19:54 Jeremy 如何將所有模型及其設定放在一起以便以後進行實驗?現在是否必須使用模型規格的尺寸,以後又如何?

圖片

20:52 如何在不耗盡記憶體的情況下運行所有規格的模型

圖片

22:07 為什麼傑瑞米在訓練中不使用seed=42 這裡?效果如何?

22:55 什麼是不同好的深度學習架構的整合或裝袋?為什麼它有用?

23:37 如何整合不同的深度學習模型?

圖片

24:15 為什麼我們要每天改進並提交給Kaggle?提交歷史記錄如何幫助追蹤您的模型開發和改進?

25:53 更多問題:什麼是 k 折交叉驗證以及如何在這種情況下應用它?為什麼傑里米不使用它?

28:03 GradientAccumulation 有什麼缺點嗎?有GPU推薦嗎?

30:55 在第 2 部分中,傑里米可能會介紹如何訓練較小的模型,使其在大型模型中表現良好,以實現更快的推理

31:37 多目標模型:如何建立一個具有兩個標籤的資料載入器,疾病類型和品種類型?資料加載器是什麼樣子的show_batch ?什麼是DataBlock ?如何DataBlock 使用所有必要的參數來建立雙標籤預測模型的資料載入器?該函數如何get_variety 給出各種類型的稻米圖像?

35:44 如何設定資料拆分以及項目和批次轉換?

圖片

37:51 如何建立一個模型來預測疾病和品種類型?我們能否透過預測 20 件事(10 個疾病,10 個品種)來預測疾病和品種?

38:34 新模型(和新資料載入器)現在需要什麼來預測疾病?

圖片

何時以及如何提供我們自己的損失函數?fastai 可以偵測您的 datalaoders 的適當損失,並在簡單情況下預設使用它。在這種特殊情況下,我們如何為新模型建立和使用自訂損失?

41:24 到底是F.cross_entropy 做什麼的?這個函數屬於第一層和最後一層,所以我們必須理解它們。預測 5 件事的模型的原始輸出是多少?

圖片

softmax的公式是什麼以及如何在電子表格中計算它?

圖片

44:41 softmax 的問題是什麼?當給熊分類器提供貓圖像時,它是如何做出明顯的錯誤預測的?

45:43 對於上面的softmax問題我們能做什麼呢?(所有預測機率加起來不等於 1)。什麼時候使用softmax,什麼時候不使用?

46:15 cross_entropy 損失公式的第一部分是什麼?

圖片

47:03 如何從softmax計算交叉熵?

圖片

49:53 如何計算二元交叉熵?如何理解它的預測是貓還是非貓圖像的公式?如何最終得到一批5張影像的二值交叉熵損失?

圖片

52:19 pytorch 中交叉熵的兩個版本是?以及何時使用每個版本?我們這裡使用哪個版本?

圖片

53:31 由於資料載入器有兩個目標,我們的新模型需要了解損失函數、指標和輸出大小到底是什麼?

圖片

54:24 如何建立一個學習器來預測兩個目標或 20 個項目?學習者如何使用疾病和品種損失來知道哪 10 個項目是疾病預測,哪 10 個項目是品種預測?如何將兩個損失函數組合在一起?如何理解綜合損失?

圖片

57:01 如何計算病害類型和品種類型的錯誤率?如何在訓練時將它們組合在一起並展示?

圖片

57:22 如何製作新學習者以及如何訓練?為什麼多工模型沒有改進,甚至比之前的模型還差一點?為什麼延長多任務模型的訓練時間可以提高疾病預測的準確性?為什麼一起預測第二件事可以幫助改善第一件事的預測?Jeremy 之前參加的 Kaggle 魚類預測比賽中,使用多任務模型確實提高了結果。建構多任務模型的原因或好處是什麼?

圖片

1:00:25 如何讓多工建模不再讓您感到困惑?(從頭開始為泰坦尼克號資料集建立多任務;探索和實驗此筆記本)

1:01:26 哪裡可以了解更多交叉熵帖子 作者:Chris Said 關於二元交叉熵?

1:02:00 協作過濾深入研究 chp 8,無需更改。使用的數據集是什麼?我們正在使用哪個版本的資料?如何使用 pandas 讀取 tsv 檔案?如何閱讀/理解資料集內容/列?推薦系​​統產業和Radek。Jeremy 喜歡如何查看數據?(交叉列表)為什麼 Jeremy 談論他查看數據的首選方式的圖像中空數據或缺失數據如此之少?

圖片

1:05:30 如何填入交叉表資料集中的缺失資料或空白?如何判斷新用戶是否喜歡他/她以前沒有看過的特定電影?我們能弄清楚我們在這裡談論的特定電影是什麼類型/類型嗎?電影的類型機率是什麼樣的?使用者的偏好機率是什麼樣的?如果我們將兩組機率進行匹配,我們可以知道用戶對這部電影的喜歡程度嗎?我們如何計算呢?

圖片

1:08:09 到目前為止一切順利,透過在用戶偏好機率和電影類型機率之間進行點積來找出新用戶對電影的評分的方法存在什麼問題?(我們都不知道這兩個機率)。我們該如何處理這個問題呢?我們可以在不知道類型的情況下創建這樣的電影類型機率嗎?

1:08:55 潛在因素是什麼?如果我對電影一無所知,我們可以使用SGD(隨機梯度下降)來找到它們嗎?我們能否創造一個隨機的 5 個數字作為電影的 5 個潛在因素來描述電影的類型,然後再找出它們?我們是否也可以為每個用戶創建潛在因素?現在如何計算使用者喜歡某部電影的機率?(兩組潛在因子之間的乘積或點積)。

圖片

1:11:28 現在,mmult 或點積可以為我們提供用戶對電影的喜愛程度的預測,因此我們可以將預測與真實標籤進行比較。當標籤或資料缺失時怎麼辦?(我們將預測設為空或為零)。我們可以使用 SGD 透過使用損失函數將預測與標籤進行比較來改進潛在因子嗎?如何使用Excel求解器使用SGD和損失來更新潛在因子?

圖片

1:13:16 為什麼即使資料集很小,Excel 的計算梯度也這麼慢?協同過濾的基礎是什麼?(如果我們知道A喜歡(a,b,c)並且B喜歡(a,b,c),那麼如果A喜歡(d,e),也許B也喜歡(d,e))。

1:15:22 兩個向量之間的角度的餘弦與點積相同嗎?

1:16:07 我們如何在 pytorch 中執行上述操作,因為它們的資料格式與 excel 不同?資料集在 pytorch 中是什麼樣子?

圖片

1:18:37 什麼是嵌入?什麼是嵌入矩陣、使用者嵌入和電影嵌入?(嵌入=在陣列中尋找某些內容)。某個領域創造的詞彙越令人生畏,這個領域實際上就越不令人生畏。

圖片

1:20:05 在建立資料載入器之前,我們的資料集是什麼樣子的?如何使用建立用於協同過濾的資料載入器CollabDataloaders.from_df ?它是什麼show_batch 樣子的?我們如何創造用戶和電影的潛在因素呢?

圖片

1:22:18 fastai 中如何選擇潛在因子的數量?

1:23:17 如何理解在 Excel 中尋找潛在因子和使用 one-hot 嵌入進行點積實際上是同一件事?我們是否可以將嵌入視為一種將某些內容乘以單熱編碼向量的計算快捷方式?我們是否可以將嵌入視為一種以虛擬變數加速矩陣乘法的數學技巧(無需建立虛擬變數或單熱編碼向量)。

圖片

1:27:13 如何從頭開始建立協同過濾模型?我們如何創建一個類別?(因為模型是一個類別)。我們如何透過 來初始化一個類別物件__init__ ?是否__init__ 告訴我們要提供哪些參數才能建立類別實例?類別函數是怎麼say 做的?什麼是超類別?創建類別時我們把它放在哪裡?它為我們帶來了什麼?pytorch和fastai創建類別時使用的超類別(模組)是什麼?班級是什麼DotProduct 樣的?

圖片

1:29:57 如何理解類別forward 中的函數DotProduct ?是什麼.sum(dim=1) 意思?(每行求和)。

圖片

1:31:39 如何創建協作學習器並開始訓練?即使在 CPU 上訓練也非常快。

圖片

1:32:47 為什麼上面這個合作模型不太好?(給予評分的人都是熱愛電影的人,他們給1分的情況並不罕見,而且很多都是高分。而預測中5分以上的情況很多)。查看 sigmoid 的用法。我們如何對預測進行 sigmoid 變換?這個 sigmoid 是如何運作的?為什麼我們要使用範圍的上限5.5 而不是5 ?添加 sigmoid 總是能改善結果嗎?

圖片

1:34:29 Jeremy 從資料集中觀察到哪些有趣的事?(有些用戶喜歡對所有電影給予高評價,有些則傾向於不喜歡所有電影)。我們能否為使用者和電影潛在因素添加一個偏差值來解釋這個有趣的觀察?如何使用協作模型中的偏差因子?

圖片

1:38:33 為什麼有偏差的升級模型變得更糟?(過度擬合)。

圖片

1:39:06 什麼是體重衰減以及它有什麼幫助?如何理解解決過擬合問題的權重衰減?

圖片

1:41:35 如何在 fastai 程式碼中實際使用權重衰減?fastai 是否有像 CV 這樣的協同過濾的良好預設?Jeremy 建議如何為wd 您自己的資料集找到合適的值?

圖片

1:43:47 什麼是正規化?當權重值較高或較低時會出現什麼問題?體重衰減如何幫助平衡?

1:44:38 更多問題:除了 Jeremy 關於潛在因素數量的經驗法則以及平均評級推薦之外的任何其他規則僅在存在許多元數據時才可行。


資料來源: