日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

吴恩达 深度学习

發布時間:2023/12/31 pytorch 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 吴恩达 深度学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第一章

數據規模驅動了深度學習的發展


圖中的數據指的是帶有標簽的數據

除了數據規模,還有計算能力的提升和算法的創新(sigmoid,RElu)

第二章 LR實現

2.1 識別貓咪

  • 將紅藍綠的像素值取出放入特征向量x中,y為標簽
  • 訓練集和測試集的表示符號
  • 2.2 邏輯回歸(Logistic Regression, LR)

  • 輸入x,得到概率值y

    由于y需要在[0, 1],如果簡單地進行線性回歸處理,wT + b有時候會大于一或為負數

  • 為避免上述情況,所以將wT + b輸入sigmoid函數中,將其對應到[0, 1]


  • 3. 關于w和b的符號約定

    2.3 LR cost function

    Loss(error) function 單個訓練樣本上的表現
    一般不用L(y^,y)=12(y^?y)2\mathscr{L}(\hat{y}, y)=\frac{1}{2}(\hat{y}-y)^{2}L(y^?,y)=21?(y^??y)2這樣的算是函數
    因為在梯度下降時,這種損失函數很容易產生很多局部最優解
    L(y^,y)=?(ylog?y^+(1?y)log?(1?y^))\mathscr{L}(\hat{y}, y)=-(y \log \hat{y}+(1-y) \log (1-\hat{y}))L(y^?,y)=?(ylogy^?+(1?y)log(1?y^?))是一個較好的損失函數(logloss)

    注意y^\hat{y}y^?也是屬于零一之間

    Cost function 全體訓練樣本上的表現

    梯度下降


    logloss是一個convex function(凸函數)可以找到局部最優解

    使用梯度下降計算局部最優解

    2.4 LR中單個樣本的梯度下降


    2.5 m個樣本的梯度下降

    分別對m個樣本的w1,w2,b求偏導,取均值


    采用向量化(vectorization)的數據形式來代替顯式for循環可以保證處理數據的效率

    2.6 向量化(vectorization)

    向量化編程和非向量化編程的對比

    向量化編程速度是非向量化編程的近480倍

    所以盡量避免使用for循環

    一些其他向量化的例子

    2.7 向量化LR

    2.8 向量化LR的梯度輸出

    2.9 python中的廣播

    Exapmle1

    注意 * 和np.dot()是不一樣的,np.dot()才是平時說的矩陣相乘,乘號只是對應位置上相乘
    Exapmle2

    總結

    第三章 神經網絡

    3.1 約定表達

    3.2 激活函數

    a=tanh(z)a = tanh(z)a=tanh(z)


    a=tanh?(z)=ez?e?zez+e?za=\tanh (z)=\frac{e^{z}-e^{-z}}{e^{z}+e^{-z}}a=tanh(z)=ez+e?zez?e?z?

    因為tanh可以讓輸出的均值更接近零,從而讓下一層的學習更加方便。所以tanh通常能得到比sigmoid更好的學習效果

    除了二分類的輸出用sigmoid,其他情況一般使用tanh更好

    激活函數上的上標表示在第幾層

    sigmoid和tanh的缺點
    當z很大或很小時,激活函數的斜率趨于0,從而會導致模型無法收斂

    RElU a=max(0,z)a = max(0, z)a=max(0,z)


    ReLU雖然在原點不可微,但在實際使用中很少會有z = 0求導的情況,或者可以在z = 0時給導數賦值1或是0

    LEAKY ReLU a=max(0.01z,z)a = max(0.01z, z)a=max(0.01z,z)


    一般用ReLU而很少使用tanh或者sigmoid,因為ReLU不會因為z過大或過小而影響學習速率

    3.3 為什么神經網絡需要非線性的激活函數

    因為沒有經過非線性的激活函數處理,從輸入到輸出無論有多少隱藏層,只不過是把輸入重新組合了一遍
    最后化簡實際和一層隱藏層的效果是一樣的,那么多個隱藏層就沒有意義

    除了輸出層,其他層一般都是使用非線性的激活函數

    3.4 正向傳播與反向傳播


    3.5 隨機初始化

    同一層的神經元存在對稱性,如果將同一層的所有神經元的參數都初始化為零,則訓練后該層所有神經元都是相同的

    所以需要隨機初始化

    通常將參數初始化為較小的值,因為如果初始化的參數較大,得到的z也較大。在使用sigmoid或者tanh時對應激活函數的梯度就會很小。

    第四章 深層神經網絡

    4.1 需要用到的符號

    4.2 前向和反向傳播

    反向傳播的單個樣本和m個樣本的向量形式

    三層神經網絡示意圖

    4.3 各矩陣的維數

    結論:w[l] = (n[l], n[l-1])
    b[l] = (n[l], 1)
    n為隱藏單元數
    輸入x,輸出z都是列向量,圖中x1和x2組成一個向量,多個輸出是進列左右擴展

    m個樣本的向量形式

    在第二維上進行擴展

    4.4 參數和超參數

    參數(模型學習):w, b
    超參數(人為調節): 學習率α,迭代次數iterations,隱藏層L,隱藏單元數n[1], n[2], 激活函數的選擇

    4.5 Building your Deep Neural Network - Step by Step

  • 初始化L層網絡的參數W和b
    initialize_parameters_deep(layer_dims)
    返回一個含有2 * L個參數的字典
  • 前向傳播
    linear_forward(A, W, b)
    進行線性計算Z = np.dot(W, A) + b,得到Z
    將三個參數(當前層的W,b以及上一層傳進來的A)放入cache中
    返回Z和cache
  • linear_activation_forward(A_prev, W, b, activation)
    調用linear_forward(A, W, b) 得到Z和cache
    將Z放入激活函數中,得到A和cache,cache是輸入Z
    將linear_forward得到的linear_cache(包含preA,W,b)和激活函數返回的activation_cache(Z)放入一個元組cache中
    返回經過激活函數得到的A和cahce

  • 前向傳播model
    由L - 1層relu和1層sigmoid構成
    先經過一個L層的for循環,通過linear_activation_forward(A_prev, W, b, activation = ‘relu’)得到A和cache。A用于下一層的輸入,cache保存在caches中。
    最后經過sigmoid激活函數,得到最終的輸出結果AL和cache,同樣將cache加入caches中。

  • 計算損失函數
    用logloss計算AL和Y的損失

  • 反向傳播
    linear_backward(dZ, cache)
    利用激活函數反向傳過來的dZ和cache中的A_pre, W, b計算dW, db, dA

  • linear_activation_backward(dA, cache, activation)
    先從sigmoid_backward或是relu_backward將后一層的dA轉換為dZ
    在調用linear_backward(dZ, cache)計算得到dW, db, dA

  • 反向傳播model
    對logloss求導帶入AL和Y的到dAL
    在將dAL傳入linear_activation_backward(dA, cache, activation = ‘sigmoid’)中得到dW, db, dA
    將當前層算得的dW, db, dA存入字典grads中
  • 再通過L - 1次for進行反向傳播,重復調用linear_activation_backward(dA, cache, activation = ‘relu’),并保存計算得到的梯度在grads中

  • 更新參數
    用L層for通過保存的grads來更新parameters中的參數
  • 第五章

    5. 1 數據劃分

  • 訓練集,驗證集(dev),測試集
  • 深度學習中,如果數據量很大,那么驗證集和測試集的數據不需要占總數據量特別多
  • 驗證集和測試集最好服從同一分布
  • 測試集是對所構建的神經網絡進行無偏評估。如果不需要對模型進行評估,那么也可以不用設置測試集(有的人可能在沒有設置測試集時,會將驗證集稱為測試集)
  • 5.2 偏差和方差(bias and variance)


    偏差是預測值和標簽值的偏差,過大則欠擬合
    方差是預測值的方差,過大則過擬合


    在訓練模型時

  • 先考慮bias是否過大,如果過大,則需要用更大的神經網絡或者其他算法
  • 再考慮var是否過大,如果過大,可以用更多的數據進行訓練或者采用正則化
  • 5.3 正則化

  • L2正則化
    在損失函數J后加上L2范數

    b可以省略,因為w是一個高維的參數向量,足以表達高偏差問題
  • L1正則化
    在損失函數J后加上L1范數

    L2比L1更常用
  • L2范數在多個參數下變成Frobenius范數,即矩陣各個位置的數的平方之和

    將加上L2范數的損失函數J對參數W求導得到dW,在用dW更新W時,相當于對原有的W乘了一個(1 - αλ / m)再減去原有梯度下降的部分
    相當于減小了原有參數W的權重,從而降低過擬合

    5.4 為什么正則化可以減小過擬合


    如果λ足夠大,模型為了減小損失J,就會把W設置的很小,接近0

    如果將很多W都設置為接近0,那么相當于這些神經元對輸出值的影響會很小,從而消除了部分神經元對輸出值的影響。
    由此簡化了神經網絡的結構,使得模型從高方差(variance)向高偏差轉移(bias)。但存在一個中間值使得模型處于“just right”的狀態。
    副作用
    如果λ設置的很大,那么W會很小,使得Z = WA + b也會很小

    但在一些激活函數中,如tanh。Z在0附近的區間幾乎是線性的。我們知道如果網絡中的變換都是線性的,整個網絡也會呈線性,那么會非常不適合復雜模型的構建。

    5.5 dropout正則化


    對于每一層,隨機舍棄一部分神經元,最后的到一個精簡的神經網絡用于訓練。對多個樣本進行多次舍棄,多次訓練。
    Inverted dropout(目前最常用)
    先隨機生成一個和輸出A形狀相同的0-1矩陣D,再將A與D的的各個元素相乘
    從而達到舍棄部分結果的目的

    假設僅保留keep-prob=0.8的參數,那么矩陣A在與矩陣D相乘后,各個元素都要除以keep-prob=0.8
    因為要保持A的期望值不變,否則在測試階段平均值會變得越來越復雜(因為測試階段不需要進行dropout,這樣可以保持訓練和測試時輸出結果的一致性)

    dropout和L2正則化都有壓縮權重的作用,dropout是舍棄部分權重參數.L2是壓縮整個W

    使用dropout的缺點是很難去檢查梯度下降的過程

    其他正則化方法 - Adam爆內存直接沒了…沒保存

    第七章

    7.1 常見需要調整的超參數

    α > β,hidden units,mini-batch size>layers,learing rate delay

  • 盡量隨機選擇超參數
  • 如果發現某幾個點的取值較好,可以縮小范圍在這幾個點周圍取值

    例:為α選擇適合的值

    假如要在0.0001~1之間選取一個學習率,使用均勻分布那么在0.0001-0.1之間的概率是10%,0.1-1之間的概率是90%,這顯然是不合理的

    更合理的選擇方法如下圖:

    在指數函數上選擇
    例:為β選擇適合的值
    用上述方法在指數級別上選擇1-β
  • 7.2 Batch Normalization

    和歸一化輸入類似,將訓練時的中間參數A進行歸一化后在輸入下一層
    一般不是歸一化A,而是Z。因為一般先進行BN,在傳入激活函數

    但是有時不希望歸一化處理的Z的均值和方差為0和1,因為這樣會不利于一些激活函數的處理
    所以引入兩個新的變量γ和β

    總之,目的是使得各層的所有隱藏單元的輸出Z都有固定的均值和方差

    具體流程

    注意每一次的γ和β可以不一樣

    總結

    以上是生活随笔為你收集整理的吴恩达 深度学习的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。