# ICD Coding from Clinical Text Using Multi-Filter Residual Convolutional Neural Network 閱讀筆記 ###### tags: `論文筆記` `NLP` `機器學習` > papers with code: https://paperswithcode.com/paper/icd-coding-from-clinical-text-using-multi > > {%pdf https://arxiv.org/pdf/1912.00862v1.pdf %} --- ## 介紹 ### ICD coding 是一種sentance的多分類問題,從一段話裡分出屬於的疾病 跟一般多分類不一樣的是,疾病分類是有一種樹狀階層式關係的,然後類別很多動不動就改 ### 本文想解決的 文字分類問題 --> 所以模型應該要能適應不同長度的句子輸入 ICD的階層問題 --> 設計一個CNN有多種不同的filter,這樣就能從不同的階層學到不同的特徵 所以,他假設了使用不同filter的CNN可以學到不同層次的訊息,而這些不同filter學到的東西要跟WHO訂出來的的ICD階層結構盡量接近 --- ## 方法 ### Input Layer [word embedding](https://arxiv.org/abs/1310.4546) 謝謝大家 ### **Multi-Filter Convolutional Layer**(他的自信之作) 讓同一條句子經過不同filter的1D Convolution 之後再把他concat起來 > 像這樣concat > | 我是filter 1 | 我是filter 2 | ... | 我是filter m | > | --------| -------- | -------- | -------- | > | 特徵 | 特徵 | ... | 特徵 | > | 特徵 | 特徵 | ... | 特徵 | > | 特徵 | 特徵 | ... | 特徵 | --- #### filter size不一樣,output的特徵長度不一樣怎麼concat呢? 解法: kernel size=k 時, padding = floor(k/2), stride=1 這樣取出來的特徵長度就都會一樣 ::: warning k不能是偶數 ::: --- ### Residual Convolutional Layer 有了convolution layer加個short cut也是合理的吧 > 一個Residual Block 長這樣 (activation function用的是tanh) > ![](https://i.imgur.com/1pi5FzE.png) > [code底加](https://github.com/foxlf823/Multi-Filter-Residual-Convolutional-Neural-Network/blob/4acb3c0b68a48b125f042a066b5eb60019c07de5/models.py#L173) 這個block就是特徵擷取功能, block可以重複p(hyperparameter)次 到此為止的架構長這樣,paper上畫的 ![](https://i.imgur.com/xEOZWjt.png) --- paper上給的公式是這樣 ![](https://i.imgur.com/pVLjret.png) --- paper上對應那個公式的圖是這樣 ![](https://i.imgur.com/DfgZSMi.png) 那個橘色的$W_m$我覺得應該就是概括的代表特徵擷取架構裡所有的weight --- paper上的公式對應我畫的架構圖,應該是這樣 ![](https://i.imgur.com/xw2M9hA.png) --- ### Attention layer 基本上follow [Mullenbach et al. 2018](https://www.aclweb.org/anthology/N18-1100.pdf) 的工作 不同filter的conv在此篇論文的假設中應該代表不同的ICD code 但這些不同filter取出來的特徵都被拼在一塊 所以,需要注意力機制去學習哪個答案應該要focus在哪塊,這樣或許能提升準確率 attention的概念基本上是在每一個特徵上加上一個可以被更新的NN weight,這個weight會再過softmax轉換成分數形式,那原本的特徵就再依照分數用乘法對特徵的重要度做加權 這是paper裡面attention部分的圖 ![](https://i.imgur.com/wOWdSUn.png) 自我理解的圖配上他的式子 ![](https://i.imgur.com/7pTErQt.png) --- ### Output Layer 經過注意力機制出來的特徵,他就簡單的過一個Linear做線性轉換以後做pooling loss 就是 用logistic with binary cross entropy(pytorch) 整體架構就是這樣惹 ![](https://i.imgur.com/yHgZF4z.png) 然後他所有的神經網路都是用均勻分布初始化 ``` torch.nn.init.xavier_uniform_(tensor, gain=1.0) ``` --- ## Experiments ### Dataset #### MIMIC-III 沒特別研究過 https://paperswithcode.com/dataset/mimic-iii ### 消融實驗 ![](https://i.imgur.com/aBODpRG.png) + 從表裡面顯示出加了multi-CNN準確率提升很大 但是感覺看code他的CNN baseline model只跑了**一個CNN**去做的 multi-CNN是拿了3~6個CNN去跑之後concat起來 也就是說假設baseline CNN他擷取出來的特徵數量是一個單位, 那multiCNN他擷取出來的特徵數量就是3~6個單位 一般來說, 在影像裡CNN feature vector是1024的不會拿去跟feature vector是512的比較阿!! 他們weight數量差這麼多!!本來就會比較好啊!! 這裡應該做個實驗 要弄出相同kernel size但是不同的CNN一樣去做concat,這樣才看得出來kernel size不同是否真的可以找出不同尺度的資訊,而這個尺度是可以對應到ICD coding的樹狀結構!! 不做這個實驗的話 我可以假設他只是跟transformer的架構一樣有multi-head多加很多weight所以效果就變好了,並不是真的學到了ICD coding的樹狀結構了 + 消融測試沒有做到attention架構 如果沒有attention架構以後, 是不是還是會變好呢? (應該還是會啦 但是attention score是不是有照著ICD coding的樹狀架構一樣對應到他應該對應的部位,這會是一個很有趣的問題 ### 與比較對象的實驗 略 感覺準確率都還有很大的進步空間,畢竟evaluation matrix是**P@8** ### Limitations + paper說bert效果不佳,因為**limitations of hardware** 和 **fixed-length context** 首先,**limitations of hardware** 所以**ALBERT**他不好嗎? 再來,**fixed-length context** fixed-length或許可以得到比較好的效果? 因為太長的句子在做注意力機制的時候,神經網路的注意力會被放到別的地方去,所以限制長度讓他先關注單詞附近的字或許可以得到比較好的效果 因為在影像上如果CNN關注到錯的地方 直接截掉就可以提升準確率惹