2.1 二分分類
-定義:對某個事件或者事物進行“是”或者“否”的判斷,即可表示為如“0”和“1”兩種數據形式。
-數學定義:
對某個事件的結果y進行判斷
??y∈{0,1}.
需要有一個期望值,使得:
??0??1.
最后根據期望值hθ(x)與0.5的大小,輸出結果
引用文獻:https://blog.csdn.net/mathlxj/article/details/81490288
-例子:對一張貓的圖片判斷是否是貓。
??具體的判斷方法為:利用圖片中的各個像素點的三原色(紅、綠、藍)的亮度值來表示圖片的特征,并且將這些亮度值轉換為n維特征向量作為算法的輸入值,最后利用邏輯回歸(logistic回歸)算法等各種算法判斷出是否為貓的圖片,最后給出對應的結果。
??簡單點說,分析圖片三原色亮度值 → 獲取特征向量作為輸入 → logistic回歸算法進行運算 → 輸出判斷結果
-常用符號:
符號 | 含義 | 作用 |
---|---|---|
x | nx維特征向量 | 常用于表示圖片的特征 |
|
輸入特征向量維度 | |
y | 預測結果 | 二分類中用0或1表示結果 |
(x,y) | 一個單獨的樣本 | 訓練集的一個成員 |
一個訓練集中的第i個樣本 | 區(qū)分訓練集中的每個樣本 | |
m或者m_train | 訓練集樣本個數 | |
大寫X表示訓練集中所有樣本的輸入特征向量的矩陣集合 | m列nx行,作為輸入矩陣 | |
訓練集樣本預期值矩陣 | 1*m矩陣 | |
sigmoid()函數對于樣本i計算值 | 常用于表示樣本i的計算值 | |
表示第i層卷積層的參數W的特征向量 | 常用于sigmoid()函數的計算 | |
對樣本輸入的預測向量 | ||
損失函數 |
需要注意,矩陣X不能用特征向量橫向集合而成,即不能寫成如下形式:
(錯誤)
-多類分類:本質上是在二分分類上的拓展,講判斷結果分成了更多的部分。例如,識別水果的種類是蘋果還是西瓜,或者是香蕉。
2.2-2.3 logistic回歸和損失函數
-定義:利于一定的參數,對特征向量進行一定的計算,從而得出判斷結果。
-相關函數:
1.線性回歸:
a. 函數形式: y = ;
T為轉置符,交換特征向量的行和列。
b. 參數:w,b
??w和b參數常相互獨立的進行分開分析(在后面的求導中也是分開求導以及分別改變和優(yōu)化自身的值)
c. y范圍 :大于(0,1)
??由于這個范圍大于(0,1),并不符合當前判斷正誤的場景(即0或者1的場景)。所以為了保證y的值在0和1的范圍內,需要使用sigmoid()函數將y轉化到0到1的范圍內。
??為了容易區(qū)分,將線性函數的輸出值y改為z,即 z = wx + b,并且將z作為sigmoid(z)函數的輸入。
2.sigmoid函數:
a. 表達式:
b.函數圖像:
??當z越大,y的值越接近于1,當z越小,y的值越接近于0。
3.損失函數:
a.定義:對當前輸出y和訓練樣本的預期值之間的誤差的計算,進而用于修正函數的各種參數(如前面線性回歸中的w和z)。
損失函數也常被稱為誤差函數。
損失函數的計算結果越小說明參數越準確。
b.常見的損失函數:
是訓練樣本的預期值,y是計算值。
??該損失函數不常用,因為可能會出現多個局部最低值(例如sin函數),不利于梯度下降法對參數的修正。
該函數為常用的損失函數。
??當預期值為1,即=1,化簡得
,要使
的值盡可能的小,則需要使得
盡可能的大,即y要盡可能的大,因為
小于等于1,所以當
無限逼近1時,損失函數輸出值
越小,模型準確率越高。
??同理,當預期值為0,即=0,化簡得
,要使
的值盡可能的小,則需要使得
盡可能的大,即
要盡可能的小,因為
大于等于0,所以當
無限逼近0時,損失函數輸出值
越小,模型準確率越高。
4.成本函數
a.定義:即一個訓練集中所有樣本的損失函數輸出值的平均值,用于衡量當前模型的參數的準確性。平均值越小,參數越準確。
b.公式:
2.4 梯度下降法
a.定義:通過對參數(如w,b)進行求導,用于訓練模型中的各種參數(如線性回歸的w和b參數),從而達到成本函數值的最低點(也就是函數圖像的最低點)。
b.函數圖像:
在圖中,x和y軸分別為需要訓練的參數w和b(參數越多時維數越高),z軸為J(w,b)的值
c.具體操作方式:
??在logistic回歸當中參數進行任意初始化后,進行一次logistic回歸計算,并且計算出當前J(w,b)的公式和值,并且分別對公式進行關于不同參數的導數,進而求出斜率最低的方向,即再圖像中為當前點最陡的方向,再向這個方向移動一定的距離(這個距離按照學習率,也就是步長決定),具體的移動方法就是使用變化函數改變參數的值,也就是對參數進行優(yōu)化,并且不斷重復上述過程,從而達到最優(yōu)點(損失函數最低點)。
d.變化函數:(以參數w為例):
為更新w的值
為學習率,代表著步長,控制著每次迭代的移動長度,學習率越大,步長越大
:為J進行關于w的導數,后面常用
直接表示
e.過程圖示:
2.5.1 導數
導數定義
一、導數第一定義
設函數 y = f(x) 在點 x0 的某個鄰域內有定義,當自變量x 在 x0 處有增量△x ( x0 + △x 也在該鄰域內 ) 時相應地函數取得增量 △y = f(x0 + △x) - f(x0) 如果 △y 與 △x 之比當 △x→0 時極限存在則稱函數 y = f(x) 在點 x0 處可導,并稱這個極限值為函數 y = f(x) 在點 x0 處的導數記為 f'(x0) ,即導數第一定義。
二、導數第二定義
設函數 y = f(x) 在點 x0 的某個鄰域內有定義當自變量x 在 x0 處有變化 △x ( x - x0 也在該鄰域內 ) 時相應地函數變化 △y = f(x) - f(x0) 如果 △y 與 △x 之比當 △x→0 時極限存在則稱函數 y = f(x) 在點 x0 處可導并稱這個極限值為函數 y = f(x) 在點 x0 處的導數記為 f'(x0) ,即導數第二定義。
幾何意義
函數y=fx在x0點的導數f'x0的幾何意義表示函數曲線在P0[x導數的幾何意義0fx0] 點的切線斜率。
導數的幾何意義是該函數曲線在這一點上的切線斜率。
導數計算公式
這里將列舉六類基本初等函數的導數:
1.常函數即常數y=c(c為常數) y'=0
2.冪函數y=xn,y'=n*x(n-1)(n∈R)
基本導數公式3指數函數y=ax,y'=ax * lna
4對數函數y=logaX,y'=1/(xlna) (a>0且a≠1,x>0)
5.三角函數
(1)正弦函數y=(sinx y'=cosx
(2)余弦函數y=cosx y'=-sinx
(3)正切函數y=(tanx y'=1/(cosx)^2
(4)余切函數y=cotx y'=-1/(sinx)^2
6.反三角函數
(1)反正弦函數y=arcsinx y'=1/√1-x^2
(2)反余弦函數y=arccosx y'=-1/√1-x^2
(3)反正切函數y=arctanx y'=1/(1+x^2)
(4)反余切函數y=arccotx y'=-1/(1+x^2)
偏導數
在數學中,一個多變量的函數的偏導數,就是它關于其中一個變量的導數而保持其他變量恒定(相對于全導數,在其中所有變量都允許變化。
偏導數幾何意義
表示固定面上一點的切線斜率。
偏導數 f'x(x0,y0) 表示固定面上一點對 x 軸的切線斜率;偏導數 f'y(x0,y0) 表示固定面上一點對 y 軸的切線斜率。
高階偏導數:如果二元函數 z=f(x,y) 的偏導數 f'x(x,y) 與 f'y(x,y) 仍然可導,那么這兩個偏導函數的偏導數稱為 z=f(x,y) 的二階偏導數。二元函數的二階偏導數有四個:f"xx,f"xy,f"yx,f"yy。
注意:
f"xy與f"yx的區(qū)別在于:前者是先對 x 求偏導,然后將所得的偏導函數再對 y 求偏導;后者是先對 y 求偏導再對 x 求偏導。當 f"xy 與 f"yx 都連續(xù)時,求導的結果與先后次序無關。
2.5.2 鏈式法則
復合函數對自變量的導數等于已知函數對中間變量的導數乘以中間變量對自變量的導數--稱為鏈式法則。
鏈式法則(chain rule)是微積分中的求導法則,用以求一個復合函數的導數。所謂的復合函數,是指以一個函數作為另一個函數的自變量。如設f(x)=3x,g(x)=x+3,g(f(x))就是一個復合函數,并且g′(f(x))=3。若h(x)=f(g(x)),則h'(x)=f'(g(x))g'(x)。
鏈式法則用文字描述,就是“由兩個函數湊起來的復合函數,其導數等于里邊函數代入外邊函數的值之導數,乘以里邊函數的導數。
2.6.1 計算圖
計算圖是用箭頭畫出來的,從左到右的計算。以下會以具體函數J=3(a+bc)為例。
如圖所示,先計算出bc的數值,并將其存在變量u中,之后計算a+u,并將其存在變量v中,之后計算3*v,計算結果即為變量J 的數值。從左到右,箭頭表示出了計算的順序。
2.6.2 計算圖的導數運算
那么如何計算J的導數呢?如圖中所示:
結合鏈式法則,從最右側算起,dJ/dv=3,故dJ=3dv。dJ/da=dJ/dvdv/da=31=3;這個過程其實就是反向傳播。那dJ/du是多少呢?根據鏈式法則,從圖中右側向左計算,dJ/du=dJ/dvdv/du=31=3。同理可知,dJ/db=dJ/dvdv/dudu/db=31c=6;dJ/dc=dJ/dvdv/dudu/dc=313=9。
2.7.1 logistic回歸中的梯度下降法
logistic回歸的公式如下圖所示,只考慮單個樣本的情況,損失函數為L(a,y),a是logistic回歸的輸出,y為樣本的基本真值標簽值,該樣本的偏導數流程圖如下圖所示。
假設樣本只有兩個特征值x1和x2,為了計算Z,我們需要輸入參數w1和w2和b,在logistic回歸中,我們要做的就是變換參數w和b的值,來最小化損失函數。首先,我們需要向前一步,先計算損失函數的導數,計算函數L關于a的導數,在代碼中,只需要使用da來表示這個變量;之后,再向后一步,計算dz,dz是損失函數關于z的導數,向后傳播的最后一步,w和b需要如何變化,關于b的求導:db=dz=a-y。因此,關于單個樣本的梯度下降法,所需要做的就是使用這個計算公式計算dz,然后計算dw1、dw2、db,然后更新w1為w1減去學習率乘以dw1;更新w2為w2減去學習率乘以dw2;更新b為b減去學習率乘以db,這就是單個樣本實例的一次梯度更新步驟。
2.8.1向量化
向量化代碼示例
import numpy as np
a=np.array([1,2,3,4])
import time
a=np.random.rand(1000000)
b=np.random.rand(1000000)
tic=time.time()
c=np.dot(a,b)
toc=time.time()
print("Vectorized version:"+str(1000*(toc-tic))+"ms")
c=0
tic=time.time()
for i in range(1000000):
c+=a[i]*b[i]
toc=time.time()
print (c)
print("for loop:"+str(1000*(toc-tic))+"ms")
結果如下
向量化作用
相比于顯式的for循環(huán),向量化可以大大縮短數據的運算時間,得到同樣的結果,使用for循環(huán)所花費時間是將代碼向量化后運行時間的近300倍
GPU和CPU的對比
GPU為圖像處理單元,CPU為中央處理器。兩者都有并行化指令,有時稱為SIMD指令(單指令多數據流),這能夠讓python使用其中的內置函數(可以去掉顯式for循環(huán)的函數,如:numpy),GPU更為擅長運用SIMD指令,但CPU也同樣可以實現。
2.8.2向量化代碼示例
v和u都為n維向量,若要實現如下轉化
在不使用for循環(huán)的條件下,使用向量化
代碼如下
import numpy as np
from numpy import *
b = zeros((5, 2)) # 先創(chuàng)建102的一個數組,里面元素都為0
a = matrix(b) # 轉化為102的矩陣
print(a)
u = zeros((5,2))
m = matrix(u)
u=exp(a)
print(u)
結果如下:
2.8.3初步向量化logistic函數
若用如下程序計算logistic回歸導數
該程序實際包含兩個for循環(huán),第一個for循環(huán)即第二行的“for”,第二個for循環(huán)。在程序中,為以下的這一部分
即如果特征不止2個,有n個的話,則需重復執(zhí)行該步驟n次
現用向量化的方法去掉第二個for循環(huán),
將dw通過轉化為初始值為0的n*1維的向量
則原程序中的部分可取締。
原程序的
可以用代替。
原程序的
可以用代替。
以此去掉了第二個for循環(huán),通過向量化的方法,使程序得到了初步的簡化。
高效計算激活函數
已知函數和
,可以利用向量的方法對數據進行高效計算
首先,將所有訓練樣本(m個n維的向量)橫向堆疊得到一個n*m的矩陣X,以此作為訓練輸入
其中,X矩陣如下
為第一個訓練樣本的向量,依此類推
再定義一個1*m的矩陣Z,如下
定義1*m矩陣如下
定義矩陣A如下
則高效計算得出:
在python中的操作
調用numpy庫,定義向量和矩陣后,使用z=np.dot(w.T,x+b)語句進行計算,其中python自動將b擴展為1*m的向量(python的“廣播”)
調用sigmoid函數,由計算
.....
2.8.4高度向量化logistic
定義X矩陣如下
定義矩陣Y如下
定義矩陣A如下
定義矩陣dz如下
有.....
則高度向量化后,程序如下
在python中,調用numpy庫(np)
則矩陣Z可用一行代碼
Z計算得出
db可用一行代碼
計算得出
2.9.1 關于python / numpy向量的說明
默認以下的向量指的是np.array,直譯是數組,但是在神經網絡的項目中稱為向量是更符合的。以下將對其的一些概念做介紹。
軸(axis)
對于array.shape形如 (a, b, c, ...) 的數組,a是其第0軸,b是第1軸,以此類推。數軸簡單,但這些軸有什么意思?
對于shape為 (x, y) 的array,0軸就是行的軸,遍歷該軸可以遍歷所有行;1軸是列的軸,遍歷該列可以遍歷所有列。但是為什么是這樣?
a[x][y]我們都懂,是訪問數組a的第x行,第y列。那么軸的概念就在于,搭建一個坐標系(二維的是xOy坐標系),可以用坐標軸上的數表示數組的任意一個數。在這里,x就是a[x][y]在0軸的位置,y是在1軸的位置。那么自然而然0軸對應的是行號的軸,1軸對應的是列號的軸。對于有更多軸(秩更高)的數組來說這樣解釋同樣是合適的。
了解了軸的概念之后,那就應該也了解函數np.sum中參數axis的含義了:沿著(遍歷)某一個軸進行求和。對于其他含義該參數的函數來說,也是遍歷該軸的意思。
維數(dimension / dim)
我曾經在入門的時候遇到了這樣一個難題:
一個博主說 np.zeros((1000,))是獲得一個1000維的向量。
我當時就懵了,1000維?一張圖片才3維,就算所有圖片疊在一起也才4維,為什么要1000維?后來才知道此維非彼維:“維”指的是一個軸的“大小”(取值范圍),而不是接下來要講的秩的含義。對“維”的誤解主要出自我們一般稱a[][] 為二維數組,b[][][]為三維數組之類的說法。不過在真正了解維數/dim的定義之后就基本不會再有誤解了。
秩(rank)
在一些論文中,可能會出現這個單詞。而且如果用的是翻譯軟件進行閱讀,很有可能被翻譯為其他東西而影響閱讀,故特地標明了對應的英文rank。
秩指的是一個向量的軸的數量。秩0是單個數字,秩1是[]向量,秩2是[][]向量,以此類推。
或許有的同學在學線性代數時學過秩這個概念,不過又是此秩非彼秩。
示例代碼
a = np.array([[1, 2],
[3, 4],
[5, 6]]
)
b = np.sum(a, axis=0)
# b is [9, 12]
c = np.sum(a, axis=1)
# c is [3, 7, 11]
你可能也發(fā)現了一個細節(jié):sum之后降秩了。如果不想這么做,可以傳多一個參數keepdims
b = np.sum(a, axis=0, keepdims=True)
# b shape (1, 2)
這樣就可以避免可能由于降秩而帶來的bug。
2.9.2 Python中的廣播
Python中的廣播(broadcasting),是一種自動將“低秩”向量拓展到高秩向量,以便與高秩向量進行逐元素運算(+-*/)的機制。
a = 3
b = np.array([[1, 2],
[3, 4],
[5, 6]]
)
c = b + a
# c = a + b 結果也一致
print(c)
# c is [[4, 5], [6, 7], [8, 9]]
值得注意的是,這個“低秩”并不一定是真正的低秩。
廣播機制的規(guī)則
- 假設低秩向量shape為(a, b),高秩向量shape為(a, b, c, d, ...)或(..., c, d, a, b)。即高秩向量shape的最前面或者最后面“包含”低秩向量的shape,則可以進行廣播。
- 兩個同秩向量,若對應的部分軸(不要求連續(xù))的維數相等,且維數不同的軸,其中一個向量(不一定總是同一個向量)的維數為1,則可以進行廣播。
- 單個實數x(秩0),可以和任意向量廣播。
廣播可以理解為通過復制操作,將低維的軸的維數增加到和高秩向量一致。
示例代碼
a = np.zeros((3, 4))
b = np.zeros((1, 2, 3, 4))
t = a + b # 可以廣播
c = np.zeros((3, 4, 5, 6, 7))
t = a - c # 可以廣播
d = np.zeros((1, 2, 3, 4, 5, 6))
t = a * d # 不可以廣播
e = np.random.randn(1, 1, 2, 1, 4, 1)
f = np.random.randn(7, 6, 2, 3, 4, 8)
t = e / f # 可以廣播
g = np.random.randn(5, 6, 1, 3, 1, 8)
t = e + g # 可以廣播
2.9.3 Jupyter / Ipython筆記本快速指南
本文參考了Jupyter Notebook介紹、安裝及使用教程,提取了其中的一部分,適用于只是想快速運行python代碼、驗證自己的想法的同學。如果想了解過多細節(jié),可以參考原文。
安裝
介紹兩種安裝方式,分別對應到安裝了anaconda和萬能的場合
方法一
安裝了anaconda的話,常規(guī)來說自帶Jupyter。如果沒有,嘗試如下指令:
conda install jupyter notebook
方法二
只要你安裝了python(版本支持前提下)就能安裝的方法(win10):
打開cmd(不知道如何打開可以搜索),輸入
pip install jupyter
一般來說,會自動安裝到目錄:...\Python\Python36\Scripts\ 。
具體安裝到了哪,要看你的python安裝到了哪。然后此時你可以按照下一步運行jupyter;如果提示沒有這個命令,則是環(huán)境變量的問題,解決辦法:
- 右鍵我的電腦->屬性->高級系統(tǒng)設置->環(huán)境變量
- 雙擊第一個窗口 用戶變量 下的Path->新建
- 將jupyter安裝的目錄 “...\Python\Python36\Scripts” 復制到此處。連點ok。完成。
打開運行
打開cmd,輸入 jupyter notebook,回車。然后順利的話會彈出一個游覽器,先別急著關掉cmd,關掉的話你的jupyter也會一起“關掉”的。
點擊右邊的new->python3 ,然后會打開/跳轉一個新頁面,于是就可以愉快滴快速驗證代碼啦!
簡單的使用教程
一開始只有一個 In[] ,你可以輸入代碼,回車鍵輸入下一行,并且一個In可以視為一個“塊”,在執(zhí)行時是一個塊一個塊執(zhí)行的。
輸入代碼之后如果想要運行,用 shift+enter(回車)即可。然后回到剛剛提到的塊問題,如果你后面的塊依賴前面的塊的代碼,那么在修改前面的塊的代碼之后,需要將“受到牽連”的所有塊重新執(zhí)行,才能將結果更新到后面的塊,否則輸出是不會自動改變的。
在運行之后,有時候會有輸出塊 Out[] ,有時候沒有。這個取決于該塊中最后一句代碼是否有返回值,有則顯示返回值內容,否則不顯示任何東西。對于print顯示的內容,將在塊正下方的空白處顯示,而不是在 Out[] 中顯示。
2.9.4 logistic損失函數的解釋
首先,要知道我們的logistic回歸在做什么:“擬合”一個函數,該函數對于輸入圖形x,給出概率p(y|x),其中p(y|x)是圖中有貓的概率。
那這個函數可以寫成:
a, y=1
1-a, y=0
其中a是logistic回歸的輸出,也即y-hat(y帽),y的預測值。
更進一步,可以寫成:
那么我們的任務就成了找出一組權值w和偏置b,使得p(y|x)最大。有沒有讓你想起來最大似然估計?沒錯,就是差不多的任務。那么對數似然函數可以寫作:
我們目標就是讓上面的那個函數取最大值。再加個負號,改為取最小值:
于是,我們的損失函數(loss)就定義為了上式。
似然和概率
既然提到了最大似然估計,那就提提似然和概率的區(qū)別:
簡單來講,似然與概率分別是針對不同內容的估計和近似。概率(密度)表達給定θ下樣本X=x的可能性,而似然表達了給定樣本X=x下參數θ=θ1(相對于另外的參數取值θ2而言)為真實值的可能性