1. 程式人生 > 其它 >過擬合、欠擬合問題

過擬合、欠擬合問題

1. SVM分類效果相對於神經網路並不是很差,那它的缺點在哪裡?答:SVM通過kernel匹配模型複雜度,用kernel算起來並不容易,SVM很難做到100萬等大的資料量;但是對於多層感知機等通過梯度下降很容易做到很大的資料量1000萬,一個億或更多等。

在資料量少的時候,幾千個,幾萬個點SVM還可以,但是太大了就不行了。此外,SVM能調節的東西不多,就是一個很平滑的東西;你可以調一下kernel的寬度,或不同的kernel;但是調來調去基本沒什麼效果,SVM的可調性不是很好,或者反過來說,想了解SVM的缺點,

你就想想神經網路的優點是什麼;神經網路本身可以看作一個語言,不同的layer就是裡面的小工具,不同的layer可以連起來;可以是for loop,可以一句一句寫出來;通過神經網路這種語言,我們可以通過其程式設計,來描述對整個物體、世界和對整個要解決問題的理解。神經網路其實是一個比較不那麼直觀的,但是程式設計性比較好的一種框架,可以做很靈活的程式設計,反正自動求導把梯度能求出來就行了。 相對於其他的機器學習模型比如SVM,SVM有很好的數學解釋,但是程式設計性就差了很多。也即SVM可解決的問題就會比神經網路少很多;當然如果

純從分類角度來說SVM確實也不錯,問題不大;除了scale不上去之外,SVM做ImageNet就很難很難,但是神經網路確實可以做到很大的資料集。。另外,神經網路可以通過卷積做比較好的特徵的提取SVM可以簡單的看成說SVM需要做特徵的抽取和SVM本身是個分類器;但

神經網路特徵的提取和分類是放在一起做的,也即一起通過神經網路來表達,可以真正的做原始資料集上的end-to-end的訓練。

2. 模型剪枝和蒸餾Distillation其實不是真的給你做規約,並不是讓你模型精度減少,只是讓你得到一個比較小的模型,以方便部署(模型輕量化)。validation dataset可以用來調超引數,但是testing data 則是用一次就沒了,泛化誤差在testing dataset上測得的。

3. 比如可以選擇30%作為測試資料,70%的資料作為訓練資料;在70%的資料裡面做一個5折的交叉驗證,也即每一次只拿70%資料中的20%作為驗證資料集,然後做5次,這是最常用的。或者:你的資料多的話,你可以訓練和測試資料各取一半,在訓練資料集上還是做K折交叉驗證;或者對ImageNet這種來說,假如有1000類,每個類有5000張,然後對測試資料集/驗證資料集每個類隨機挑50張出來,那就得到1000個類加一起的50000個圖片的驗證資料集,剩下資料集全部作為測試,這也是另外一種做法。另外使用valid dataset來看是否overfitting的。

4. 如果時序的資料,訓練集和驗證集會有自相關性,這時候怎麼處理呢?答:時序序列資料要保證你的測試集是在訓練集之後的,不能在中間站做,中間做肯定是不行的,(網友:把時序資料轉化為監督學習),可以這樣1到100的時序資料集,你用1到90作為訓練,91到100作為驗證這樣的往後推的方法。這是一般的時序序列的做法。

5. 驗證資料集和訓練資料集的資料清洗(e.g. 異常值處理,特徵構建(如標準化))是否需要放在一起處理?兩種:1.標準化的話,資料減去其均值然後除以方差,涉及到均值和方差怎麼算,有兩種演算法,一種是把訓練和測試資料集等都拿過來放在一起算均值和方差,因為你沒有看它的標號,你只看到了他們的值,在實際生產中很可能沒問題;第二種方法是隻在訓練集上算均值和方差,然後把均值和方差作用到驗證資料集上去,一般來說後者會保險一些,實際情況下,可以做、看。不過前面一種會好一些,實際的話,看你是否能拿到驗證資料集的資料,能拿到的話就可以用第一種方法。

6. 深度學習一般訓練集較大,K折交叉驗證是不是沒什麼用?訓練成本太高了吧?答:資料集不夠大的情況下采用K折交叉驗證,傳統機器學習用K折較多;深度學習用的不多,因為比較貴。

7. 為什麼cross validation就好呢?它也沒解決資料來源問題?答:cross validation只是給你選擇超引數的,它並不能解決其他問題。資料來源:你怎麼取樣資料使得它的分佈比較好,不要跟訓練集、驗證集資料分佈長的非常不一樣這都不是cross validation做的事情,這些

都是data science來解決的;裡面有挺大一塊,比如怎麼處理和爬取資料等。

8. K折交叉驗證的K是怎麼確定的?答:要在你能承受的計算成本里面。理論上K越大越好,但是你也要考慮計算成本,K大了你的計算成本也線性增長了。。