RWKV LM 語(yǔ)言模型 ffn層 淺談 可視化
# 7B 模型ffn層可視化
?
[詳細(xì)介紹 RWKV 語(yǔ)言模型:具有 Transformer 優(yōu)點(diǎn)的 CNN](https://blog.csdn.net/weixin_49139876/article/details/129869814?csdn_share_tail=%7B%22type%22:%22blog%22,%22rType%22:%22article%22,%22rId%22:%22129869814%22,%22source%22:%22weixin_49139876%22%7D)
# 前言
首先 為了對(duì)新手友好 簡(jiǎn)單講一下什么是 RWKV LM, 這是一個(gè)開(kāi)源LLM語(yǔ)言模型項(xiàng)目 .其性能與生態(tài)支持很好 例如:cuda重寫(xiě)了python代碼 效率更高,有web 項(xiàng)目匹配,有chatrwkv,也可以運(yùn)行在移動(dòng)設(shè)備上 良好的跨平臺(tái)能力,以及節(jié)省資源的特點(diǎn) .?
是目前唯一一個(gè)使用CNN也能達(dá)到同等transformer 類模型性能的 模型?
## 最近研發(fā)群里面看到大家在討論 腦電圖
大伙中有人想看RWKV fnn層響應(yīng)可視化, 然后作者就發(fā)了一個(gè)效果圖

顯而易見(jiàn)的 看到 明顯的異常值 大很多, 有人管這個(gè)叫做腦電圖, 其實(shí)差不多 只不過(guò)不是特殊些的連續(xù)信號(hào).? 相信大老們肯定對(duì)此熟悉,但是對(duì)我來(lái)說(shuō)第一次見(jiàn)到,非常好奇. 這種異常值統(tǒng)稱outlier離群點(diǎn).? ?而后另外一個(gè)佬做了一下430M模型各層的可視化

這個(gè)就更加離譜了, 離群點(diǎn)倍越往后就越大. 那么就好奇 如果這樣的outline對(duì)語(yǔ)言模型很重要,而模型還擁有涌現(xiàn)能力與頓悟, 那么他們之間有什么聯(lián)系?
1.首先我們閱讀一下源碼
```bash
?def forward(self, tokens, state=None, preprocess_only = False):
? ? ? ? # tokens=tokens.to('cpu').numpy().tolist()
? ? ? ? # if tokens is not None:
? ? ? ? #? ? ?print('input_tokens', len(tokens))
? ? ? ? # if state is not None:
? ? ? ? #? ? ?print('? input state',state.shape)
? ? ? ? with torch.no_grad():
? ? ? ? ? ? w = self.w
? ? ? ? ? ? args = self.args
? ? ? ? ? ? seq_mode = len(tokens) > 1
? ? ? ? ? ? x = w.emb.weight[tokens] if seq_mode else w.emb.weight[tokens[-1]]
? ? ? ? ? ? if self.RUN_DEVICE == 'cuda':
? ? ? ? ? ? ? ? x = x.cuda()
? ? ? ? ? ? if state == None:
? ? ? ? ? ? ? ? state = torch.zeros(args.n_layer * 5, args.n_embd, device=self.RUN_DEVICE)
? ? ? ? ? ? ? ? for i in range(args.n_layer):
? ? ? ? ? ? ? ? ? ? state[5*i+4] -= 1e30
? ? ? ? ? ? SA = self.SA_seq if seq_mode else self.SA_one
? ? ? ? ? ? FF = self.FF_seq if seq_mode else self.FF_one
? ? ? ? ? ? all_ffn_out=[]
? ? ? ? ? ? for i in range(args.n_layer):
? ? ? ? ? ? ? ? ww = w.blocks[i].att
? ? ? ? ? ? ? ? x = x + SA(self.LN(x, w.blocks[i].ln1), state, i,
? ? ? ? ? ? ? ? ? ? ww.time_mix_k, ww.time_mix_v, ww.time_mix_r, ww.time_first, ww.time_decay,
? ? ? ? ? ? ? ? ? ? ww.key.weight, ww.value.weight, ww.receptance.weight, ww.output.weight)
? ? ? ? ? ? ? ? ww = w.blocks[i].ffn
? ? ? ? ? ? ? ? ffn_out=FF(self.LN(x, w.blocks[i].ln2), state, i,
? ? ? ? ? ? ? ? ? ? ww.time_mix_k, ww.time_mix_r,
? ? ? ? ? ? ? ? ? ? ww.key.weight, ww.value.weight, ww.receptance.weight)
? ? ? ? ? ? ? ? x = x + ffn_out
? ? ? ? ? ? ? ? all_ffn_out.append(ffn_out)
? ? ? ? ? ? ? ? # print('ffn->',x)
? ? ? ? ? ? ? ? if (i+1) % RWKV_RESCALE_LAYER == 0:
? ? ? ? ? ? ? ? ? ? x = x / 2
? ? ? ? ? ? if preprocess_only:
? ? ? ? ? ? ? ? return state
? ? ? ? ? ? x = self.LN(x[-1,:], w.ln_out) if seq_mode else self.LN(x, w.ln_out)
? ? ? ? ? ? x = w.head.weight @ x
? ? ? ? ? ? # print('output',x.shape,'? out put state',state.shape)
? ? ? ? ? ? return x.float(),all_ffn_out, state
```


這里注意到ffn層 輸出后 會(huì)被layernorm 泛化,但即使這樣 也會(huì)有outlier 這就太奇怪了.
2.不同大小的模型可視化
為了探討不同模型大小對(duì)outlier的影響我做了后續(xù)的可視化

1b5 fp32

1b5 fp16

7b fp16
## 單從可視化結(jié)果中可以得到3個(gè)結(jié)論
?- 結(jié)論一: 模型越大 outlier 情況越少
?- 結(jié)論二 量化 或者說(shuō)精度的改變會(huì)影響 outlier
?- 結(jié)論三 outlier 的情況會(huì)直接影響模型的性能(并不嚴(yán)謹(jǐn))
如何得出
## 如何得出結(jié)論 以下為可視化時(shí)控制變量的情況?
?- 全部輸入都一致 為:` What is python? Please tell me in detail what it is, how to use it, how to learn it, and what advantages and disadvantages it has.`
?- 模型輸出不可控
?- 結(jié)論一; 對(duì)比7b fp16 與 1b5 fp16 的模型可視化可直觀看出 7b的outlier更小
?- 結(jié)論二,對(duì)比1b5 fp16 與 1b5 fp32 相同輸入的情況下,多次試驗(yàn)結(jié)果都表明fp32 的輸出比f(wàn)p16 的輸出更長(zhǎng) ,效果更好 猜測(cè)做量化的對(duì)齊 會(huì)保證性能的一致
?- 結(jié)論三? 對(duì)于1b5模型而言(7b fp32 3090單卡跑不了 后續(xù)會(huì)補(bǔ)上) 不同的精度會(huì)導(dǎo)致outlier 情況有區(qū)別,? 但是是否對(duì)模型性能有影響 要在后面的試驗(yàn)中來(lái)演示
## 進(jìn)行可量化的評(píng)估試驗(yàn)
? ?#### 思路
- 1.通過(guò)使用KL散度 來(lái)評(píng)估相同情況下 模型大小,精度,不同輸入 對(duì)outlier現(xiàn)象的影響
- 2.通過(guò)對(duì)outlier的操作(剔除,規(guī)范化等)來(lái)驗(yàn)證 不同層,大小 的outlier 的作用是什么
- 3.使用均方差來(lái) 評(píng)估不同模型大小,精度, ffn不同層 響應(yīng)的離散程度 (outlier 的嚴(yán)重情況)
- 4.對(duì)目前開(kāi)源的LLM模型進(jìn)行相同的操作 來(lái)驗(yàn)證outlier 到底在干什么
- 5.目前沒(méi)有太好的思路來(lái)驗(yàn)證 涌現(xiàn)與頓悟 跟outlier之間的關(guān)系,這應(yīng)該要在訓(xùn)練的過(guò)程中來(lái)統(tǒng)計(jì)outlier的情況 并根據(jù)其他多任務(wù)的評(píng)估指標(biāo)來(lái)評(píng)價(jià) outler 到達(dá)何種程度后 頓悟/涌現(xiàn) 就出現(xiàn)了.