動手學深度學習(二)——欠擬合和過擬合

文章作者:Tyan
博客:noahsnail.com ?|? CSDN ?|? 簡書

注:本文為李沐大神的《動手學深度學習》的課程筆記其障!

欠擬合和過擬合

訓練誤差和泛化誤差

機器學習模型在訓練數(shù)據(jù)集上表現(xiàn)出的誤差叫做訓練誤差,在任意一個測試數(shù)據(jù)樣本上表現(xiàn)出的誤差的期望值叫做泛化誤差章鲤。

統(tǒng)計學習理論的一個假設是:訓練數(shù)據(jù)集和測試數(shù)據(jù)集里的每一個數(shù)據(jù)樣本都是從同一個概率分布中相互獨立地生成出的(獨立同分布假設)。

一個重要結論是:訓練誤差的降低不一定意味著泛化誤差的降低。機器學習既需要降低訓練誤差田盈,又需要降低泛化誤差。

欠擬合和過擬合

  • 欠擬合:機器學習模型無法得到較低訓練誤差缴阎。
  • 過擬合:機器學習模型的訓練誤差遠小于其在測試數(shù)據(jù)集上的誤差缠黍。

模型的選擇

模型擬合能力和誤差之間的關系如下圖:

error_model_complexity.png

訓練數(shù)據(jù)集的大小

一般來說,如果訓練數(shù)據(jù)集過小药蜻,特別是比模型參數(shù)數(shù)量更小時瓷式,過擬合更容易發(fā)生。除此之外语泽,泛化誤差不會隨訓練數(shù)據(jù)集里樣本數(shù)量增加而增大贸典。

model_vs_data.png

多項式擬合

給定一個標量數(shù)據(jù)點集合x和對應的標量目標值y,多項式擬合的目標是找一個K階多項式踱卵,其由向量w和位移b組成廊驼,來最好地近似每個樣本xy。用數(shù)學符號來表示就是我們將學wb來預測

$$\hat{y} = b + \sum_{k=1}^K x^k w_k$$

并以平方誤差為損失函數(shù)惋砂,一階多項式擬合又叫線性擬合妒挎。

創(chuàng)建數(shù)據(jù)集

使用二階多項式來生成每一個數(shù)據(jù)樣本黑竞,$y=1.2x?3.4x2+5.6x3+5.0+noise$缕粹,噪音服從均值0和標準差為0.1的正態(tài)分布茴扁。

# 導入mxnet
import mxnet as mx

# 設置隨機種子
mx.random.seed(2)

from mxnet import gluon
from mxnet import ndarray as nd
from mxnet import autograd
# 訓練數(shù)據(jù)數(shù)量
num_train = 100
# 測試數(shù)據(jù)數(shù)量
num_test = 100
# 多項式權重
true_w = [1.2, -3.4, 5.6]
# 多項式偏置
true_b = 5.0
# 生成隨機數(shù)據(jù)x
x = nd.random.normal(shape=(num_train + num_test, 1))
# 計算x的多項式值
X = nd.concat(x, nd.power(x, 2), nd.power(x, 3))
# 計算y
y = true_w[0] * X[:, 0] + true_w[1] * X[:, 1] + true_w[2] * X[:, 2] + true_b
# 查看數(shù)據(jù)
('x:', x[:5], 'X:', X[:5], 'y:', y[:5])
(200L,)

定義訓練和測試步驟

%matplotlib inline
import matplotlib as mpl
mpl.rcParams['figure.dpi']= 120
import matplotlib.pyplot as plt

# 定義訓練過程
def train(X_train, X_test, y_train, y_test):
    # 定義線性回歸模型
    net = gluon.nn.Sequential()
    with net.name_scope():
        net.add(gluon.nn.Dense(1))
    # 權重初始化
    net.initialize()
    # 學習率
    learning_rate = 0.01
    # 迭代周期
    epochs = 100
    # 訓練的批數(shù)據(jù)大小
    batch_size = min(10, y_train.shape[0])
    # 創(chuàng)建訓練數(shù)據(jù)集
    dataset_train = gluon.data.ArrayDataset(X_train, y_train)
    # 讀取數(shù)據(jù)
    data_iter_train = gluon.data.DataLoader(dataset_train, batch_size, shuffle=True)
    # 訓練方法SGD
    trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': learning_rate})
    # 定義損失函數(shù)
    square_loss = gluon.loss.L2Loss()
    # 訓練損失
    train_loss = []
    # 測試損失
    test_loss = []
    # 進行訓練
    for e in range(epochs):
        for data, label in data_iter_train:
            with autograd.record():
                # 進行預測
                output = net(data)
                # 計算預測值與實際值之間的損失
                loss = square_loss(output, label)
            # 損失進行反向傳播
            loss.backward()
            # 更新權重
            trainer.step(batch_size)
        # 保存訓練損失
        train_loss.append(square_loss(net(X_train), y_train).mean().asscalar())
        # 保存測試損失
        test_loss.append(square_loss(net(X_test), y_test).mean().asscalar())
    # 繪制損失
    plt.plot(train_loss)
    plt.plot(test_loss)
    plt.legend(['train','test'])
    plt.show()
    return ('learned weight', net[0].weight.data(), 'learned bias', net[0].bias.data())

三階多項式擬合(正常)

train(X[:num_train, :], X[num_train:, :], y[:num_train], y[num_train:])
Figure 1
('learned weight', 
 [[ 1.22117233 -3.39606118  5.59531116]]
 <NDArray 1x3 @cpu(0)>, 'learned bias', 
 [ 4.98550272]
 <NDArray 1 @cpu(0)>)

線性擬合(欠擬合)

train(x[:num_train, :], x[num_train:, :], y[:num_train], y[num_train:])
Figure 2
('learned weight', 
 [[ 19.74101448]]
 <NDArray 1x1 @cpu(0)>, 'learned bias', 
 [-0.23861444]
 <NDArray 1 @cpu(0)>)

訓練量不足(過擬合)

train(X[0:2, :], X[num_train:, :], y[0:2], y[num_train:])
Figure 3
('learned weight', 
 [[ 3.10832024 -0.740421    4.85165691]]
 <NDArray 1x3 @cpu(0)>, 'learned bias', 
 [ 0.29450524]
 <NDArray 1 @cpu(0)>)

結論

  • 訓練誤差的降低并不一定意味著泛化誤差的降低酌畜。
  • 欠擬合和過擬合都是需要盡量避免的凡纳。我們要注意模型的選擇和訓練量的大小辅甥。
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末驴一,一起剝皮案震驚了整個濱河市踊淳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌镶苞,老刑警劉巖喳坠,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異茂蚓,居然都是意外死亡壕鹉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門聋涨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來御板,“玉大人,你說我怎么就攤上這事牛郑〉±撸” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵淹朋,是天一觀的道長笙各。 經(jīng)常有香客問我,道長础芍,這世上最難降的妖魔是什么杈抢? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮仑性,結果婚禮上惶楼,老公的妹妹穿的比我還像新娘。我一直安慰自己诊杆,他們只是感情好歼捐,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晨汹,像睡著了一般豹储。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淘这,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天剥扣,我揣著相機與錄音,去河邊找鬼铝穷。 笑死钠怯,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的曙聂。 我是一名探鬼主播晦炊,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了刽锤?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤朦佩,失蹤者是張志新(化名)和其女友劉穎并思,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體语稠,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡宋彼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了仙畦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片输涕。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖慨畸,靈堂內(nèi)的尸體忽然破棺而出莱坎,到底是詐尸還是另有隱情,我是刑警寧澤寸士,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布檐什,位于F島的核電站,受9級特大地震影響弱卡,放射性物質(zhì)發(fā)生泄漏乃正。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一婶博、第九天 我趴在偏房一處隱蔽的房頂上張望瓮具。 院中可真熱鬧,春花似錦凡人、人聲如沸名党。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兑巾。三九已至,卻和暖如春忠荞,著一層夾襖步出監(jiān)牢的瞬間蒋歌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工委煤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留堂油,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓碧绞,卻偏偏與公主長得像府框,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子讥邻,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容