2018年8月19日 星期日

bash shell 迴圈寫法

在bash shell 中的迴圈有三種主要寫法:

  1. For Loop
  2. While Loop
  3. Until Loop



< for loop>

a. 清單式
for Variable in List ; do 
   ... 
done
 example:
 for myFiles  in  test*
    echo $myFiles
done 
優點:處理檔案、資料,或是在某資料夾中沒有命名規則的檔案
缺點:若需要處理有index 的時候,可以使用其他迴圈寫法較為方便,否則就需要於建立清單時將此index寫入,如:
bgn=0; int=1; end=10;
for i in ${ seq $bgn $int $end }; do
   ...
done

b. 雙括號式
for (( 初始值; 迴圈結束判斷; 步進值 )); do
    ...
done

example:
bgn=0; end=10
for ((  i = bgn ; i <= end; i ++ ))
  ...
done 

雙括號式的變數為迴圈index,故利於處理具有index的檔案,或是單純的迴圈計算。
i++ 也可以寫成++ i,若要改變步進值,可以直接寫成i+=n


c. 大括號式
for Variable in { 初始值..終止值..步進值}; do
    ...
done
若只是單純處理某區間的迴圈,如1~10,這種寫法和b.差不多;但若要進行一些終止邏輯判斷,此寫法不適合。

example:
bgn=0; end=10
 for i in {bgn..end}; do
    ...
 done
Note:在某些版本(或機器?)上,無法指定步進值,只能令步進值為1,若指定的步進值不為1 則會出錯。 => 原因尚不明,近期也不會深究。


<While Loop>


While [ condition ]; do
    ... 
done
當condition 為真,便執行迴圈。如;
i = 1
whle [ $i -lt  10 ]; do 
   ... 
   i= expr ` $i + 1 
done 

也可以不使用條件判斷,而是在迴圈內部控制:
while : ; do
   ...
done 

While 指令也可以用來讀取資料,一次讀取一行:
read fileName
while read line; do
      echo " $line"
done 
<Until Loop>

Until [ condition ];  do
    ...
done 
Until loop 一般比較少用到,因為它的概念其實和while 迴圈類似:
    while 是[ condition]成立會執行迴圈;
    until則是[condition]不成立,才會執行迴圈。
或是換句話說:
    當while的條件為真,迴圈執行;
    當Until 的條件為真,迴圈馬上停止。


<Continue、break>

不論是哪一種迴圈,這兩個指令都適用。
只要在迴圈中遇到continue指令,就會立刻回到迴圈的開頭,重複執行;
若是遇到break指令,就會立刻離開迴圈。




2018年7月19日 星期四

arg max f(x)

y=f(x)  : 輸入一個x到函數f中,會得到output y
y=max f(x) :在所有f(x)的輸出值中,最大的輸出值
y=argmax f(x):在所有f(x)的輸出值中,要得到最大輸出值時的參數 x

如:
x=1,2,3; f(x)=x*6
y1=f(1)=6,
y2=f(2)=12,
y3=f(3)=18,

y=max(f(x)) = max[ y1, y2, y3] =y3 =18

y= argmax f(x)= which x causes the max.
y = 3



2017年10月29日 星期日

如何準備書報討論 (seminar)

回想當初從大學進入到研究所的階段,我覺得最大的差異與衝擊就來自於書報討論這門課,其他研究所的課對我來說其實和大學部的差異其實不大,基本上都還是屬於單向接收的角色,課堂中在台下接收教授的講述或在家自行閱讀時接收教科書的文字論點,唯一差別在於難度的提升以及必須試圖將所有知識串聯並建立架構。但書報討論這門課卻讓我必須從扮演已久的接收者轉換成論述者,我需要理解一篇文章想要傳達的概念,並將這些概念與其他相關的知識組織整理成一篇合邏輯的故事介紹給其他人,過程中我需要複習許多基礎的知識,並以觀眾的角度思考哪些地方可能過於專業,需要想一些簡單的例子幫助想像,同時針對可能出現問題的地方盡可能詳細的描述(或是準備好,刻意讓他人提問)。因此書報討論對我來說是一門相當有趣且富有挑戰性的課。從研究所至今也準備過許多次書報討論,從最初需要一個月以上的準備時間並花費一整個禮拜準備講稿和順口條(這是關鍵!!),到後期可能只需要一至兩個禮拜就可以完成所有的準備工作,過程中我也整理累積出了一些心得和個人認為需要注意的事項,正好可以筆記下來。

如何挑選Paper

在這個年代,隨便google一些關鍵字,都可跳出許多Paper,但哪些適合閱讀、哪些適合瀏覽、哪些適合報告、哪些可完全置之不理,光挑選本身就是一件有趣且苦惱的事。從書報討論的角度出發,我自己會有幾個準則來刪除一些不適合報告的文章:
  1. 與自身研究的關聯性: 書報討論除了讓觀眾能了解不同領域的研究外,我想最主要的目的還是讓報告的人能夠完整消化一至數篇文章。既然都要花那麼多的心力去閱讀,能一魚兩吃自然最好。
  2. 論文發表時間:以我自身的領域來說,不論是數值天氣預報或是資料同化方法的研究都還算是發展期,仍會有許多新觀點或新方法被提出,換句話說,有些研究還是具有時效性(並非說研究內容錯誤或怎樣,但可能問題經過十幾年的討論後已得到共識解或最佳解了,此時去報告過渡期中的一些研究可能會誤導觀眾以為那就是目前針對此議題的現況或結果;或這個科學問題可能因為科技的進步已獲得解決,這些科學發展過程中的掙扎和嘗試就屬於值得閱讀,卻未必適合報告的文章),因此除非有特殊原因要介紹一些經典的文章外,我會建議以近五年的文章為報告主軸,但仍可以挑選一些相較久遠的文章做為論點的比較和輔佐,令報告更加完善。
  3. 閱讀的難易度:有些文章可能很新、也與自身研究很有關聯,但相當艱澀。這種文章通常會讓自己在閱讀中痛苦不堪,即使耗費許多心力理解後,要再介紹給他人也有相當難度,這種痛苦的事情就不要互相傷害了。此外,如果有些文章主要著重在公式推導的話,可能也不太適合作為書報討論的文章。
  4. 題材合適程度:以上三點比較是從準備者的角度思考,而這點主要是從觀眾的觀點考量。對我來說,書報討論有點像是系所內的通識課,透過書報討論來瞭解系上其他實驗室在關心那些議題,以及這個議題目前主要問題在哪,大家試圖從哪個哪個方向去解決這些問題。因此身為觀眾,我其實不太希望聽到一個需要過多專業背景知識的報告,例如當我聽一個空氣汙染的研究時,我就不太希望聽到一個需要花十分鐘講解化學反應過程才能理解的報告,這種文章可能適合在實驗室內部報告,卻不適合一般系所的書報討論。

對於剛進研究所的新手,我建議可以依照自己的興趣或實驗室的研究方向挑選三到五篇文章,簡單閱讀摘要後大概瞭寫文章的方向後,與指導教授討論哪篇比較合適,但千萬不要一口氣抓了十篇文章標題就直接問指導教授,除非你有她的裸照


重點是? 如何選擇報告內容

不論是短至十五二十分鐘,長達一個小時,書報討論的重點絕對不會是時間,講者想要透過這個報告讓觀眾記得並理解的概念才是重點,也就是所謂的take home message,時間的長短只是讓講者有更多的舞台來鋪陳他的論述、提供更多的佐證,讓觀眾能理解並且接受這些概念,並非時間越長就必須提供更多的take home message

在盡所有能力(有限時間內,也與指導老師討論過有疑問處後)閱讀完一篇文章後,假設你可以抓到五個作者所想要表達的重點,其中可能只有三點你可以完全的理解(可以用自己的邏輯完整陳述),有一點你不是很確定,剩下還有一點你完全不知道他在嘴砲甚麼,在這種情況下,千萬不要想仍然把文章的五個重點全部介紹,這絕對是自己挖洞給自己跳。我建議就乖乖的把你懂得三個重點好好的介紹,甚至,挑其中一兩個重點介紹即可。在有限的報告時間內,你要確定這些take home message有效地被討論、解釋,而你所有呈現的實驗結果都圍繞著這些你所想要傳達的訊息,千萬不要文章有多少內容有幾張圖就全部轉成投影片讓報告看起來好像頁數很多自己準備很充分,但實際上每張圖都快速跳過、每個重點草草帶過,最後再露出一種都是因為時間的關係的扼腕表情。

除了閱讀文章並從中挑選想傳達的概念外,我覺得在準備報告題材時,理解文章的重要性也是件不可或缺的工作。每篇文章能被刊登都一定有其重要性,可能是一個新穎的方法或技術、某個特殊個案的診斷分析、針對某領域某技術的回顧文章等等。一篇文章的重要性大多都可以從indtroduction或文獻回顧中找到,但可能受限篇幅或時間性,無法將文章在該領域中的重要性完整描述,有時可能需要多看幾篇文章或與指導教授討論後,才能對該領域發展過程的整體歷史脈絡梳理出一些頭緒,這工作對瞭解文章重要性會有相當大的幫助。以我自己的經驗,我會盡量在投影片第一頁介紹題目的同時,就針對這篇文章(報告)的重要性進行簡單的描述,讓觀眾能在一開始注意力最集中的時候,就清楚瞭解到今天主題及其重要性,並試圖建立(扼殺?)起觀眾的好奇心,讓觀眾能更專注於報告中。

需要特別說明的是,對我來說,瞭解一個領域的發展過程(科學史)是在科學研究中相當重要且有趣的一件事,你會從整個科學史的發展瞭解到最初是誰基於甚麼原因或為了達到甚麼目的而開始進行這個研究,在研究初期做了那些假設或受限於那些條件而得到了怎樣的結果,後續的研究者是如何基於這些基礎或猜想,依循何種邏輯來延伸這個議題,在研究過程中又再發現了哪些新的問題,甚至是新的研究成果完全推翻最初的研究結果,也可能研究結果並無法解決最初的問題,卻反而成為其他領域或研究方向中的最佳解。如果不去瞭解這個領域發展的整體背景和思維,就很難進一步理解為何現在這個領域研究重點會是這些議題以及每位科學家是依循怎樣的邏輯處理這個問題。

開始編故事

準備好文章題材後,接下來的難題就在於如何編排內容才能讓報告變得流暢當決定好想要傳遞給觀眾的概念,並挑出與此概念相關的圖與內容後,就要開始準備編故事了。當然,你可以直接套用文章的邏輯思路轉化成你的報告,但別忘記了,其實你並未打算將整篇文章所想傳達的概念都完整呈現於你的報告中,因此作者所採用的思路未必適合。對我來說,當我把文章內容轉化成投影片時,其實就像在重新改寫那篇文章一樣,我要將原始文章中部分內容刪除,而為了彌補被刪除的部分,我就需要改變文章的敘述方式。同時為引起觀眾的興趣,或讓自己在講述時更為流暢,我甚至要將文章架構整個改變。

當我在準備第一版的投影片時,我會以我想要傳遞的概念先當作大綱,再將相關的圖或內容放上去。不論是依照作者或自己的思路,必須讓整個報告的邏輯是清晰流暢的,並注意當我從這頁跳到下一頁時,一定會有個原因或動機,這樣才會讓下一頁的內容變得有價值。例如準備要進入介紹實驗A的投影片,那我就必須說明基於甚麼理由我們(作者)需要進行這個實驗,且實驗目的是希望釐清哪些事情。如果只是直接說那我們來看實驗A blabla....,那我會覺得少了些甚麼。在投影片間,我會多用「why」和「因為...所以...」來連接並告知觀眾內容的重要性與連貫性,讓觀眾能順著我介紹的邏輯來理解報告所想要傳遞的訊息,而不是以跳躍的報告方式訓練觀眾的組織能力和猜謎能力。同時我會在報告中適時的提醒觀眾這個報告的(我想傳遞的)重點是甚麼,讓大家能記住我所想要傳遞的概念。


時間的掌握

一個好的報告,時間的掌握絕對是個評估的標準之一,早早結束的報告會讓人覺得準備不足,超時太多的報告也會讓人心情煩躁,內容準備太多卻硬要在時間全部交代反而會讓觀眾無法好好思考吸收,要做到不疾不徐的報告,依照自己擁有的報告時間來決定要交代的內容多寡就是講者需要事先規劃的部分了。
對我來說,一張投影片所提供的內容至少要有一分鐘,最多不超過三分鐘(扣除掉為了報告流程而放的大綱頁)。一張投影片如果需要交代的事情少於一分鐘,那就可以思考一下是否真的需要這張投影片,刪除或是跟其他頁合併都是選項;如果一張投影片需要花超過三分鐘來陳述解釋,那就要思考一下這張投影片資訊密度是否太高,可能會讓觀眾耐心下降或注意力渙散。
因此我在估計報告時間時,我會將投影片分為三種,一個是廢頁,例如為了流程而放的大綱頁,在計算時間時就直接忽略;另一種是普通頁,我大概就當作一頁一分鐘;第三種是重點頁,我會抓一頁是三分鐘。假如是一個十五分鐘的報告,我大概會讓投影片準備在17、18分鐘左右,因為上台後可能會由於緊張而遺忘掉一些內容或是讓語速變快,所以大概多準備兩三分鐘的投影片差不多,如果整個報告一切都很理想,多個兩三分鐘我認為都還是在可接受的範圍內。萬一真的無法增加報告時間,可以讓整個報告停在結論的那一頁,讓觀眾自己去看,而不用再多花時間複誦結論內容。


口條

我想每個觀眾都希望聽到一個相當流暢的報告,而不是看著講者在台上突然當機,自己看著自己的投影片看半天還是不知道自己要說些甚麼。除非你已經是相當資深的演講者,否則我會建議在你完成投影片後,請自己拿著碼表,試著將整個報告講過一遍。試講的過程中你會發現在某些點自己講起來還是很不順,如果很不順暢的原因是單純詞窮,那可以打開word,先好好釐清自己在這段想說些甚麼,並寫成講稿,讓自己知道可以用怎樣的方式順利表達這個概念;如果是因為內容不熟悉以至於漏講內容或不知道重點在何處,那可試著在投影片中參雜一些關鍵字或將關鍵字上色,在圖上做一些記號也是個方法,這些技巧不僅能提醒自己重點在哪邊外,也可增加觀眾印象。
我個人的經驗是我一定會把投影片前幾頁重複順講好幾次,甚至熟練到幾乎可以背起來。因為我自己做投影片的習慣是我會將希望聽眾記得的重點再報告開頭就先介紹,所以前幾頁一般都會是文章的重點或精華,將這些內容記起來也不是件壞事。此外,如果報告一開始就能夠很順暢的進行,絕對能幫助講者建立自信,並讓聽眾更快進入狀況。


如果我是聽眾 

書報討論的目的是讓自己針對某個議題,透過閱讀期刊文章增進自己對這議題的認識,並且將閱讀後的心得或新知有效地組織以傳遞給他人了解,因此所有的準備都必須從觀眾的角度出發,幫助觀眾在最短時間內建構出對此議題或是報告主題的框架,讓觀眾能繼續深入地了解報告的細節,進而與講者討論。因此當整個報告準備好後,我會試圖拋開所有的想法,從頭到尾將我的投影片看過一次,想像如果我是聽眾,我能不能直接從前幾張投影片掌握 1. 這篇文章的價值、2. 這篇文章想克服的議題或想分析的事物、3. 有沒有哪些專有名詞是過於專業以至於可能成為一般聽眾理解內容的障礙?


在正式報告之前,我相信很多人會找自己的朋友或同學來聽自己試報。如果是實驗室內部的報告,可以請實驗室的同學聽你試講,如果是針對整個系所的報告,那一定要再找一兩個不同領域的同學,來幫助你了解報告是否過於艱深或過於專業而不自知。但請注意試報是請別人來幫你debug,而不是來幫你coding的,你必須讓自己的報告過得了自己良心這關後,再請別人來幫你找有沒有哪些盲點是自己沒注意到的,而不是請人來幫你一起準備一個報告。如果自己都不能說服自己這是一個完美的投影片、自己所準備的講稿或內容是最好的,並且真的能夠幫助其他人學習到一些新東西的話,你怎麼好意思直接上台浪費底下所有人的時間呢? 

2017年10月12日 星期四

不熟的常用vim指令

此處筆記還不熟的vim常用指令
Last Update: 20171013


<游標移動>
ctrl+f       : 向下一頁 (= page down)
ctrl+b      : 向上一頁 (= page up)

0或home: 移動到該列首字元處
$或end   : 移動到該列最後字元處

H            : 移動到視窗第一列首字元處
M            : 移動到視窗中間列首字元處
L             : 移動到視窗最末列首字元處

gg或1G   : 移動到檔案第一列
G             :移動到檔案最末列

<複製、剪下、貼上>
選擇文字( v:部分文字: V: 整行)
複製文字( y )
剪下文字( d )
貼上文字( p )

單行複製貼上: V => y => p
單行剪下貼上: V => d => p

將游標所在列與下一列結合 (J)
重複上一個動作 (ctrl+r)


<進入insert mode>
I  : 於游標所在列第一個非空白字元處插入
A : 於游標所在列最後一個字元處插入
o : 於游標所在列之下一列插入新的一列
O: 於游標所在列之上一列插入新的一列

:!  command => 可暫時退出vim,於指令列執行command並顯示結果,如 " :! ls "



程式變數命名原則

撰寫程式時,良好的註解習慣是不可或缺的。

而程式的變數名稱可以視為此變數最直觀的註解,因此如何替變數取一個好名字就是撰寫程式時的藝術了。

一般在替程式命名時,會有幾種規則,這些命名法則並無特殊優劣,但我們會希望在整個程式碼中變數的命名方式(風格)是一致的。

  • 駝峰式(Camel Case)一般又可分為大駝峰與小駝峰:
    • 大駝峰,也被稱作Pascal case,變數的首字母為大寫,並且各表意的單字字首皆以大寫區分,如LocalQvaporAccumulate。
    • 小駝峰,各表意的單字字首同樣以大寫區分,惟變數首字母為小寫,如localQvaporAccumulate。

  • Snake Case
    各表意單字間以下劃線「_」區分,如local_qvapor_accumulate。

  • Kebab Case
    各表意單字間以連接符號「-」區分,如local-qvapor-accumulate。

  • 匈牙利命名法(Hungarian notation)
        這種命名法的特性在於會將變數的資料型態放在字首,如"lAccountNum",其中的 "l"就表示此變數屬於長整數型態;或透過字首表示變數目的的提示或是變數代表了甚麼,如"strName"中的str就表示此變數屬於字串。


個人習慣使用Pascal Case來替變數命名,但若在較為複雜的迴圈中,則採用SnakeCase輔助辨識迴圈index所代表的意義,如i_x、j_y、k_lev等。

2016年9月30日 星期五

如何整理學術文獻

從大學到博士班,一路上花費在文獻閱讀上的時間也不算少。有時回頭看會覺得有些方法或概念如果當初能夠早點知道,或許就不會走了那麼多冤路,那些浪費的時間就可以用來從事其他休閒活動,例如讀更多的文獻。因此我希望把過去這數年閱讀文獻的一些過程技巧記錄下來,但我必須事先強調,每個學科領域或是每個人所適用的文獻閱讀方法絕對不同,如同做研究一樣,可以將別人的方法當作參考,但絕對不可盲目當作聖經完全依循,閱讀的同時也可以思考看看那些部份可以改進得更好,那些地方其實是做虛工浪費時間。畢竟,身為研究生,不論是哪種題材,閱讀時還是得保有一些職業敏銳度的XD。


I.  怎麼找?搜索文獻

還記得我當初剛進到碩士班,接觸到的第一個題目是我以前在大學時期完全陌生的領域(廢話一句XD),雖然指導教授並沒有給予任何壓力,但自己還是希望能快點從一張白紙到能夠聽懂group meeting時其他學長姊到底在說些甚麼。因此那段時期就一直逼自己大量閱讀期刊,希望能夠早點跟上其他人的腳步。


但是,要看那些期刊呢? 對於這種新手村LV0的狀況,最快上手的方式就是直接找看看有沒有這個領域的回顧文章,如果有的話,恭喜你! 你已經找到進入這個領域的guide paper了。若不幸地,你所研究的領域太新,或是太冷門,沒有這種Review Paper的話該怎麼辦呢?我個人的方法是隨機的挑選領域內十年內的文章大約十幾篇,只看Reference的部分,挑出這些文章都有引用的論文,基本上這些文章應該就算是這個領域比較經典或是重要的文章,可以把這幾篇文章當作是guide paper。從這幾篇經典文章開始出發,透過非常好用的google scholar,就可以找出還有那些文章是引用這幾篇經典文章的, 這樣就可以快速地建立出關於這個議題或是領域的文獻樹,快速瀏覽這些文章的標題,可以概括的對於這個領域在不同期間所關注的議題有一些基本認識,再從其中挑選有興趣的文章來看,能夠比較快速且有效率的幫助你在完全陌生的領域中梳理出方向。

這個階段的文獻瀏覽我只關注題目內容與作者是誰,頂多看到有興趣或是直覺認為重要的文章會多看一下摘要。因為在這個階段我只有三個目的:

  1. 試圖了解這個領域整體的發展方向與各個時期的主要研究重心在哪方面。
  2. 在這個領域內有那些人或是那些團隊是比較活躍的。如果有不同的說法或派別,那哪種說法或派別到現在還是比較流行的。
  3. 透過這種粗略的瀏覽先對這個領域建構出一個簡單的架構,再從中思考其中那些部分是自己有興趣的,哪些部分是重要的,進而再決定自己閱讀的重心該放在哪邊。
我個人是覺得找出自己有興趣的方向和了解哪些方向是這個領域重要的題目都一樣重要。前者能夠激發你的熱情,即使這個方向和你(或指導教授希望)未來的研究不同,都還是要趁業餘的時間好好研究一下,只要有熱情,學習起來的效率是連自己都會怕的;後者則是要有一些基礎的認識,了解其重要性為何,甚至要認真地翻過一兩篇經典的文章。


II. 怎麼看? 閱讀文獻

在回答怎麼看文章之前,我會希望先回答為什麼要看文章?沒錯,動機很重要。

看文章的目的不外乎兩種:1. 心中有疑惑,想要透過文章來獲得解答。2. 增加自己的知識庫。當然還有那些課堂作業或是老師要求的那種就先不討論了。

對我來說,我會認為閱讀文章有兩種方法,一種是橫向的閱讀,一種是縱向的閱讀。

橫向的閱讀是指同時將同一個方向的文章抓出來,在開始每看一篇文章前,自己心中先就這一批文章的題目做一些想法上的猜測,例如這些文章都是試圖解決哪個問題,如果是自己,會有那些解決的方法,或是看完這些題目後自己產生了那些疑問。將這些猜測和疑問記錄下來,再開始進行一輪快速的閱讀,這輪目的只是要回答自己的猜測是否正確,疑問是否能在這些文章中獲得解答。而在閱讀的同時,一定也會產生一些新的想法和猜想,這些想法或許可以修正自己最初的假設,也可能帶來更多的疑問,都無妨。經過一輪快速閱讀後,一定可以發現有幾篇文章對於你當前的問題幫助其實不大,可以不必再看,也一定有一些新的文章是你認為有幫助的,那就抓進來一起閱讀。接著再帶著這些問題再重複看第二輪。第二輪的閱讀同樣不求精,但可以比第一輪更有深度,同時也可以仔細的安排閱讀順序。例如通過第一輪的閱讀,大概可以知道那些文章都提到了類似的概念,有時候在A文章中對於這個概念有比較詳盡的解釋,B文章則是舉了一個不錯的例子或有仔細地推導,因此可以先讀A關於這個概念的部分,再看B文章的推導會比較有概念,或者是AB兩個交錯閱讀也是很好的方式。

因此,透過橫向閱讀的策略除了能夠透過不同文章的解釋讓讀者能挑選最適合自己的方式去理解外,也能夠逐層篩選出那些部分是自己最需要,非懂不可的部分,那些部分則只需要有個大略的概念即可,哪些部分則是可以完全忽略不理。也就是說,雖然乍看之下橫向閱讀需要耗費更多的時間進行閱讀,但這些閱讀都是更有效率的,因此能提供最多、最有用的資訊量。而且橫向閱讀的優勢在於每經過一輪閱讀,你對於這個領域的知識又增進了一層,自然能夠發現一些更為精緻的問題,再針對這些問題重複閱讀,必能對文章有更深一層的體悟。

縱向的閱讀則比較傳統,也就是一口氣認真仔細地讀完一篇文章。讀完後再針對文章內有興趣的部分或是有疑惑的部分去找尋第二篇文章來繼續閱讀。這樣的閱讀方式我個人是覺得比較偏向任務型取向的閱讀,例如為了應付某門課的報告,或是針對一個很明確的問題,需要在極短時間內獲得解答。

也有些人在閱讀文章時分為精讀和略讀。對我來說,除非這篇文章我很肯定與我目前工作的主軸有密切相關,或是這篇文章我有相當濃厚的興趣,抑或課堂需要進行報告,否則我不會精讀這篇文章。這並不是說精讀不如略讀,而是因為每個人時間有限,不可能每篇文章都能鉅細靡遺地從頭讀到尾,所以如何取捨閱讀材料也是研究生涯中需要練習的重點。

另外,我覺得不論是橫向或縱向的閱讀策略、精讀或細讀的閱讀方式,都有一個核心是必須抓住的,就是想像。很慶幸自己在閱讀第一篇文章的時候,就在無意間發現這個方法。當時為了某堂課的報告,花了一個星期一字一句地從頭到尾將文章仔細看過後還是不知所云,隨著報告時間一步步逼近,我就憑藉著我第一次閱讀後的印象,大膽地自己編了一個故事,想像這篇文章的重點是怎樣怎樣,然後用了哪些方法想要證明那些東西,因此得到那些結論。將我想像的大綱列出來後,在重新回頭去從文章找訊息,看看有那些敘述或是圖表是支持我所想像出來的故事,或是有沒有哪些敘述或是圖表和我的假設相反,那我該怎麼修正我的故事。因為已經閱讀過一遍了,對於文章的內容已有一些初步認識,所以很幸運地透過這個方式幫我理解了原本讀完第一次還是對其內容不知所云的文章。
也因此我會覺得在閱讀文章前,可以先閱讀完題目、摘要、各段落的題目後,再粗略地掃描一下文章內有的圖與結論,就可以開始想像、猜測這篇文章經營的步驟、方法以及結論,並試著自己架構出這篇文章的中心邏輯。然後根據自己的猜測從文章中找尋支持你的證據,如果發現與想像符合的話,那麼閱讀的速度就會飛快,因為你等於已經抓住作者思考的脈絡了;如果你發現越讀越奇怪,那可能是你的猜想錯誤了,這時候最好先暫停閱讀,重新看一遍摘要或你覺得重要的部分,再修正自己的猜想。透過想像建構自己的閱讀邏輯會比從無到有被迫去跟隨作者的思考邏輯還要輕鬆容易,只要持續發現自己的想法和文章內容相符,閱讀起來就不會有障礙,伴隨而來的成就感也能加大閱讀的樂趣;萬一自己的想法和文章內容相牴觸,因為需要重新思考與建構新的邏輯,也能加深自己對於這部分的印象。

怎樣才算是讀完一篇文章呢?根據你的目的不同會有不同的答案。不過有幾個基本的問題在你讀完這篇文章後一定要能夠回答出來:

  1. 這篇文章的重點是甚麼?它的價值在哪裡?它解決了那些科學問題?如果這個科學問題也有其他人進行類似的研究,那他們之間的差異在哪邊?
  2. 作者在解決這個問題的時候,有沒有進行一些假設?如果有,你覺得這個假設是否合理,或是這個假設有那些使用上的限制。如果作者沒有特別提到,那就針對這個問題自己假設一個非常極端的例子,看看文章的結論在這個極端例子中是否仍然成立?
  3. 作者使用了那些證據或是方法來佐證他的理論,是否合理?

最後,我的建議是最好能夠一次騰出數個小時,一氣呵成的閱讀。因為閱讀的時間越分散,思考就越不連貫,連帶降低閱讀的效率和印象。所以如果非必要,最好別利用零碎時間來讀文獻。


III. 怎麼記? 快速搜尋


我想大部分人在讀文章的時候,都會忍不住手癢畫畫重點寫寫心得。這當然是好事,在閱讀當下利用自己的思緒針對每一個小段落用自己的文字進行總結,或是隨手記錄下突如其來的想法與疑問,這些都是閱讀過程中最為寶貴的部分。
不過隨著科技的進步,每個人閱讀文章的管道越來越多元,有些比較環保的人會選擇在利用電腦或是平板閱讀文章;有些比較傳統或是害怕傷眼睛的人,就還是選擇使用紙本閱讀;甚至有人兩種方式都使用,雙管齊下的閱讀。這些方法都好。但是在這麼多元的媒介中,你會怎麼去記錄你的筆記呢?
或許有人會覺得是廢話,用電腦閱讀當然就直接在PDF檔案中進行編輯阿;用紙本當然就拿支筆直接在紙上塗塗畫畫阿。老實說,關於這點,我其實沒有太多的建議,怎樣紀錄當然依照個人習慣不同而有不同的方式。不過我只想點出一個很重要的概念:資訊集中,利於檢索。

嗯,沒錯,是八字箴言,絕對不是抄馬先生的。

就我個人的經驗,不論是紙本或是電腦我都試過。可能是我對於尖端科技的掌握度還不太熟悉,總會覺得在電腦上想要做些筆記或是畫線,還需要移動滑鼠選取功能鍵,然後才能畫線或是插入註釋,實在很不直觀,而且常常經過這些操作後,反而讓我分心,輕則忘記我本來靈光一現的想法,重則讓我自我放棄關掉閱讀文章的視窗。除此之外,因為領域的關係,做研究需要大量的coding,因此已經需要長時間面對螢幕了。所以最後我還是選擇使用紙本閱讀。而紙本閱讀時,如果有想法就可以直接寫在空白處,或是特別準備一本筆記本,把自己認為重要的訊息寫進去。

等等,這和那八字箴言有甚麼關係?

其實這主要是想要說明資訊集中的重要。如果你習慣使用電腦,那就盡情使用電腦記錄下你的筆記,如果你習慣紙本,那就好好找個筆記本,或是把你讀過的紙本都好好蒐藏。千萬不要一下把重點記在電腦中,一下又把心得寫在筆記本上,然後畫線畫在紙本中。這樣哪天你需要複習的時候,就會發現怎麼甚麼資訊都找不到,最後因為貪一時之快,反而得將文章重讀一次。紀錄的方法各有優劣,只要能確保資訊不會散落在各處就好。

此外,對大部分的研究生而言,所有的研究最終都得要寫成論文或是投稿期刊,在撰寫自己的文章時免不了需要進行文獻回顧。此時,如果能夠快速地找出過去自己所讀過的文章重點,將可以省下許多不必要的搜尋時間。同樣地,每個人紀錄的習慣不同,因此在找回過去閱讀文章的重點時所適用的方法也不盡相同。對我而言,我個人的習慣是在閱讀文章時是透過紙本閱讀,重點與心得也是直接寫在紙本上,但當同一篇文章讀過了一兩輪後,有些讀第一遍時的疑問可能已經獲得解答,或是經過更仔細閱讀後,發現有些第一遍略讀時的心得不全然正確,因此又直接在原本的筆記旁直接修正,如此一來,整個紙本就會變得相當混亂,不利於日後回顧。所以我會在一篇文章閱讀完畢後,如果有時間就趁記憶正清晰的時候將這些筆記或重點直接整理到電腦的PDF檔中,然後再放上雲端;若是沒有時間,就趁一些零碎的時間把這些筆記歸檔,在歸檔的同時也等於再度把這篇文章的重點複習一次。歸檔到電腦中的好處在於日後當我急需某篇文獻中的某一些句子或是重點時,可以快速藉由一些管理軟體,如Mendeley,幫助我很快的找到我需要的資訊。對我來說,不論讀的當下多麼認真,經過時間一定會忘掉許多細節資訊,因此把所有資訊透過電腦軟體集中儲存,日後需要的時候能夠快速找到,對我來說是比較有效率的紀錄方式。



2016年3月14日 星期一

濾波器發散 (Filter Divergence)


    系集卡爾曼濾波器(Ensemble-based Kalman Filter, EnKF)是利用系集預報後,各系集成員間的差異來估計背景誤差結構,而EnKF的表現取決於系集能否完整的表達真實大氣的特性,這牽扯到模式的動力是否完整正確、系集的樣本數是否足夠等因素。實作上因受限於計算資源,系集樣本數不可能太大,故EnKF經常面臨樣本數不足的問題。當系集樣本數不足(註一)時,除會引入取樣誤差外,更可能造成濾波器失敗(Filter Failure)。
  1. 較傳統的定義是指系集在動力模式中發展時,因樣本數不足,使得系集的差異性(離散度)不足,低估真實大氣的不確定性。這會讓EnKF認為此時的預報不確定性很低,模式已可掌握真實大氣的發展,也就不需過多的觀測資訊修正背景場。少了觀測資訊的修正,系集的離散度會隨著時間繼續下降,使得觀測資訊更難藉由同化過程修正背景場,最終致使系集收斂至模式動力特徵,完全背離真實大氣的狀態,導致濾波器發散(Filter Divergence)。 
  1. 另一種濾波器失敗稱作Catastrophic Filter Divergence(CFD),同樣是因系集樣本數不足造成。這種形態的濾波器失敗是模式在積分過程中,會於短時間內出現無限大的值(machine infinite),讓積分結果爆掉(blow-up),屬於數值不穩定造成的濾波器失敗。 
    Catastrophic Filter Divergence的觸發條件是:
  1. 觀測誤差很小,確保觀測資料一定會被使用。傳統的濾波器發散是因為觀測誤差相對背景誤差過大,使得觀測資訊無法被使用。而對CFD來說,反倒是需要很小的觀測誤差,除了確保觀測資訊一定會被使用外,因為觀測誤差很小,使得背景場會大幅度地朝觀測值靠攏。
  1. 需在特定的同化間隔(註二)才會觸發,當同化間隔過高或過低都不會觸發。若同化間隔過高,則分析場會非常接近觀測場;若同化間隔過高,則分析場會隨著積分過程而具有模式動力的特徵。但若是同化間隔不高也不低時,當獲得一個接近觀測值的分析場後,隨模式積分一小段時間,還沒獲得模式動力平衡時,又馬上被拉回觀測值。如此周而復始的在觀測值與模式動力平衡間來回調整將會誘發數值不穩定,進而讓結果在積分過程中爆掉(blow-up)。


註一:怎樣的系集樣本數才足夠?理論上,一個系統自身的不確定性可以用Lyaponov exponent來表示,假設某系統的Lyaponov vector是50,表示只要有50組獨立且有效的系集成員就可以表達此系統的不確定性。但實作上Lyaponov exponent 並不容易獲得,也沒有意義(因為NWP模式的複雜度太高,即便知道Lyaponov exponent 的大小,也沒有能力負擔相對應的系集數)。


註二:同化間隔是否適當取決於模式解析度與天氣系統的尺度。如氣候模式與雲解析度模式適用的同化間隔就不一樣。

<參考資料>
Harlim, J., and A. J. Majda, 2010: Catastrophic filter divergence in filtering nonlinear dissipative systems. Communications in Mathematical Sciences, 8, 27–43, doi:10.4310/cms.2010.v8.n1.a3.
Gottwald, G. A., and A. J. Majda, 2013: A mechanism for catastrophic filter divergence in data assimilation for sparse observation networks. Nonlinear Processes in Geophysics, 20, 705–712, doi:10.5194/npg-20-705-2013.


    濾波器失敗可以分為兩種不同型態: 
    這兩種濾波器失敗的型態雖都稱作濾波器發散(filter divergence),但對NWP而言,意義卻不太相同。第一種(傳統)濾波器發散發生時,模式仍能提供預報結果,只是預報結果完全背離真實大氣狀態,不具預報能力。若沒有仔細評估預報結果,可能會錯信預報結果。第二種濾波器發散是因為積分過程中引發的數值不穩定而造成。由於傳統的濾波器發散的發生有跡可循,可透過各種統計方法估計離散度或是透過背景誤差矩陣的擴張(Inflation)來避免。相對而言,第二種型態的濾波器發散就較難掌握,因此將就其觸發條件與發生原因進行討論。

    可以想像模式在積分時,是沿著模式動力的吸引子移動(達到模式動力的平衡),但因模式具有模式誤差,使得模式動力的吸引子並不相等於真實大氣狀態的吸引子,所以需要藉由資料同化將將預報從模式動力的吸引子拉向觀測值,以逼近真實大氣狀態的吸引子。(關於吸引子的概念,可以從Lorenz的蝴蝶圖想像,該圖具有兩個明顯的吸引子,可以類比左側的中心是模式動力吸引子,右側是真實大氣狀態的吸引子) 。因此若觀測資料無法被同化,將造成預報最終會收斂至模式動力的吸引子,完全遠離真實大氣狀態的吸引子,也就是第一種濾波器發散。若是觀測誤差很小,同化時,原本受模式動力影響的背景場會馬上移動到觀測附近,開始積分後又會從觀測附近朝模式動力的吸引子移動。如果同化間隔很小,代表預報結果剛從觀測值往模式動力吸引子移動沒多久,又馬上被拉回觀測值,因此能確保預報結果很貼近觀測值;若同化間隔很長,那就有足夠的積分時間將預報結果從觀測值拉回到模式吸引子。但當同化間隔介於兩者之間時,會造成預報已經在前往模式吸引子的路上,又突然被拉回觀測,然後再積分一小段後,又再被拉回觀測,使得預報不斷在模式吸引子與觀測間快速來回調整。這種快速且劇烈的調整使得積分過程變得相當不穩定(數值上),可能在某個同化完成後的積分過程就爆掉了。而且CFD並不是因為不穩定度累積超過某個門檻後觸發的產物,其發生機率是屬於Poisson Distribution,也就是隨機過程,並不能夠掌握何時會出現,因此在執行EnKF同化時,需特別注意同化間隔對於數值穩定度的影響。