difflogic 會先 做 normalize 把 input 壓到 [-1, 1], type 是 float32, 不過論文有提到 用 bf16.
inp
跟 out
, inp 就是 image 攤平後的 array, out 是 算完的結果. 其中 e.g., inp[161] | inp[160], 中間的op 就是作者用 fuzzy logic train 出來的.這邊還不知道實作 half adder 的用途…
作者是 用 torch 去做訓練的, 從下面的code, 作者有另外實作 model 的 class, 只要在 model 裡面有實作 forward , pytorch 就會根據 forward 的結果去計算 梯度. 可以參考下面的第二行.
forward 有分 python 跟 cuda 版本的, 目前先看 python 版本的實作, 可以看到 一開始 會先從 image 的 arr, 各別隨機選出 a 跟 b 根據 op 的 table 去算出
下面是 簡單的流程圖.
看 source code 是用 cross entropy.
目前我的想法應該是不可行, 因為作者的做法是 用 logic gate 的op 去取代 conv, max pool. 而bitnet 已經把 資料壓縮成 bit並且運算已經用 accumulate sum 去取代矩陣乘法. 理論上用硬體做應該已經最快了, 優化的空間可能也有限.
介紹傳統邏輯門(如 AND、OR、XOR 等)在
神經網絡中的應用。
傳統的邏輯門無法直接進行反向傳播和梯度計算
,這使得它們無法直接用於深度學習模型中。提出可微邏輯門網絡(DLGNs)
,該網絡可以將邏輯門運算符轉化為可微分形式,並能夠進行有效的梯度下降訓練。引入 實值邏輯運算符(例如 T-norms 和 T-conorms)fuzzy logic, 來代替傳統的布爾邏輯。
T-norms, T-conorms
16 logic operator table
模型結構:DLGN 模型的結構,包括邏輯門層、加權邏輯運算符、輸入和輸出層等。使用 softmax 來選擇每層的邏輯運算符,使得每個邏輯操作的選擇成為一個概率分佈。
加權平均讓logic net 可以微分
aggregate of output neutron
邏輯運算符選擇和計算流程
在每一層中,我們使用 softmax 來選擇每個邏輯運算符的選擇概率。每個邏輯運算符的概率會根據 梯度下降 優化來自動調整,選擇最適合的邏輯運算符。
邏輯運算符的選擇和加權計算
例如,如果選擇了 AND,則對應的運算是 a * b;如果選擇了 OR,則對應的運算是 a + b - a * b。選擇的運算符會根據 softmax 輸出的概率進行加權。可以將其看作是從 16 個邏輯運算符中選擇一個來進行計算。
邏輯門數量的增長特性
表格右側的標註指出,隨著數據集的複雜度增加,邏輯門數量以指數速度增長。例如:
在 CIFAR-10 的模型中,每層包含 1,024,000 個邏輯門,這顯著高於小模型的 12,000。
參數總數(Total num. of p.)也隨之顯著增加,從幾萬增長到數百萬。
https://drive.google.com/file/d/1Q3EfJ_Ld5ic_43HKd6-ojjaNEkC6lybm/view?usp=drive_link
python experiments/main.py -bs 100 -t 10 --dataset mnist20x20 -ni 200_000 -ef 1_000 -k 8_000 -l 6 --compile_model
apply_compiled_net.py
去跑 inference