星期四, 5月 05, 2022

星期二, 5月 03, 2022

閱讀:Clinical Notes — The “Negative” Story

連結

否定語句(Negation,例如 No evidence of embolism)在放射科報告很常見,但特定情況下會造成困擾,例如我目前經營的搜尋引擎,輸入關鍵字會連否定句裡面的內容也被列入搜尋結果。

這篇 Medium 的文章深入淺出的總結了 negation 有關的概念並總結了一些處理方法。對常見 negation pattern 的總結是亮點,例如

Termination patterns: abdominal pain denied
Prefixes: non-diabetic, non-hypertensive
Double negation: not abnormal, not unusual    
Symbols usage: Hypertension +, Diabetes -
Positive/Negative usage: Hypertension positive, Diabetes negative.
Yes/No phrases: Hypertension — No, Diabetes — Yes, Urinary problems — No.
Use of more generic language than clinical terminology: No complaint of high sugar (rather than No Diabetes).

其實還有一些是作者沒提到的,例如病歷上的英文可能不符合英文文法(例:no fracture or dislocation seen),這對基於語法分析的方法(例如 NegBio)可能會有影響。symbol 實際上病歷也有很多種,(+)(V)(O) 我都看過 XD

這篇的缺點是引用的處理方法(NegEx 等)有些舊了。連 NegBio 都沒提到,更後面的 deep learning 方法當然沒有了。


全文連結

星期一, 5月 02, 2022

星期日, 5月 01, 2022

星期六, 4月 23, 2022

Basics of Linear Algebra for Machine Learning: Discover the Mathematical Language of Data in Python 讀後感

書本簡介

本書完全從學習 ML/DL 的應用角度出發,內容非常淺,還有大半篇幅是 python 代碼。如果是正經學習線性代數這本書不夠,但對非工科出身,在工作之餘為了 ML/DL 才回頭研究的人來說,這本就合適,最起碼可以快速鳥瞰跟 ML 相關的內容,也不會迷失在 ML 相對用不到的細節裡,200+ 頁的篇幅也很快可以看完。以後需要學更多東西再找別的書補完。





全文連結

星期日, 4月 10, 2022

文石 BOOX Note5 入手!

閱讀大量文件時,用電腦或 ipad 看久眼睛很累,還是習慣用 e-ink 電子書閱讀器。

原本機器是 N 年前從露天花幾千元入手,賣家裝好多看系統的二手 Amazon DXG。多年來使用愉快,只有中間換過幾次電池。

但最近好幾次看 PDF,電腦上沒問題,但 DXG 全部顯示空白頁面,Google 起來疑似多看系統 bug。而 DXG 的多看好像 N 年沒更新,至少我找不到,決定換新機。

新機首先希望是 10.3 吋。6 吋、8 吋看久實在不舒服,不要求能放口袋。另外希望可以看不同店家的電子書,不要鎖死在閱讀器官方商城,所以只考慮開放系統。

原本想買 HyRead 產品,但現場試用有莫名卡頓感,PTT 上也有類似抱怨,一些慣用操作如文件放大旋轉瀏覽也不順。Boox 的機器試用就順手很多,決定改買 Boox Note5。請店員設定,裝好 Google Play 後帶回家。

新機放大旋轉檢視 PDF,換頁流暢度遠勝舊機,少了切幻燈片的卡頓感,一時還不大習慣 XD。App 試了 JPTT 和內建瀏覽器 Wifi 上網。第三方 App 能裝能用,以後裝不同商城電子書或裝 App 看不同格式文件應該沒問題。

DXG 就從此安心退役了。

新舊機器比較圖,左方 DxG 右方 Boox Note5,新機器的螢幕大一些,也沒有佔空間的實體鍵盤。

新機器看 PDF,大螢幕看起來還是比較輕鬆。

全文連結

FFMpeg 影片批次轉檔

 出去玩時喜歡手機錄影,每次回來都一堆影片檔。原始檔案都很大,直接上傳太佔空間,需要批次壓縮。

原本作法是用 anyvideo converter 批次處理,但 GUI 操作繁瑣,也不喜歡裝癰腫的軟體。後來發現 ffmpeg 也可以做一樣的事情。

FFMpeg 命令列產生器

先用上方連結點選 GUI,頁面會自動轉成 FFMpeg 需要的命令列參數。可以把它記下,不用每次都去網頁點,我得到的參數是這樣的:

ffmpeg -i 輸入影片 -c:v libx264 -preset slow -crf 20 -c:a copy 輸出影片


套上 Windows cmd 下可用的迴圈語法,就是

for /r "來源目錄" %a in (*.mp4) do ffmpeg -i "%a" "輸出目錄\%~na.mp4" -c:v libx264 -preset slow -crf 20 -c:a copy
用這方式就不需要每次都開 GUI 調參,目錄指定好就流水線處理到底了。

全文連結

星期二, 3月 29, 2022

文章:Fine-Tuning BERT for text-classification in Pytorch

文章連結

這是簡介用 PyTorch 進行 BERT fine tuning 做 downstream task 的很簡單入門文章。亮點是簡單、圖漂亮、有程式可參考。可以當作 cheatsheet,適合已經了解重要概念後(例如何為 transformer)要寫程式時回頭參考,用來入門則太簡略。

因為自架業務部門搜尋引擎,需要處理 negation 等問題的原因,未來跟 NLP、BERT 打交道的機會應該不少,收錄這篇供自己回頭參考 XD

全文連結

星期二, 3月 22, 2022

Unsupervised Text Classification with Lbl2Vec

Github
介紹文

今天被 Medium 演算法推薦,蠻有趣的思路。

這個庫的功用是做 text classification。特點是對每個 category 設定至少一個關鍵字後,就可以用 unsupervised 的方式對文本進行分類。

整體原理其實接近人類分類的方式。人類大量分類文章的時候,可能看文章出現特定關鍵字就歸類到特定分類了。

而 Lbl2Vec 如果我理解沒錯(錯了再改 XD),則是先將 word 和 text 在同樣的 feature space 做 embedding,先將 text 依據對 keyword 的「距離」先分類一次,去掉 outlier 後求每個分類的 centroid,再根據新算出的分類 centroid 正式分類所有 text。

這樣分類的方法可以不用標註部分資料,只要每個分類都能找出至少一個 keyword 就好。之前研究的地址分區里問題感覺或許可以用,也許未來有緣就當作備案試試看。

全文連結

負面範例:Predicting Tesla Stocks (TSLA) using Python & PyCaret

文章連結

難得 Medium 的演算法會推薦辣眼睛的文章,放在腦海裡越想後勁越強 XD

文章標題很吸引人,利用 python 和 PyCaret 來預測特斯拉股價。但看到一半,作者吹噓「用了 PyCaret,模型不調參 R square 也就是正確率有 99%」就喉頭一甜,差點吐血。

網頁下拉,細看 test data 的 feature,赫然看到 feature 裡面有今日高低價。已知今日高低價,用模型求收盤價???如果投資者買賣股票的時候能預知今日高低價,又何需機器學習?

有這種條件,模型乾脆再簡化點,直接高低價相加取平均當模型輸出就好,連 linear regresser 都不用,拿來有漲跌幅限制的國家使用 performance 會更好 XD

另外作者選用的所有模型都只是拿單日開盤資訊 fit 收盤價,完全不參考過去行情。模型不用參考過去行情,僅憑單日資料就有 99% 「正確率」,作者不覺得哪裡不對?

討論區反而有亮點,PyCaret 開發者親自回應,指出文章 technical flaw 很多,這種文章只會傷害 PyCaret。很遺憾我調包俠無法看出全部問題就是了 QQ

----

結果作者還來回應我的吐槽,作者指出「可以用 API 做更細的時間粒度,例如以 5min 為單位預測股價」。

問題根本不在這裡好吧?看起來就是作者隨便拿了 data,就隨便丟給模型去 fit,對 feature 完全不理解,連常識等級的 domain knowledge 都沒有。看到結果也無法反思。

這種派大星都可以當 data scientist 在 Medium 寫文章教人,我忽然覺得我也可以學好 XD

----

結果我 Medium 第一個 follower 就是被我吐槽的作者 XD

全文連結

星期四, 3月 03, 2022

DuckDNS

VPS 買的 noip 域名到期了。noip 免費版每個月就要手動更新一次不然域名會失效。每年 24.95 美金也覺得不值得。我只是要連到自己的 VPS 而已。隨手搜尋一下免費 DNS 就換到 DuckDNS。

DuckDNS 官網看起來簡陋,看起來像小團隊自架的免費服務,但使用起來很簡單。直接用 Google account 登入,頁面填想要的域名,照著 install 頁面設定 crontab 定時執行 HTTP update API,不到 10 分鐘新域名就可以用了。install 頁面還很貼心的會根據實際使用者自動修改頁面中的教學,自動帶入正確的域名和 API key。只要 curl 和 crontab 有裝,直接一步步複製貼上頁面的指令就好。

應該會改用這家了,只要把一些工作用腳本指向新域名就好 XD 


全文連結

星期一, 2月 28, 2022

Gunbuster 觀後感

 Gunbuster 是 1988 年的老動畫,之所以認識這部動畫,是因為追動漫鋼琴時偶然追到了 Pianeet 的 Gunbuster Fantasy 組曲。因為曲子好聽去追原動畫 XD


這部動漫的監督是新世紀福音戰士的庵野秀明。本作的本意是彌補製作「王立宇宙軍」造成的巨大虧損。動畫刻意集合了各種「宅」要素力求打開市場,結果「王立宇宙軍」沒紅,這部為了彌補虧損而做的作品反而大紅了。

前三集是真實系開局,天真活潑 or 傻白甜女主經歷艱辛登上宇宙。後來經過各種挫折,特別是在戰場上無能導致坑死自己初戀後,逐漸成長為獨當一面的 Gunbuster 駕駛員。

本作對人物和感情刻劃非常深刻,因為反覆在接近光速的情形下執行任務,與地球上的朋友無可避免出現「時間差」。姊姊與教練的悲戀。為了挽救人類,兩人選擇自我犧牲選擇進入 Buster Machine 3 號,容格乘著量產機陪同赴死被勸回,歷經萬年漂流返回地球,地球亮出「歡迎回家」伴隨著音樂全劇落幕。聲優真摯的演技和悲壯的音樂更把整部作品盤活。

神作。

全文連結

星期五, 2月 25, 2022

成人鋼琴班愉快學琴中, 老師教新曲子,趁這首還沒忘之前留影紀念。這已經是錯音、漏音、糊掉最少的版本。

從「自我檢查」的角度來說,錄音錄影其實比單純錄音就好,搭配影像還可以回憶當時用力的情形。

總而言之,不漏音好難,控制手速避免不自主飆車好難。彈到後面手軟掉變成不曉得什麼東西 XD

全文連結

星期日, 2月 20, 2022

李宏毅老師 youtube 深度學習課程:attention、transformer、BERT

【機器學習2021】Transformer (上)
【機器學習2021】Transformer (下)
【機器學習2021】自注意力機制 (Self-attention) (上)
【機器學習2021】自注意力機制 (Self-attention) (下)
【機器學習2021】自督導式學習 (Self-supervised Learning) (二) – BERT簡介
【機器學習2021】自督導式學習 (Self-supervised Learning) (三) – BERT的奇聞軼事 

為了研究 BERT 能否解決 negation detection 決定線上進修,剛好找到李宏毅老師的課。

之前上過吳恩達老師在 deeplearning.ai 的深度學習課程。兩位老師的課都非常的深入淺出,吳老師的課有作業,李老師的課程內容比較新,技術細節講的比較深細。

看了幾堂 attention、transformer 和 BERT 的簡介有相見恨晚的感覺。 暫時沒時間寫濃縮筆記,先發文佔樓,以後想更再更吧。這個清單還沒放上李老師對 BERT variant 的簡介,有看再放上來。

全文連結

星期三, 2月 02, 2022

「超速學習」閱讀心得


 

一直對「如何學習」很有興趣,這本讀完感覺不錯,決定用它寫心得,寫心得的同時也是運用其中的技巧,鞏固內化書本上的知識,也方便未來的自己提取技巧不用整本重讀。

這本書重要概念大概如下:

後設學習

確定「為什麼、做什麼、及怎麼做」,「怎麼做」可以切分成「概念、事實、程序」。後設學習可以佔整體計畫的 10% 時間。後設學習可避免學習毫無目的性,在無限的知識中沒有效率的「漫遊」

專心致志


講拖延症、專心的重要性和專心的技巧。

實質上我認為最好的技巧,也是書本沒有講的,是每天花時間冥想。冥想可以實際上改造大腦。變得可以忍受工作和學習中的難受、沉悶和從根本上控制住分心(掉舉)。

直截了當


用「最短路徑」去達成學習目標,例如學語言,就直接去需要該語言的生活環境,學工作技能就從做中學。

反覆操練

其實覺得這個名字不完整,因為書中的例子還包含很多「分而治之」(divide and conquer)的技巧,例如學音樂把譜分段,並針對不會的困難段落反覆練習。

提取記憶

用測驗、回想...來鞏固記憶,不是學完就算了。

意見回饋


我想這是自學者最欠缺的。其實有人潑冷水比自己「十年磨一劍」好的多。

我學專業技能之所以能有進度,很大是因為學長姐,臨床同仁甚至病人會給「回饋」。做了錯誤的判斷就會從回饋得到「重拳」,就會一直進步。

但「重拳」太重也可能把人擊垮,可能必須在「不痛不癢的回饋」和「太重的重拳」中間拿一個度。

保留記憶

書中提出了幾種技巧來克服「遺忘曲線」的問題。淺見比較有用的方法是「過度學習:超越完美的練習」和「記憶法」。考專科的時候不自覺的用了這些技巧。

培養直覺

覺得翻譯為「技能直覺化」比較好。將學到的技能內化為直覺。

個人經驗上這是個水磨功夫,只有不斷反覆熟悉技能、接受回饋,試著簡化提取要點才能題取出技能的「神髓」才能內化為直覺。

例如當年自學軟體重構的相關知識,書都會教「何時該重構」,但實質上我不是用背的,而是很多次栽在充滿壞味道上的坑以後,對坑的感知因為大量經驗內化形成直覺,跟本不用背,也不會忘記,甚至書本講的「何時該重構」也只是印證了我的經驗而已。

勇於實驗

書中提到各種實驗技巧,在不會太痛苦的前提下,擴展現有的技能樹使之更全面,跨出舒適圈。


看完這本書以後,覺得最無腦的技能入門方式其實是去上針對性、有提供測驗的線上課。線上課除了最後兩步(培養直覺、勇於實驗)外幾乎都涉獵到了。至於後兩者也只能技能稍微入門後再自己反覆錘鍊、內化和擴展了。

全文連結

星期六, 1月 22, 2022

Linux 監控 CPU 使用率腳本

Linode 寄信提示 CPU 異常使用率,超過 90% 使用率,一次好幾小時。根據網路拼湊、修改出腳本來定期監控 CPU 使用率。原則上五分鐘監控一次,使用率超過 70% 觸發 log,log 寫在監控腳本同目錄下。

cpuuse=$(cat /proc/loadavg | awk '{print $3}'|cut -f 1 -d ".")
if [ "$cpuuse" -ge 70 ]; then
MESSAGE=$(date +%s).log
  echo "CPU current usage is: $cpuuse%" >> $MESSAGE
  echo "" >> $MESSAGE
  echo "+------------------------------------------------------------------+" >> $MESSAGE
  echo "Top 20 processes which consuming high CPU" >> $MESSAGE
  echo "+------------------------------------------------------------------+" >> $MESSAGE
  echo "$(top -bn1 | head -20)" >> $MESSAGE
  echo "" >> $MESSAGE
  echo "+------------------------------------------------------------------+" >> $MESSAGE
  echo "Top 10 Processes which consuming high CPU using the ps command" >> $MESSAGE
  echo "+------------------------------------------------------------------+" >> $MESSAGE
  echo "$(ps -eo pcpu,pid,user,args | sort -k 1 -r | head -10)" >> $MESSAGE

else
  echo "CPU usage OK"
fi

腳本存好,chmod +x 以後下 crontab

crontab -e
*/10 * * * * /bin/bash /opt/scripts/cpu-alert.sh

以目前使用者身份執行腳本一次(不一定跟 cron 同使用者!),確認腳本沒問題

crontab -l | grep -v '^#' | cut -f 6- -d ' ' | while read CMD; do eval $CMD; done
全文連結

星期四, 1月 20, 2022

QNAP docker 建置 nginx reverse proxy

問題背景:我開發的關鍵服務建置在公司內虛擬機(VM),虛擬機放實體 NAS( QNAP)。基於未知原因,公司內某些網段的電腦無法直連 VM,tracert 顯示路由到 default gateway 就掉。

Bug 還在協商溝通,暫時解不掉,只能先想辦法繞過。因關鍵服務大多利用 HTTP,所以決定用 nginx 建立 reverse proxy 解決。

整件事最大困難:QNAP 系統高度自製,很多資料找不到。很多工具沒有裝(例如 apt-get)。

本來考慮用 QNAP 軟體市集找 nginx,失敗,改用 container station 上。用 nginx container,以 docker volume 覆蓋設定檔。

然後發現 container station GUI 並不友好。例如 exposed port、volume 等參數每次建立 container 都要重新指定,非常麻煩。docker volume 還只能指定一整個目錄,無法只覆蓋目錄下的單一檔案,所以萬一 config 檔同目錄還有其他檔案就不好處理。

後來解法是 ssh,command line 用 docker 指令就好。container station 的 GUI 只是套殼,其實沒必要用。docker 指令操作結果也會反映在 container station 的介面上。File Station 看到的 Public 資料夾在 /share/Public。文字編輯可以用 Text Editor 就不必用沒調整過的 vi,還支援瀏覽器貼上!

QNAP 上 docker 操作 nginx 我用的指令如下:

docker run --rm -p 9080:9080 -p 8888:8888 -p 9090:9090 --name nginx -v ${PWD}/minimal.conf:/etc/nginx/nginx.conf:ro -d nginx


nginx.conf 設定檔長這樣
events {}

http {
client_max_body_size 0;

server {
listen 9080;
server_name <QNAP 內網 IP>:9080;
proxy_set_header Host <QNAP 內網 IP>:9080;

location / {
proxy_pass http://<VM IP>:80;
}
}

server {
listen 9090;
server_name <QNAP 內網 IP>:9090;
proxy_set_header Host <QNAP 內網 IP>:9090;

location / {
proxy_pass http://<VM IP>:808;
}
}

server {
listen 8888;
server_name <QNAP 內網 IP>:8888;

location / {
proxy_pass http://<VM IP>:8888;
}
}
}
port 9080 和 9090 分別對應不同 Laravel 服務。port 8888 給 jupyter-notebook 用。

jupyter-notebook 必須修改 NotebookApp.allow_origin 允許 cross origin API 不然修改會無法存檔。

nginx 設定 client_max_body_size 是避免用 notebook 上傳檔案的時候因檔案太大導致上傳失敗,設定 proxy_set_header Host 可避免 Laravel 的 redirection 錯誤導向到 VM IP。

Laravel app 也必須修改,包括:
.env
PROXY_URL = <QNAP 內網 IP>:port
PROXY_SCHEMA = http

app/Http/Middleware\TrustProxies.php
protected $proxies = [
    '**'
];

routes/web.php
$proxy_schema = env('PROXY_SCHEMA');
if (!empty($proxy_url)) {
    URL::forceRootUrl($proxy_url);
}
 
if (!empty($proxy_schema)) {
    URL::forceScheme($proxy_schema);
}

設定好後需重啟 Laravel
其他工具也可以透過 docker 使用。例如使用 git docker container 把 working directory 掛載進去做 commit。就可以繞過 QNAP 一堆東西都沒裝,偏偏還不好修改的問題。
全文連結

星期二, 1月 18, 2022

好站:小狐狸事務所

 連結

舊的站台書籤隨著換樣板全不見了 XDDD

閒逛發現的好站,部落格文章種類非常多,投資理財,大數據、深度學習、區塊練...都涉獵了。

重點是文章產量大且穩定,同樣是寫了 10+ 年的部落格,我就做不到持續產出。

其實寫筆記也是確保學習效果的好方法,單純看過可能很容易就忘,也可以留下自己曾經做過得紀錄,該勉勵自己了

全文連結

星期一, 1月 17, 2022

有趣的網路 bug

 幫公司做的土炮搜尋引擎和某些服務放在某虛擬機,稱 VirtA
VirtA 放在實體 NAS 上,稱為 NasA

公司內某些 PC,可以連 NasA 但連不到 VirtA,所有 port 都不通。tracert 顯示封包到 default gateway 就掉包。公司內不同網段的 PC  則完全正常,但產生連線問題的 PC 逐漸增加。

聯絡了資訊單位和科內真資訊大佬,做了各種諮詢和推論。最後被科內大老依照經驗找到問題,原來是 NasA 的實體網卡!讓虛擬機從不同網卡出去,bug 就不見了。

原本懷疑 routing 和 default gateway router 的問題,結果不是,真是活久見 XD

話說,我不是甲方嗎? 

---

結果空歡喜一場,問題還是在 route...

全文連結

星期五, 12月 10, 2021

生命中第一次開刀 X 勞累

11 月單位換新機器以來,臨時增加的 loading,包含下班後線上進修,趁工程師在的時候學 workstation 、陪伴長官測試 etc 產生骨牌效應,工作狀態爆炸,進入做不完導致加班更累,加班更累導致更做不完的惡性循環,甚至可以電腦前發愣一小時但就是什麼都沒辦法做。

經過連續工作 non-stop 2x 天後(11 月份的四個六日分別是:連續加班、值班、上台北 *2),工時和業務累積量逐漸正常,然後換身體炸掉。本來一年沒發的 biliary colic 三天發了兩次。11/26 日 5 AM 痛到掛急診,打了四針(止痛 *2 IV lock *1 溶血重抽血 *1),榮幸被急診長官探視慰問,還幫忙聯絡了 intern 同梯的優秀外科醫生,直接約時間安排外科治療。

為了隔天來台北學習,離開急診後沒有留一口氣回家,而是黑咖啡撐著繼續清工作。結果本來嚴重疲累時偶發性的眩暈升級成 nausea + vomiting。趕業務趕到一半,看著影像猛地一陣噁心,直衝廁所抱著馬桶準備吐,還好情緒平穩後沒吐出來,不然真成了「打報告打到吐出來」的第一人。這種情況不知道是腹痛引發的嚴重失眠導致的,Tramadol 的 side effect,焦慮引起的,還是兼而有之難以查考了。

後來一心三用,邊恍神邊工作邊補眠把住院工作清完了。還有些業務不想弄也沒力氣弄了。好在已跟科內長官請了假,六日上課、散心後,回台南做一點必要的業務和報告後,就直接住院準備開刀,請假期間大多業務分出去也不用管了,趁病假的中間設法休息。
深深覺得,我知道自己不是事情最多的,但我可以肯定自己身體特別差,這波好了後有點想跟上頭談談了 =.=

----

第一次麻醉感覺蠻奇妙的,麻醉科醫師一邊跟我哈拉一邊 IV push。藥推進來的時候感覺的到刺痛,忽然間覺得腦袋轉不過來,眼前的畫面卡格,然後人就在恢復室了。

這次的 LC 復原蠻快,上週三上午開刀,週五就順利出院。今天就順利拆線。除了遵照醫囑不敢去健身房或做劇烈運動外,行動幾乎照常了。

暈眩的問題也去看神內了,初步看起來像週邊型暈眩,用藥控制症狀,做了腦部誘發電位,下週看結果。作為醬料系吊車尾神內耳鼻喉的知識早全忘了(沒想到這句話也可以說的如此坦然、如此自信、如此風采)就看醫師怎麼診斷了。

----

Gallstone 圖...就不附了,偷看病理報告已經 chronic cholecystitis 了。


 

 

全文連結