20191215周學習總結

  • 2019 年 12 月 18 日
  • 筆記

最近會打算每周總結一下學習的內容,主要內容可能是看過的書的一些學習筆記、論文閱讀、學習的知識點以及推薦一些文章。

這周的學習包括:

  • 推薦系統的知識點整理
  • 機器學習的技巧學習
  • linux下兩台機器的ssh免密登陸方式
  • 書籍閱讀
  • 效率方法

推薦系統

因為工作方向的原因,從九月份開始工作內容從圖像轉到了推薦系統,不過推薦系統的內容其實是非常的多,目前也還是在學習,然後也簡單做了一個推薦系統知識體系的思維導圖,算是作為學習的一個指導方向,會陸續完善這個知識體系:

主要是參考這兩本書和極客時間的一門課程:

  • 《推薦系統實踐》
  • 《推薦系統開發實戰》
  • 極客時間的《推薦系統三十六式》

推薦看的幾篇文章有:


機器學習

分享下本科生晉陞GM記錄 & Kaggle比賽進階技巧分享中一些不錯的調參技巧

優化器的選擇

一般選擇 Adam,初始學習率是 3e-4,據說這是 Adam 最好的初始學習率;另一個選擇就是 SGD,隨即梯度下降,這個速度會更快,但如何選擇學習率就考驗調參功力了

學習率策略

如何選擇一個合適的學習率策略,即學習率下降的頻率和幅度的選擇,這個主要影響的當然就是梯度下降是否可以到達全局最小值,而不是陷入局部最小值了。作者推薦的三種策略:

  • ReduceLROnPlateau,patience=4(5),gamma=0.1,這是我常用的一套組合,並不是最好的;
  • StepLR,個人比較喜歡用這個,自己設定好在哪個epoch進行學習率的衰減,個人比較喜歡用的衰減步驟是[5e-4(3e-4), 1e-4, 1e-5, 1e-6],至於衰減位置,就需要自己有比較好的直覺,或者就是看log調參,對着2.1上訓練的valid loss走勢,valid loss不收斂了,咱就立刻進行衰減;
  • CosineAnnealingLR+Multi cycle,這個相較於前兩個,就不需要太多的調參,可以訓練多個cycle,模型可以找到更多的局部最優,一般推薦min_lr=1e-6,至於每個cycle多少epoch這個就說不準了,不同數據不太一樣。

Finetuning的技巧

微調是指採用一個預訓練模型的初始參數,然後在自己的數據集或者新的網絡模型上訓練得到自己的模型,之所以要使用 finetuning,目的就是更好更快的收斂,並且得到性能更好的模型,由於現在網絡模型越來越大,模型的參數都是幾十萬,上百萬,甚至更多,如何設置初始參數就非常重要,好的初始參數當然就可以縮短訓練時間,並且獲得更佳的性能,而預訓練模型就能達到這個目的–提供不錯的初始參數選擇,當然這裡具體微調的方式,也是有以下四種:

  • 微調方式一,最常用,只替換掉最後一層 fc layer,改成本任務里訓練集的類別數目,然後不做其餘特殊處理,直接開始訓練;
  • 微調方式二,在微調一的基礎上,freeze backbone 的參數,只更新(預訓練)新的fc layer的參數(更新的參數量少,訓練更快)到收斂為止,之後再放開所有層的參數,再一起訓練;
  • 微調方式三,在微調方式二預訓練fc layer之後或者直接就是微調方式一,可選擇接上差分學習率(discriminative learning rates)即更新backbone參數和新fc layer的參數所使用的學習率是不一致的,一般可選擇差異10倍,理由是backbone的參數是基於imagenet訓練的,參數足夠優秀同時泛化性也會更好,所以是希望得到微調即可,不需要太大的變化。
  • optimizer = torch.optim.Adam([{'params': model.backbone.parameters(), 'lr': 3e-5}, {'params': model.fc.parameters(), 'lr': 3e-4}, ])
  • 微調方式四,freeze淺層,訓練深層(如可以不更新resnet前兩個resnet block的參數,只更新其餘的參數,一樣是為了增強泛化,減少過擬合)。

編程開發

了解如何實現兩台機器的 ssh 免密登陸:

  1. 兩台機器之間免密登陸的方法,首先是在兩台機器分別執行 ssh-keygen, 命令出來後,直接按3次回車鍵,第一次就是默認生成的密鑰保存在 ~/.ssh/id_rsa.pub,然後兩次是確認密碼
  2. 接着在兩台機器分別執行命令 ssh-copy-id -I ~/.ssh/id_rsa.pub root@ip,這裡的ip 是另一台機器的ip,這就是將本機生成的ssh公鑰傳到另一台機器,並寫入其 ~/.ssh/authorized_keys 文件中
  3. 執行完後,ssh ip 來試驗登陸機器,查看是否設置成功

另外完成這個設置後,兩台機器之間的文件傳輸也是可以不需要輸入密碼的,也是非常方便了。


閱讀

這周終於是看完《軟技能:代碼之外的生存指南》,我覺得這確實是一本非常值得程序員看看的書,或者說對於之前比較火的一個話題–怎麼做副業,想做副業的也推薦看看這本書,這本書正如書名說的,介紹的代碼之外的技能,整本書分為 7 篇,也是 7 個方面的內容,包括:

  • 職業:對自己職業的規劃、自由職業者的介紹等
  • 自我營銷:提高自己的影響力,打造自己的品牌;
  • 學習:學習方法
  • 生產力:如何提高自己的效率
  • 理財:如何分配每個月的薪水、退休計劃、對房地產的投資
  • 健身:一些健身知識的科普
  • 精神力:如何擁有積極的心態、愛情、積極面對失敗等

效率方法

其實一直都在想着怎麼提高自己的工作學習效率,之前其實也看過一些文章的介紹,方法包括:

  • 設置一個大目標,然後分解成一個個小目標,然後做好月計劃、周計劃,並且做好總結;
  • 番茄工作法,也就是工作學習一段時間,比如30分鐘,然後休息5分鐘,主要就是提高專註了;

這幾個方法都有在使用,不過目前在計劃方面會做得不夠好,每次總結的時候,都會發現這周的計劃似乎太多,導致完成率不到50%,這主要是也是每天的效率有些低。

不過最近,又新學習了一個方法,來自也大(公眾號:也談錢),叫做每天三件事+記錄一件自己開心的事情,主要就是每天只計劃完成 3 件事情即可,數量不多也不會太少,難度也不會太高,每天都能完成也可以保證一個正反饋,提高自己的積極性;

而記錄一件開心的事情也是可以讓自己在遭遇一些挫折困難或者不夠自信的時候,看看自己曾經做過的成功的事情,或者開心的事情,鼓勵自己勇於面對挫折、困難或者是失敗;

一開始可以先定下一個堅持7天的目標,然後堅持完成7天,則可以繼續提高到 14 天,然後再就是一個月,這樣就很快能養成這個習慣,目前我的進展是到了 14 天的這個階段,再堅持 2 天也可以完成堅持 14 天的目標,當然其實這個過程中,也還是有一兩天沒能完全完成 3 件事情,但我感覺並不要緊,記錄下來每件事情的完成程度,或者說原因,明天再繼續今天沒有完成的事情。

當然每天 3 件事情,其實也是需要根據自己的計劃來的,每周的計劃依然還是需要盡量量力而行,需要做好減法,只挑選當前緊急重要的事情或者重要但不緊急的事情。