星期四, 11月 27, 2025

Autohotkey 自動監測啟動 VirtualBox VM

用 GPT 產生的腳本,蠻好用的 XD。作用是在每次 Windows 開機時,自動監測某個 VirtualBox VM 是否已經自動運行。如果沒有運行,就自動啟動它。

需求背景是研究計畫中請了一位學弟妹幫忙,而標註程式需要用到 Windows,結果學弟家裡只能使用 Mac 囧,只好自己在 VirtualBox 上架設一個 VM。如果不這樣做,線上的 VPS 提供者所給的套餐都很貴資源又少。用 1GB 或 2GB 的 RAM 搭一個 shared vCPU core 跑 Windows,性能實在不敢想像。

自己電腦建 VM,然後把 RAM 和 Disk 切多一些,使用FRP Tunnel出去,體驗實在好太多。唯一問題就是 ADSL 有時不穩定,這點還要設法剋服。

; --- settings ---
VBoxManage := "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe"
VMName := "win10"
CheckIntervalMs := 1000 ; how often to check when running
BackoffAfterStartMs := 5000 ; wait a bit after starting to avoid rapid retries
; -----------------

#NoEnv
#SingleInstance, Force
SetBatchLines, -1

Loop
{
	; Build: "C:...\VBoxManage.exe" list runningvms | findstr /I /C:""Win10""
	Cmd := """"  VBoxManage  """" "list runningvms | findstr /I /C:" """""" VMName  """"""
	RunWait, % ComSpec " /C " Cmd, , Hide
	if (ErrorLevel != 0) {
	; Not found -> start headless
		Run, % """" VBoxManage """ startvm """ VMName """ --type headless", , Hide
		Sleep, %BackoffAfterStartMs%
	} else 
	{
		Sleep, %CheckIntervalMs%
	}
}
全文連結

星期二, 11月 18, 2025

影片:這才是審稿人眼中漂亮的 discussion!

出處

好影片,紀錄一下影片重點:

好的 Discussion 分成五步驟。所有討論都有一個目的:to tell people what they can know from your research!

一、概括當前研究

進行具體討論前,先對 current study 做一個回顧,因為讀者讀到 discussion 這里有可能已經忘記你研在幹麻,所以要提醒一下讀者。一段話就夠了!

* 再次指出你的研究問題(research question)
* 回顧你的研究方法(methodology)
* 強調重要研究成果(key findings)——注意是最核心的研究結果,而不是所有在 results 部分呈現的結果
* 告知讀者 discussion 的結構(the structure of discussion):這部份 ChatGPT 給了一個示範,放在 Discussion 第一段最後一兩句:The discussion is organized into three parts. The first part interprets the key findings of this study. The second part compares these findings with previous literature. The final part addresses the limitations and provides directions for future research...


二、討論本研究與已有文獻的關系
discussion應該要和文獻對話里找到的文獻相呼應起來。
這一部分,核心問題:
* 你的研究結果是否與現有文獻「一致」?哪些一致?怎麼一致?
更重要:你的研究結果是否與現有文獻「不一致」?哪些不一致?
* 為什麼不一致?如何解釋它們的不一致?
要提出三點左右的發現和能解釋它們不一致的原因(這里需要大量的 critical thinking!)這里也需要盡量找到有參考文獻的支持!

同時可以討論,為什麼一些理由不適用於解釋當前的不一致?這樣會讓 discussion 部分顯得更加的 critical!

* The findings match those observed in earlier studies
* Our findings are in accord with recent studies indicating that…
* There are similarities between the current study and …

「與現有文獻不一致」萬能句型
* In contrast to/Contrary to earlier findings, however, …
* The results provide evidence against the widely held assumption in …
* The results/findings go exactly counter to the idea that …

「對結果進行解釋」萬能句型
* A possible explanation for this might be that…
* We speculate that this might be due to …
* Two types of accounts could be proposed for the …. The first account assumes that… The second account assumes that…
* The difference between … and … could be attributable to…

三、討論意外,或預料之外的發現(unexpected or surprising findings)

是否有一些結果是和預想的不符,意想不到的?可以從中進行討論,並給出解釋理由,比如是否有一些結果並不顯著(statistical significance)
其他次要的結果,也可以簡單的進行討論+解釋
更重要的是這些意外發現的價值在哪裡?對這個研究領域能有什麼樣的implication? Any new insights that emerged as a result of your research?

* Surprisingly, ...
* What is surprising is that...
* One unanticipated finding was that...
* Contrary to expectations, this study did not find...
* It is somewhat surprising that...

描述意外結果的 implication 萬能句型
* The experiment provides a new insight into the relationship between...
* These results should be taken into account when considering how to...
* The data contributes a clearer understanding of...
* While previous research has focused on X, these results demonstrate that Y.
* The findings have extended our knowledge of...


四、闡明本研究結果與相關理論模型的關系

說完和之前具體的 study 的關系,要開始討論理論部分了!這邊要把眼光放長遠,要想到整個bigger picture!這部分也是想要拿到高分的重點,因為這都是研究contribution!

* 基於你的研究結果,可以對現有的理論作出任何貢獻嗎?
* 你的結果是否與某理論觀點不符?
* 是否可以改變某個理論觀點?
* 或者可以補充一些什麼觀點?
* 是否可以基於你的研究,提出一個更新版的模型呢?


五、本次研究的不足之處(limitation)

任何一個研究都會有局限性,不可能有一個研究是完美的!所以只需要承認這些局限性就可以了,這里也是你critical thinking的展現之處。

* 有哪些局限性?(如樣本量小,研究結果普適性(generalisability)較低,實驗器材有局限性)
* 為什麼會有這些局限性?
* 這些局限性會帶來什麼影響?

全文連結

星期一, 11月 10, 2025

論文閱讀:Free Transformer

Arxiv 連結

來記錄一下最近在 GPT 幫助下讀過的最難的 paper:Free Transformer。這篇的數學難到撞牆。

這篇核心概念,就是在 Transformer 裡面明確在模型裡顯式引入潛變量 Z。(論文 Z 不是單一全局變數而是序列 Z1...ZT)


 

在原本 Transformer 結構,潛變量 Z (例如影片是正評、負評)是通過學習序列預測來進行隱式學習。這種方法存在幾個缺點。首先,要計算我們感興趣的變量 Z,會涉及很複雜的計算,並且這類計算容易出錯。只要序列生成中出現錯誤,整個序列以及根據該序列推導出的 Z 都會是錯誤的。此外,沒有顯式表達 Z,把產生 Z 建立在序列預測,也可能在新資料因為序列預測表現不同而影響泛化,這也是論文 (1)(2) 式舉例想表達的。


另一個難點是論文中 (3)。這個(3)邊際似然(marginal likelyhood)P(S)和論文中 loss function 有關,loss function 其中一部分近似 logP(S) 的證據下界(ELBO),因此當 loss 降低時,意謂 ELBO 提高,從而提高對 logP(S) 的下界。而 P(S) 基本上可以看作在先驗 P(Z) 下對 P(S|Z) 的期望。如果P(S)夠高,那麼在模型生成的過程中,只要採樣Z,就會有足夠的機會讓模型產生的 S' 能夠對應到真實的序列 S。而 Z1...ZT 並非參數,是隨機採樣出來的,編碼器參數(確定 Q)與解碼器參數(確定 P(S|Z))才是需要學的。


接下來難點是所謂 free bit 設計。Free bit 目的在於避免 KL collapse ,也就是,VAE decoder 以及後面的模型直接將採樣的 Z 丟棄不用,然後 VAE 訓練出的分佈 Q(Z|S) 直接套先驗分佈,然後 KL Loss 歸零成功最小化,但 VAE 就整個沒用。為了避免這種情況,模型引入了 free bit,使得 Q 分佈與先驗分佈之間可以允許一定程度差異,不會計入 Loss。

接下是所謂的 Binary Mapping。它的模組有一層,不是直接輸出 2^H 次方個 output,而是將輸出 H 個互相獨立的 Binary Bit,具體輸出 class number 則是這 H 個 bit 對應的 binary number。學習 H 個(例如 16 個)互相獨立的 binary classification 會比直接學 2^H 個 class(如 65536 個)訓練更好,降低參數量、避免大多數輸出都是在 0 附近微調,訓練速度慢並且容易被 noise 干擾,也避免資料不夠長尾類別學不到。


剩下的部分是實際測試。首先是 free bit 的設定。Kappa 太低,模型表現與正常 Transformer 相同,實際上就是 KL collapse,導致 VAE 沒有作用。然後,當 Kappa 的值過大,模型會在 Z 藏太多資訊,實際上是 overfitting,測試中連雜訊都學進去了。然後後面 benchmark 的部份就沒有細讀。更多的細節我看不懂 XD





全文連結