Day 089:請問要撰寫自訂的loss function要從什麼地方開始起步比較好?
> 請參考範例程式碼Day089_CustomizedLoss.ipynb,請自行定義一個 loss function, 為 0.3 * focal loss + 0.7 cross-entropy,訓練並比較結果 (請讓比例為可以隨意調控,而非寫死) Day 089的作業是要自己製作一個組合loss function,但是範例的focal loss其實沒有看懂,也不知道該如何解讀起,課程講義也沒有相關說明,請問是否有推薦的、關於自己組合loss function的文章可以讀,或是有什麼好的切入點可以學習的呢? ```python def focal_loss(gamma=2., alpha=4.): gamma = float(gamma) alpha = float(alpha) def focal_loss_fixed(y_true, y_pred): """Focal loss for multi-classification FL(p_t)=-alpha(1-p_t)^{gamma}ln(p_t) """ epsilon = 1e-8 y_true = tf.convert_to_tensor(y_true, tf.float32) y_pred = tf.convert_to_tensor(y_pred, tf.float32) model_out = tf.add(y_pred, epsilon) ce = tf.multiply(y_true, -tf.math.log(model_out)) weight = tf.multiply(y_true, tf.pow(tf.subtract(1., model_out), gamma)) fl = tf.multiply(alpha, tf.multiply(weight, ce)) reduced_fl = tf.reduce_max(fl, axis=1) return tf.reduce_mean(reduced_fl) return focal_loss_fixed ```
回答列表
-
2020/12/02 下午 02:09張維元 (WeiYuan)贊同數:1不贊同數:0留言數:0
嗨,你好
你可以搜尋看看「Keras 自定義 loss」這樣的關鍵字找找看。我剛剛看到這一篇覺得還蠻入門的,你可以先讀讀看。
嗨,你好,我是維元,持續在不同的平台發表對 #資料科學、 #網頁開發 或 #軟體職涯 相關的文章。如果對於內文有疑問都歡迎與我們進一步的交流,都可以追蹤我的 Facebook 或 技術部落格 ,也會不定時的舉辦分享活動,一起來玩玩吧 ヽ(●´∀`●)ノ
-
2020/12/02 下午 10:03Felix Pei贊同數:1不贊同數:0留言數:0
同學你可以參考以下文章看看 [人工智慧中的19 種損失函數......](https://kknews.cc/zh-tw/tech/vlnp6z2.html) [Keras自定義Loss函數](https://blog.csdn.net/A_a_ron/article/details/79050204) - 另外該篇的重要知識點複習中提到的Loss function的3個要素你可以搭配上面的程式碼說明區塊一起看可能會比較清楚。 最後,關於D89的內容,我們會再與專家討論看看怎麼調整學習效果會比較好。
-
2020/12/02 下午 10:19Noah贊同數:3不贊同數:0留言數:0
hi:
loss function有很多種設計方式,基本上端看你自己的“想法”而決定.前面經有專家貼出有哪些loss fumction,以及如何實作的例子,我這邊就另外補充一些概念
在如何決定loss function之前,要先知道,目前主流optimizer基本上都屬於梯度下降法的變形,意思就是說,loss function的設計是用來讓optimizer越修正越小用的.
知道loss function是設計來讓loss越來越小的重點後:
* 先看最基本的MSE, loss = error^2,誤差的平方,自然我們希望誤差越小越好
* 你例子中提到的cross entrpy loss,- ( gt*log(y) + (1-gt)*log(1-y) ), gt為ground true, y為模型output,當gt = 0 時,y越接近0 loss則越小,當gt=1時,y越接近1 loss越小
* 回到你提的focal loss,當初原作者其設計目的是,一個object detection,大部分的位置都是沒有目標的,僅有少數位置有目標,所以只要模型大部分猜沒有目標,loss其實也能一定程度變小,為了阻止模型往這方向發展,所以focal loss多了幾個變數,讓你調整negtive sample(沒目標) 與positive sample(有目標)的權重.有目標時的權重大點;沒目標時的權重小點,此時focal loss為了能讓loss多下降點,就會多修正有目標時的樣本,才好讓loss更下去
上面提到了一個重點“權重”,通常調整loss function的權重還有幾種場合:
* multi-class時,偏偏你手上的資料對某一個class少了一些,所以模型即使沒猜中某個class,loss影響也不會太大時,你可以把某個class的loss權重調大,讓模型答錯也有一些痛,就比較可能會去修正某class
* 現今很多模型都多種輸出種類,例如object detection 需要的輸出有 1. confident (判斷有無目標) 2. box size的regression 3. class (該目標的分類) ,一個object detection至少有三種輸出,就變成loss = confident loss + regression loss + class loss,其實你也可以根據實際情況去調整各個loss的權重,或者你有特殊需求假設這個object detection你還想做embedding(隨便舉例),就變成loss = confident loss + regression loss + class loss + embedding loss,權重也可以任意條,例如說你覺得regression的loss太大,confident loss太小,導致模型傾向收斂regreesion而非confident時,你可以把regression loss權重調小或調大confident loss權重
* multi-scale output,有些模型設計多個resolution輸出,再舉例object detection中的yolov3,yolov3有三種resolution的輸出,resolution低的針對大目標,resolution高的針對小目標,所以loss = small_resolution loss + med_resolution loss + high_resolution loss,其中resolution低的可能會遺失很多小目標,導致loss較高,但loss較高又怕權重更新太多而不穩定,你可以把 small_resolution loss的權重調低,讓它允許一些失誤,好讓loss能降下來不會讓其他大小收斂不穩定之類
與其手調loss權重,有些演算法也可以幫你計算比例,取得各個loss相對應的權重值,這又是另一回事了