# 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)
> 
> [code底加](https://github.com/foxlf823/Multi-Filter-Residual-Convolutional-Neural-Network/blob/4acb3c0b68a48b125f042a066b5eb60019c07de5/models.py#L173)
這個block就是特徵擷取功能, block可以重複p(hyperparameter)次
到此為止的架構長這樣,paper上畫的

---
paper上給的公式是這樣

---
paper上對應那個公式的圖是這樣

那個橘色的$W_m$我覺得應該就是概括的代表特徵擷取架構裡所有的weight
---
paper上的公式對應我畫的架構圖,應該是這樣

---
### 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部分的圖

自我理解的圖配上他的式子

---
### Output Layer
經過注意力機制出來的特徵,他就簡單的過一個Linear做線性轉換以後做pooling
loss 就是 用logistic with binary cross entropy(pytorch)
整體架構就是這樣惹

然後他所有的神經網路都是用均勻分布初始化
```
torch.nn.init.xavier_uniform_(tensor, gain=1.0)
```
---
## Experiments
### Dataset
#### MIMIC-III
沒特別研究過
https://paperswithcode.com/dataset/mimic-iii
### 消融實驗

+ 從表裡面顯示出加了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關注到錯的地方 直接截掉就可以提升準確率惹