1. 機器學習中的降維演算法和梯度下降法
機器學習中有很多演算法都是十分經典的,比如說降維演算法以及梯度下降法,這些方法都能夠幫助大家解決很多問題,因此學習機器學習一定要掌握這些演算法,而且這些演算法都是比較受大家歡迎的。在這篇文章中我們就給大家重點介紹一下降維演算法和梯度下降法。
降維演算法
首先,來說一說降維演算法,降維演算法是一種無監督學習演算法,其主要特徵是將數據從高維降低到低維層次。在這里,維度其實表示的是數據的特徵量的大小,當特徵量大的話,那麼就給計算機帶來了很大的壓力,所以我們可以通過降維計算,把維度高的特徵量降到維度低的特徵量,比如說從4維的數據壓縮到2維。類似這樣將數據從高維降低到低維有兩個好處,第一就是利於表示,第二就是在計算上也能帶來加速。
當然,有很多降維過程中減少的維度屬於肉眼可視的層次,同時壓縮也不會帶來信息的損失。但是如果肉眼不可視,或者沒有冗餘的特徵,這怎麼辦呢?其實這樣的方式降維演算法也能工作,不過這樣會帶來一些信息的損失。不過,降維演算法可以從數學上證明,從高維壓縮到的低維中最大程度地保留了數據的信息。所以說,降維演算法還是有很多好處的。
那麼降維演算法的主要作用是什麼呢?具體就是壓縮數據與提升機器學習其他演算法的效率。通過降維演算法,可以將具有幾千個特徵的數據壓縮至若干個特徵。另外,降維演算法的另一個好處是數據的可視化。這個優點一直別廣泛應用。
梯度下降法
下面我們給大家介紹一下梯度下降法,所謂梯度下降法就是一個最優化演算法,通常也稱為最速下降法。最速下降法是求解無約束優化問題最簡單和最古老的方法之一,雖然現在已經不具有實用性,但是許多有效演算法都是以它為基礎進行改進和修正而得到的。最速下降法是用負梯度方向為搜索方向的,最速下降法越接近目標值,步長越小,前進越慢。好比將函數比作一座山,我們站在某個山坡上,往四周看,從哪個方向向下走一小步,能夠下降的最快;當然解決問題的方法有很多,梯度下降只是其中一個,還有很多種方法。
在這篇文章中我們給大家介紹了關於機器演算法中的降維演算法以及梯度下降法,這兩種方法是機器學習中十分常用的演算法,降維演算法和梯度下降法都是十分實用的,大家在進行學習機器學習的時候一定要好好學習這兩種演算法,希望這篇文章能夠幫助大家理解這兩種演算法。
2. fortran的數組定義
1.基本使用:
一維數組:
datatype
name (size)
datatype:
integer, real, complex, logical,或type自定義出來的類型。
integer,
parameter :: students = 5
integer
:: student (students)
其他定義方法:
integer
a(10) !最簡單的
integer,
dimension (10) :: a !另外的方法
integer,
dimension (10) :: a,b,c !一起定義
integer
a !f77 先聲明a是整型,
dimension
a(10) !再聲明a是大小為10的數組
或type
type
:: person
real ::height, weight
end
type
type
(person) :: a(10)
a(2)%height
= 180.0
二維數組:
integer
a(3, 3)
a(1,1)
= 3
定義方法:
integer
a(10,10)
integer,
dimension (10, 10) :: a,b,c
integer
a
dimension
a(10,10) ! f77, 先定義類型
二維數組常用來當作矩陣使用。
多維數組:
frotran最多可聲明高達七維的數組。
integer
a(D1,D2,...,Dn) !n維
一般說來,越高維數組讀數據越慢。
另類聲明方法:
integer
a(5) 可使用的是a(1), a(2), a(3), a(4), a(5)
integer
a(0:5) 下標可使用的是0~5,a(0),a(1),...,a(5)六個元素。
integer
a(-3:3) 可以使用的是a(-3), a(-2), a(-1), a(0),...,a(3)七個元素。
integer
a (5,0:5) 可用a(1~5, 0~5)
integer
b(2:3, -1:3) 可用b(2~3, -1~3)
2.數組內容的設置
賦初值:
integer
a(5)
data
a /1, 2, 3, 4, 5/
data
a /5*3/ !5個3 *表示數據重復
「隱含式」循環的功能設置初值:
integer
a(5)
integer
i
data(a(i),i=2,4)
/2,3,4/ !a(2)=3,a(3)=3,a(4)=4
輸出:write
(*,*) (a(i), i=2, 4) 顯示a(2),a(3),a(4)
也可以設置累加值:
(a(i),i=2,10,2)
! 循環執行5次,i分別是2,4,6,8,10。
「隱含」選還可以多層嵌套:多維數組
integer
a(2,2)
integer
i,j
data((a(i,j),
i=1,2),j=1,2) /1,2,3,4/
裡面的循環先執行,結果:
a(1,1)=1,
a(2,1)=2, a(1,2)=3, a(2,2)=4
F90中可以省掉data描述,直接設置初值:
integer
:: a(5) = (/1,2,3,4,5/) ! 注意:括弧和除號之間不能有空格。
省掉
data直接把初值寫在聲明之後時,不能像data時那樣,用隱式循環對數組中部分元素設初值,每個元素必須給定初值,而且寫法有點不同:
integer
:: i
integer
:: a(5) = (/ 1, (2, i=2,4), 5/)
!a(1)
= 1
!a(2)=2,a(3)=2,
a(4)=2 !(2,i=2,4) 是隱式循環
!a(5)=5
f90中的隱式循環:
integer
:: a(5)= (/i, i=1,5/)
!a(1)=1,
a(2)=2, a(3)=3, a(4)=4, a(5)=5
3.對整個數組的操作(數組廣播)
a=5
! a是任意維數的數組,全部元素設為5
a=(/1,2,3/)
! 右邊數字數目應該和數組的大小一樣
a=b
!a,b同樣維數及大小的數組,相同位置的元素賦給a
a=b+c!三個都是相同維數大小的數組,相同位置的數字相加給a
a=b-c
a=b*c!注意不等於矩陣的相乘,a(i,j)=
b(i,j)*c(i,j)
a=b/c
a=sin(b) !a(i)=sin(b(i))
4.
對部分數組的操作
a(3:5)
= 5
a(3:)
= 5
a(3:5)
= (/3,4,5/)
a(1:3)
= b(4:6)
a(1:10)
= a(10:1:-1) !使用隱含循環的方法將數組a(1~10)的內容翻轉。
a(:)
= b(:, 2)
a(:,
:) = b(:, :, 1)
!拿數組的一部分內容使用的時候,需要注意的原測:
(1)等號兩邊的數組元素數目要一樣多。
(2)同時使用多個隱含循環的時候,較低維數循環可以看作是內層的循環。
5.
WHERE:
F95的添加功能,用來取出部分數組的內容進行設置。where命令可以經過邏輯判斷來使用數組的一部分。
example:
!把數組a中小於3的元素值設置給b
where(a<3)
b=a !這里a,b維數大小相等
end
where
也可以寫成:
where
(a<3) b=a !與if相似
!where命令的代碼簡單,執行起來速度快。
!where是用來設置數組的,所以它的模塊中只能出現與設置數組相關的命令,而且在它的整個程序模塊中所使用的數組變數,都必須是同樣維數大小的數組。
還可以配合elsewhere來處理邏輯不成立的情況:
where
(a<3)
b=1
elsewhere
b=2
end
where
還可作多重判斷,只要elsewhere後接上邏輯判斷就行了:
where
(a<2)
b=1
elsewhere(a>5)
b=2
elsewhere
b=3
end
where
可以嵌套的,跟循環一樣可以取名字,不過在end
where的時候一定要加上它的名字,用來明確要結束哪個where模塊:
name:
where (a<5)
b=a
end
where name
where(a<5)
where(a/=2)
b=3
elsewhere
b=1
end where
elsewhere
b=0
end
where
6.FORALL:
F95添加
integer
i
integer
:: a(5)
forall
(i=1:5)
a(i)=5
end
forall
forall(i=1:5)
a(i)=i
end
forall
forall的詳細語法:
forall
(triplet1 [, triplet2 [, triplet3...]], mask)
........
end
forall
tripletn是用來賦值數組坐標范圍的值。如forall
(i=1:5)中i=1:5 就是一個triplet。
integer
:: a(10, 5)
forall
(i=2:10:2, j=1:5)
a(i,j) = i+j
end
forall
mask是用來作條件判斷的,跟where命令中使用的條件判斷類似,可以用來限制forall程序模塊中只作用於數組中符合條件的元素。還可以作其他限制。
forall
(i=1:5, j=1:5, a(i, j)<10 ) !只處理a中小於10的元素
a(i,j) = 1
end
forall
forall
(i=1:5, j=1:5, i==j) !只處理i==j的元素
a(i,j) = 1
end
forall
forall(i=1:5,
j=1:5, ((i>j) .and. a(i,j)>0))
!還可賦值好幾個條件,這里只處理二維矩陣的上三角部分且a(i,j)>0的元素
a(i,j)=1/a(i,j)
end
forall
如果只有一行代碼時候也可以省掉end
forall,寫在同一行:
forall
(i=1:5, j=1:5, a(i,j)/=0) a(i,j)=1/a(i,j)
forall
可以多層嵌套,裡面只能出現跟設置數組數值相關的程序命令,還可以在forall中使用where。不過where中不可以使用forall。
forall
(i=1:5)
forall (j=1:5)
a(i,j) = 1
end forall
forall (j=6:10)
a(i,j) = 2
end forall
end
forall
forall
(i=1:5)
where (a(:, i) /=0)
a(:, i) = 1.0/a(:, i)
end where
end
forall
7.
fortran 中數組的保存規則
不管數組的形狀,它所有的元素都是分布在內存中同一個連續的模塊當中。
多維數組在內存中的連續模塊排列情況是以一種列優先的方法排列的,數組存放在內存中的時候,會先放入第一個列中每個行的元素,然後再放入下一個列中每一行的元素。
exmaple:
a(1,1)->a(2,1)->a(3,1)=>a(1,2)->a(2,2)->a(3,2)=>a(1,3)->a(2,3)->a(3,3)
也即對多維數組,會先放入維數的元素,再放入較高維數的元素。
數組元素位置的計算:
一個n維數組a(D1,D2,...,Dn)
設:
sn=D1*D2*...*Dn
則a(d1,d2,d3,...,dn)在第1+(d1-1)+(d2-1)*s1+
... +(dn-1)*sn-1個位置。
使用數組時候最好用低維的下標作為內循環,這樣比較快。
8.可變大小的數組:(allocate,
allocatable, deallocate)
integer
:: students, error = 0
integer
,allocatable :: a(:) !定義a是可變大小的數組
...
read(*,*)
students
allocate(a(students),
stat=error) ! or allocate(a(students)) !申請數組內存空間
...
deallocate(a) !釋放動態數組佔用的內存空間
多維數組:
integer,
allocatable :: a2(:, :)
integer,
allocatable :: a3(:, :, :)
allocate(a2(5,
5))
allocate(a3(5,
5, 5))
或
allocate(a2(-3:3,
-3:3))
相關的函數allocated可用來檢查一個可變大小的數組是否已經配置內存來使用,會返回一個邏輯值。
example:
if(.not.
allocated(a)) then
allocate(a(5))
end
if
3. 關於matlab中多維數組某一單元物理存放位置的計算
matlab是按從低維到高維的順序存放的
例如有個a矩陣是2x2x2的三維矩陣,實際的儲存順序是
a(1,1,1)
a(2,1,1)
a(1,2,1)
a(2,2,1)
a(1,1,2)
a(2,1,2)
a(1,2,2)
a(2,2,2)
也就是低維的下標改變比高維的頻繁,第一維變化最快
實際上,我們可以用(:)將一個矩陣變為按其儲存順數排列的列向量
例如
b=a(;);
這時候b就是8x1的數列
b(1)
b(2)
..
b(8)
就是按照上述的順序排列的
其實對於高維數組,我們知道我們可以用
a(i,i,k)那樣的方式引用其中三維下標分別為i,j,k的那個元素
其實也可以用a(n)來直接引用儲存順序中第n個元素
也就是上邊2x2x2矩陣的例子中
a(1,2,1) 的結果和 a(3)的結果是一樣的
而matlab其實也提供函數實現子下標sub和總下標ind之間的轉化
IND = sub2ind(siz,I,J,...) 當然I J K不能超過那一維的最大值
[I,J,.....] = ind2sub(siz,IND) 當然 IND不能超過矩陣的元素總個數
其中sub2ind基本原理大概就是利用你那個(a-1)*d2*d3+(b-1)*d3+c公式計算出儲存位置
siz是矩陣的大小,例如這里的2x2x2
ind=sub2ind([2 2 2],1,2,1)得到的ind就是3
[i j k]=ind2sub([2 2 2],3)得到的i,j,k就分別是1,2,1
4. 高維數組運算 怎麼用梯度下降演算法
梯度下降法是一個最優化演算法,通常也稱為最速下降法。最速下降法是求解無約束優化問題最簡單和最古老的方法之一,雖然現在已經不具有實用性,但是許多有效演算法都是以它為基礎進行改進和修正而得到的。最速下降法是用負梯度方向為搜索方向的,最速下降法越接近目標值,步長越小,前進越慢。
5. D3群在三維實空間中的矩陣表示是怎麼算的
MVS是一種從具有一定重疊度的多視圖視角中恢復場景的稠密結構的技術,傳統方法利用幾何、光學一致性構造匹配代價,進行匹配代價累積,再估計深度值。雖然傳統方法有較高的深度估計精度,但由於存在缺少紋理或者光照條件劇烈變化的場景中的錯誤匹配,傳統方法的深度估計完整度還有很大的提升空間。近年來卷積神經網路已經成功被應用在特徵匹配上,提升了立體匹配的精度。在這樣的背景下,香港科技大學Yaoyao等人,在2018年提出了一種基於深度學習的端到端深度估計框架——MVSNet。
多視圖立體匹配(Multi-view Stereo, MVS)是計算機領域中一個核心問題。重建多視圖立體匹配,可以認為是拍攝既定場景的一個逆過程。相機映射下,三維場景變換為二維,而多視圖立體匹配重建正好相反,其從這樣子。不同視點拍攝圖像,恢復出真實的三維場景。
傳統的方法使用手工設計的相似性度量指標和正則化方法計算場景的稠密對應關系(比如使用歸一化互相關Normalized Cross-Correlation和半全局匹配semi-global matching)。這些方法在非朗伯體表面、無弱紋理區域的場景可以達到很好的效果。但是在弱紋理區域,人工設計的相似性指標變得不可信,因此導致重建結果不完整。由MVS數據集的排行榜可知,這些方法具有很高的精度,然而在重建的完整度方法還有很大的空間可以提升。
卷積神經網路的研究的最新進展引發了人們完善立體匹配重建熱情。從概念看,基於學習演算法能夠捕獲全局的語義信息,比如基於高光和反射的先驗條件,便於得到更加穩健的匹配。目前已經探求一些兩視圖立體匹配,用神經網路替換手工設計的相似性度量或正則化方法。這些方法展現出更好的結果,並且逐步超過立體匹配領域的傳統方法。事實上,立體匹配任務完全適合使用CNN,因為圖像對是已經過修正過的,因此立體匹配問題轉化為水平方向上逐像素的視差估計。
與雙目立體匹配不同的是,MVS的輸入是任意數目的視圖,這是深度學習方法需要解決的一個棘手的問題。而且只有很少的工作意識到該問題,比如SurfaceNet事先重建彩色體素立方體,將所有像素的顏色信息和相機參數構成一個3D代價體,所構成的3D代價體即為網路的輸入。然而受限於3D代價體巨大的內存消耗,SurfaceNet網路的規模很難增大:SurfaceNet運用了一個啟發式的「分而治之」的策略,對於大規模重建場景則需要花費很長的時間。
6. 牛頓法為什麼比梯度下降法求解需要的迭代次數更少
牛頓法是二階收斂,梯度下降是一階收斂,所以牛頓法就更快。如果更通俗地說的話,比如你想找一條最短的路徑走到一個盆地的最底部,梯度下降法每次只從你當前所處位置選一個坡度最大的方向走一步,牛頓法在選擇方向時,不僅會考慮坡度是否夠大,還會考慮你走了一步之後,坡度是否會變得更大。所以,可以說牛頓法比梯度下降法看得更遠一點,能更快地走到最底部。根據wiki上的解釋,從幾何上說,牛頓法就是用一個二次曲面去擬合你當前所處位置的局部曲面,而梯度下降法是用一個平面去擬合當前的局部曲面,通常情況下,二次曲面的擬合會比平面更好,所以牛頓法選擇的下降路徑會更符合真實的最優下降路徑。1. 牛頓法起始點不能離局部極小點太遠,否則很可能不會收斂。(考慮到二階擬合應該很容易想像),所以實際操作中會先使用別的方法,比如梯度下降法,使更新的點離最優點比較近,再開始用牛頓法。
2. 牛頓法每次需要更新一個二階矩陣,當維數增加的時候是非常耗內存的,所以實際使用是會用擬牛頓法。
3. 梯度下降法在非常靠近最優點時會有震盪,就是說明明離的很近了,卻很難到達,因為線性的逼近非常容易一個方向過去就過了最優點(因為只能是負梯度方向)。但牛頓法因為是二次收斂就很容易到達了。牛頓法最明顯快的特點是對於二階函數(考慮多元函數的話要在凸函數的情況下),牛頓法能夠一步到達,非常有效。
7. 梯度下降法是萬能的模型訓練演算法嗎
並不是。一方面,梯度並不是在任何時候都可以計算的。實際中很多問題的目標函數並不是可導的,這時梯度下降並不適用,這種情況下一般需要利用問題的結構信息進行優化,比如說Proximal gradient方法。甚至有些問題中目標函數的具體形式都不知道,更別談求梯度,比如說Bayesian Optimization。另一方面,即使問題可導,梯度下降有時並不是最佳選擇。梯度下降的性能跟問題的條件數相關,在條件數比較大時問題中梯度下降可能會非常慢。相對來說,以擬牛頓法為代表的二階方法沒有這個問題,雖然擬牛頓法在高維問題中會有計算量偏大的問題,但在很多場景還是比梯度下降有優勢。再比如,在梯度計算代價比較大時,SGD及其變種會遠比普通的梯度下降快。當然,總體來說,在機器學習的各種教科書中梯度下降是最常見的優化方法。主要因為它非常簡單易懂,而且大多數情況下效率比較高,但同時也是因為機器學習中大多數問題的懲罰函數是比較smooth的。如果有梯度的信息,有限內存BFGS是更好的辦法! 而且所謂的學習率,如果不是凸問題就不能設置為常數,需要線搜索來確定學習率,很多場景下GD方法並不能很「容易」的獲得較優解。另外,很多場景下,並不能寫出梯度公式。xGD演算法在對性能有一定要求的前提下,網路瓶頸是個問題,如果有更好的方法當然不會用它 而且如果模型存在局部不可導的情況下,部分分片發散,調整起來很頭疼的 我記得Jeff Dean有幾篇論文講了這個事情,題主不妨去翻翻看。
8. matlab中計算三維數組的差分
(1)在Matlab中習慣性的會將二維數組中的第一維稱為「行」第二維稱為「列」,而對於三維數組的第三位則是習慣性的稱為「頁」。在Matlab中將三維及三維以上的數組統稱為高維數組,三維數組也是高級運算的基礎。
(2)創建方法:
1、使用下標創建三維數組
在Matlab命令框中輸入以下代碼可以創建簡單的三維數組:
for i=1:2
for j=1:2
for k=1:2
A(i,j,k)=i+j+k;
end
end
end
2、使用低維數組創建三維數組
我們可以先輸入一個二維數組,然後通過第三維數組與其關系生成第三維數組,例如輸入以下代碼可以生成三維數組:
D2=[1,2,3;4,5,6;7,8,9];
D3(:,:,1)=D2;
D3(:,:,2)=2*D2;
D3(:,:,3)=3*D2;
3、使用創建函數創建三維數組
使用Cat命令來創建高維數組。Cat命令的個事為【C=cat(dim,A1,A2,A3,A4……)】其中dim表示的是創建數組的維度,A1,A2,A3,A4表示的是各維度上的數組。在命令窗口中輸入以下代碼即可創建一個簡單的三維數組:
D2=[1,2,3;4,5,6;7,8,9];
C=cat(3,D2,2*D2,3*D2);
9. 求Deep learning 【Yann LeCun 1,2 , Yoshua Bengio 3 & Geoffrey Hinton 4,5】全文中文翻譯
原文摘要:深度學習可以讓那些擁有多個處理層的計算模型來學習具有多層次抽象的數據的表示。這些方法在許多方面都帶來了顯著的改善,包括最先進的語音識別、視覺對象識別、對象檢測和許多其它領域,例如葯物發現和基因組學等。深度學習能夠發現大數據中的復雜結構。它是利用BP演算法來完成這個發現過程的。BP演算法能夠指導機器如何從前一層獲取誤差而改變本層的內部參數,這些內部參數可以用於計算表示。深度卷積網路在處理圖像、視頻、語音和音頻方面帶來了突破,而遞歸網路在處理序列數據,比如文本和語音方面表現出了閃亮的一面。
機器學習技術在現代社會的各個方面表現出了強大的功能:從Web搜索到社會網路內容過濾,再到電子商務網站上的商品推薦都有涉足。並且它越來越多地出現在消費品中,比如相機和智能手機。
機器學習系統被用來識別圖片中的目標,將語音轉換成文本,匹配新聞元素,根據用戶興趣提供職位或產品,選擇相關的搜索結果。逐漸地,這些應用使用一種叫深度學習的技術。傳統的機器學習技術在處理未加工過的數據時,體現出來的能力是有限的。幾十年來,想要構建一個模式識別系統或者機器學習系統,需要一個精緻的引擎和相當專業的知識來設計一個特徵提取器,把原始數據(如圖像的像素值)轉換成一個適當的內部特徵表示或特徵向量,子學習系統,通常是一個分類器,對輸入的樣本進行檢測或分類。特徵表示學習是一套給機器灌入原始數據,然後能自動發現需要進行檢測和分類的表達的方法。深度學習就是一種特徵學習方法,把原始數據通過一些簡單的但是非線性的模型轉變成為更高層次的,更加抽象的表達。通過足夠多的轉換的組合,非常復雜的函數也可以被學習。對於分類任務,高層次的表達能夠強化輸入數據的區分能力方面,同時削弱不相關因素。比如,一副圖像的原始格式是一個像素數組,那麼在第一層上的學習特徵表達通常指的是在圖像的特定位置和方向上有沒有邊的存在。第二層通常會根據那些邊的某些排放而來檢測圖案,這時候會忽略掉一些邊上的一些小的干擾。第三層或許會把那些圖案進行組合,從而使其對應於熟悉目標的某部分。隨後的一些層會將這些部分再組合,從而構成待檢測目標。深度學習的核心方面是,上述各層的特徵都不是利用人工工程來設計的,而是使用一種通用的學習過程從數據中學到的。
深度學習正在取得重大進展,解決了人工智慧界的盡最大努力很多年仍沒有進展的問題。它已經被證明,它能夠擅長發現高維數據中的復雜結構,因此它能夠被應用於科學、商業和政府等領域。除了在圖像識別、語音識別等領域打破了紀錄,它還在另外的領域擊敗了其他機器學習技術,包括預測潛在的葯物分子的活性、分析粒子加速器數據、重建大腦迴路、預測在非編碼DNA突變對基因表達和疾病的影響。也許更令人驚訝的是,深度學習在自然語言理解的各項任務中產生了非常可喜的成果,特別是主題分類、情感分析、自動問答和語言翻譯。我們認為,在不久的將來,深度學習將會取得更多的成功,因為它需要很少的手工工程,它可以很容易受益於可用計算能力和數據量的增加。目前正在為深度神經網路開發的新的學習演算法和架構只會加速這一進程。
監督學習
機器學習中,不論是否是深層,最常見的形式是監督學習。試想一下,我們要建立一個系統,它能夠對一個包含了一座房子、一輛汽車、一個人或一個寵物的圖像進行分類。我們先收集大量的房子,汽車,人與寵物的圖像的數據集,並對每個對象標上它的類別。在訓練期間,機器會獲取一副圖片,然後產生一個輸出,這個輸出以向量形式的分數來表示,每個類別都有一個這樣的向量。我們希望所需的類別在所有的類別中具有最高的得分,但是這在訓練之前是不太可能發生的。通過計算一個目標函數可以獲得輸出分數和期望模式分數之間的誤差(或距離)。然後機器會修改其內部可調參數,以減少這種誤差。這些可調節的參數,通常被稱為權值,它們是一些實數,可以被看作是一些「旋鈕」,定義了機器的輸入輸出功能。在典型的深學習系統中,有可能有數以百萬計的樣本和權值,和帶有標簽的樣本,用來訓練機器。為了正確地調整權值向量,該學習演算法計算每個權值的梯度向量,表示了如果權值增加了一個很小的量,那麼誤差會增加或減少的量。權值向量然後在梯度矢量的相反方向上進行調整。我們的目標函數,所有訓練樣本的平均,可以被看作是一種在權值的高維空間上的多變地形。負的梯度矢量表示在該地形中下降方向最快,使其更接近於最小值,也就是平均輸出誤差低最低的地方。
在實際應用中,大部分從業者都使用一種稱作隨機梯度下降的演算法(SGD)。它包含了提供一些輸入向量樣本,計算輸出和誤差,計算這些樣本的平均梯度,然後相應的調整權值。通過提供小的樣本集合來重復這個過程用以訓練網路,直到目標函數停止增長。它被稱為隨機的是因為小的樣本集對於全體樣本的平均梯度來說會有雜訊估計。這個簡單過程通常會找到一組不錯的權值,同其他精心設計的優化技術相比,它的速度讓人驚奇。訓練結束之後,系統會通過不同的數據樣本——測試集來顯示系統的性能。這用於測試機器的泛化能力——對於未訓練過的新樣本的識別能力。
當前應用中的許多機器學習技術使用的是線性分類器來對人工提取的特徵進行分類。一個2類線性分類器會計算特徵向量的加權和。當加權和超過一個閾值之後,輸入樣本就會被分配到一個特定的類別中。從20世紀60年代開始,我們就知道了線性分類器只能夠把樣本分成非常簡單的區域,也就是說通過一個超平面把空間分成兩部分。
但像圖像和語音識別等問題,它們需要的輸入-輸出函數要對輸入樣本中不相關因素的變化不要過於的敏感,如位置的變化,目標的方向或光照,或者語音中音調或語調的變化等,但是需要對於一些特定的微小變化非常敏感(例如,一隻白色的狼和跟狼類似的白色狗——薩莫耶德犬之間的差異)。在像素這一級別上,兩條薩莫耶德犬在不同的姿勢和在不同的環境下的圖像可以說差異是非常大的,然而,一隻薩摩耶德犬和一隻狼在相同的位置並在相似背景下的兩個圖像可能就非常類似。
圖1 多層神經網路和BP演算法
多層神經網路(用連接點表示)可以對輸入空間進行整合,使得數據(紅色和藍色線表示的樣本)線性可分。注意輸入空間中的規則網格(左側)是如何被隱藏層轉換的(轉換後的在右側)。這個例子中只用了兩個輸入節點,兩個隱藏節點和一個輸出節點,但是用於目標識別或自然語言處理的網路通常包含數十個或者數百個這樣的節點。獲得C.Olah (http://colah.github.io/)的許可後重新構建的這個圖。
鏈式法則告訴我們兩個小的變化(x和y的微小變化,以及y和z的微小變化)是怎樣組織到一起的。x的微小變化量Δx首先會通過乘以∂y/∂x(偏導數)轉變成y的變化量Δy。類似的,Δy會給z帶來改變Δz。通過鏈式法則可以將一個方程轉化到另外的一個——也就是Δx通過乘以∂y/∂x和∂z/∂y(英文原文為∂z/∂x,系筆誤——編輯注)得到Δz的過程。當x,y,z是向量的時候,可以同樣處理(使用雅克比矩陣)。 具有兩個隱層一個輸出層的神經網路中計算前向傳播的公式。每個都有一個模塊構成,用於反向傳播梯度。在每一層上,我們首先計算每個節點的總輸入z,z是前一層輸出的加權和。然後利用一個非線性函數f(.)來計算節點的輸出。簡單期間,我們忽略掉了閾值項。神經網路中常用的非線性函數包括了最近幾年常用的校正線性單元(ReLU)f(z) = max(0,z),和更多傳統sigmoid函數,比如雙曲線正切函數f(z) = (exp(z) − exp(−z))/(exp(z) + exp(−z)) 和logistic函數f(z) = 1/(1 + exp(−z))。 計算反向傳播的公式。在隱層,我們計算每個輸出單元產生的誤差,這是由上一層產生的誤差的加權和。然後我們將輸出層的誤差通過乘以梯度f(z)轉換到輸入層。在輸出層上,每個節點的誤差會用成本函數的微分來計算。如果節點l的成本函數是0.5*(yl-tl)^2, 那麼節點的誤差就是yl-tl,其中tl是期望值。一旦知道了∂E/∂zk的值,節點j的內星權向量wjk就可以通過yj ∂E/∂zk來進行調整。 一個線性分類器或者其他操作在原始像素上的淺層分類器不能夠區分後兩者,雖然能夠將前者歸為同一類。這就是為什麼淺分類要求有良好的特徵提取器用於解決選擇性不變性困境——提取器會挑選出圖像中能夠區分目標的那些重要因素,但是這些因素對於分辨動物的位置就無能為力了。為了加強分類能力,可以使用泛化的非線性特性,如核方法,但這些泛化特徵,比如通過高斯核得到的,並不能夠使得學習器從學習樣本中產生較好的泛化效果。傳統的方法是手工設計良好的特徵提取器,這需要大量的工程技術和專業領域知識。但是如果通過使用通用學習過程而得到良好的特徵,那麼這些都是可以避免的了。這就是深度學習的關鍵優勢。
深度學習的體系結構是簡單模塊的多層棧,所有(或大部分)模塊的目標是學習,還有許多計算非線性輸入輸出的映射。棧中的每個模塊將其輸入進行轉換,以增加表達的可選擇性和不變性。比如說,具有一個5到20層的非線性多層系統能夠實現非常復雜的功能,比如輸入數據對細節非常敏感——能夠區分白狼和薩莫耶德犬,同時又具有強大的抗干擾能力,比如可以忽略掉不同的背景、姿勢、光照和周圍的物體等。
反向傳播來訓練多層神經網路
在最早期的模式識別任務中,研究者的目標一直是使用可以訓練的多層網路來替代經過人工選擇的特徵,雖然使用多層神經網路很簡單,但是得出來的解很糟糕。直到20世紀80年代,使用簡單的隨機梯度下降來訓練多層神經網路,這種糟糕的情況才有所改變。只要網路的輸入和內部權值之間的函數相對平滑,使用梯度下降就湊效,梯度下降方法是在70年代到80年代期間由不同的研究團隊獨立發明的。
用來求解目標函數關於多層神經網路權值梯度的反向傳播演算法(BP)只是一個用來求導的鏈式法則的具體應用而已。反向傳播演算法的核心思想是:目標函數對於某層輸入的導數(或者梯度)可以通過向後傳播對該層輸出(或者下一層輸入)的導數求得(如圖1)。反向傳播演算法可以被重復的用於傳播梯度通過多層神經網路的每一層:從該多層神經網路的最頂層的輸出(也就是改網路產生預測的那一層)一直到該多層神經網路的最底層(也就是被接受外部輸入的那一層),一旦這些關於(目標函數對)每層輸入的導數求解完,我們就可以求解每一層上面的(目標函數對)權值的梯度了。
很多深度學習的應用都是使用前饋式神經網路(如圖1),該神經網路學習一個從固定大小輸入(比如輸入是一張圖)到固定大小輸出(例如,到不同類別的概率)的映射。從第一層到下一層,計算前一層神經元輸入數據的權值的和,然後把這個和傳給一個非線性激活函數。當前最流行的非線性激活函數是rectified linear unit(ReLU),函數形式:f(z)=max(z,0)。過去的幾十年中,神經網路使用一些更加平滑的非線性函數,比如tanh(z)和1/(1+exp(-z)),但是ReLU通常會讓一個多層神經網路學習的更快,也可以讓一個深度網路直接有監督的訓練(不需要無監督的pre-train)。
達到之前那種有pre-train的效果。通常情況下,輸入層和輸出層以外的神經單元被稱為隱藏單元。隱藏層的作用可以看成是使用一個非線性的方式打亂輸入數據,來讓輸入數據對應的類別在最後一層變得線性可分。
在20世紀90年代晚期,神經網路和反向傳播演算法被大多數機器學習團隊拋棄,同時也不受計算機視覺和語音識別團隊的重視。人們普遍認為,學習有用的、多級層次結構的、使用較少先驗知識進行特徵提取的這些方法都不靠譜。確切的說是因為簡單的梯度下降會讓整個優化陷入到不好的局部最小解。
實踐中,如果在大的網路中,不管使用什麼樣的初始化條件,局部最小解並不算什麼大問題,系統總是得到效果差不多的解。最近的理論和實驗表明,局部最小解還真不是啥大問題。相反,解空間中充滿了大量的鞍點(梯度為0的點),同時鞍點周圍大部分曲面都是往上的。所以這些演算法就算是陷入了這些局部最小值,關系也不太大。
2006年前後,CIFAR(加拿大高級研究院)把一些研究者聚集在一起,人們對深度前饋式神經網路重新燃起了興趣。研究者們提出了一種非監督的學習方法,這種方法可以創建一些網路層來檢測特徵而不使用帶標簽的數據,這些網路層可以用來重構或者對特徵檢測器的活動進行建模。通過預訓練過程,深度網路的權值可以被初始化為有意思的值。然後一個輸出層被添加到該網路的頂部,並且使用標準的反向傳播演算法進行微調。這個工作對手寫體數字的識別以及行人預測任務產生了顯著的效果,尤其是帶標簽的數據非常少的時候。
使用這種與訓練方法做出來的第一個比較大的應用是關於語音識別的,並且是在GPU上做的,這樣做是因為寫代碼很方便,並且在訓練的時候可以得到10倍或者20倍的加速。2009年,這種方法被用來映射短時間的系數窗口,該系統窗口是提取自聲波並被轉換成一組概率數字。它在一組使用很少詞彙的標準的語音識別基準測試程序上達到了驚人的效果,然後又迅速被發展到另外一個更大的數據集上,同時也取得驚人的效果。從2009年到到2012年底,較大的語音團隊開發了這種深度網路的多個版本並且已經被用到了安卓手機上。對於小的數據集來說,無監督的預訓練可以防止過擬合,同時可以帶來更好的泛化性能當有標簽的樣本很小的時候。一旦深度學習技術重新恢復,這種預訓練只有在數據集合較少的時候才需要。
然後,還有一種深度前饋式神經網路,這種網路更易於訓練並且比那種全連接的神經網路的泛化性能更好。這就是卷積神經網路(CNN)。當人們對神經網路不感興趣的時候,卷積神經網路在實踐中卻取得了很多成功,如今它被計算機視覺團隊廣泛使用。 卷積神經網路
卷積神經網路被設計用來處理到多維數組數據的,比如一個有3個包含了像素值2-D圖像組合成的一個具有3個顏色通道的彩色圖像。很多數據形態都是這種多維數組的:1D用來表示信號和序列包括語言,2D用來表示圖像或者聲音,3D用來表示視頻或者有聲音的圖像。卷積神經網路使用4個關鍵的想法來利用自然信號的屬性:局部連接、權值共享、池化以及多網路層的使用。
圖2 卷積神經網路內部
一個典型的卷積神經網路結構(如圖2)是由一系列的過程組成的。最初的幾個階段是由卷積層和池化層組成,卷積層的單元被組織在特徵圖中,在特徵圖中,每一個單元通過一組叫做濾波器的權值被連接到上一層的特徵圖的一個局部塊,然後這個局部加權和被傳給一個非線性函數,比如ReLU。在一個特徵圖中的全部單元享用相同的過濾器,不同層的特徵圖使用不同的過濾器。使用這種結構處於兩方面的原因。首先,在數組數據中,比如圖像數據,一個值的附近的值經常是高度相關的,可以形成比較容易被探測到的有區分性的局部特徵。其次,不同位置局部統計特徵不太相關的,也就是說,在一個地方出現的某個特徵,也可能出現在別的地方,所以不同位置的單元可以共享權值以及可以探測相同的樣本。在數學上,這種由一個特徵圖執行的過濾操作是一個離線的卷積,卷積神經網路也是這么得名來的。
卷積層的作用是探測上一層特徵的局部連接,然而池化層的作用是在語義上把相似的特徵合並起來,這是因為形成一個主題的特徵的相對位置不太一樣。一般地,池化單元計算特徵圖中的一個局部塊的最大值,相鄰的池化單元通過移動一行或者一列來從小塊上讀取數據,因為這樣做就減少的表達的維度以及對數據的平移不變性。兩三個這種的卷積、非線性變換以及池化被串起來,後面再加上一個更多卷積和全連接層。在卷積神經網路上進行反向傳播演算法和在一般的深度網路上是一樣的,可以讓所有的在過濾器中的權值得到訓練。
深度神經網路利用的很多自然信號是層級組成的屬性,在這種屬性中高級的特徵是通過對低級特徵的組合來實現的。在圖像中,局部邊緣的組合形成基本圖案,這些圖案形成物體的局部,然後再形成物體。這種層級結構也存在於語音數據以及文本數據中,如電話中的聲音,因素,音節,文檔中的單詞和句子。當輸入數據在前一層中的位置有變化的時候,池化操作讓這些特徵表示對這些變化具有魯棒性。
卷積神經網路中的卷積和池化層靈感直接來源於視覺神經科學中的簡單細胞和復雜細胞。這種細胞的是以LNG-V1-V2-V4-IT這種層級結構形成視覺迴路的。當給一個卷積神經網路和猴子一副相同的圖片的時候,卷積神經網路展示了猴子下顳葉皮質中隨機160個神經元的變化。卷積神經網路有神經認知的根源,他們的架構有點相似,但是在神經認知中是沒有類似反向傳播演算法這種端到端的監督學習演算法的。一個比較原始的1D卷積神經網路被稱為時延神經網路,可以被用來識別語音以及簡單的單詞。
20世紀90年代以來,基於卷積神經網路出現了大量的應用。最開始是用時延神經網路來做語音識別以及文檔閱讀。這個文檔閱讀系統使用一個被訓練好的卷積神經網路和一個概率模型,這個概率模型實現了語言方面的一些約束。20世紀90年代末,這個系統被用來美國超過10%的支票閱讀上。後來,微軟開發了基於卷積神經網路的字元識別系統以及手寫體識別系統。20世紀90年代早期,卷積神經網路也被用來自然圖形中的物體識別,比如臉、手以及人臉識別(face recognition )。
使用深度卷積網路進行圖像理解
21世紀開始,卷積神經網路就被成功的大量用於檢測、分割、物體識別以及圖像的各個領域。這些應用都是使用了大量的有標簽的數據,比如交通信號識別,生物信息分割,面部探測,文本、行人以及自然圖形中的人的身體部分的探測。近年來,卷積神經網路的一個重大成功應用是人臉識別。
值得一提的是,圖像可以在像素級別進行打標簽,這樣就可以應用在比如自動電話接聽機器人、自動駕駛汽車等技術中。像Mobileye以及NVIDIA公司正在把基於卷積神經網路的方法用於汽車中的視覺系統中。其它的應用涉及到自然語言的理解以及語音識別中。
圖3 從圖像到文字
盡管卷積神經網路應用的很成功,但是它被計算機視覺以及機器學習團隊開始重視是在2012年的ImageNet競賽。在該競賽中,深度卷積神經網路被用在上百萬張網路圖片數據集,這個數據集包含了1000個不同的類。該結果達到了前所未有的好,幾乎比當時最好的方法降低了一半的錯誤率。這個成功來自有效地利用了GPU、ReLU、一個新的被稱為dropout的正則技術,以及通過分解現有樣本產生更多訓練樣本的技術。這個成功給計算機視覺帶來一個革命。如今,卷積神經網路用於幾乎全部的識別和探測任務中。最近一個更好的成果是,利用卷積神經網路結合回饋神經網路用來產生圖像標題。
如今的卷積神經網路架構有10-20層採用ReLU激活函數、上百萬個權值以及幾十億個連接。然而訓練如此大的網路兩年前就只需要幾周了,現在硬體、軟體以及演算法並行的進步,又把訓練時間壓縮到了幾小時。
基於卷積神經網路的視覺系統的性能已經引起了大型技術公司的注意,比如Google、Facebook、Microsoft、IBM,yahoo!、Twitter和Adobe等,一些快速增長的創業公司也同樣如是。
卷積神經網路很容易在晶元或者現場可編程門陣列(FPGA)中高效實現,許多公司比如NVIDIA、Mobileye、Intel、Qualcomm以及Samsung,正在開發卷積神經網路晶元,以使智能機、相機、機器人以及自動駕駛汽車中的實時視覺系統成為可能。
分布式特徵表示與語言處理
與不使用分布式特徵表示(distributed representations )的經典學習演算法相比,深度學習理論表明深度網路具有兩個不同的巨大的優勢。這些優勢來源於網路中各節點的權值,並取決於具有合理結構的底層生成數據的分布。首先,學習分布式特徵表示能夠泛化適應新學習到的特徵值的組合(比如,n元特徵就有2n種可能的組合)。其次,深度網路中組合表示層帶來了另一個指數級的優勢潛能(指數級的深度)。
多層神經網路中的隱層利用網路中輸入的數據進行特徵學習,使之更加容易預測目標輸出。下面是一個很好的示範例子,比如將本地文本的內容作為輸入,訓練多層神經網路來預測句子中下一個單詞。內容中的每個單詞表示為網路中的N分之一的向量,也就是說,每個組成部分中有一個值為1其餘的全為0。在第一層中,每個單詞創建不同的激活狀態,或單詞向量(如圖4)。在語言模型中,網路中其餘層學習並轉化輸入的單詞向量為輸出單詞向量來預測句子中下一個單詞,可以通過預測詞彙表中的單詞作為文本句子中下一個單詞出現的概率。網路學習了包含許多激活節點的、並且可以解釋為詞的獨立特徵的單詞向量,正如第一次示範的文本學習分層表徵文字元號的例子。這些語義特徵在輸入中並沒有明確的表徵。而是在利用「微規則」(『micro-rules』,本文中直譯為:微規則)學習過程中被發掘,並作為一個分解輸入與輸出符號之間關系結構的好的方式。當句子是來自大量的真實文本並且個別的微規則不可靠的情況下,學習單詞向量也一樣能表現得很好。利用訓練好的模型預測新的事例時,一些概念比較相似的詞容易混淆,比如星期二(Tuesday)和星期三(Wednesday),瑞典(Sweden)和挪威(Norway)。這樣的表示方式被稱為分布式特徵表示,因為他們的元素之間並不互相排斥,並且他們的構造信息對應於觀測到的數據的變化。這些單詞向量是通過學習得到的特徵構造的,這些特徵不是由專家決定的,而是由神經網路自動發掘的。從文本中學習得單詞向量表示現在廣泛應用於自然語言中。
圖4 詞向量學習可視化
特徵表示問題爭論的中心介於對基於邏輯啟發和基於神經網路的認識。在邏輯啟發的範式中,一個符號實體表示某一事物,因為其唯一的屬性與其他符號實體相同或者不同。該符號實例沒有內部結構,並且結構與使用是相關的,至於理解符號的語義,就必須與變化的推理規則合理對應。相反地,神經網路利用了大量活動載體、權值矩陣和標量非線性化,來實現能夠支撐簡單容易的、具有常識推理的快速「直覺」功能。
在介紹神經語言模型前,簡述下標准方法,其是基於統計的語言模型,該模型沒有使用分布式特徵表示。而是基於統計簡短符號序列出現的頻率增長到N(N-grams,N元文法)。可能的N-grams的數字接近於VN,其中V是詞彙表的大小,考慮到文本內容包含成千上萬個單詞,所以需要一個非常大的語料庫。N-grams將每個單詞看成一個原子單元,因此不能在語義相關的單詞序列中一概而論,然而神經網路語言模型可以,是因為他們關聯每個詞與真是特徵值的向量,並且在向量空間中語義相關的詞彼此靠近(圖4)。
遞歸神經網路
首次引入反向傳播演算法時,最令人興奮的便是使用遞歸神經網路(recurrent neural networks,下文簡稱RNNs)訓練。對於涉及到序列輸入的任務,比如語音和語言,利用RNNs能獲得更好的效果。RNNs一次處理一個輸入序列元素,同時維護網路中隱式單元中隱式的包含過去時刻序列元素的歷史信息的「狀態向量」。如果是深度多層網路不同神經元的輸出,我們就會考慮這種在不同離散時間步長的隱式單元的輸出,這將會使我們更加清晰怎麼利用反向傳播來訓練RNNs(如圖5,右)。
圖5 遞歸神經網路
RNNs是非常強大的動態系統,但是訓練它們被證實存在問題的,因為反向傳播的梯度在每個時間間隔內是增長或下降的,所以經過一段時間後將導致結果的激增或者降為零。
由於先進的架構和訓練方式,RNNs被發現可以很好的預測文本中下一個字元或者句子中下一個單詞,並且可以應用於更加復雜的任務。例如在某時刻閱讀英語句子中的單詞後,將會訓練一個英語的「編碼器」網路,使得隱式單元的最終狀態向量能夠很好地表徵句子所要表達的意思或思想。這種「思想向量」(thought vector)可以作為聯合訓練一個法語「編碼器」網路的初始化隱式狀態(或者額外的輸入),其輸出為法語翻譯首單詞的概率分布。如果從分布中選擇一個特殊的首單詞作為編碼網路的輸入,將會輸出翻譯的句子中第二個單詞的概率分布,並直到停止選擇為止。總體而言,這一過程是根據英語句子的概率分布而產生的法語詞彙序列。這種簡單的機器翻譯方法的表現甚至可以和最先進的(state-of-the-art)的方法相媲美,同時也引起了人們對於理解句子是否需要像使用推理規則操作內部符號表示質疑。這與日常推理中同時涉及到根據合理結論類推的觀點是匹配的。
剩下的超過字數限制了……