Brian
概念:把精度為 n 的浮點數向右位移 n 個位元
Q23.8: 表示該數有 23 個整數位、8 個小數位,是 32 位二補數。
假設兩個精度為 n 的 2 進位浮點數 a, b
其定點數表達為
在轉換過程多乘了一個 故要校正回來
同理發生在除法運算
被抵消所以要往左位移 n 補回來
fixed_power_int
解析理解為在定點數的框架下做計算, 這也是為什麼需要在乘法後做校正
值得一提的是這行
個人認為是做四捨五入讓右移時不會造成誤差大於單位的一半
意義:表示系統的負載量而非 cpu 的負載
: 在時間點 t 的 load
: 狀態為 TASK_RUNNABLE的task總數
: 狀態為 TASK_UNINTERRUPTIBLE的task總數
系統在顯示的load average則是移動平滑後的結果
在load avg 中使用exponential moving average來作為load的計算
所以上述公式的為
:kernel取樣的秒數,這裡為5秒
:多少時間尺度的load avg (1min, 5min, 15min)
calc_global_load 函數就是根據指數移動平滑平均和定點數運算在5秒一個間隔去更新load avg 1,5,15的值
每列總和為1的轉移矩陣就是右隨機矩陣(right stochastic matrix)
折扣總和(discount sum)定義如下:
為什麼需要一個去做折扣的理由是假設有一個獎勵為正的環,在沒有discount的情況下,最佳選擇就會是一直繞著環的動作,而不會採取其他考慮
自己的對這個discount的見解是下個動作之外的未來是不確定的,所需要對在這個時間點所知的報酬打折扣
在狀態s的折扣回報我們可以分成兩個部分來計算
第一個部分是選擇下一個步驟的回報s'
另一個是s'之後的每個步驟s'', s''', …,的折扣回報
其實這個回報就是
: 對應的最佳動作選擇
這樣還是有點難懂 所以去找了一些解說
Bellman Equation
Value Iteration
利用每次迭代選擇的最佳步驟 至V(s)的值收斂
左邊狀態的回報計算
第一輪:
第二輪:
右邊狀態回報計算
第一輪:
第二輪:
以此類推,終止條件是當兩輪的結果收斂
然後選出得到折扣報酬最大的動作
這個方法的必須先知道選擇動作的機率,在實務上可能是未知的
所以在專案ttt裡面的強化學習實作是使用時間差分學習
總結就是如同筆記的這句話
強化學習的核心目標是學習最佳的 𝜋,以最大化𝑉𝜋(𝑠),並透過探索與利用(exploration vs. exploitation)策略來達成最優解。
學習的目標: 價值函式
以ttt為例, 我們學習的是在某個棋盤狀態下剩餘可以放子的格子的價值
這個更新公式的關鍵想法是:目前狀態的價值應該向「即時獎勵 + 折扣後的下一狀態價值」靠攏
往下看括號項
意義是實際觀察到的狀態期望扣除當下預期期望,
換句話說,我們看到的比預期的好,遞迴狀態價值就加上學習率*
主要關注兩個檔案
**int get_action_exploit(char table, rl_agent_t agent)
*int table_to_hash(char table)
char *hash_to_table(int hash)
static float update_state_value
這個函式就是TD learning的遞迴函式
static void train
訓練的主函式
這裡埰用兩種方法去實作下一步該往哪走