2018年4月24日 星期二

Apache Spark 學習三部曲:學會他,除錯他,寫好他



最近密集的在寫Spark 程式,感覺到終於該開始往下個階段邁進了,其實就像學習任何程式語言和Framework,Spark 學習也分三個步驟:
  1. 如何寫
  2. 如何調教/錯誤排除
  3. 如何寫的好

學會如何寫,網路上有不少的範例,不過大多是Scala和Python,如果要翻成Java版還需要額外花點功夫,等到開始寫一些程式丟到spark 上面跑,又會開始遇到一堆奇奇怪怪的錯誤訊息,比如說:
  • Futures timed out after [300 seconds]
  • This timeout is controlled by spark.executor.heartbeatInterval
  • cannot assign instance of java.lang.invoke.SerializedLambda to field org.apache.spark.sql.UDFRegistration$$anonfun$27.f
  • Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory


這時候就要開始學習怎麼調教系統參數和錯誤排除,下面這個網站整理的蠻不錯的,把Spark performance tuning 分成幾大塊,分別是:
  • Data Serialization
  • Memory Tuning
  • Memory Managemnt
  • Data Structure Tuning
  • Garbage Collection Tuning




最後就是程式都會動了,但是怎麼要跑那麼久?這時候就應該開始瞭解Spark 許多底層的運作原理,要怎麼寫才是正確的,怎樣寫才會有比較好的效能,下面收一些在學習spark 時收集到的不錯資訊:



其它網路文章:


最後要提醒自己:

先求有,再求好,等到程式會動了,確定結果是大家想要的,有符合商業價值了,再來調教也不遲!

2018年4月17日 星期二

[筆記] 要如使用Unicode Range 濾掉文章的特殊字元


最近在實作文章(中文)抽詞,斷詞的程式,其中要做的一件事就是把一些符號和標點符號濾掉,在網路上google 都會搜尋到五花八門的範例,常見的regular expression如下:
  • !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
  • ['?:!.,;]*([a-z]+)['?:!.,;]*

如果沒有好好去瞭解,其實都會被這些眼花繚亂的符號所迷惑,其實很多多東西在Java的文件裡面都有定義好了,只是從來都沒有好好去研究 (遮臉)。參考Java Pattern的文件其實很輕易的就可以列舉出所有的符號:

POSIX character classes (US-ASCII only)
\p{Lower} A lower-case alphabetic character: [a-z]
\p{Upper} An upper-case alphabetic character:[A-Z]
\p{ASCII} All ASCII:[\x00-\x7F]
\p{Alpha} An alphabetic character:[\p{Lower}\p{Upper}]
\p{Digit} A decimal digit: [0-9]
\p{Alnum} An alphanumeric character:[\p{Alpha}\p{Digit}]
\p{Punct} Punctuation: One of !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
\p{Graph} A visible character: [\p{Alnum}\p{Punct}]
\p{Print} A printable character: [\p{Graph}\x20]
\p{Blank} A space or a tab: [ \t]
\p{Cntrl} A control character: [\x00-\x1F\x7F]
\p{XDigit} A hexadecimal digit: [0-9a-fA-F]
\p{Space} A whitespace character: [ \t\n\x0B\f\r]


但是真實世界往往不只這樣,除了一般ASCII符號外,其實現在越來越多怪異的 Unicode 符號也會出現在文章中,比如說:
  • "─" U+2500 Box Drawings Light Horizontal Unicode Character
  • "⋯" U+22EF Midline Horizontal Ellipsis Unicode Character - Compart
  • "䶵" U+4DB5  cjk Ideograph Extension A, Last
甚至最近連emoji 也非常常出現:
到底emoji 需不需要濾掉呢?這個問題我也不知道,不過至少確定許多符號都應該要濾掉,為了方便使用就把要濾掉的特殊字元整理如下:



有興趣的歡迎取用~

2018年3月20日 星期二

[情報] 目前市面上有哪些 Open Source Function As Service (FaaS)



前陣子因為好奇加入了 Cloud Native 的Slack 群組,看看最近熱門在討論的話題是什麼,有什麼有趣的技術正在發展,最近就剛好看到一個有趣的投票話題,請大家推薦 open source 的 FAAS Solution。



2018年3月17日 星期六

非技術團隊的敏捷與自省會議


究竟非技術團隊也適合跑敏捷方法嗎?一直以來我對這個議題也蠻感興趣的,如果適合那該怎麼推行和實踐呢?雖然以前有上網找到了一些文章,不過沒有實際執行過也不會有感覺。

其實敏捷推行久了慢慢會發現,其實瓶頸可能已經不在技術團隊,而會轉移到其它非技術團隊,或者應該說瓶頸往往產生再技術團隊與非技術團隊的交付以及溝通的過程,而一間公司和一個集團想要能更加的成長茁壯,就必須不分團隊別的共同進步與成長,這也是Lean 與 DevOps 的精神。

2018年3月13日 星期二

透過Java開發 Spark 2.x ML 的 LDA (Latent Dirichlet allocation) model 的感想

借用 Deep Learning 那門課的一張投影片來代表我最近在做的事,一直不斷的在轉圈圈,但是其實更多時候腦袋都是下圖這種轉圈圈:


主要的挑戰如下:
  1. 第一次用Spark 寫 ML 相關的程式,然後網路上的範例和討論幾乎都是用 scala 和python 寫的,為了要轉成Java版花了不少力氣。
  2. 資料散亂且難以理解,關於LDA 的文章幾乎都是論文等級了,充滿了難以下嚥的數學公式,往往都是直接略過,而且關於LDA 和 Spark ML 相關的中文討論又是以大陸居多,不過也因此挖到不少寶。

Spark ML 內建的Pipeline 主要分為以下四個步驟:



不過後來才發現Spark ML 的 pipeline 是給 supervisor learning 使用的,因為有 label 的 data  可以用來驗證訓練的結果是好還是不好,但是我們這次用到的不論是 LDA 或是 word2vec 都是屬於 unsupervised learning 沒有一個明確的基準點可以驗證,因次不適合用 cross validation 來找出最佳的 hyper parameter 。



那LDA 可以調的參數有哪些些呢?如下圖所示,主要是 K (topic number) , max iteration,doc Concentration和 topic Concentration,不過上網看了許多論文和討論,似乎影響最大的還是K 值。




原本以為只要把這些參數排列組合,找出最大 likelihood 或最小的 perplexity 結果居然看到以下的討論......



在研究中產生許多問題,順便把問題整理在這裡:

1. LDA 跟 word2vec 的差異在哪裡?

LDA 注重的是文章與文章間所有詞的關係,而word2vec 是詞與某篇文章上下文之間的關係,也就是說 word2vec 並沒有考慮語法層面的訊息,一篇文章被看成文字序列(word sequences),只考慮詞與詞之間的位置與邊界關係。

網路上找了一個有趣的解釋,假如你輸入HTC:

普通的word2vec 會找到:Android,cellphone,Taiwan,Google...
但是考慮語法後:Moto,Apple,Nokia,Xiaomi...

雖然看起來都有關連,但是本質上卻是不一樣,真得好難啊....

更多網路資訊:

關於LDA 與 Spark 相關文章:


 





2018年2月14日 星期三

The art of system thinking 談要如何改變系統



本週萬維鋼精英日課介紹的新書是 The Art Of Thinking In Systems: Improve Your Logic, Think More Critically, And Use Proven Systems To Solve Your Problems - Strategic Planning For Everyday Life ,好在有了之前的基礎研究,對於聽懂這些題目輕鬆多了,有興趣的朋友可以看看我之前整理的介紹 - 什麼是系統思考

對於系統思考的理解也有分幾個層次,首先你要先知道它的存在,然後再能找出其中的反饋迴路,進而能辨識基模,最難的就是解決系統問題。

而改變系統性的問題又有三種等級的做法(上中下策)
  • 下策是直接命令。想要什麼就直接要,反對什麼就直接禁止。 (這就是根本沒系統思維)
  • 中策是間接刺激。找到系統中的一個平衡反饋回路,讓回路鬆弛一下。(經濟學常用手法)
  • 上策是尋求一個新的共識。在這個新的共識上,把全社會團結起來去做一件事。 (這讓我想到ICA 在做的事)
找出系統的Reinforcement loop (RL),透過尋求共識的方法去移除或削減RL,說起來很簡單,不過卻是多麼困難的問題啊...可惜沒辦法要求政治人物要選舉前必須通過系統思維的考試,才有資格參與政策制訂。

有趣的是在這本書把系統思維也比喻成冰山,讓我不禁想到薩提爾的冰山理論,我們看問題是不是都看到問題的表象(行為),能否找出夥伴的行為模式與盲點,最後能給予引導解決盲點,這不也是一種系統性思維?



許多理論背後的核心都是相通的(因為都是要解決人的問題?),越來越可以體會到咱們 #敏捷魔藥師 在調藥時的快感(咦)

#萬維鋼的精英日課
#TheArtOfSystemThinking