Practical

How to convert nltk.tree.Tree to other type of Tree?

I didn’t found any example on this problem, so I want to provide sample code for someone who is not that familiar with reading API.

# Construct nltk.tree.Tree
s = '(ROOT (S (NP (NP (DT The) (JJ old) (NN oak) (NN tree)) (PP (IN from) (NP (NNP India)))) (VP (VBD fell) (PRT (RP down)))))'
my_tree = Tree.fromstring(s)

# Convert my_tree to ParentedTree
my_parented_tree = ParentedTree(0, [])
my_parented_tree = my_parented_tree.convert(my_tree)

# Check result
print(type(my_parented_tree))
my_parented_tree.draw()

 

Reference:

  1. What is the ‘cls’ variable used for in Python classes?
  2. NLTK Tree convert API
Advertisement
Practical

Paper reading – The naïve utility calculus: Joint inferences about the costs and rewards of actions

前言

今天讀的論文是 The naïve utility calculus: Joint inferences about the costs and rewards of actions,key insight 是把人類其實有能力去推算別人為了達成目標,所得到的 reward、跟所需耗費的 cost 大致是什麼。

以前的 work 大致都著重在人類的行為是為了完成目標,得到不同 reward,卻忽略了不同人做同一件事其實 cost 不同。

重要的人類行為

條列一些之前的發現:

  1. 人類的行為是為了某個 goal
  2. 人類會盡量採取(自認為)有效率的方式去達成目標

在這前提之下,我們就可以大致推得在 goal 是 G 的時候,採取行為 A 的機率有多高。越能有效率達到 G 的 A,被採取機率就越高。

我們用L(A|G)來表示這個可能性(likelihood)。

擷取.JPG

在這種 formulation 之下,我們可以將人類的決策行為當成一個 Markov decision process ,所以就可以:

  1. Forward: 推算出人類在某個 state 會採取什麼行為
  2. Backward: 從人類行為推算出他的 goal

擷取擷取2

這篇論文的 key insight 

上面提到的方法看起來很有趣,用基本的條件機率和貝氏定理就可以描述如何 infer 人的 action或 inverse infer 人的 goal,但如果你仔細用心就會發現,每一個 action 的成本其實不一樣,我們怎麼能只用夠不夠有效率來推論人會不會這樣做呢?(甚至可能有資訊不足的問題,例如完成 goal G 有 100 種方法,但我只聽過 5 種)

所以這篇 paper 才提出應該要用同時考慮 action 的 cost。

擷取擷取2

如何用數學和程式實作出這篇論文的概念?

這邊我也還不是很懂,看來應該是需要先讀懂他們 2009 年的那篇論文:

Baker, Chris L., Rebecca Saxe, and Joshua B. Tenenbaum. “Action understanding as inverse planning.” Cognition 113.3 (2009): 329-349.

等我懂了再寫出來分享。

擷取.JPG

English

GRE 地基 – 最簡化的核心精神

基本認識

GRE 聽起來是一個很大很複雜的考試,但其實提綱挈領來看,裡面只有填空、閱讀、數學、作文四大項目。根據我準備的經驗,抓到重點,可以節省很大量的時間,所以才想把我個人準備過程中發現的明悟跟大家分享,讓大家有機會事半功倍。

數學對大家來說應該還好,所以我只把重點放在填空、閱讀跟作文上,雖然我的作文都沒有高於 3.5 過 XD,不過 V+Q 我有 326 跟 331 的經驗,所以應該可以對大家有些幫助!

填空

填空主要考驗兩種能力,但都跟精確很有關係 :

  1. 理解單字:單字的重要應不必再提,如果單字都看不懂,題目跟選項就都是一團迷霧。而且GRE非常重視選出精確的單字,所以對單字的用心要夠深刻。我自己是喜歡用做題目,重複 exposure 的方式來體會單字,其實最後我熟悉的也只 1500 個單字左右,但是有些單字即使忘記意思,也還是會有一個直覺。
  2. 體會題目邏輯:需體會此句作者想講什麼,且其邏輯非常精確。例如下題,一開始我誤選 experimentation,因為我推想有做實驗->就有客觀數據->就不能誇大 (grandiosity),但是 humility 本身就已經是謙遜的意思,所以選 humility 的邏輯更直接、精確。畢竟,experimentation 跟謙遜未必可以直接連結。

填空-1.JPG

SOP:

  1. 看過整個句子
  2. 找到關鍵的詞或片語,契入作者想講什麼
  3. 自己先想好空格中要講的意思
  4. 再從選項中選擇最match自己所想意思的 (直接代入選項很容易腦補!!)

閱讀

閱讀主要需考驗三種能力:

  1. 對作者目的的體會:理解作者為什麼要寫這段文章(主旨),體會作者心境。
  2. 對長難句的理解:這個推薦看楊鵬難句,精髓 – 難句看懂多次,就能自動解讀出其意義。
  3. 單字:應該不用解釋

其中我覺得 1 是最重要的,我記得我在考試時有碰到一篇文章,我剛看到這篇文章時的狀態不佳,所以想直接去看懂文章裡的句子,整個很有障礙。

當下我先閉上眼睛,先冷靜一下。然後開始一次神奇的突破之旅:

  1. 我跟自己說,我看不懂沒關係,一步一步來。我知不知道這篇主題要講什麼?
  2. 我知道,這篇是要討論歷史學家認定希臘某哲學派系是否對某個議題有某種解讀,而且看起來有爭議
  3. 好,看來我還是知道一點東西
  4. 既然有爭議,那應該會有正反兩方論述吧,分別是什麼?
  5. 開始 scan 文章 找到正方與反方(我記得這篇文章的正反邏輯有點隱晦,好像是這個哲學派別有沒有認為女性可以參與某某東西之類的,所以一開始 skim 完文章不知道在說什麼,不小心被太多細節迷惑了,無法有最高 level 的 summary 式思考)
  6. 找到之後,我就覺得這篇文章我通了(我可以用一句話說出這篇文章想講什麼),剩下的細節除非問題有問到再說吧

我原本看這篇文章被嚇到,skim 過去不知道這是在說什麼鬼,以為我得花個 5 分鐘之類的,結果上面的過程做完大概只花一分鐘,題目也很快就搞定了。分享這個經驗是希望讓大家知道,如果用體會的方式切入,大概會是什麼樣的思考脈絡。即使你一開始被細節迷惑了,也別擔心,跳出來,從最直觀、最高 level 的 summary 出發,你一定可以看懂。

作文

作文的話,個人覺得最重要的精神就是 – 寫出有說服力的文章

我在準備的過程中,常會想說我這樣寫有沒有符合各段正反論述的分佈、字數夠不夠等等細節,但寫出來的文章常常不夠說服力。

可是,AWA 要考的重點是論述能力,你寫出來的東西邏輯是否嚴謹?有沒有足夠的說服力?我很推薦 GRE寫作高頻題目與考點精析

希望大家可以永遠抓住這個大原則,再下去加強各項能力,永遠要知道你加強各種能力只是為了增加說服力。

總結

祝福大家都能在準備 GRE 的路上抓到重點,事半功倍。是你在考試,不是試在考你。

如果考試時覺得緊張,可以閉上眼睛深呼吸調整節奏,喜歡運動的朋友在休息時可以跑一跑樓梯,把考場轉成自己喜歡的氣氛,這些轉換都對我個人很有幫助。讓我感覺到自己握有主控權。

最後鼓勵大家多多教別人,幫助別人時,自己也會把東西學得很通,我屢試不爽,大家也可以試試~

English

TOEFL Speaking Task 3 preparation

前言

上次考托福,口說拿個 3 個 F,總分 23 分,覺得練習口說其實是一條滿不容易的路,畢竟裡面整合了滿多的技巧(筆記技巧、內容連貫性、流暢度、語調節奏、用字文法等等)。雖然補完 SK2 已經省下我很多自己摸索的時間,但還是有很多技巧沒有真正內化,所以想要透過文章來詳實記錄自己一步步的進步過程,除了容易追蹤自己的狀況;將過程分享出來,也可以幫助更多人克服托福的口說。

另外真的是很推 SK2 的 TOEFL 班,個人覺得很有幫助,如果希望可以有效率加強自己 TOEFL 能力的朋友可以參考看看他們的課程,或就算不想花錢,他們的部落格裡也有滿多有用的資訊。

23分等級的錄音

先直接上錄音檔:TPO30_Q3_第一次錄音 

我平常第一次錄大概就是這個等級,可以聽得出來裡面有幾個缺點,根據 Topic Development、Delivery & Language Use 三大項來探討,再來一項一項改進。

Topic Development 是否切題 有講到 proposal、女學生的意見、女學生為何同意。 G
解釋是否清楚 第一點少講到其他學生甚至教授也遲到。第二點講得有點短,比較不清楚。 F
時間掌握 剛好講1分鐘左右,算是剛好。 G
Delivery 發音是否清晰 除了disruptive卡到,其他各個發音應該都算清楚。 G
語調是否自然 語調有點平淡,沒有什麼起伏,雖然沒有太奇怪,但也稱不上好。 F
表達是否順暢 有一些奇怪的停頓點(停在句中)。轉折詞的停頓可以再加強。 F
Language Use 用字正確度 用字應該都沒有太大問題,用字可能有點太重複。 G
文法正確度 有一些小錯誤,不過並非這時改進的重點,先不討論。 F
整體評價 F

首先關於切題,因為題目是: The woman expresses her opinion about the student’s proposal. Briefly summarize the proposal. Then state her opinion about the proposal and explain the reasons she gives for holding that opinion.,所以必須要 cover 到下列幾點:

  1. Summarize the proposal
  2. State her opinion
  3. Explain the reasons she gives for holding that opinion

在 SK2 上課時,Show 已經說過要突破 26 分,語調是關鍵。我覺得台灣學生普遍都很容易因為內容不好就影響信心,進而影響語調。雖然我們應該盡量讓自己準備好內容,但總是有可能因為恍神、遇到不熟的主題、緊張漏聽等等讓內容不夠好,所以我想先從語調著手。如果能讓自己不管什麼情況都能講出好的語調,要進步到 26 以上就更有可能了!

改進語調的問題

這邊的問題根源應該整個答題信心,只要有信心,應該就可以講出好的語調才是,所以首先可以想像自己是英文很好的人,講起來完全不需要擔心,也不會被別人覺得不好。

然後也聽聽什麼叫做好的語調:

好的語調應該有幾個重點:

  1. Rise(在重點處變成上揚的聲音):示範音檔(為了加上 Rise,節奏自然會變得較慢)
  2. Emphasis(在關鍵字延長):示範音檔(延長動詞的地方)
  3. Volume(在關鍵字加大音量):示範音檔(在動詞的地方變大聲)
  4. Pause(在轉折詞停頓,加強節奏感):示範音檔

接下來就是把這些技巧一步步地融合到回答中:

  1. Rise:TPO30_Q3_第二次錄音(聽起來就明顯比第一次的錄音有起伏了!)
  2. 綜合以上:TPO30_Q3_第三次錄音(又比第二次錄音聽起來更好!)

經過這邊的改進之後,我發現自己的根本問題是我連說中文的時候都沒有什麼音調起伏,所以講英文的時候,也自然是如此。而這個問題,其實是來自於我只把說話的目標放在把想說的話說出來,而非讓對方易於理解跟掌握重點。

只要把說話的目標,從 說完 改成 說得清楚、有強調重點讓對方易於理解,自然就能強化語調囉!而且會對未來說話有全面性的幫助!不僅僅適用於考試~接下來就是慢慢地將這個習慣,融入到生活之中啦!

改進解釋不夠清楚的問題

解釋會不夠清楚,跟筆記有極大的正相關,這邊可以 follow David 的口說三到六題練習方法,循序漸進地讓自己的筆記內容優化。

首先,是大概要講的內容,畢竟第三題只有 60 秒,所以不應妄想把所有細節都呈現出來(例如 circle around、snowing ice on the ground),而是應該把該講的重點都講到(開車到學校需要車位、因為施工所以車位減少、必須停較遠、大家都會遲到;上次工程遇到暴風雪、常常中斷、花更多時間)。可是,要怎麼讓筆記大致上都是可以講的重點呢?我覺得就是在抄的時候要篩選,像 David 講的 要知道哪些資訊是自己想要留下的,這樣抄下來的筆記就會都是自己想要講的。準備時間就只需要加上轉折詞了。

接下來,是時間的掌握,根據第三次錄音,若要讓語調聽起來是舒服的,我可以講到的句數大概是 14 句(我把抄到的每一個 SVO 當作一句):

  1. Summarize plan:1 句
  2. 學生立場:1句
  3. 同意/反對第一個理由:1 句
  4. 第一個意見的詳細說明:6 句
  5. 同意/反對第二個理由:1 句
  6. 第二個意見的詳細說明:3 句
  7. 結論句:1 句

所以兩個意見的詳細說明部分,大概只要各抄個 5 句即可。

接下來根據上面這兩點 – 有意識地篩選資訊兩個詳細說明部分篩到 5 句左右,來練習一回 TPO31 的 Q3:TPO31_Q3_第一次錄音

這次講了之後,發現講起來非常的卡,主要是因為我抄的筆記邏輯不連貫,然後因為卡住,心思就會回到只希望可以把內容都講出來,語調就又 lost 掉了。 所以問題的根源在於筆記做得不夠好。

而筆記之所以不連貫,並不是因為我沒有要篩選資訊的意識,而是因為我辦不到!我抄筆記的速度太慢了,所以當我聽懂一個東西時,就漏了下一個東西。所以如果學生表達了 1 2 3 4 5 6,我大概就只抄到 1 3 5,講起來也就很容易很卡。所以要最根本加強的應該是抄筆記的能力,可以抄到重點、也能夠講得很順暢

筆記修正之後就可以把內容抄完,最後就是邏輯是否要再修正,原本的講法是

  1. 講 proposal
  2. 講學生立場
  3. 講學生對理由一的立場
  4. 講學生對理由一的意見
  5. 講學生對理由二的立場
  6. 講學生對理由二的意見

但上面這樣的講法是把 Reading 跟 Listening 的內容交互講,自己很容易混亂。所以把結構調成先把 Reading 講完,再講 Listening。

  1. 講 proposal
  2. 講 proposal 的理由一 & 理由二
  3. 講學生立場
  4. 講學生對理由一的意見
  5. 講學生對理由二的意見

模板長相會變成

In the reading passage, the University/Student proposes that ____. This is because Reason 1 & Reason 2. And/But the man/woman Agree/Disagree with the proposal. First,  _________. Secondly, ________.

結果回報

用上面的方法去注意語調真的很有幫助,二戰的時候,剛好很衰地跟坐我旁邊的女生強碰,不但回答問題的時間幾乎一樣,我們兩個又都算是講得很大聲,結果我的思考就一直被她的回答拉走(我猜她也是QQ)。

但即使這樣,我都還有 24 分,我想這個方法還是挺有效的。希望大家都加油,考高分!

延伸閱讀

  1. David: 口說如何28分以上?(需要加強內容的深度、豐富度與切題度)
AI/ML, Robotics

深入淺出 End-to-End Learning on Robotics

前言

隨著機器人不斷地發展,機器人已經越來越聰明,可以漸漸學習執行更高複雜度的任務。在實作如此複雜的機器人時,參考人類的學習能力是很自然的一件事情。人類學習是一大黑盒子,從五官收到 sensory input,對應到所有肌肉的 control output。學習藉著 raw sensory input ,產生最後的 control output,就稱為 end-to-end learning。

相較來說,傳統方法常傾向把過程中的每一個功能都拆分成一個個 module,再將這些 module 串成一個 pipeline,無法評論哪個好,只是呈現給大家看。

end-tp-end

接下來我們會帶大家一起來讀 End-to-End Training of Deep Visuomotor Policies,對這類方法有簡單的認識。雖然這篇論文提出的架構並沒有辦法讓機器人像人類般聰明地做事情(光是接收到的 sensor input 就還比人類少很多,起碼缺少了聽覺、觸覺、味覺、嗅覺),但是這篇論文仍然提出了一個很好的架構,有初步的廣泛應用能力(e.g. 學會怎麼掛上衣架後,就算衣架上有毛巾還是可以掛上)、並且可以處理用 hand crafted 程式很難做到的複雜任務(像是旋緊瓶蓋、把方塊放進大小接近的洞裡),相當值得一讀。

可以做到的成果

他們用來實驗的 task 包含了下圖中的幾種任務,我們可以先看看下面的影片

gps-task.JPG

由此影片應該看得出這個架構有它厲害的地方,接著就讓我們來看看它是怎麼做到的!

黑盒子架構簡介

這篇論文的目標,是希望可以讓機器人學習從 raw image input 擷取出重要的資訊,來決定要怎麼產生 action。所以可以預期,我們應該要有一個黑盒子,接收 raw image input,直接產生機器人的 motor control output(就像我們控制各種肌肉一般),而這個黑盒子,就由 DNN 來實作。

先上個黑盒子的架構圖;

gps-architecture.JPG

架構圖跟我們一開始認為的目標是相合的,最左邊的 input 接收的是 240 x 240 的 raw image input,經過了中間的 7 層 layer 之後,產生最後的 motor torque(就是馬達要做什麼 action)。前面的 4 層 layer 都是在處理影像、抽取特徵,後面的 3 個 layer 則是將特徵對應到 motor torque。

這個黑盒子就是這篇論文提到的 policy,policy 的定義如下圖,基本上就是會根據 observation o,產生 action u 的機率分布(採取各種不同 action 的機率):

gps-head.JPG

gps-policy

gps-u_and_o

如果您是對 DNN 有些了解的讀者,您一定會想問,這看起來不就只是個 supervised learning 嗎?好像也沒什麼特別的啊?

其實,只要牽扯到機器人,要收集海量的 training data 就是一件很困難的事情,不過答案沒有這麼簡單!要可以做到影片中的結果,就算你真的認真地收集了海量的 data,透過 supervised learning 來訓練上面這個 DNN 也還是會失敗。換句話說,這篇論文完全不是直接使用大量的 training data 來訓練上面這個黑盒子。

之所以不這樣訓練是因為,就算用海量的資料訓練出了一個 fitting error 很小的黑盒子,在實際執行的過程中,肯定還是會因為觀察到的 observation 跟 training data 不同、採取的 action 有誤差等等,逐漸產生在 training 過程中沒看過的 state,最後就很容易導致在 testing 過程中發生各種錯誤。(我們把這個問題簡稱為 training data 不是從 policy 來的問題)舉例來說,如果我們要訓練一個自動駕駛的系統,我們會提供很多人類開車的 training data,但是人類開車通常都是處在很正常的狀態,轉彎的時候也通常會離牆壁很遠,但如果自動駕駛系統在遇到彎道時,有一些控制誤差,使車子很靠近牆壁,這種狀況就是 training data 中不太會有的 state,這時候就有點恐怖了,因為你沒 train 過它這種狀況,你就不知道它會採取什麼行為。

要避免這個問題,就是要在 training 時,讓上面的黑盒子自己產生 training data,這樣在訓練時,就真的是看到自己採取的各個 action 是好還是不好。這就很像是我們在學習的過程中,自己動手下去做,才會真正知道自己有什麼問題。譬如我們可以看很多諸葛亮的故事,覺得他好聰明,但是知道他在那些狀況下會採取的行動,對我們的幫助通常不大,基本上就只是在看故事而已,因為我們不太可能碰到司馬懿帶兵來打、自己兵又很少,可以使用空城計的狀況,重點應該是我們在日常生活中碰到狀況,要能用諸葛亮的智慧來採取行動。

這就是避免 training data 不是從 policy 來的問題 的核心精神,必須用我們自己的 policy 去採取行動,並透過這些行動造成的結果好壞,來改進我們的 policy,這個概念可以簡化如下圖:

gps-rl.JPG

既然講到這邊,就讓我延伸一下,做完行動,該怎麼評判自己做得好不好(estimate return)就是眼界問題了。同樣做一件事,不同格局的人所下的評價可能天差地別,例如有一個學生 A 想要全力發展自己的強項,有的老師可能覺得將一項專長磨練到頂尖很好、有的老師可能認為應該先補足弱項才好。假設 A 只有兩種 action (發展強項 or 發展弱項)可以採取,當他的 observation 是看到自己的強項有好的表現 & 有些弱項表現得不好,他得把發展強項帶來的好處的 return 估計得更高,把弱項減損的 return 下修,他才會去發展強項。若是走發展強項之路,他最後很可能會成為某領域的頂尖專家,而非各項都平平的人。這也是為什麼有好的老師(or mentor)很重要,因為他們可以用更高的眼界來 estimate return(用 Reinforcement Learning 的名詞來說,就是他們的 reward function 更好)。好了,題外話講完,讓我們繼續往下看。

Training 方法簡介

看到這邊大家應該很好奇,上面的概念講起來很簡單,在這篇論文是怎麼實際 train 那個 7 層的黑盒子呢?

讓我們先看這篇論文的 training 方法概念圖:

gps-train.JPG

核心的概念是這樣,首先我們先有一個 RL 的演算法,幫助我們產生一個可以拿來當作指導者的 guiding distribution – Pi(就是上圖最左下角的 optimize local controller Pi),這個 guiding distribution 就可以產生一系列的 action 與 state pair(也就是上圖中的 collect samples from Pi),然後,我們再將這一些由指導者產生的 sample,拿來訓練我們的 policy(上圖右下角的 train global policy to match local controller,也就是單純的 supervised learning),使 policy 無限逼近指導者。

原本要直接訓練上面的黑盒子很困難,因為要產生大量的 training data 非常困難,但是因為有了 Guided Policy Search(GPS)的架構,我們就可以同時滿足:

  1. Training data 是來自於 policy 本身(雖然實際上是來自於指導者的 guiding distribution,但是經過 GPS 訓練,policy 跟指導者會有相同的行為,所以沒問題)
  2. 有了可以拿來產生 supervised sample 的指導者,解決不知道哪來 data 可以 train 的問題

我們可以看一下這一小段論文加強理解:

一開始的 avoid this issue 指的是要避免 training data 不是從 policy 來的問題,所以他們交互使用 RL 跟 supervised learning,加上又已經有理論(Wang and Banerjee, 2014)證實這種訓練方法可以讓 policy 跟指導者的 guiding distribution 有相同行為,所以訓練可行。

gps-theory.JPG

接下來您可能會想問,我們憑什麼相信指導者的 guiding distribution 可以產生 supervised learning 的 training data?

Guided Policy Search 方法簡介

上一段最後的問題已經逼近核心了,最後就讓我們再回答這個問題。我們之所以可以相信指導者的 guiding distribution,是因為 guiding distribution 是透過 system dynamics 來優化的。而 system dynamics 就是真實世界的運行法則(接下來,guiding distribution == controller,為了符合論文的語言,方便待會閱讀)。

system dynamics 可以告訴我們, given 某個 state 跟 action,下一個 state 的機率分布會是什麼。換句話說,state dynamics 跟你說若你種了這些因,你會得到什麼果。而 controller 是為了達到某個 goal state,而採取 action,也就是可以告訴你為了達到某個果,你要種什麼因。所以 state dynamics 可以用來修正 controller 對因果關係的了解。

舉個生活化的例子,假設今天是星期天,你想吃飽,你就走去附近的小吃店 A 買食物,但是你走到那邊發現,那間小吃店 A 星期天公休。這個過程就是:

  1. 一開始,你處在星期天的飢餓 state,所以你要採取 action
  2. 你的 controller 跟你說,星期天飢餓時,走去附近某小吃店 A 就對啦!讚讚
  3. 走到某小吃店 A,才由 system dynamics 無情地跟你說,你在星期天飢餓時,走去小吃店,你會看到的下一個 state 是,小吃店 A 沒開
  4. 於是你就可以修正自己的 controller,知道下次星期天飢餓時,不要走去小吃店 A 了

也就是說,只要您實際嘗試,您一定可以透過這個世界的真實狀態(system dynamics),修正自己的認知(controller),不再天真地認為走去小吃店 A 就有東西吃。

這就是為什麼我們可以相信 guiding distribution 的直觀原因。上述概念完全可以在下圖中重新印證,您可以看看下圖中的論文原文再強化一下觀念。

gps-policy-1gps-policy-2

詳細為何可以 optimize linear-Gaussian controllers 就不提了,有點太過理論,若有興趣可以自行去看論文中 Section 4.2 的數學說明!

總結

今天我們跟大家簡單介紹了 End-to-End learning 的概念,並用一篇論文來詳細地介紹這種概念怎麼在機器人上運用(利用 guided policy search)。

此外,在過程中我順便 demo 了一下可以比較快速地了解一篇論文的閱讀法(先看動機 -> 看結果可以做到什麼 -> 問他們憑什麼可以做到 -> 直接找到關鍵答案,所以像 related work 就會在此閱讀方法中被忽略),希望對各位有幫助!

延伸閱讀

  1. Guided Policy Search 網頁
  2. Policy gradients introduction

如果您對機器人或是 ROS 相關文章有興趣,歡迎到 我的首頁 看更多文章!