Train ESRGAN 小整理

我想挑戰一面挖礦, 一面跑 AI training, 一面開艾爾登法環,… 不過看起來有點困難, 只好不跑老環了, 反正一直 “You Died". 好, 在此把 training 的步驟整理如下.

  1. 如先前所說, 用 Anaconda3 做出一個環境, 然後開 terminal.
  2. 到網路上下載訓練用的圖片.  根據原作者所述, 他用的 database 是 DF2K.DF2K is a merged training dataset consisting of 800 DIV2K  training images and 2650 Flickr2K training images.
  3. 雖然不知道有什麼特殊之處, 總之這兩個 databse 的名稱長度不一樣, 我就直接把它們塞到同一個目錄.

新目錄的位置在主目錄下自己建一個 datasets. 再下面一層開個 DF2K 子目錄, 一層 DF2K_HR 子子目錄. 2K 照片全部放這裡. 然後在與 DF2K_HR 同層開個 DF2K_multiscale 目錄. 這樣下一階段就可以開始訓練了.

train-data-150x150

4.  訓練步驟參考 [1], 首先把每張圖做縮圖, 分成 0.75, 0.5, 0.33, 0.25 四種大小. 看起來有 rounding 到特定的數字, 而且有 floor = 400.

python scripts/generate_multiscale_DF2K.py --input datasets/DF2K/DF2K_HR --output datasets/DF2K/DF2K_multiscale

例如 000001.png 就生成 000001T0.png、000001T1.png、000001T2.png 、000001T2.png 四張不同尺寸的小圖.

2048×1356 1530×1017 1020×678 680×452 601×400

5. 然後把圖形全部切齊成同樣大小的方塊. 注意 DF2K_multiscale_sub 這個目錄要留給程式建, 自己先建好會報錯.

python scripts/extract_subimages.py --input datasets/DF2K/DF2K_multiscale --output datasets/DF2K/DF2K_multiscale_sub --crop_size 400 --step 200

這裡的第一個參數顯然就是要把圖形裁切成 400×400 的小圖. 第二個參數看程式註解: “step (int): Step for overlapped sliding window."  這個意思是每個小圖有 200 pixel 和另外一張裁切圖有重疊. However, 我必須說此處就丟掉一些重要的資訊, 我想想怎模申請專利好了~~~

[原始的小圖 xxxT2: 680×452]

000001-300x199

T0 切成  35 個 400×400, T1 切成 15 個, T2 切成 6 個, T3 切成 2 個. T0 的前四張 400×400 長這樣. 也就是由左至右掃過原圖的上方.

000001T0_s001-150x150000001T0_s002-150x150000001T0_s003-150x150000001T0_s004-150x150

6. 在前一個步驟, 很多 400×400 小塊的原稿在哪裡? 這個資訊 (metadata) 需要保留起來, 因此下面這個步驟的重點就是回溯紀錄 metadata.

 python scripts/generate_meta_info.py --input datasets/DF2K/DF2K_HR, datasets/DF2K/DF2K_multiscale --root datasets/DF2K, datasets/DF2K --meta_info datasets/DF2K/meta_info/meta_info_DF2Kmultiscale.txt

7. 以上算是滿快就跑完了, 跟我打字的速度差不多. 接下來是重點, 作者的說明在不同版本有些許差異, 總之找到前面檔案總管節圖的那個目錄底下的 options, 裡面會有很多個 yml 檔. 以放大四倍來說, 需要改這兩個檔案, 確定目錄都對. 第一個訓練 generator, 第二個訓練 discrimator, 因此 pre-train 的檔案不同.

train_realesrnet_x4plus.yml

train_realesrgan_x4plus.yml

8. 接下來用 debug mode 跑一次,

python realesrgan/train.py -opt options/train_realesrnet_x4plus.yml --debug

馬上發現 Anaconda 的環境沒有安裝 cuda “Torch not compiled with CUDA enabled", 即使補安裝 cudatool, 也只是把 torch 版本由 1.10.2+CPU 變成 1.10.2, cuda 還是 unavailable.

(RealESRgan) C:\Users\ufoca\Real-ESRGAN>python
Python 3.8.12 (default, Oct 12 2021, 03:01:40) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> print (torch.__version__)
1.10.2
>>> print (torch.cuda.is_available())
False
>>>

看起來要先下載正確版本. 參考 [2],[3],[4]. 網站 [4] 是 pytorch 官網, 似乎只要把自己環境設定對, 就可以用 UI 生成正確的安裝指令.

conda install pytorch==1.10.2 torchvision cudatoolkit=11.3 -c pytorch

不過這招其實沒用, [5] 說的才是對的. 要用 pip install, anaconda 本身的 server 只有 cpu 的 pytorch 可以選.

pip install torch==1.10.0+cu113 torchvision==0.11.1+cu113 torchaudio===0.10.0+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html

另外, 我本來 pytorch 是 1.10.2, torchvision 是 0.11.3, 但上面那行貼了就會動. 安裝完跑出一些紅字說沒有檢查所有版本的相容性, 所以我又重新安裝成我的版號, 不過我不知道我的 torchaudio 應該要搭哪一版? 反而安裝不成功.

於是我還是用網路版本, 並且重跑一次

pip install -r requirements.txt

讓作者的檢查系統幫我微調一下版本. 總之, AI 的技術進步很快, 網路文章上的版號參考就好. 到時候要隨機應變.

9. 接者就不用跑 debug 版了. 改跑這條.

python realesrgan/train.py -opt options/train_realesrnet_x4plus.yml --auto_resume

我估計應該會做很久很久. 記錄一下起跑時間.

run

UI 顯示要跑 5 天半.

2022-04-10 21:48:02,327 INFO: [train..][epoch: 5, iter: 6,500, lr:(2.000e-04,)] [eta: 5 days, 10:47:47, time (data): 0.476 (0.002)] l_pix: 6.8241e-02

10. 然後是訓練 discriminator

python realesrgan/train.py -opt options/train_realesrgan_x4plus.yml --auto_resume

證明環境沒問題之後, 就可以自己動手腳去改 code 了.

[Note]

1. https://github.com/xinntao/Real-ESRGAN/blob/master/Training.md

2. https://towardsdatascience.com/setting-up-tensorflow-gpu-with-cuda-and-anaconda-onwindows-2ee9c39b5c44

3. https://varhowto.com/install-pytorch-cuda-10-0/

4. https://pytorch.org/

5. https://ithelp.ithome.com.tw/articles/10282119

ESRGAN 小註解

我參考 ESRGAN [11] 的論文導讀[1], 把其中相關的名詞做了個整理.

基本上兩大重點是 RRDB 和 GAN. 這個網路模型前者的修改是拔掉 BN, 後續又出了一篇 [9] 加上 noise 處理. 後者是修改 GAN 的對抗方式, [9] 又做了一些調整就略過. 以下把相關的名詞稍微整理如下.

首先看到 BN 這個詞, 文章中指的是第二種, 但是也順便把第一種 BN 列進來.

Bayesian Network (BN)

在 AI 中的主要應用是把人類的知識加入類神經網路 [2]. 如果單純使用 data training 叫做 machine learning. 既然它的名字裡面有 Bayesian, 顯然它考慮了條件機率, 所以在 training 的過程中, 我們要引入條件機率表 (conditional probability table – CPT).

條件式的因果關係就是 P(B|A) = C 的形式, 因此 BN 網路需要有一群輸入層的 feature 值, 然後以因果關係建立網路結構, 接著用條件機率把每個 node 到下一層 node 的機率以 CPT 表示, 最後會有一個輸出層, 告訴我們有幾種可能的 state, 以及各自有多少機率.

Batch Normalization (BN)

這是另外一個 BN, 在 RealSRGAN 裡面指的是這個, 事實上它也比較常用. 原理就是把輸入正規化為 N(0,1). 即 mean = 0, variance = 1, 這方法在 pattern recognition 和 classification 中也常用.  不過對 NN 來說, 它是指在 internal layer 去做 normalization, 不只是在輸入層.

RRDBNet Network [3]

在 RRDB 的實作中, 裡面有許多的 basic block 串接. Basic block  包括 Dense Block (DB) [4] 和 Residial Block (RB) [5]. Residual in Resisual Dense Block 就是把 dense block 以 residual network 的方式連起來 [3], 把這些 DB 都當作 RB 裡面的一層 layer 看待.

RRDBNet-768x255

RRDB 在 [1] 講得比較多. BTW, 關於噪音的改進. 可以參考 [9] 這篇的開頭.

Dense Block [4]

主要是每層都和其他幾層相連. 我把它當作 full connection 的分批簡化形式. Dense Block 的串接連成 Dense Network.

denseblock-768x653

Residual Block (RB) [5]

Residual Block 的概念, 像是 Dense block 的變形. 也就是可以跳過一層網路不連.

resisual-network-768x668

GAN

GAN 用國文來解釋很簡單, 就是正邪兩派各自去認親, 能夠訓練到邪不勝正, 那麼正的網路就大功告成了.

GAN-block-diagram

本圖取材自 [10].

從 coding 的角度來說, 當然還是要看到程式比較有感覺. 我覺得 [6] 的寫法滿好懂的. 若對於只熟悉C語言, 不熟 Pythone 的人需要克服這個底線障礙. 這邊的底線是 [7] 五種底線的第二種, ‘_’ 表示傳回的值有些是 don’t care. 例如:

validity, _, _ = discriminator(gen_imgs)

GAN 的基本流程當然是把生成對抗網路都各 train 一輪.  此時每輸入每一張圖, 都要生成一堆有噪音的圖 (靠隨機變數) – train generator. 然後把這一大把圖, 拿去 train discrimiator. 在生成 generator 的時候, 可以看到有製造噪音的 code 和最後的 back propogation.

# Train Generator
optimizer_G.zero_grad()
# Sample noise and labels as generator input
z = Variable(FloatTensor(np.random.normal(0, 1, (batch_size, opt.latent_dim))))
label_input = to_categorical(np.random.randint(0, opt.n_classes, batch_size), num_columns=opt.n_classes)
code_input = Variable(FloatTensor(np.random.uniform(1, 1, (batch_size, opt.code_dim))))
# Generate a batch of images
gen_imgs = generator(z, label_input, code_input)
# Loss measures generator’s ability to fool the discriminator
validity, _, _ = discriminator(gen_imgs)
g_loss = adversarial_loss(validity, valid)
g_loss.backward()
optimizer_G.step()

訓練 discrimator 網路時. 要得到 real image 在這個網路的 loss 評分 (終極目標是 loss = 0), 以及 fake image 的 loss 評分 (終極目標是 loss 很大). 兩組 loss 輸出, 取其平均值做 backward propogation 的分數. adversarial_loss 的實作細節看起來是在 Torch 的 loss.py 裡面 [8].

# Train Discriminator
optimizer_D.zero_grad()
# Loss for real images
real_pred, _, _ = discriminator(real_imgs)
d_real_loss = adversarial_loss(real_pred, valid)
# Loss for fake images
fake_pred, _, _ = discriminator(gen_imgs.detach())
d_fake_loss = adversarial_loss(fake_pred, fake)
# Total discriminator loss
d_loss = (d_real_loss + d_fake_loss) / 2
d_loss.backward()
optimizer_D.step()

以上是普通的 GAN 的處理方式. ESRGAN 的 GAN 不是比較 real image 和 fake image 誰的分數高, 因為我們早已經知道 real image 和 fake image 各自要扮演的角色. 花太多時間讓參數長對有點浪費時間.

ESRGAN 用的方式是讓真的和假的直接去 PK, 而不是對標準答案. 真的贏過假的參數要加分, 假的贏過真的的參數要扣分. 以下直接貼 [1] 的內容, 但用顏色標註重點.

我们可以看SRGAN的loss:

         l_d_real = self.cri_gan(real_d_pred, True, is_disc=True)
         l_d_fake = self.cri_gan(fake_d_pred, False, is_disc=True)

而ESRGAN的loss:

l_d_real = self.cri_gan( real_d_pred - torch.mean(fake_d_pred), True, is_disc=True)         
l_d_fake = self.cri_gan(fake_d_pred - torch.mean(real_d_pred), False, is_disc=True)

以上就是這篇論文會用到的重要模組. 沒有什麼創見, 就是幫入門者的障礙減少一點.

[Note]

  1. https://zhuanlan.zhihu.com/p/258532044
  2. https://towardsdatascience.com/how-to-train-a-bayesian-network-bn-using-expert-knowledge-583135d872d7
  3. https://blog.csdn.net/gwplovekimi/article/details/90032735
  4. DenseNet 學習心得
  5. https://ithelp.ithome.com.tw/articles/10204727
  6. https://github.com/eriklindernoren/PyTorch-GAN/blob/master/implementations/infogan/infogan.py
  7. https://towardsdatascience.com/5-different-meanings-of-underscore-in-python-3fafa6cd0379
  8. https://github.com/pytorch/pytorch/blob/master/torch/nn/modules/loss.py
  9. https://zhuanlan.zhihu.com/p/393350811
  10. https://github.com/jonbruner/generative-adversarial-networks/blob/master/gan-notebook.ipynb
  11. https://aiqianji.com/blog/article/1

我讀 «一小時科普量子力學» – 下

6. 量子隱形傳態 (quantum teleportation)

它的原理是這樣. Alice 有一個量子態不知的微觀粒子 A 要傳給 Bob. Alice 和 Bob 手中各一個糾纏量子對 E1, E2. 因為 E1 和 E2 糾纏, 所以 E1 改變, E2 就會改變. 兩者之間有量子通道的存在. Alice 將粒子 A 和 E1 做某種測量, 因為 E1 被測過之後就改變了, 所以 E2 也就跟著變. 術語是 E2 塌縮到一個特定的量子態. OK, 那干 A 底事呢? A 是我們要傳遞的東西, 到現在都還沒有傳出去…

沒問題, Alice 通過古典通道, 把他量測的結果也告訴 Bob, Bob 根據這個數據, 和塌縮的 E2 反推出 A 粒子的量子態. 這樣我們完全沒有傳送 A 粒子, 但是可以重現 A 粒子. 而 Alice 和 Bob 從頭到尾都不知道 A 粒子的量子態, 所以稱為隱形傳態.

這聽起來怪的地方是古典通道的 cost 會不會高到比量子通道更高? 還有這樣的糾纏真的能實現嗎? 如果 Google 簡體中文的新聞, 大陸已經實現了 6 光子隱形傳態, 在 45 個小時中保持 98% 的量子干涉 (糾纏態) [3].

為了怕大陸新聞是大外宣, 我們來看看英文的 [4]. Zeilinger 的團隊以一光子跨過 143 公里傳遞, 有平均 0.863 的正確率 (The teleportation fidelity). 如果沒有量子糾纏, 瞎猜沒辦法達到這種水準. 可見得量子隱形傳態雛型已經有了, 只是正確性還不夠. 能傳出的量子個數也還太少.

7.  Others

這本書有很多名人故事, 也有厲害的數學. 在這些名人故事中, 我覺得最遺憾的是有 93 年中華民國國籍的楊振寧, 在 2015 年入籍中國. 不過老共的量子電腦都上太空了, 我們物理研發環境確實沒得比. 新聞說鴻海在發展離子阱, 希望他們有所突破.

書中公式密集的地方大家可以跳過.  量子力學的數學模式, 本書介紹過: 1925 年海森堡矩陣力學, 1926 年薛丁格波動方程式, 1948 年費曼路徑積分, 以及和它們和等效的狄拉克 q 數形式, 至少四種. 基本上除了路徑積分之外, 都無法和相對論結合. 故路徑積分的數學篇幅較多. 在 7.3 節 “相對論性量子力學" (P.201~), 介紹的就是與相對論有關的公式和計算. 

8. 附錄: 對稱和守恆.

(1) 空間平移對稱:動能守恆

(2) 空間旋轉對稱: 角動量守恆

(3) 時間平移對稱:能量守恆

無論在巨觀的古典力學或是微觀的量子力學, 這三者都依然守恆. 守恆和對稱看起來都是應該是"天經地義".  但是弱交互作用力 [2] 下, 宇稱卻不守恆 (parity nonconservation)[1]. 鈷 60 原子核的左旋或右旋, 在幾乎絕對零度下, 發射出的電子數量大不同. 

當初包立從 β 衰變出的電子有固定能量, 而推論出微中子 (大陸叫中微子) 的存在. 結果上帝居然不搞平等, 只要左旋右旋就可以造成電荷不同, 叫他一時難以接受, 不過他最後還是接受了啦, 還幫 “宇稱女士" 寫了死亡證明書 [5]. 楊政寧和李振道便以這個不守恆得諾貝爾獎. 做出實驗證明這個假說的吳健雄則摃龜…

9. 結語

看看本書中的諾貝爾獎小故事, 貢獻很大卻錯失獎項的人很多. A 貢獻比 B 大, 結果 B 獲獎的狀況也有. 愛因斯坦應該得十次只得一次. 田中耕一無心把別人認為不可能的東西做出來, 拿去申請專利, 而意外得到諾貝爾獎, 更是前幾年大家津津樂道的趣聞.  

基本上數學不好的人沒辦法深入欣賞量子力學, 但是看到物理學家努力解讀這個世界的故事, 還是覺得挺有趣的. 即使是愛因斯坦這麼聰明的人, 至死也想不出能統一廣義相對論和量子力學的數學架構. 我想一般人若不是要創立新教當教主, 抓住量子物理其中片面的解讀, 就想要建立一套新的宇宙觀, 恐怕是沒有必要.  我們可以接受不完美, 就像接受宇稱不對稱一樣. 知道多少就是多少.

最後附上兩大學術理論相矛盾之處:

  廣義相對論 量子力學
基本差異 定域 非定域
時空 4 維平等 4 維 + 自旋

時間一階導數

空間二階導數

引力 算得準 必須要測不準原理

[Notr]

  1. 宇稱不守恆
  2. 弱交互作用力
  3. http://scitech.people.com.cn/BIG5/n1/2020/1221/c1007-31972908.html
  4. https://en.wikipedia.org/wiki/Quantum_teleportation
  5. https://kknews.cc/zh-tw/science/yb4n5ag.html

我讀 «一小時科普量子力學» – 上

本來以為我的量子力學粗淺地瞭解到一個程度就要往前走了, 但是看到這本書, 還是讓我停留了下來. 畢竟 “一小時" 我有. 當然, 作者是騙人的. 他說的是 “一小時起", 跟百貨公司一折起的意思一樣.

這本書的作者朱梓忠博士是廈門大學物理系教授. 原著應該是以簡體字發表. 因為沒有寫譯者是誰, 推測是電腦自動翻譯, 所以翻錯的地方也不算少. 我在後面放了一個勘誤表. 基本上繁簡翻譯錯誤, 大家一看就知, 不影響閱讀.

  1. 量子誕生

量子起源於對液態鋼的觀察, 當時的主要工業就煉鋼. 熟練的工人以鋼水的顏色來判斷此時的溫度. 因此科學家認為溫度和顏色應該要有一個關係.  學術上叫做黑體輻射, 不吸收不穿透只反射物體叫做黑體. 後來兩組科學家推導出的公式, 一個只適合短波, 一個只適合長波. 普郎克湊出一個公式可以同時解釋長波和短波, 但是還沒有足夠理論基礎.

Planck

普朗克公式:

Planck-EQ-768x297

這公式說明能量是一份一份的 (微分), 而不是連續的. 自此才產生 “量子" 的觀念.  過去大家都認為連續才是正常 (類比也比數位先接受吧). 普郎克論文發表日的 1900/12/14 被追溯為量子誕生日.

量子的觀念一時還不能被大家接受, 也不知道有什麼用? 愛因斯坦首先用量子的觀念解釋 “光電效應", 說明如果光的頻率不對, 不管多強都無法打出電子. 這個解說證明一切跟頻率有關, 他也因此獲得諾貝爾物理學獎 (相對論沒有得獎).

S-eq

2. 原子模型

最初 Rutherford 原子模型: 按照萬有引力模式, 電子繞原子核有如行星繞太陽 –> 但電子繞圈將產生磁場, 發出電磁波–> 按照 Maxwell Equation, 電子在 10-10 秒 能量就耗盡, 應該要失去能量掉入電子核 .

波耳修改模型為不同軌道有不同能階, 跳躍才需要能量 –> 包立修改模型為每個能階只能裝得下固定數量的電子 (包立不相容定理) –>  後來發現比電子更小的粒子, 費米子的自旋為半整數, 依然符合包立不相容定理. 玻色子自旋是整數, 但不符合包立不相容定理, 可以群聚在同一狀態.

β 衰變時 (亦即原子放出電子), 離開的電子應該根據當初所在的位階有不同能量, 但實際量測到的能量固定 (更完整地說是能量、動量以及自旋角動量守恆), 觀察的方法不是測量而是看光譜的連續性. 包立於是推論有中微子 (台灣翻譯為微中子) 的存在, 不管失去的電子在哪個位階, 都有對應的微中子跟著離開 (1932 年). 當初只是一個假設, 還因為後來中子被發現 (1932 年), 兩者撞名. 包立這款中子被改命名為微中子.

書上提到包立有很多小故事, 說明他微人也跟別人不相容, 非常好看 (P.137~P.142). WIKI 也有寫一點 [8]. 因為他非常天才又能把人批評到沒信心, 提出自旋理論的克羅尼格因此放棄研究, 最後與諾貝爾獎失之交臂.

3. 波粒二相性

楊氏雙縫實驗 (光子) –> 電子也可以重現這個實驗 –> 一顆光子也可以通過雙縫 –> 一顆電子也可以通過雙縫 –> 更大的粒子也可以同時通過雙縫 –> 如何既是波又是粒子? 德布羅意提出物質波的概念, 物質的能量即是波的能量.

Double-slit.svg_

3. 量子力學

海森堡為量子建立矩陣運算的基礎, 產生量子力學 (1925/7/29). 與海森堡的路徑不同, 薛丁格由物質波出發, 建立波動方程式 (薛丁格方程式) – 有定態, 非定態兩種表示法. 非定態公式包含時間因素 [1]. 薛丁格的公式比海森堡的公式好用. 當然還有其他人想出等效的表達方式 [2], 不過現在都以薛丁格的公式為主, 並且它是量子力學中的公設.

薛丁格的公式既然是公設, 它無法被證明. –> 玻恩以機率解釋薛丁格的波函數:

量子在空間中存在任何一點的機率是一樣的, 但是散射後出現在某一方向的機率正比於波函數的平方. 也就是雖然隨機但是有規律 (模方才有機率). 

換言之, 玻恩的解釋完備了薛丁格方程式. 電子雖然是波, 但是它不像電磁波這樣會往外擴散, 而是它數學上表現得像波. 有人開玩笑說玻恩就憑這個註解拿到諾貝爾獎. 書上有解釋人家貢獻很多, 薛丁格得獎時就認為獎應該頒給玻恩, 結果玻恩本人 72 歲才拿到這個獎.

另一方面愛因斯坦相信一個完整的理論系統不應該有機率這個東西存在, 他留下 “上帝是不擲骰子的" 這種名言. “I, at any rate, am convinced that He (God) does not throw dice" (P.243). 愛因斯坦身為量子力學先驅, 認為一定是還有東西為解決 (隱變量), 才會發生機率性.

故他在第六次索爾維會議[3] 上以 “光子箱" 回馬槍挑戰 “測不準原理" 的基本教義. 據說波耳(哥本哈根學派領袖) 當場呆若木雞, 第二天才又找出一個 “光子箱" 測不準的地方辯論獲勝. 但書上也提到一則軼聞, 說波耳在過世前一天都還在黑板上研究 “光子箱", 表示他還是很擔心萬一測得準要怎麼辦?  (p.122).

愛因斯坦找不到的隱變量, 其他人也沒找到. 貝爾[5]就是其中之一, 他努力的結果就是證明量子理論要成立必須綁定 “非定域性", 若違反他的貝爾不等式[9], 就可以證明有量子糾纏. 後續的人就靠著這個數學基礎證明真的有量子糾纏的存在.

貝爾不等式為:|Pxz-Pzy|≤1+Pxy

其中,Ax為正的意思為在x軸上觀察到A量子的自旋態為正,而Pxz代表Ax為正和Bz為正的相關性。在古典力學中,此不等式成立。在量子世界中,此不等式卻不成立。

4. 量子密碼

量子密碼基於測不準原理而來, 量子只要被讀取, 就會改變也不可複製. 因此 Charles Bennett and Gilles Brassard  – 雙 B 發明了量子編碼, 如 BB84, BB92. wiki [6] 寫得比書上 更清楚. 建議去看 WIKI.

BB84 簡單地說, Alice 在兩種互不正交的基裡面選擇 0 或 1 去傳送, 例如有 (0度, 90度) 和 (45 度, -45 度) 兩個基, 他們旋轉 45 度所以不正交. 接收者 Bob 不知道 Alice 選擇的基, 所以隨機亂猜是哪個基,  只有猜對基才能判斷正確 0 或 1, 若猜錯基得到的值剛好在 0 和 1 之間, 不知道是哪一個? 如果有人 (Eve) 在此時竊聽, Bob 收到的東西就會改變. 故可以防盜. 若無人竊聽, 隨後 Alice 再把他當初使用的基發給 Bob, Bob 在沒有人竊聽的情況下, 就能知道哪幾個 bit 猜對, 哪幾個 bit 猜錯. 猜對的 bit 就用為雙方的 key.

BB92: 前提和 BB84 一樣, 但 Alice 這次只傳, 45 和 90  度的值,  Bob 隨機亂選基去讀取, 若是讀到 0 度, 肯定當初只能是 45, 看到 135 度, 肯定當初只能是送 90 度. 於是 Bob 知道哪幾次自己猜對了基! Bob 就用他可以確定的基回傳 Alice. 雙方把這一系列的基轉換成 0,1 當作key. 同樣, 有人竊聽時, Bob 回傳給 Alice 的基也會有錯的, 那這次 key 就不能用. 當然 channel 本身不能有 error. 而單光子通道也不易實現. 不然 RSA key 早就淘汰了.

5. 量子電腦

量子電腦厲害的地方有兩個, 第一個就是量子位 (qubit) 可以同時表達多個態, 例如自旋, 圓偏振, 激發態,…每一態都相當於傳統的 1 bit, 所以一個量子位就等於傳統的多個 bit. 其次是考慮量子非定域性 (糾纏), 還有態可以疊加. 雖然有這些預期的優點, 但是根據測不準原理, 當量子電腦的尺寸大到一個地步, 量子的特性就消失了.

在讀這類書之前, 我本來有一個疑問: 不是說測不準嗎? 不準我怎麼做計算? 讀很多次取平均更是不合快速計算的原理啊? 其實 “不準" 本身是個誤解,應該說是一對共軛變量的準確度如同魚與熊掌不可兼得。而製作量子電腦的難處在於做出量子阱, 這個阱的功用是讓被操作的量子不會亂跑. 目前其中一種趨勢是用離子為量子, 所以量子阱即為離子阱. [10]

目前最新的進展是: 2021 年 10 月, 中國打造的量子電腦「祖沖之號」透過60個量子位元, 進行24次的量子操作, 只要4個多小時就能完成. 最快的超級電腦 Summit 要 4.8 萬年. 如果大家比較相信 Google 量子電腦的數據, 那就是能讓電腦進行20次指定的量子操作,實驗重複一百萬次,僅耗時200秒就完成. 相較於 Summit 需要  16 天 [7].

[勘誤]

  1. P50. 葡萄幹 –> 葡萄乾
  2. P.66, P.233  自己幹涉 –> 自己干涉
  3. P128 復常數 –> 複常數
  4. P136 被髮射出來 –> 被發射出來
  5. P185 相幹性 –> 相干性 (多次)
  6. P208 必鬚 –> 必須
  7. P243 物理學泰的 –> 物理學泰斗的

[note]

  1. 薛丁格波動方程式
  2. 保羅狄拉克
  3. 索爾維會議
  4. John Von Neumann
  5. John Steward Bell
  6. BB84
  7. https://www.ithome.com.tw/tech/149757
  8. 沃夫岡·包立
  9. 貝爾定理, 貝爾不等式
  10. 不是零就是一?打造離子阱量子電腦,台灣有機會嗎? (aif.tw)

我讀 «量子力學與混沌理論的人生十二堂課» – 2

第七堂課叫做隨機混亂的熱力學. 作者引用熱力學第二定律, 說明宇宙喜歡混亂, 讓熵(Entropy) 變大, 所以生命中會體驗到各種事物, 讓我們的經驗值增加. 我們拿到不同的牌, 都應該調整心態做出最佳的回應. 

那熵甚麼時候會歸零呢? 根據熱力學第三定律 [1], 系統不會自己歸零 (0K 絕對溫度). 換言之, 我們怎麼努力結果應該都是變亂啊? 但是作者在下一堂課定義 (發明?) 了一個變小的熵.

第八堂課耗散結構理論(耗散結構理論) [2]. 這個是由比利時物理學家 Ilia Prigogine 所提出的. 本書說系統要從無序混亂到有序規律, 就必須從封閉系統改為開放系統, 注入能量並產生新資訊. 不過看 [2],  資訊這部分是打破封閉系統的延伸應用案例而已.

本書作者把資訊看成另外一種熵. 既然熱力學的熵會一直變大, 就有一種資訊熵會一直變小. 資訊變簡單, 系統就會穩定. 薛丁格在 “生命是什麼?" 中提到: “在一個開放系統中,生命物質會藉由原態穩定地保持負熵(信息),來迂迴規避第二定律達成熱平衡的衰減。" [8] 這應該是作者說法的原始出處.  

就實務而論, 企業顧問的腳色就把封閉系統變得開放, 然後把資訊和命令變簡單, 不過就如上 一篇所說, 霍金認為上帝沒有設計圖, 並沒有一個熵非得跑出來跟另外一個熵抵銷. 即使是資料壓縮 (entropy coding), 也只是把資料量儘量壓到逼近熵, 不多浪費而已. 好比特斯拉的車節能減碳 (減熵), 但是在製造電的過程中會增熵, 整個系統的熵還是(略微)上升.

第九堂課哥德爾不完備性[3]. 這章的重點是小故事大道理. 想找出終極演算法想解釋一切的德國數學家 David Hilbert, 被年僅 24 歲的哥德爾的不完備性定理打臉, 所以得出世事無完美的結論. 所以我們在世界上雖然遭遇挑戰, 還是要奮發圖強. 

書上所說的哥德爾定理是:

  1. 不是所有對的東西都可以被驗證.
  2. 也沒有一種理論可以永久解釋而不被超越.
  3. 有些東西我們目前是不知道的.

但依據 wiki [3] 所說, 不完備定理有兩條. 第一定理可以被解釋為:「不存在一個萬能的公理系統,使得其既能夠證明一切數學真理,又能證偽任何謬誤。」[3]. 舉例來說, 假設有個命題是 “此命題 p 是不可證明的", 若命題為真, p 就不可被證明. p 既然不可被證明, 怎麼知道它為真呢? 基本上這是一個邏輯的問題. 對應到本書整理的第一點, 但是沒那麼恐怖.

第二定理說: “如果一個(強度足以證明基本算術公理的)公理系統可以用來證明它自身的相容性,那麼它是不相容的。", [3] 這個 wiki 很繞口令. 以我的理解來說: 我需要用 HDMI Analyzer 來驗證別人是否跟 HDMI 相容, 但是我這個 Analyzer 是不是完全可信的, 除非它不用跟任何裝置測試, 就可以自己證明與 HDMI 相容.

對於書上第二點和第三點是從哪一篇引述來的, 我沒辦法直接觀察出來. 但 wiki 說了, 哥德爾定理並不是說什麼東西都不可能完備, 而是一致性、完備性、有效公理化的存在性三者不能共存. 認為一切都不可能完備是常見的誤解. 後來也有找到一篇專業的文章 [4] 討論到作者的誤解, 增加我不少信心, 哈!

第十堂課玻爾茲曼大腦. 這堂課的起點是既然熱力學第二定律說熵只能上升, 所以宇宙之初的熵將是超級低, 低到只有一縷意識, 稱之為 “玻爾茲曼大腦". 再套回黑洞白洞理論, 這個玻爾茲曼還不是一個真人, 它是白洞的玻爾茲曼的大腦中一個念頭. 因此, 後面引用很多東西, “證明" 必須有靈魂的存在. 靈魂說不再贅述, 而是玻爾茲曼變成宇宙中 “永恆的觀察者", 算是一種 “天道" 吧!

值得一提的是這堂課找了一些 “證據", 證明人的腸壁有 “腹腦", 心臟也有 “心腦". 主要的證據就是這裡有很多神經細胞或是腺體. 畢竟作者相信人是被白洞投影出來的, 意志也不掌握在自己, 所以 “腦" 不需要會思考, 只要會做選擇, 包括反射動作. 所以對腦的定義和標準也不同. 

第十一堂課人擇理論 [5]. 這個理論其實跟霍金的依賴模型實在論 (人存原理) 有異曲同工之妙. 也就是物質宇宙必須與觀測到它的存在意識的智慧生命相匹配. 因為我們在這種宇宙活下來, 所以才能觀察到適合我們生存的各種宇宙參數. 假如參數是另外一組, 就是另外一種宇宙人再討論我們熟知但是對他們神秘的現象了.

這個人擇理論又分枝成不同版本. 天體物理學家布蘭登·卡特最先提出這個理論, 然後分枝為:

  1. 強人擇(Strong anthropic principle,SAP): 宇宙某些機能的協調性必然導致智能生命的產生. 這麼棒的參數, 暗喻背後必須有個造物者存在. 我小時候看到傳教的手冊都是這樣寫的. 普郎克常數如果大一倍, 看一眼火爐眼睛就瞎了.
  2. 弱人擇(weak anthropic principle,WAP): 宇宙的參數微調產生適應的倖存者, 演化成智能生命. 我們可能是多重宇宙中的一個. 但既然說是人擇原理, 就是說這宇宙適應人類, 而不是人類要適應宇宙.
  3. 最終人擇(Final anthropic principle,FAP). 包含智慧的信息处理过程一定会在宇宙中出现,而且,它一旦出现就不会灭亡。[6]

在回到作者的解讀, 作者相信強人擇. 因此我們被產生在這個宇宙是有意義和天命的, 後面都是闡述做人的道理.

第十二堂課貝葉思法則. 作者說貝葉思法則很厲害, 萬事萬物都可以用它解釋, 當然也有科學家把量子力學結合貝葉思法則. 蝦米是貝葉思法則咧? 就是學校老師把我教得比較清楚的 Bayesian Theory (感謝交大蔡文祥老師). 基本上 Bayesian 的精神就是條件機率. 

作者衍伸條件機率為: 本來人類只知道有限資訊, 所以只能靠瞎矇. 後來經過學習之後, 產生經驗值, 所以猜的範圍縮小, 只要我們日新月異, 依更多條件做出正確選擇, 以後就會變厲害. 基本上還是勉勵人們. 不過我所知道的 Bayesian Theory 是這樣. 

P(A,B) = P(A|B)P(B)=P(B|A)P(A)

我收集很多 database, 並得知 B 發生的機率 P(B), 根據先驗資訊學到 B 有 A 特徵的機率為 P(A|B), 以後看到 P(A), 我就可以推算它是 B 的機率 P(A|B). 

書上說的就是條件機率而已, 還不是 Bayesian Theory. 

最後, 終於把這本書摘要完了. 雖然我不認同書上的觀點, 但是作者旁徵博引, 讓我有機會快速掃描了許多理論和知識. 雖然我年紀一大把了, 對思考人生的目的已經沒有興趣, 再過幾年可能都要思考 “墓地" 了. 但是我對於探索宇宙奧秘還是很有興趣 (外星人看到這篇請不要綁架我, 除非可以帶回重回 16 歲, 我可以從高一練起. 謝謝!)

[Note]

  1. 熱力學三大定律_百度百科 (baidu.hk)
  2. 耗散結構理論 – MBA智库百科 (mbalib.com)
  3. 哥德爾不完備定理 – 維基百科,自由的百科全書 (wikipedia.org)
  4. https://www.thenewslens.com/article/85099
  5. 人擇原理
  6. 人择原理_百度百科 (baidu.com)
  7. Bayesian Theory
  8. 生命是什麼