1. 程式人生 > >正則化對深層神經網路的影響分析

正則化對深層神經網路的影響分析

本文是基於吳恩達老師《深度學習》第二週第一課練習題所做,目的在於探究引數初始化對模型精度的影響。

一、資料處理

本文所用第三方庫如下,其中reg_utils 和 testCases_regularization為輔助程式這裡下載。

import numpy as np
import matplotlib.pyplot as plt
from reg_utils import *
import sklearn
import sklearn.datasets
import scipy.io
from testCases_regularization import *

本次課程中使用了一個比較有趣的例子:使用人工智慧的方法為一支足球隊做技術分析,為隊員預測頭球破門率最高的位置。


下圖給出了過去十場比賽中,該隊與對手搶得頭球點的資料集


藍色點表示本隊搶到頭球時隊員所在的位置,紅點表示對手搶到頭球時所在的位置。本文的任務是建立深層神經網路對該資料集進行訓練,為了分析正則化對構建神經網路的作用,我們分別構建無正則化模型、L2正則化模型和dropout模型,並對三者的結果進行對比研究。

二、深層神經網路模型

該文中已經詳細說明過模型所用到的各函式的意義,再此不再贅述。

def model(X, Y, learning_rate = 0.3, num_iterations = 30000, print_cost = True, lambd = 0,keep_prob = 1):

    grads = {}
    costs = []
    m = X.shape[1]
    layers_dims = [X.shape[0], 20, 3, 1]

    parameters = initialize_parameters(layers_dims)

    for i in range(0, num_iterations):

        if keep_prob == 1:
            a3, cache = forward_propagation(X, parameters)

        elif keep_prob < 1:
            a3, cache = forward_propagation_with_dropout(X, parameters)

        if lambd == 0:
            cost = compute_cost(a3, Y)

        else:
            cost = compute_cost_with_regularization(a3, Y, parameters, lambd)

        assert(lambd == 0 or keep_prob == 1)

        if lambd == 0 and keep_prob == 1:
            grads = backward_propagation(X, Y, cache)

        elif lambd != 0:
            grads = backward_propagation_with_regularization(X, Y, cache, lambd)

        elif keep_prob < 1:
            grads = backward_propagation_with_dropout(X, Y, cache, keep_prob)

        parameters = update_parameters(parameters, grads, learning_rate)

        if print_cost == True and i % 10000 ==0:
            print("cost after iterations {}:{}".format(i,cost))
        if print_cost == True and i % 1000 ==0:
            costs.append(cost)

    plt.plot(costs)
    plt.xlabel("iterations (per 1000)")
    plt.ylabel("cost")
    plt.title("Learning rate = " + str(learning_rate))
    plt.show()

    return parameters

三、無正則化模型

我們先測試一下模型沒有正則化和dropout優化的情況下,測試效果是怎樣的

parameters = model(train_X, train_Y)
print("On the training set:")
predictions_train = predict(train_X, train_Y, parameters)
print("On the test set:")
predictions_test = predict(test_X, test_Y, parameters)
cost after iterations 0:0.6557412523481002
cost after iterations 10000:0.16329987525724213
cost after iterations 20000:0.13851642423245572

On the training set:
Accuracy: 0.9478672985781991
On the test set:
Accuracy: 0.915

在訓練集和測試集上的預測精度分別是94.78%,91.5%,訓練集上精度比測試集高3%,看起來有些過擬合,我們打印出邊界曲線看下效果。


圖中可以明顯看出,對於測試集確實有些過擬合,下面我們使用L2正則化和dropout方法,看看如何改善過擬合現象。

四、L2正則化模型

L2範數在神經網路中也成為F範數(弗羅貝尼烏斯範數),在使用L2正則化的同時,cost函式也需要進行相應的修改。


def compute_cost_with_regularization(A3, Y, parameters, lambd):
    m = Y.shape[1]
    W1 = parameters["W1"]
    W2 = parameters["W2"]
    W3 = parameters["W3"]

    cross_entropy_cost = compute_cost(A3, Y)

    L2_regularization_cost = (1. / m * lambd / 2) * (np.sum(np.square(W1))+
                                                     np.sum(np.square(W2))+
                                                     np.sum(np.square(W3)))
    cost = cross_entropy_cost + L2_regularization_cost

    return cost
進行反向傳播函式的計算也需要響應的改變,正則化的導數為:ddW(12λmW2)=λm
def backward_propagation_with_regularization(X, Y, cache, lambd):
    m = X.shape[1]
    (Z1, A1, W1, b1,Z2, A2, W2, b2,Z3, A3, W3, b3) = cache

    dZ3 = A3 - Y
    dW3 = 1. / m * np.dot(dZ3, A2.T) + lambd / m * W3
    db3 = 1. / m * np.sum(dZ3, axis=1, keepdims = True)

    dA2 = np.dot(W3.T, dZ3)
    dZ2 = np.multiply(dA2, np.int64(A2>0))
    dW2 = 1. / m * np.dot(dZ2, A1.T) + lambd / m * W2
    db2 = 1. / m * np.sum(dZ2, axis=1, keepdims = True)

    dA1 = np.dot(W2.T, dZ2)
    dZ1 = np.multiply(dA1, np.int64(A1>0))
    dW1 = 1. / m * np.dot(dZ1, X.T) + lambd / m * W1
    db1 = 1. / m * np.sum(dZ1, axis=1, keepdims = True)

    gradients = {"dZ3": dZ3, "dW3": dW3, "db3": db3,"dA2": dA2,
             "dZ2": dZ2, "dW2": dW2, "db2": db2, "dA1": dA1,
             "dZ1": dZ1, "dW1": dW1, "db1": db1}

    return gradients

我們設lambd = 0.7,執行模型觀察預測效果:

cost after iterations 0:0.6974484493131264
cost after iterations 10000:0.26849188732822393
cost after iterations 20000:0.2680916337127301
parameters = model(train_X, train_Y, lambd = 0.7)
print("On the training set:")
predictions_train = predict(train_X, train_Y, parameters)
print("On the test set:")
predictions_test = predict(test_X, test_Y, parameters)

On the training set:
Accuracy: 0.9383886255924171
On the test set:
Accuracy: 0.93

此時增加L2正則化後,訓練集和測試集的預測精度分別是93.8%和93%

plt.title("Model with L2-regularization")
axes = plt.gca()
axes.set_xlim([-0.75,0.40])
axes.set_ylim([-0.75,0.65])
plot_decision_boundary(lambda x : predict_dec(parameters, x.T),train_X, train_Y)

過擬合現象大大改善。

五、dropout模型

dropout的基本原理在每層網路上隨即的讓一些神經元失活,這樣使得網路模型更加簡化,可以改善過擬合現象。dropout作用的網路層通常是W比較複雜的,對於只有少數神經元的層次則不需要作用。增加dropout演算法後,前向傳播和反向傳播的過程都會受到影響。

(1)前向傳播

def forward_propagation_with_dropout(X, parameters, keep_prob=0.5):
    np.random.seed(1)
    
    W1 = parameters["W1"]
    b1 = parameters["b1"]
    W2 = parameters["W2"]
    b2 = parameters["b2"]
    W3 = parameters["W3"]
    b3 = parameters["b3"] 
    
    Z1 = np.dot(W1,X) + b1
    A1 = relu(Z1)
    D1 = np.random.rand(A1.shape[0], A1.shape[1])
    D1 = D1 < keep_prob
    A1 = A1 * D1
    A1 = A1 / keep_prob

    Z2 = np.dot(W2, A1) + b2
    A2 = relu(Z2)
    D2 = np.random.rand(A2.shape[0], A2.shape[1])
    D2 = D2 < keep_prob
    A2 = A2 * D2
    A2 = A2 / keep_prob

    Z3 = np.dot(W3, A2) + b3
    A3 = sigmoid(Z3)

    cache = (Z1, D1, A1, W1, b1, Z2, D2, A2, W2, b2, Z3, A3, W3, b3)

    return A3, cache

(2)反向傳播

def backward_propagation_with_dropout(X, Y, cache, keep_prob):
    m = X.shape[1]
    (Z1, D1, A1, W1, b1, Z2, D2, A2, W2, b2, Z3, A3, W3, b3) = cache

    dZ3 = A3 - Y
    dW3 = 1. / m * np.dot(dZ3, A2.T)
    db3 = 1./ m * np.sum(dZ3, axis = 1, keepdims = True)

    dA2 = np.dot(W3.T, dZ3)
    dA2 = dA2 * D2
    dA2 = dA2 / keep_prob
    dZ2 = np.multiply(dA2, np.int64(A2>0))
    dW2 = 1. / m * np.dot(dZ2, A1.T)
    db2 = 1. / m * np.sum(dZ2, axis=1, keepdims = True)

    dA1 = np.dot(W2.T, dZ2)
    dA1 = dA1 * D1
    dA1 = dA1 / keep_prob
    dZ1 = np.multiply(dA1, np.int64(A1>0))
    dW1 = 1. / m * np.dot(dZ1, X.T)
    db1 = 1. / m * np.sum(dZ1, axis = 1, keepdims = True)

    gradients = {"dZ3": dZ3, "dW3": dW3, "db3": db3,"dA2": dA2,
                 "dZ2": dZ2, "dW2": dW2, "db2": db2, "dA1": dA1,
                 "dZ1": dZ1, "dW1": dW1, "db1": db1}

    return gradients

我們給定Keep_prob為0.86,即以24%的概率失活各層神經元,呼叫模型如下

parameters = model(train_X, train_Y, keep_prob = 0.86, )
print("On the training set:")
predictions_train = predict(train_X, train_Y, parameters)
print("On the test set:")
predictions_test = predict(test_X, test_Y, parameters)
cost after iterations 0:0.6543912405149825
cost after iterations 10000:0.0610169865749056
cost after iterations 20000:0.060582435798513114

On the train set:
Accuracy: 0.9289099526066351
On the test set:
Accuracy: 0.95

該方法在訓練集和測試集上的預測精度分別是92.89%和95,在訓練集上的預測效果更有,過擬合問題得到了很好的解決。

plt.title("Model with dropout")
axes = plt.gca()
axes.set_xlim([-0.75,0.40])
axes.set_ylim([-0.75,0.65])
plot_decision_boundary(lambda x: predict_dec(parameters, x.T), train_X, train_Y)

六、總結

正則化可以很好的解決模型過擬合的問題,常見的正則化方式有L2正則化和dropout,但是正則化是以犧牲模型的擬合能力來達到平衡的,因此在對訓練集的擬閤中有所損失。

相關推薦

深層神經網路影響分析

本文是基於吳恩達老師《深度學習》第二週第一課練習題所做,目的在於探究引數初始化對模型精度的影響。一、資料處理本文所用第三方庫如下,其中reg_utils 和 testCases_regularization為輔助程式從這裡下載。import numpy as np impor

【GAN ZOO閱讀】模式的生成對抗網路 MODE REGULARIZED GENERATIVE ADVERSARIAL NETWORKS

原文地址: https://arxiv.org/abs/1612.02136 引用之請註明出處。 Tong Che 1,Yanran Li 2 3,Athul Paul Jacob 1,Yoshua Bengio 1,Wenjie Li 2 1 蒙特利爾學習演算法

改善深層神經網路:超引數除錯、以及優化_課程筆記_第一、二、三週

所插入圖片仍然來源於吳恩達老師相關視訊課件。仍然記錄一下一些讓自己思考和關注的地方。 第一週 訓練集與正則化 這周的主要內容為如何配置訓練集、驗證集和測試集;如何處理偏差與方差;降低方差的方法(增加資料量、正則化:L2、dropout等);提升訓練速度的方法:歸一化訓練集;如何合理的初始化權

吳恩達改善深層神經網路引數:超引數除錯、以及優化——優化演算法

機器學習的應用是一個高度依賴經驗的過程,伴隨著大量的迭代過程,你需要訓練大量的模型才能找到合適的那個,優化演算法能夠幫助你快速訓練模型。 難點:機器學習沒有在大資料發揮最大的作用,我們可以利用巨大的資料集來訓練網路,但是在大資料下訓練網路速度很慢; 使用快速的優化演算法大大提高效率

改善深層神經網路:超引數除錯、以及優化 優化演算法 第二週

改善深層神經網路:超引數除錯、正則化以及優化  優化演算法 第二課 1. Mini-batch Batch vs Mini-batch gradient descent Batch就是將所有的訓練資料都放到網路裡面進行訓練,計算量大,硬體要求高。一次訓練只能得到一個梯

吳恩達 改善深層神經網路:超引數除錯、以及優化 第一週

吳恩達 改善深層神經網路:超引數除錯、正則化以及優化 課程筆記  第一週 深度學習裡面的實用層面 1.1 測試集/訓練集/開發集        原始的機器學習裡面訓練集,測試集和開發集一般按照6:2:2的比例來進行劃分。但是傳統的機器學習

改善深層神經網路——超引數除錯、Batch和程式框架(7)

目錄 1.超引數除錯 深度神經網路需要除錯的超引數(Hyperparameters)較多,包括: α:學習因子 β:動量梯度下降因子 :Adam演算法引數 #layers:神經網路層數

【deeplearning.ai】第二門課:提升深層神經網路——的程式設計作業

正則化的程式設計作業,包括無正則化情況、L2正則化、Dropout的程式設計實現,程式設計中用到的相關理論和公式請參考上一篇博文。 問題描述:原問題是判斷足球運動員是否頭球,在此省略問題背景,其實就是二分類問題。有以下型別的資料,藍點為一類,紅點為一類 匯入需要的擴充套件包

吳恩達《深度學習-改善深層神經網路》3--超引數除錯、以及優化

1. 系統組織超參除錯Tuning process1)深度神經網路的超參有學習速率、層數、隱藏層單元數、mini-batch大小、學習速率衰減、β(優化演算法)等。其重要性各不相同,按重要性分類的話:   第一類:最重要的引數就是學習速率α    第二類:隱藏層單元數、min

《吳恩達深度學習工程師系列課程之——改善深層神經網路:超引數除錯、以及優化》學習筆記

本課程分為三週內容: 深度學習的使用層面 優化演算法 超引數除錯、Batch正則化和程式框架 WEEK1 深度學習的使用層面 1.建立神經網路時選擇: 神經網路層數 每層隱藏單元的個數 學習率為多少 各層採用的啟用函式為哪些 2

改善深層神經網路第一週-Regularization(

RegularizationWelcome to the second assignment of this week. Deep Learning models have so much flexibility and capacity that overfitting c

吳恩達deeplearning.ai課程《改善深層神經網路:超引數除錯、以及優化》____學習筆記(第一週)

____tz_zs學習筆記第一週 深度學習的實用層面(Practical aspects of Deep Learning)我們將學習如何有效運作神經網路(超引數調優、如何構建資料以及如何確保優化演算法快速執行)設定ML應用(Setting up your ML applic

第2次課改善深層神經網路:超引數優化、以及優化

1. 除錯處理 超引數重要性排序 學習速率(learning rate)α 動量權重β=0.9,隱藏層節點數,mini-batch size 層數,learning rate decay Adam優化演算法的引數β1=0.9,β2=0.999,ϵ=10

深層神經網路引數初始方式訓練精度的影響

本文是基於吳恩達老師《深度學習》第二週第一課練習題所做,目的在於探究引數初始化對模型精度的影響。文中所用到的輔助程式在這裡。一、資料處理本文所用第三方庫如下,其中init_utils為輔助程式包含構建神經網路的函式。import numpy as np import matp

吳恩達deep learning筆記第二課 改善深層神經網路:超引數除錯、以及優化

學習吳恩達DL.ai第二週視訊筆記。 1.深度學習實用層面 在訓練集和驗證集來自相同分佈的前提下,觀察訓練集的錯誤率和驗證集的錯誤率來判斷過擬合(high variance高方差)還是欠擬合(high bias高偏差). 比如訓練集錯誤率1%,驗證集11%則過擬合(

【機器學習】神經網路DNN的

和普通的機器學習演算法一樣,DNN也會遇到過擬合的問題,需要考慮泛化,之前在【Keras】MLP多層感知機中提到了過擬合、欠擬合等處理方法的問題,正則化是常用的手段之一,這裡我們就對DNN的正則化方法做一個總結。 1. DNN的L1&L2正則化 想到正則化,我們首先想到的就是L1正則化和L2正則化

神經網路方法

正則化方法:防止過擬合,提高泛化能力 在訓練資料不夠多時,或者overtraining時,常常會導致overfitting(過擬合)。其直觀的表現如下圖所示,隨著訓練過程的進行,模型複雜度增加,在training data上的error漸漸減小,但是在驗證集上的error卻

神經網路損失函式中的項L1和L2

轉自:https://blog.csdn.net/dcrmg/article/details/80229189 神經網路中損失函式後一般會加一個額外的正則項L1或L2,也成為L1範數和L2範數。正則項可以看做是損失函式的懲罰項,用來對損失函式中的係數做一些限制

神經網路優化演算法二(、滑動平均模型)

1、神經網路進一步優化——過擬合與正則化 過擬合,指的是當一個模型過為複雜後,它可以很好的“記憶”每一個訓練資料中隨機噪音的部分而忘了要去“學習”訓練資料中通用的趨勢。舉一個極端的例子,如果一個模型中的引數比訓練資料的總數還多,那麼只要訓練資料不衝突,這個模型完全可以記住所有訓練資料

3. DNN神經網路

1. DNN神經網路的前向傳播(FeedForward) 2. DNN神經網路的反向更新(BP) 3. DNN神經網路的正則化 1. 前言 和普通的機器學習演算法一樣,DNN也會遇到過擬合的問題,需要考慮泛化,這裡我們就對DNN的正則化方法做一個總結。 2. DNN的L1和L2正則化 想到正則化,