從Random Walk談到Bacterial foraging optimization algorithm(BFOA),再談到Ramdom Walk Graph Segmentation圖分割算法


1. 從細菌的趨化性談起

0x1:物質化學濃度梯度

類似於概率分布中概率密度的概念。在溶液中存在不同的濃度區域。

如放一顆糖在水盆里,糖慢慢溶於水,糖附近的水含糖量比遠離糖的水含糖量要高,也就是糖附近的水糖的濃度高,離糖越遠的水糖的濃度越低。

這種濃度的漸減(反方向就是漸增)叫做濃度梯度。可以用單位距離內濃度的變化值來表示。同樣,溫度、電場強度、磁場強度、重力場、都有梯度的。

化學溶液的濃度梯度的概念和概率分布的梯度類似,都代表了值下降的方向

0x2:趨化性細菌的運動方式

細菌趨化性是指有運動能力的細菌對物質化學濃度梯度作出的反應,使細菌趨向有益刺激,逃避有害刺激。

Engelmann 和 Pfeffer 發現細菌的運動不是任意的,而是定向移動。直到1960年,Alder深入研究了細菌趨化性的分子機制,提出大腸桿菌(Escherichia coli)對氨基酸以及糖的趨化性是由位於細胞表面的受體蛋白調節的,並由細胞內分子傳遞信號最終影響細菌的運動。

以大腸桿菌為例,一個細胞有4~10根鞭毛,鞭毛快速旋轉使得細胞具有運動的能力。

鞭毛的運動方式分為 2 種:

1. 順時針旋轉(clockwise,CW) - 按照本輪計算的優化方向進行迭代調整

當鞭毛順時針旋轉時,細胞鞭毛分開,原地做翻滾運動,來調整運動方向

 

筆者思考:CW過程我們可以理解為LMS過程中計算最速下降梯度方向,但是生物機制沒法一步得到最速梯度方向,而且我們知道液體中轉動物體也存在粘滯慣性,因此,細菌在CW過程中實際上是在計算一個大致正確的梯度下降方向。它並不是一次得到最優結果,而是依靠多次地不斷迭代逐漸靠近最優

2. 逆時針旋轉(counter-clockwise, CCW)

1)在存在局部濃度梯度變化的環境中調整方式 - GD過程

當鞭毛逆時針旋轉時,鞭毛擰成一束,產生向前的推動力。

CCW過程中前進的這段,我們可以理解為梯度下降中,每次調整的總距離,即

但是細菌並不是說一次CW調整方向后,就一直保持前進。

細菌先直線運動一段距離 然后通過比較現有濃度和過去濃度(計算濃度梯度)來控制鞭毛接下來的運動方式(根據濃度梯度調整下一步大致方向)。

1. 當誘導劑濃度降低或趨避劑濃度增加時,翻滾頻率增加(縮短學習率),遠離不利環境;
2. 反之,翻滾頻率降低,細菌泳動,趨向有利環境(類似梯度下降中加入momentum動量因素,如果方向對了就繼續保持);

2)在局部環境中濃度梯度都相等時的調整方式 - Ramdom過程

我們知道,溶液中濃度的傳播是一種漸變衰減的形態,即一個濃度源的濃度梯度只能傳播一定的范圍,超過一定的范圍就會衰減到幾乎無法感知。這就造成了溶液中的濃度梯度看起來就像一個個的小山包此起彼伏。有山包就有山谷、平原。

在無化學刺激物質或濃度相同的化學環境中(可能剛好存在於一個濃度梯度的平原中),細菌先平穩地直線泳動一段距離,然后突然翻滾改變運動方向,再向前泳動, 再翻滾。

泳動和翻滾循序變化,其特點為隨機選擇運動方向

這就為細菌提供了一種能力,即脫離困境的能力。即使不小心處於一個沒有營養的溶液區域,或者說當前離營養源距離比較遠。但是依靠自己的ramdom walk機制,在概率上,通過一定的步數后,是有機會到達存在濃度梯度的區域的,到達了濃度梯度區域后就簡單了,細菌自身的趨向性會開始發揮作用,幫助喜歡達到營養源中心。

筆者思考:細菌的濃度梯度趨向性雖然很驚艷,但是也還算平常,畢竟冷熱氣流也存在密度交換形成暴風,濃度的趨向是自然現象。但是細菌的這個ramdom walk隨機試探機制就太神奇了,SGD(隨機梯度下降)的發明就是參考了細菌的這種ramdom walk思想。ramdom walk使優化過程具備脫離局部鞍點的能力

0x3:細菌趨化性分子機制

趨化性的發現刺激了許多科學家的興趣,Julius Adler用基因、生物化學和行為學方法分析大腸桿菌的趨化行為,為詳細了解細菌趨化性分子機制做了鋪墊。

趨化細菌膜表面存在專一性的化學受體,以此來感知外界環境中化學物質的濃度變化,並將接收到的化學信號轉化為細胞內信號,進而來控制鞭毛的運動方式,表現出相應的趨化性。

通常信號轉導途徑分 3個部分

1. 膜上趨化受體接收信號;
2. 從膜 受體到鞭毛馬達的信號轉導;
3. 對最初信號輸入的適應。

Relevant Link:

http://www.casb.org.cn/PublishRoot/casb/2015/6/casb14110008.pdf

 

2. 隨機游走數學模型

下圖中黑點表示了不同的隨機運動實驗,每個球的運動軌跡用不同的顏色表示,可以看到,每個球都呈現出不同的軌跡顏色。這些球的運動可以被統稱為隨機運動

0x1:一維空間下的等概論隨機運動(伯努利隨機游走)

最簡單的隨機運動形式就是一維運動。

圖中的黑點從原點開始,它有各50%的概率向左和向右移動,黑點每次只能隨機選擇一個方向移動一格。

下圖展示了這個黑點運行5次后的可能的運動軌跡:

黑點最后停在了“-1”這個點上。這個時候我們肯定有疑問了,這是巧合嗎?還是有內在的規律在支配着這一切?

1. 黑點隨機運動的本質是什么?

為了討論這個問題,我們對“黑點隨機運動(ramdom walk)”這個實驗進行數學抽象。

1. 設函數 F(x) 為每次移動遠離原點的距離(只針對這次移動而言,不考慮前一次的位置),這是一個隨機變量函數;
2. 同時,F(x) 由代表每次移動的隨機變量 an 決定,F(x) = F(an) = an。顯然,an 是一個離散型隨機變量,取值可能為 -1/+1,所以 F(x) 的可能取值也為 -1/+13. F(x) 的損失函數 loss(E(x)) = loss(F(x) - 0)= loss(an - 0),代表了對黑點隨機運動的一種抽象化數值考量;

有了抽象表示,接下來我們從損失函數的角度來討論:在不同損失函數的背景下,黑點的隨機運動

同時,筆者這里要重點強調,不同的損失函數代表的實際物理意義是不同的

1. 在均值損失函數背景下,對黑點隨機運動的計算本質上是在計算最后黑點停留的位置(相對原點)

在均值損失函數條件下,我們要求黑點N次隨機運動后停留的位置,就是在求函數 F(x) 的均值。

現在假設我們讓黑點運行N次(N可以為任意數字)作為一次實驗,記錄最后黑點停止的位置。

顯然,每次運行N次的結果都會不一樣,那我們該怎么去形式化地認知這個現象呢?

這就要引入極限均值的思想。

我們用<d>表示當N趨向於無限時,黑點最后距離原點的距離的均值;<an>表示黑點每次運動前進的均值。所以有下式:

<d> = <(a1 + a2 + a3 + ... + aN)> = <a1> + <a2> + <a3> + ... + <aN>

同時,可以計算得到,<a1>=0。 因為如果我們重復這個實驗趨向於無限次,a1有相同的概率得到 -1 或者 +1,所以均值為0。以此類推:

<d> = <a1> + <a2> + <a3> + ... + <aN> = 0 + 0 + 0 + ... + 0 = 0

這個分析過程可以使用數學中的數學期望進行抽象。

1)數學期望的定義

如果隨機變量只取得有限個值或無窮能按一定次序一一列出,其值域為一個或若干個有限或無限區間,這樣的隨機變量稱為離散型隨機變量。

離散型隨機變量的一切可能的取值 xi 與對應的概率 p(xi) 乘積之和稱為該離散型隨機變量的數學期望,記為 E(x)。它是簡單算法平均的一種推廣,類似加權平均。

數學期望為描述隨機過程和隨機變量提供了一種可量化的工具。

2)黑點最后停止的位置等於黑點隨機運動的數學期望

E(x) = -1 * 0.5 + 1 * 0.5 = 0

當然,這種等價性只有在 N 趨近於無限次的前提下才能成立。

3)平均距離說明了什么?

從平均的角度來看,這個結果表明在大量實驗下,黑點最終會停留在原點位置,這也是上帝是公平的一種數學抽象表示。

2. 在均方根(root-mean-squared)損失函數的背景下對黑點隨機運動的計算本質上是在計算黑點總共運行的距離(恆正值)

1)計算均方根損失

在一次實驗中,d 可能為正值或者負值。但是 d2 永遠是正值。

<d2> = <(a1 + a2 + a3 + ... + aN)2> = <(a1 + a2 + a3 + ... + aN(a1 + a2 + a3 + ... + aN)>

= (<a12> + <a22> + <a32> + ... + <aN2>) + 2 (<a1a2> + <a1a3> + ... <a1aN> + <a2a3> + ... <a2aN> + ...)

我們逐項分解來看:

<a12> = 1,因為a1取-1和+1的概率是相等的。同樣的道理<a22>, <a32>, ...<aN2>

接下來看<a1a2>,有4種可能的取值,每種取值的概率都相等:

可以計算得到,<a1a2> = 0,同樣的情況對<a1a3>, <a1aN>, <a2a3>, <a2aN>成立。所以:

<d2> = (<a12> + <a22> + <a32> + ... + <aN2>) + 2 (<a1a2> + <a1a3> + ... <a1aN> + <a2a3> + ... <a2aN> + ...)

= (1 + 1 + 1 + ... +1) + 2 (0 + 0 + ... + 0 + 0 + ...) = N

接着對<d>開根號,得到:

sqrt(<d2>) = sqrt(N)

2)為什么均方根損失函數比平均值損失要大?

在機器學習最優化過程中很常用的均方根損失,有一個很好的數學特性,就是“放大誤差”,即如果某次實驗出現了和預期不一致的結果,均方根可以將這個誤差放大,而不至於被掩蓋在均值為0的假象中。

也可以這么理解,黑點每次實驗,不管是向前還是向后,都是在“運行一步的距離”,均方根並不關心前進的方向,只計算相對的前進值,因此永遠是正值。

0x2:在多維空間中的Ramdom Walk

多維空間中的ramdom walk分析方法和上一節的一維是一樣,區別只是隨機變量變成了多維隨機向量。

0x3:Ramdom Walk在現實生活中的例子

當空氣例子散布在一個房間中時,ramdom walk原理決定了一個例子從一個位置移動到另一個位置的距離。

0x4:包含偏置的隨機游走(biased random walk)

偏置可能由下列兩種情況組合而成:

1. 向不同方向行走的概率不相等,例如可能是 40%向左- 60%向右;
2. 向不同方向移動的步數(step size)不同,例如可能向左移動是1步,而向右是2步;

可以很容易想象,上述兩種偏置都是導致ramdom walk的軌跡向右偏移(net drift to the right)。換句話說,我們可以說隨機游走向右偏置了。

下圖展示了第二種偏置情況下,黑點的可能運行軌跡。

0x5:細菌的趨化性本質上是一種偏置隨機游走

1. 在沒有濃度梯度的環境下細菌呈現等概論隨機游走

嚴格來說,這個小節的標題應該叫,在不存在“局部”濃度梯度環境下,因為細菌沒有上帝視角,它只能感知到自己周圍一定范圍內的濃度梯度。

當不存在濃度梯度的時候,細菌先平穩地直線泳動一段距離,然后突然翻滾改變運動方向,再向前泳動, 再翻滾。這對應的就是等概論等步長的隨機游走過程。

2. 在有濃度梯度的環境下細菌呈現偏置隨機游走

當細菌感知到周圍存在濃度梯度的時候,細菌通過鞭毛逆時針旋轉進行方向調整,超濃度梯度增加的方向移動。這對應的就是不同方向概率不同的偏置隨機游走過程。

Relevant Link: 

https://wenku.baidu.com/view/81d7a657a36925c52cc58bd63186bceb19e8edc2.html
http://www.mit.edu/~kardar/teaching/projects/chemotaxis%28AndreaSchmidt%29/random.htm
http://www.mit.edu/~kardar/teaching/projects/chemotaxis%28AndreaSchmidt%29/gradients.htm 
https://blog.csdn.net/u012655441/article/details/62216304

 

3. 細菌覓食優化算法 - Bacterial foraging optimization algorithm(BFOA)

0x1:BFOA的發展歷史

細菌覓食優化算法(BFOA)被Passino所提出,對於仿生學優化算法大家庭來說是一個新興技術。

對於過去的50年來,優化算法(像遺傳算法(GA)、進化規划(EA)、進化策略(ES)),從進化和自然遺傳上給了研究人員許多的靈感,已經占領了優化算法領域。

最近幾年,自然群體激發了算法(像粒子群優化(PSO)算法、蟻群算法(ACO)),已經找到了它們應用領域。

跟隨着相同的群體算法趨勢,Passino提出了BFOA算法。

大腸桿菌群體覓食策略的應用在多元函數最優化算法中是一個很關鍵的想法原型。

1. 細菌以一種可以最大限度的提高單位時間內獲得能量的方式去尋找食物;
2. 個體細菌通過發送信號來與其他的細菌進行交流;

細菌在考慮前面兩個因素之后做出進行覓食的決定。這個過程中,當尋找到食物后細菌做出最小的步長的移動,這個過程叫做趨化

BFOA的關鍵思想是在問題搜索空間模仿細菌趨化運動

從該算法出現以來,BFOA吸引了許多來自不同知識領域的研究人員的關注,主要是由於它的生物學驅動方式和神奇優美的結構。研究人員正在嘗試着去混合BFOA算法與其他不同的算法,盡量去探索該算法的局部和全局兩個方面的特性。

它已經被應用到許多現實世界的真實問題上。可以預見,數學模型,適應性,算法針對特定場景問題的定制化修改可能是BFOA將來的主要研究方向。

0x2:BFOA算法的生物動力模型

1. 細菌系統中主要4種機制

1)趨化運動

在實際的細菌覓食過程中,運動是靠一系列拉伸的鞭毛來實現的。鞭毛幫助的大腸桿菌細菌翻滾游泳,這是由細菌在覓食時執行兩個基本操作

1. 翻轉:當它們順時針方向翻轉時,每一根鞭毛都會拉動細胞。這導致了鞭毛的獨立運動,並且最終以最少的代價去翻轉。在糟糕的地方則頻繁地翻轉,去尋找一種營養梯度;
2. 游泳:逆時針方向移動鞭毛有助於細菌以非常快的速度游泳;

細菌經歷了趨化,朝着它們喜歡的營養梯度地方移動並且避免進入有害的環境。

通常情況下,細菌在友好的環境中會移動較長的一段距離。下圖展示了細菌的兩種運動模式:

Fig.1. Swim and tumble of a bacterium

2)復制

當它們獲得了足夠的食物,它們的長度增加以及面對着合適的溫度,它們將從自己本身的中間斷裂開來,形成兩個新的細菌。這個現象啟發Passino在BFOA中引進繁殖事件

3)消除-分散

由於突然的環境變化或攻擊發生后,趨化過程可能被破壞,一群細菌可能會轉移到其他地方或者一些細菌可能被引進到細菌群中。這些構成了真實細菌環境中的消除-分散事件

4)群體

一個區域內的所有細菌被殺死或者一組細菌分散到環境的新部分

2. 形式化定義細菌系統機制

現在我們假設每個細菌的“人生終極目標”為 J(θ),每個細菌的各種趨化、繁衍等機制,目的都是想要找到最小的 J(θ),其中θ ∈ R (θ is a p-dimensional vector of real numbers)。這樣,就可以在最優化理論的框架內對細菌的各種生存機制進行分析。

注意,我們沒有關於梯度∇J ( θ ) 的測量或者分析描述,實際上,細菌並能准確計算出本次移動的濃度梯度∇J ( θ )

BFOA模擬了細菌系統中的四個觀察到的主要機制:趨化,群體,復制以及消除-分散。

BFOA解決的是一個無梯度優化問題

一個虛擬細菌事實上是一個實驗方案(可能稱為搜索代理)在其優化面移動(見Figure2),來尋找全局最優解。

Fig.2. 每個細菌都在尋找全局最優解,同時又一起構成一個整體群體

為了方便后續的套路,我們進行符號化定義:

1. 定義 j 作為趨化步驟索引、k 作為復制步驟索引、l 作為消除-分散步驟索引;
2. p:搜索空間維度;
3. S:群體中細菌的總數;
4. Nc:趨化步驟的步數;
5. Ns:游泳長度;
6. Nre:復制步驟的次數;
7. Ned:消除-分散事件的次數;
8. Ped:消除-分散概率;
9. P( j , k , l ) = {θ ( j , k , l ) | i = 1,2,..., S}  :代表 j 趨化步驟中,S細菌群體中的每一個成員的位置、k 復制步驟、l 消除-分散事件;
10. J( i,j,k,l ):表示在 i 細菌搜索定位中的消耗(代價)。我們可以將J當作“cost”代價來做參考(用優化理論的術語);

對於現實世界中的細菌種群,S可能(可以)可能是非常大的(例如:S=上萬),但是p=3。這很容易理解,一個培養皿中,有上萬的細菌在三維的溶液中進行移動。

在我們的BFOA計算模擬中,種群數代表了我們需要進行全局最優化的目標函數數量,通常這個數字不會非常大(幾十、幾百最多了),例如后面會討論的ramdom walk圖分割算法。

同時,BFOA允許p>3,以至於我們能夠運用這種方法在高維度優化問題中。

下面我們將簡要的描述這四種BFOA中的主要步驟。

1)趨化

這個過程模擬一個大腸桿菌細胞的運動,通過利用鞭毛的游泳和翻轉。它可以在一定時間內朝着一個相同的方向游去或者也可以翻轉,或者在整個生命周期中在兩中操作模式之間來回的輪流替換。
假設 θ<i>( j,k,l ) 代表 i 細菌在 j 趨化、k 復制,l 消除-分散步驟中。C(i) 是翻轉過程中采取指定的隨機方向的步長的大小(運行長度單元)。

在細菌的一次趨向過程中,細菌的運動方向可能根據下式表示:

其中 △i 指定為一個隨機方向向量,元素范圍為[-1,1]

2)群聚

群聚這個有趣的群體行為,已經在好幾種細菌物種里被發現有類似的行為,包括大腸桿菌,鼠傷寒沙門氏菌。

其中復雜性和穩定性的時空格局(群聚)形成在半固體培養基。在群聚中,細胞不是但個體的行為,而是個體與個體間互相影響的復雜行為模式。

在一次實驗中,當使用一個營養化療效果器放置半固體基質到其中時,大腸桿菌細胞依靠拉動營養梯度來安排自己在一個群聚圈中。

在另一次獨立實驗中,當使用一個高等級的琥珀酸去刺激時,大腸桿菌細胞釋放一個有吸引力的谷草,這可以幫助他們去聚集成一個群組,從而移動成像高密度細菌群體的同心圓形狀圖案。

這種細胞-細胞信號傳導在大腸桿菌群體中可以通過下面的函數來表示出來:

 

其中表示是目標函數值;

S是細菌的總數;

p是將要被優化的變量的數量(即搜索空間的維度);

每一個細菌都是p維搜索域中的一個點;

是需要被搜索優化的系數(超參數)。

3)復制

至少當每一個健康的細菌無性分裂成兩個細菌,然后放置在原先的位置,健康的細菌才最終死亡。這樣將保持細菌群體大小的不變。

4)消除和擴散

細菌生活的環境逐漸的改變或者突然的改變都可能由於各種各樣的原因而發生。

例如:當地顯著的氣溫上升可能殺死一組目前生活在一個區域內且有高濃度營養鹽梯度的細菌。以至於一個區域內的細菌都被殺死或者一組細菌擴散到一個新的區域。這是一種種群群體移動的現象。

BFOA對這一現象的模式方式如下:

一些細菌被以很小概率的隨機地清算掉,隨后新的替代品細胞們在搜索空間被隨機初始化后。

0x3:BFOA算法流程

參數:
【步驟 1】初始化參數 p,S,Nc,Ns,Nre,Ned,Ped,C(i)(i=1,2,…S),θi
算法:
【步驟 2】消除-擴散 循環 loop:l=l+1
【步驟 3】復制循環 Loop:k=k+1
【步驟 4】趨化循環 Loop:j=j+1
  [a] i=1,2,……S 細菌 i 進化趨化移動

  [b] 計算適應值函數 J(i,j,k,l)

 

   [c] 讓 保存值,因為通過移動我們可能找到更好的。

【步驟 5】如果 j < Nc,跳轉到步驟4。這種情況下繼續進行趨化,因為細菌的生命並未結束。
【步驟 6】復制 - 消除:
  [a] 根據給定的 k 跟 l,對i=1,2,……S,循環,讓 

作為 i 細菌的一種它生命周期中度過多少營養以及怎樣成功的避免有害物質的數值化衡量。高代價意味着低健康
  [b] 擁有最高的 Jhealth值的 Sr 細菌死亡,擁有最低的Jhealth值的細菌分裂開來(結果放置在它們原先的父母的位置)。
【步驟 7】如果 K < Nre,跳到步驟3。這種情況下,我們沒有達到制定復制的數量,所以,我們開始下一次趨化循環,產生后代。
【步驟 8】驅散:以概率Ped 進行循環 i=1,2,……S,驅散每一個細菌(保持持續不變的細菌種群數量)。如果 l < Ned,然后跳轉到步驟2;否則結束。 

流程圖如下所示:

Relevant Link:

http://www2.ece.ohio-state.edu/~passino/PapersToPost/BFO-IJSIR.pdf
https://ieeexplore.ieee.org/document/1004010 
https://www.cnblogs.com/L-Arikes/p/3734353.html

 

4. 一種全局最優化算法  - 隨機游走算法(Random Walk)

0x1:隨機游走算法步驟

設目標函數 f(x) 是一個含有 n 個變量的多元函數,x=(x1,x2,...,xn) n 維向量。f(x) 的超曲面空間就是我們要進行搜索的向量空間。

1)給定初始迭代點 x,初始行走步長λ,控制精度ϵ(ϵ是一個非常小的正數,用於控制結束算法);

2)給定迭代控制次數 N,k 為當前迭代次數,置 k=1;

3)當 k < N 時,隨機生成一個(−1,1) 之間的 n 維向量 u=(u1,u2,⋯,un),(−1 < ui < 1,i=1,2,⋯,n),並將其標准化得到。令 x1 = x + λu′,完成第一步游走嘗試(注意這一步僅僅只是嘗試)。

4)計算函數值

  4.1)如果 f(x1) < f(x),即找到了一個比初始值好的點,那么 k 重新置為1,同時將 x1 變為 x(完成實際的前進),回到第2步;

  4.2)否則 k = k+1,回到第3步,繼續其他方向的隨機游走的嘗試。

5)如果連續 N 次都找不到更優的值,則認為,最優解就在以當前最優解為中心,當前步長為半徑的 n 維球內(如果是三維,則剛好是空間中的球體)。此時:

  5.1)如果 λ < ϵ,則結束算法,即算法已經收斂;

  5.2)否則,令 λ= λ / 2,減小學習率,回到第1步,開始新一輪游走。

0x2:隨機游走的代碼實現

我們假設目標函為,實際的目標函數可能是任意形式的,根據你自己在項目里的實際場景而定。

我們的目標是f(r) 的最大值。

該函數是一個多峰函數,在 (5050) 處取得全局最大值 1.1512,第二最大值在其全局最大值附近,采用一般的優化方法很容易陷入局部極大值點。

這里是求解函數的最大值問題,可以將其轉化為求目標函數的相反數的最小值問題,即對偶求解思想。具體代碼如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__  import print_function
import math
import random

N = 100     # 迭代次數
step = 0.5  # 初始步長
epsilon = 0.00001   # 收斂閾值
variables = 2   # 變量數目,搜索空間的維度
x = [49, 49]     # 初始點坐標
walk_num = 1    # 初始化隨機游走次數

print("迭代次數:", N)
print("初始步長:", step)
print("epsilon:", epsilon)
print("變量數目:", variables)
print("初始點坐標:", x)


# 定義目標函數
def obj_function(p):
    r = math.sqrt((p[0]-50)**2 + (p[1]-50)**2) + math.e
    f = math.sin(r) / r + 1
    return -f


# 開始隨機游走
while(step > epsilon):  # 判斷是否收斂停止算法
    k = 1   # 初始化計數器
    while(k < N):
        u = [random.uniform(-1, 1) for i in range(variables)]       # 隨機向量
        # u1 為標准化之后的隨機向量
        u1 = [u[i] / math.sqrt(sum([u[i]**2 for i in range(variables)])) for i in range(variables)]
        x1 = [x[i] + step*u1[i] for i in range(variables)]      # 隨機游走嘗試
        if(obj_function(x1) < obj_function(x)):     # 如果找到了更優點
            k = 1   # 重置 k
            x = x1  # 更新坐標
        else:
            k += 1  # 繼續下一次隨機游走嘗試
    step = step/2
    print("第 %d 次隨機游走完成。" % walk_num)
    walk_num += 1
print("隨機游走次數:", walk_num-1)
print("最終最優點:", x)
print("最終最優值:", obj_function(x))

1. 隨機游走依然容易陷入局部鞍點

基本的隨機游走算法對於初始點比較敏感,可以看出,當初始點位於最優點附件時,可以很好地達到全局最優點;

如果將初始點設置得離最優點較遠,比如設置初始點為(10,10)時,其他參數不變,得到結果為:

可以發現,隨機游走陷入了局部最優點。

2. 擴大嘗試次數 N、以及步長 λ 有助於脫離局部最優點

不管是SGD,還是隨機游走,都一樣面臨陷入局部最小值的問題中。解決(或者說緩解)這一問題的方法是增大迭代次數 N 以及初始步長λ,可以在一定程度上增加尋優能力。

當然,增大迭代次數 N 以及初始步長 λ 也會引入新的問題,就是增大收斂過程的抖動,可以想象,如果目標函數已經優化到真正的全局最小值點附近了,因為步長 λ 過大,目標函數會不斷在極值點附近來回擺動。

0x3:改進的隨機游走算法

改進的隨機游走算法的不同之處是在於第3步,原來是產生一個隨機向量u,現在則是產生n個隨機向量u1,u2,,unn是給定的一個正整數。

n ui(i=1,2,,n) 標准化得到u1u2un,利用公式 xi = x + λui,min{x1x2xn}替換原來的x1,其他步驟保持不變。

改進的核心思想在於:增加了ramdom process的干預程度,原本只有一次ramdom process,即決定一個確定的方向后進行隨機游走嘗試。改進后變為在各個維度上全部ramdom,

同時在各個向量維度上進行隨機游走嘗試,最后再綜合評價本次隨機游走嘗試的優劣。

通過這種方式改進之后,隨機游走算法的尋優能力大大提高,而且對於初始值的依賴程度也降低了。

n=10,初始點為(100,10),N=100λ=10.0ϵ=0.00001,改進的隨機游走算法實現代碼如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__  import print_function
import math
import random

N = 100     # 迭代次數
step = 10.0     # 初始步長
epsilon = 0.00001
variables = 2   # 變量數目
x = [-100,-10]  # 初始點坐標
walk_num = 1    # 初始化隨機游走次數
n = 10  # 每次隨機生成向量u的數目

print("迭代次數:", N)
print("初始步長:", step)
print("每次產生隨機向量數目:", n)
print("epsilon:", epsilon)
print("變量數目:", variables)
print("初始點坐標:", x)


# 定義目標函數
def obj_function(p):
    r = math.sqrt((p[0]-50)**2 + (p[1]-50)**2) + math.e
    f = math.sin(r)/r + 1
    return -f


# 開始隨機游走
while(step > epsilon):
    k = 1   # 初始化計數器
    while(k < N):
        # 產生n個向量u
        x1_list = []    # 存放x1的列表
        for i in range(n):
            u = [random.uniform(-1,1) for i1 in range(variables)]   # 隨機向量
            # u1 為標准化之后的隨機向量
            u1 = [u[i3]/math.sqrt(sum([u[i2]**2 for i2 in range(variables)])) for i3 in range(variables)]
            x1 = [x[i4] + step*u1[i4] for i4 in range(variables)]
            x1_list.append(x1)
        f1_list = [obj_function(x1) for x1 in x1_list]
        f1_min = min(f1_list)
        f1_index = f1_list.index(f1_min)
        x11 = x1_list[f1_index]     # 最小f1對應的x1
        if(f1_min < obj_function(x)): # 如果找到了更優點
            k = 1
            x = x11
        else:
            k += 1
    step = step / 2
    print("第%d次隨機游走完成。" % walk_num)
    walk_num += 1

print("隨機游走次數:",walk_num-1)
print("最終最優點:",x)
print("最終最優值:", obj_function(x))

可以發現,即使迭代次數N=100不大,初始點(100,10)離最優點(50,50)非常遠,改進的隨機游走算法依然可以達到最優點。

這說明了改進的隨機游走算法具有更強大的尋優能力以及對於初始點更低的依賴性。

筆者思考:不管是SGD/GD還是batch-SGD,每次FP和BP過程的權重調整都是針對所有神經元同時進行的,同一個層上的神經元收到的調整反饋都是相同的。

在這一點上,SGD跳出局部鞍點的能力就沒有改進后的隨機游走算法強

0x4:步長 λ 的意義

無論是隨機游走算法還是改進的隨機游走算法,對於步長都是非常依賴的。

步長λ越大,意味着初始可以尋找最優解的空間越大,但同時也意味着更多的迭代次數(要搜索空間變大,尋找次數變多,相應時間自然要增加)。

如果步長取得過小,即使N很大,也很難達到最優解,過早陷入局部最優。

無論對於隨機游走算法還是改進的隨機游走算法皆是如此。所以理論上步長λ越大越好。但是步長越大,迭代總次數越高,算法運行時間越長。所以實踐中可以多試驗幾次,將λ取得適當地大即可。

Relevant Link: 

http://www.cnblogs.com/lyrichu/p/7209529.html
http://www.cnblogs.com/lyrichu/p/7209529.html 

 

5. Ramdom Walk Graph Segmentation 隨機游走圖像分割算法

假設我們要對一個網絡進行模塊挖掘,那么一種可行的方法就是隨機挑選網絡中的一些節點作為種子節點,然后進行隨機游走(計算馬爾科夫矩陣),對於計算結果,我們可以只取概率較高的前幾個作為可到達節點,之后采用一種類似於序列比對的方法來將所有種子節點游走的結果進行比對拼接,然后獲得不同的模塊。這樣做的一個好處就是結果較為穩定,並且所挖掘的模塊更加完整可靠。

下面是采用上述方法得到的結果

其中相同顏色的節點屬於一個模塊。

0x1:基於隨機游走的圖像分割算法思想

隨機游走算法是一種基於圖論的分割算法,它的分割思想是,以圖像的像素為圖的頂點,相鄰像素之間的四鄰域或八鄰域關系為圖的邊(轉移概率)。以此構建網絡圖。

如圖所示,圖中小圓圈代表圖像上的每個像素點,像素點間的折線可看為權重。L1,L2,L3三個種子代表“打標點”,它可以由用戶交互式輸入,也可以是有監督學習中的打標樣本。

以未標記像素節點為初始點,RandomWalk從未標記頂點開始隨機漫步,首次到達各類標記頂點的概率代表了未標記點歸屬於標記類的可能性,把最大的概率所在類的標簽賦給未標記頂點,完成一次分割,或者說完成一次歸屬,原本未標記的頂點現在歸屬到了一個類別中。
在上圖中可以看到,L1/L2/L3 作為標記的種子點。把圖像分割成對應的三部分。

0x2:算法流程

1. 建立圖模型

1)無向連通圖

首先,定義一個連通無向圖G=(V,E),用圖G 給圖像建模。其中V是頂點集合,E是圖中任意兩個頂點的無向邊集合,對應圖像像素的連接關系,連接兩個頂點 vi 和的邊 用 vj 表示。

2)邊權重矩陣

帶權圖要為每條邊賦權值,邊 eij 的權值用 wij 表示,權重的計算公式如下:

,其中,gi 表示個像素點的灰度值、或紋理信息等參數;

3)節點轉移概率矩陣

對於圖中任意一點 vi 的轉移概率,其滿足隨機游走概率公式

Lij = di:如果 i = j:di為頂點vi的度,是連接頂點的所有邊權值之和,di=sumj wij;
Lij = -wij:如果 i j 是相鄰節點,wij 是節點i 和節點j 之間的權重;
Lij = 0:other;

可構建圖的拉普拉斯矩陣,然而拉普拉斯是非滿秩矩陣,需要添加邊界約束條件,才可根據方程組解出個各未知點的概率。也就是將圖像分割問題轉換為Dirichlet問題進行求解。Dirichlet問題即就是尋找一個滿足邊界條件的調和函數。

2. 求解狄利克雷方程

隨機游走模型的建立,可以理解為狄利克雷積分條件的離散化。其可以使用拉普拉斯矩陣來進行描述,即對隨機游走模型的求解,可以描述為如下方程的最小化求解:

以已標記的K類頂點作為邊界約束條件,求解未知點到各個類的概率。例如,求解各未知點游走到L1的概率,則以,作為約束條件。L2和L3也是同理。

因此,狄利克雷方程可以變形如下:

然后把矩陣分成標記的和未標記的。對x_U求偏微分, 一階導等於0, 得到:

對於向量x_M,其中各個元素為:

3. 模型的求解

對上述稀疏矩陣線性方程組的求解,最長用的是共軛梯度法。 

Relevant Link:

https://yq.aliyun.com/ziliao/522808
https://blog.csdn.net/hjimce/article/details/45201263
https://blog.csdn.net/u011773995/article/details/50438018
https://blog.csdn.net/menjiawan/article/details/47086423
https://blog.csdn.net/Broccoli_Lian/article/details/79739299

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM