类神经网络训练不起来怎么办,局部最小值 与 鞍点, batch, momentum, Adaptive Learning Rate,调损失函数。 李宏毅2022

 每个作业通关攻略

如果不满意kaggle上的结果:

 先檢查你的training data loss、看看你的model在training data上面有沒有學起來


 

 

which one?判断方法:

透過比較不同的模型、來得知說、你的model現在到底夠不夠大
 e.g. residual network(2015)paper,測2個networks,一个20层、一个56层,

橫軸指的是training的過程、

那個時候大家對Deep Learning有各種奇怪的誤解,很多人看到這張圖都會說、這個代表overfitting、告訴你deep learning不work、56層太深了 、根本就不需要那麼深。那個時候大家也不是每個人都覺得 deep learning是好的、那時候還有很多 對deep learning的質疑、所以看到這個實驗有人就會說、深沒有比較好、所以這個叫做overfitting

BUT,這個不是overfitting、並不是所有的結果不好、都叫做overfitting、你要檢查一下訓練資料上面的Loss

观察如右图,這代表56層的network 的optimization沒有做好

你可能会問、为什么不是model basis
比較56層跟20層、20層的loss都已經可以做到這樣了、56層的彈性一定比20層更大
如果今天56層的network要做到 20層的network可以做到的事情、對它來說是輕而易舉的、它只要前20層的參數、跟這個20層的network一樣、剩下36層就什麼事都不做

overfitting:簡單定義是訓練表現好,實戰不給力 , 現在畫面上是實戰跟訓練都不行

模型越深,能够拟合的函数越多,表达能力更强。


判断你的optimization有沒有做好,建议:

看到一個你從來沒有做過的問題,可以先跑一些比較小 比較淺的network、或甚至用一些不是deep learning的方法、比如說 linear model、比如說support vector machine

有一些方法比如說support vector machine、它們可能是比較容易做Optimize的、比較不會有optimization失敗的問題、也就是這些model它會竭盡全力的、在它們的能力範圍之內、找出一組最好的參數、它們比較不會有失敗的問題
所以你可以先train一些比較淺的model、或者是一些比較簡單的model、先有個概念 這些簡單的model、到底可以得到什麼樣的loss

接下來才train一個深的model、如果你發現你深的model跟淺的model比起來、深的model明明彈性比較大、但loss卻沒有辦法 比淺的model壓得更低、那就代表說你的optimization有問題、你的gradient descent不給力、那你要有一些其它的方法、來把optimization這件事情做得更好


那如果optimization做得不好的話 、要怎麼辦

2021 - 类神经网络训练不起来怎么办(一) 局部最小值 (local minima) 与鞍点 (saddle point)_哔哩哔哩_bilibili

但有時候你甚至會發現說、一開始你的model就train不起來、不管怎麼update參數、loss通通都掉不下去、那這個時候到底發生了什麼事情呢
過去常見的一個猜想、是因為我們現在走到了一個地方、這個地方參數對loss的微分為零、此时gradient descent就沒有辦法、再update參數了、這個時候training就停下來了
 
gradient为0,可能是local minima,也可能是saddle point(不是local minima、也不是local maxima)
gradient=0的点  统称为critical point


今天 当我们发现卡在critical point时,判断 到底是local minima 还是saddle point?

如果是saddle point,则可以逃离,loss还有可能降低

---->loss func.的形状,L(θ)完整的樣子寫不出來、但是它在θ'附近、可以用Tayler Series Appoximation來表示它、

 

 意思就是沿着 λ<0的特征向量的方向走,损失会变小

实际应用时,几乎不会把Hessian算出来,二次微分,运算量非常非常大,

其他逃离saddle point的方法,

local minima 和saddle point哪个比较常见?

“這個從三維的空間來看沒有路可以走、但在高維的空間中也许是有路可以走的”

那如果維度越高、是不是可以走的路就越多了呢、所以 今天我們在訓練 一個network的時候、參數往往動輒百萬千萬以上、所以我們的error surface其實是在一個非常高的維度中、既然維度這麼高、會不會其實根本就有非常多的路可以走呢、會不會其實local minima根本就很少呢

而經驗上、如果你自己做一些實驗的話、也支持這個假說

這邊的每一個點都代表一個network、然後把它訓練到卡在critical point、把那組參數拿出來分析、看看它比較像是saddle point還是local minima

那在實作上你會發現說、你幾乎找不到完全所有eigen value、都是正的critical point

這邊這個例子裡、這個minimum ratio代表eigen value的數目分之正的eigen value的數目、最大也不過0.5到0.6間而已、代表說只有一半的eigen value是正的、還有一半的eigen value是負的、“还有一半的路可走”

small gradient的解决方法?

overfitting

假設我們輸入的feature叫做x、我們輸出的label叫做y、那x跟y都是一維的、x跟y之間的關係、是這個二次的曲線(not observable)、我們真正可以觀察到的、是我們的訓練資料、 你可以想像成  就是從這條曲線上面、隨機sample出來的幾個點
今天的模型 它的能力非常的強、它的flexibility很大、它的這個曲線會通過這三個點、但是其它 沒有訓練資料做為限制的地方、它就會有freestyle
這個時候、如果你再丟進你的testing data、你的testing data 和training的data、當然不會一模一樣、
導致訓練資料上的結果好、但是測試資料上的loss很大

overfitting,解决方法:

1. 增加资料

2. data augmentation、這個方法並不算是使用了額外的資料

你用一些你對於這個問題的理解、自己創造出新的資料

舉例來說在做影像辨識的時候、非常常做的一個招式是、假設你的訓練資料裡面有某一張圖片、把它左右翻轉、或者是把它其中一塊截出來放大等等、你做左右翻轉 你的資料就變成兩倍、那這個就是data augmentation
但是你要注意一下data augmentation 不能夠隨便亂做、這個data augmentation、這個augment 要augment得有道理。
舉例來說在影像辨識裡面、你就很少看到有人把影像上下顛倒 當作augmentation、它可能就會學到奇怪的東西

所以data augmentation、要根據你對資料的特性、對你現在要處理的問題的理解、來選擇合適的data augmentation的方式
 
3. 不要让模型有那么大的弹性,给他一些限制

你要給你的model一些限制,最好你的model正好跟背後產生資料的過程是一樣的,那你就有機會得到好的結果.

 有哪些方法可以给model制造限制:

比如 给他比较少的参数;如果是deep learning,就給它比較少的神經元的數目、本來每層一千個神經元、改成一百個神經元之類的
或者是你可以讓model共用參數、你可以讓一些參數有一樣的數值、那這個之後在講CNN的時候會講到,我們之前講的network的架構 叫做fully-connected network、其實是一個比較有彈性的架構

而CNN是一個比較有限制的架構、它厲害的地方就是、它是針對影像的特性、來限制模型的彈性
所以你今天fully-connected的network、可以找出來的function所形成的集合 其實是比較大的、CNN這個model所找出來的function、它形成的集合其實是比較小的、其實包含在fully-connected的network裡面的。但是就是因為CNN給了 比較大的限制、所以CNN在影像上、反而會做得比較好
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在神经网络中,损失函数随着迭代反而上升可能是由于训练数据集过小或者模型过于复杂造成的。当训练数据集过小时,模型可能会过拟合训练数据集,导致损失函数在验证集上升。当模型过于复杂时,也可能会导致过拟合,从而导致损失函数在验证集上升。另外,如果学习率过大,也可能会导致损失函数在迭代过程中上升。 可以通过减少模型复杂度、扩大训练数据集或者整学习率来解决损失函数在迭代过程中上升的问题。 ### 回答2: 在神经网络中,损失函数是用来评估模型在训练集上的预测结果与真实标签之间的差异程度的指标。通常情况下,随着迭代的进行,损失函数应该逐渐减小,表示模型的预测能力逐渐改善。然而,有时候损失函数会在迭代过程中反而上升,这可能是由以下几个原因导致的。 首先,学习率过大可能导致损失函数上升。学习率决定了每一次迭代中参数更新的幅度。如果学习率设置过大,参数更新可能会跳过了最优解附近的小尺度波动,导致无法进行有效地收敛,损失函数会随着迭代而上升。 其次,模型的参数初始有可能不合适。初始参数的选择可能决定了优化的初始位置,如果初始位置选择不佳,比如在局部最优解或点附近,模型可能会进入一个不良的状态,此时损失函数可能会上升。 另外,训练数据集的噪声或异常也可能导致损失函数上升。如果训练数据集中存在噪声或异常,模型可能会过度依赖这些数据,并不断适应这些不正常的数据导致损失函数上升。 最后,模型复杂度过高也可能导致损失函数上升。过于复杂的模型往往具有较高的方差,可能出现过拟合的情况。过拟合会导致模型在训练集上的性能优于在测试集上的性能,损失函数可能在训练集上继续下降但在测试集上上升。 综上所述,损失函数神经网络中反而上升的原因可能与学习率设置、参数初始训练数据质量以及模型复杂度等因素有关。对于这种情况,可以采取整学习率、改进参数初始化策略、处理训练数据中的噪声和异常以及减少模型复杂度等方法来解决。 ### 回答3: 在神经网络中,损失函数的上升可能是由于以下原因造成的: 1. 初始权重选择不当:神经网络在开始训练时,需要对权重进行初始化。如果初始权重选择不当,可能导致网络无法收敛,从而引起损失函数的上升。 2. 学习率设置不当:学习率决定了每次迭代中更新权重的幅度。如果学习率过大,可能导致权重更新过于剧烈,错过损失函数的最小,进而导致损失函数的上升。 3. 过拟合:神经网络训练过程中过度拟合了训练数据,导致其在未见过的数据上表现不佳。过拟合可能导致损失函数训练过程中出现反常的上升。 4. 数据集质量问题:数据集中存在噪声、异常或缺失等问题,导致训练出的模型无法有效地拟合数据,从而引起损失函数的上升。 5. 神经网络结构选择不当:神经网络具有不同的结构和超参数选择。如果选择的网络结构不适合解决当前问题,或者网络超参数设置不合理,都有可能导致损失函数训练过程中上升。 为解决损失函数上升的问题,可以尝试以下方法: 1. 整学习率:逐渐减小学习率,以便更精细地搜索损失函数的最小。 2. 扩充或清洗数据集:通过增加更多的样本数据或对数据进行清洗,减少噪声和异常的影响。 3. 正则化:使用正则化方法(如L1、L2正则化)约束模型,防止过拟合。 4. 使用更适合的网络结构:根据问题的特性选择合适的网络结构,以增加模型的拟合能力。 5. 提前停止训练:当损失函数在验证集上开始上升时,可以提前停止训练,防止过拟合。 综上所述,“损失函数随着迭代反而上升”可能是由于初始权重、学习率、过拟合、数据集质量、网络结构等因素导致的,需要根据具体情况采取适当的整措施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值