Skip to main content

4 posts tagged with "Primordial Soup"

View All Tags

· 2 min read
Wei Ji

實驗紀錄

實驗摘要

  • 實驗日期
    • 2020-03-22
  • 實驗內容
    • 同樣使用 opencv 的函式庫,但是控制變因如下:
      1. 直接傳輸 bitmap,並建立 cv::Mat
      2. 傳輸 png 再解碼建立 cv::Mat

實驗結果

Connecting to opencv server with bitmap…
average time during: 0.0010088205337524414
Connecting to opencv server with png…
average time during: 0.008921647071838379

實驗結論

推測:

  • 資料轉換成 std::vector<char> 與解碼的過程花費多餘的時間
  • 測試發生在本地,網路傳輸的成本本來就比較低,在網路瓶頸的環境表現出的優劣可能會不太一樣

有一個討論串跟我的問題相同,並且在當中提到,png 編碼與解碼本身就會花費不少時間,資料傳輸方式的選擇還是要根據環境的硬體設備情況去做調整1

Footnotes

  1. Why 'imencode' taking so long ? - OpenCV Q&A Forum. (n.d.).Retrieved 2020-03-22, from https://answers.opencv.org/question/207286

· 5 min read
Wei Ji

拓撲進化類神經網路 (NEAT) ,必定有會自然演化出遞歸 (recurrent) 結構,若不能妥善處理遞歸衍生的問題,演算法就不能完備。下圖是一個遞歸結構的範例:

不難看出它是一個遞迴構造,最大的問題就是如何處理遞歸連結造成的遞迴?有一種方式是規定遞迴深度(次數)1,或是將整個網路的連接都定義為遞歸連結2

類神經網路拓撲結構的數學定義

類神經網路是以抽象連結的方式存在,即使為了視覺化而把網路成現在平面或立體中, 這些連結的長度與神經元之間的距離並不影響神經網路的性質, 因此類神經網路存在於拓撲空間而不存在於度量空間,又或是說類神經網路具有拓撲性質。

首先我們定義有序對(Ordered pair)3,之後要用來處理有向圖(directed graph)的連結:

(x,y):={{x},{x,y}}(x,y):=\{\{x\} ,\{x,y\} \}

定義這個的作用是什麼?拓撲學會大量使用集合論,但是如果我們把連結的頭尾單純丟到一個集合中,如: a=x1,x2a = {x_1,x_2} ,並不能描述誰是頭誰是尾,而只能描述條連結線而已,所以定義一個能夠對兩個元素產生後差異的數組十分重要。

定義一張有向圖 (Directed Graph)4

G:=(V,A,W)G := (V,A,W)

V:頂點集(vertices set),紀錄了所有點

A:連結集,紀錄了點與點的有向連接(箭頭,arrow)

W:權重集,紀錄了連結的權值

A:={(x,y)x,yV}WRf:AWA :=\{(x,y)|x,y \in V\} \\ W \in \Bbb R \\ f:A \rightarrow W

拓撲排序

對一個有向無環圖 (Directed Acyclic Graph) 而言,它是可以被排序的:

https://i.stack.imgur.com/0154o.png

當拓撲結構被排序後,就有了前後的相對關係,如此一來我們就能判斷連結究竟屬於前饋的還是遞歸連結。呼叫遞迴時,連結由前往後傳遞時呼叫遞迴產生新值;由後往前傳遞時則回傳舊值,。

但是拓撲排序只適用於無環的結構,當圖上有環,拓樸順序就不存在。因為環上每一個點都會有連向自己的邊,意味著環上每一個點必須排在其他點的後方,環上每一個點都不能在排列順序中拔得頭籌,所以合理的排列順序不存在。5

那麼假若拓撲結構一開始就定義了順序呢?

如此一來在任一節點呼叫遞迴,必然存在中止條件。實做的時候也很方便,可以直接沿用節點的編號作為拓撲排序的依據,而不需要額外的變數來處理遞迴中止條件。


創用 CC 授權條款
Wei Ji以創用CC 姓名標示-相同方式分享 4.0 國際 授權條款釋出。

Footnotes

  1. Encog NEAT Structure | Heaton Research. (n.d.). Retrieved 2019-11-21, from https://www.heatonresearch.com/encog/neat/neat_structure.html

  2. NEAT(基於NEAT-Python模組)實現監督學習和強化學習 - IT閱讀. (n.d.). Retrieved 2019-11-21, from https://www.itread01.com/content/1549347330.html

  3. 有序對 - 維基百科,自由的百科全書. (n.d.). Retrieved 2019-11-21, from https://zh.wikipedia.org/wiki/有序對

  4. 圖 (數學) - 維基百科,自由的百科全書. (n.d.). Retrieved 2019-11-21, from https://zh.wikipedia.org/wiki/圖_(數學)

  5. 演算法筆記 - Directed Acyclic Graph. (n.d.). Retrieved 2019-11-21, from http://www.csie.ntnu.edu.tw/~u91029/DirectedAcyclicGraph.html

· 8 min read
Wei Ji

給定類神經網路輸入與輸出節點的數量,並給定資料集的前提下,究竟要設定多少隱藏神經元才能完成任務?這個問題可以理解成:

在已知環境;且任務明確的前提下,智能體要具有多少資訊才能完成任務?

當環境本身的資訊量非常龐大時,我們無法量化環境究竟具有多少資訊的情況,似乎也無法計算出智能體究竟需要多少資訊才能完成任務。綜觀生物演化,想必不是「先設想需要多少基因」再演化出能夠活下來的生物,而是「能夠活下來的生物自然擁有這麼多的基因」,因此隨著訓練過程同時嘗試較多神經的網路與較少神經的網路,最後能達成任務的網路大小就是好的網路大小。

基因編碼

一個布林類神經網路可以用一段染色體描述,染色體區分成兩個部份:

  • 定址基因
  • 連結基因

定址基因決定這個網路擁有多少節點,換言之,決定網路的大小。連結基因則是描述兩個節點之間的連結。

定址基因

決定熵庫大小的基因。若定址基因儲存的變數為 nn,則網路具有 2n2^n 個節點,因此在定址基因為 1 byte 的前提下,本基因算法的定義最多可以描述有 22562^{256} 個節點的布林類神經網路。

連結基因

一段連結兩個類神經元節點的資訊可以被描述為:

l=(a1,a2,w)l=(a_1,a_2,w)
  • aa : address, 連結的定址, 訊號將會從 a1a_1 送往 a2a_2
  • ww : weight,權值,決定訊號邏輯是否會被反轉

因此一段用來描述連結的基因有三個部份:

  • 來源節點
  • 目標節點
  • 權值

基因資料空間用量

資料應該儲存為文字檔案 -- The UNIX Philosophy1

使用二進制編碼的染色體檔案會無法直接被人類閱讀,這其實是有違 Unix 哲學的,若沒有良好的理由應該避免這麼做。因此接下來試著計算這麼做在資料壓縮上的利益。

若一網路以 100 萬畫素相機作為輸入:

  • RGB -> 3 個 100 萬矩陣
  • 一個色彩值 0~255 -> 每一個單色像素花費 8 bit 的資料

總計 24,000,000 個布林輸入:

1,000,00038=24,000,0001,000,000 * 3 * 8 = 24,000,000

布林類神經網路理論要求至少要4層網路

  • 1層輸入層
  • 2層隱藏層
  • 1層輸出層

假設輸出值只有一個位元,因此先不考慮輸出層,總計需要 72M 個節點:

24M3=72M24 M * 3 = 72 M

即定址空間至少為 27 位元:

log2(72,000,000)=26.1\log_2(72,000,000) = 26.1

則一個連結至少需要多少資料表達:

27+27+1=55 bit27+27+1 = 55 \text{ bit}

若使用字串描述十進制,則連結資訊至多會消耗 9 位數,平均消耗 8 位數:

227=134,217,7282^{27} = 134,217,728

若使用字串儲存(十進制), [定址1][定址2][權值][分割字符]

8 char+8 char+1 char+1 char=18 bytes=144 bit8 \text{ char} + 8 \text{ char} + 1 \text{ char} + 1 \text{ char} \\ =18 \text{ bytes} = 144 \text{ bit}

不過目前多使用 UTF-8 編碼,因此儲存空間會變成兩倍: 288 bit, 結論:使用二進制定義的資料壓縮率為 0.19

突變機制

任一染色體經過突變之後會得到新的染色體:

G=f(G,m)G' = f(G,m)

GG': 後代染色體,為隨機變數 GG: 染色體 mm: 突變率,或為複製失敗的機率

定址基因

對染色體而言,定址基因有 mm 的機率會複製失敗, 而失敗時又有 0.5 的機率會增加; 0.5 的機率會減少, 因此當定址基因突變時,有一半一半的機率會加一或是減一, 從而觸發「定址擴張」或「定址萎縮」的事件。

連結基因

參考染色體的異常模式2

  • deletion
  • duplication
  • inversion

考量 inversion 的破壞性,只保留前面兩者突變機制,因此對一段基因而言,突變的機制有兩種:

  • 刪除
  • 複製

複製可以用來探勘解;刪除則可以用來收斂解。 對基因而言,有 mm 的機率會複製失敗,當複製失敗時有 0.5 的機率發生刪除;0.5 的機率發生複製。

位元突變

位元突變是每一個位元的基因在複製給下一代時, 皆有一定機率 mm 會發生複製錯誤,即邏輯反轉。

透過基因複製與位元突變,便可產生不同的連結基因並增加網路的連結進而曠大網路的大小。

定址擴張與萎縮

當定址基因發生突變時,整個網路的熵庫就會發生擴張或是萎縮。我們通常將輸入放置在拓撲排序的前方而輸入放在後方,因此當網路方生擴張時,會將原生的網路資訊一分為二,將後段部神經元的編號映射到新的熵庫後方。萎縮時則反向操作,與中間節點有關的所有連結資訊都會被刪除。


創用 CC 授權條款
Wei Ji以創用CC 姓名標示-相同方式分享 4.0 國際 授權條款釋出。

Footnotes

  1. Unix哲學 - 維基百科,自由的百科全書. (n.d.). Retrieved 2019-11-21, from https://zh.wikipedia.org/wiki/Unix哲學

  2. Chromosome abnormality - Wikipedia. (n.d.). Retrieved 2019-11-21, from https://en.wikipedia.org/wiki/Chromosome_abnormality

· 6 min read
Wei Ji

本文提及的網路是使用在增強式學習環境中,換句話說該網路必定涉及被該網路所驅動的代理人 (agent) ,並且下來假設代理人是 Minecraft-like 遊戲中的機器人 (BOT) ,並且網路是使用 Boolean-Recurrent-Evolving Neural Networks through Augmenting Topologies 複合式演算法生成。

意圖與行為

Minecraft-like 的環境是相當複雜的,因此在之中活動的代理人必須具有相對複雜的智能,若考量所有環境因素,代理人的任務就是「生存」,但是生存是一項相當抽象的任務,若對其進行實驗(訓練),會有如疲勞測試 (Fatigue testing) 一般耗費大量時間。因此實務上應該將該任務切割成數個具體的行為,如:採礦、伐木、狩獵...,若是針對這些行為;訓練條件就很容易指標化了,比如單位時間內的採集數量,如此以來實驗的時間便可獲得控制。這些能夠完成特定工作或任務的網路便被稱為行為網路 (action network) 。

隨著規劃不同的任務以及設計指標,我們能夠訓練出數個不同的行為網路來滿足不同的任務,但是這些網路仍相互獨立,為了能夠整合這些網路,因此需要一個用於決策的演算法。

這個演算法同樣透過類神經網路來完成,而這個網路可以透過很多種方法產生,比如:

  • 真實玩家的遊玩體驗
    • 某條件對應某個決策標籤(打怪、挖礦、睡覺...)
  • 將某個人造的演算法作為訓練資料集
    • 演算法本身必須要被網路化

注意,這些資料都需要被標籤,因為我們需要將這些決策配對到對應的行為網路。這個用於決策的網路就叫做意圖網路 (intention network),它用來使代理人從環境中獲得的資訊映射到某種意圖,如:

血量低下且面臨敵人(環境資訊) → 逃跑(意圖)

而後「意圖」驅動「行為」,做出代理人當下應該做出的具體的「操作」。

整個網路最終的結構應該會像是這樣:

不難看出,其中的智能網路 (enabled network) 其實就是一個多工器,而決策網路則是單純的分類。

網路內化假說

每一個網路單元的職責相當明確,因此人工調適的網路結構是能夠被解釋的白箱,若將人工調適的網路送回訓練環境進行迭代。代理人在環境中迭代數個世代後,這些網路單元會慢慢的融合在一起,最後這些人工調適網路的後代其結構會融合到人類難以辨識和區分的程度。

原本由人工賦予的概念,在網路融合的過程中可能會被分離或是合併,比如:原本設計在決策網路中的「挖礦」與「伐木」可能合併變成某種類似「採集」的概念,只是我們無從解析這個概念以何種形式存在於類神經路中,這個過程我稱為網路內化 (Network_Internalization) 。

意圖與行為注入

首先根據需求定義新的決策基準以及行為,並且透過訓練獲得行為網路以及決策網路,並且先前整合的網路可以直接當成一個網路單元 (proto-network) 看待。

加入的意圖網路具有最高的決策權,只有當該意圖網路判斷符合被注入行為的執行條件,才會啟用注入的行為網路,除此之外的條件都會沿用原網路的操作。

注入行為後再次放回訓練環境(野放),這些特徵便會內化成後代網路的一部分,如果是有用的特徵就會繼續存在,而無用的特徵則是會被迭代掉。透過這種方式不斷的循環經過「注入→內化」的過程來達到人工干涉網路演化的目的。