NumPy作為 Python 生態(tài)中最受歡迎的科學(xué)計算包,很多讀者已經(jīng)非常熟悉它了。
它為 Python 提供高效率的多維數(shù)組計算,并提供了一系列高等數(shù)學(xué)函數(shù),我們可以快速搭建模型的整個計算流程。毫不負(fù)責(zé)任地說,NumPy 就是現(xiàn)代深度學(xué)習(xí)框架的「爸爸」。
盡管目前使用 NumPy 寫模型已經(jīng)不是主流,但這種方式依然不失為是理解底層架構(gòu)和深度學(xué)習(xí)原理的好方法。最近,來自普林斯頓的一位博士后將 NumPy 實(shí)現(xiàn)的所有機(jī)器學(xué)習(xí)模型全部開源,超過 3 萬行代碼、30 多個模型,并提供了相應(yīng)的論文和一些實(shí)現(xiàn)的測試效果。
項目地址:https://github.com/ddbourgin/numpy-ml
粗略估計,該項目大約有 30 個主要機(jī)器學(xué)習(xí)模型,此外還有 15 個用于預(yù)處理和計算的小工具,全部.py 文件數(shù)量有 62 個之多。平均每個模型的代碼行數(shù)在 500 行以上,在神經(jīng)網(wǎng)絡(luò)模型的 layer.py 文件中,代碼行數(shù)接近 4000。
這,應(yīng)該是目前用 NumPy 手寫機(jī)器學(xué)習(xí)模型的「最高境界」吧。
誰用 NumPy 手推了一大波 ML 模型?通過項目的代碼目錄,我們能發(fā)現(xiàn),作者基本上把主流模型都實(shí)現(xiàn)了一遍,這個工作量簡直驚為天人。作者 David Bourgin 是一位大神,于 2018 年獲得加州大學(xué)伯克利分校計算認(rèn)知科學(xué)博士學(xué)位,隨后在普林斯頓大學(xué)從事博士后研究。 盡管畢業(yè)不久,David 在頂級期刊與計算機(jī)會議上都發(fā)表了一些優(yōu)秀論文。在 ICML 2019 中,其關(guān)于認(rèn)知模型先驗(yàn)的研究就被接收為少有的 Oral 論文。 David Bourgin 就是用 NumPy 手寫 ML 模型、手推反向傳播的大神。這么多的工作量,當(dāng)然還是需要很多參考資源的,David 會理解這些資源或?qū)崿F(xiàn),并以一種更易讀的方式寫出來。 他表示,從 autograd repo 學(xué)到了很多,但二者的不同之處在于,他顯式地進(jìn)行了所有梯度計算,以突出概念/數(shù)學(xué)的清晰性。當(dāng)然,這么做的缺點(diǎn)也很明顯,在每次需要微分一個新函數(shù)時,你都要寫出它的公式…… 估計 David Bourgin 在寫完這個項目后,機(jī)器學(xué)習(xí)基礎(chǔ)已經(jīng)極其牢固了。項目總體介紹這個項目最大的特點(diǎn)是作者把機(jī)器學(xué)習(xí)模型都用 NumPy 手寫了一遍,包括更顯式的梯度計算和反向傳播過程。可以說它就是一個機(jī)器學(xué)習(xí)框架了,只不過代碼可讀性會強(qiáng)很多。 David Bourgin 表示他一直在慢慢寫或收集不同模型與模塊的純 NumPy 實(shí)現(xiàn),它們跑起來可能沒那么快,但是模型的具體過程一定足夠直觀。每當(dāng)我們想了解模型 API 背后的實(shí)現(xiàn),卻又不想看復(fù)雜的框架代碼,那么它可以作為快速的參考。 文章后面會具體介紹整個項目都有什么模型,這里先簡要介紹它的整體結(jié)構(gòu)。如下所示為項目文件,不同的文件夾即不同種類的代碼集。![15ccbc5a-66f7-11ed-8abf-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/97/C2/wKgZomTnQYmAJtfDAACjiOmq7ZU052.jpg)
![15e600c0-66f7-11ed-8abf-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/97/C2/wKgZomTnQYqAWgh2AAEdMdh6UA0216.jpg)
- EM 訓(xùn)練
- 用變分 EM 進(jìn)行 MLE 參數(shù)估計的標(biāo)準(zhǔn)模型
- 用 MCMC 進(jìn)行 MAP 參數(shù)估計的平滑模型
- Add
- Flatten
- Multiply
- Softmax
- 全連接/Dense
- 稀疏進(jìn)化連接
- LSTM
- Elman 風(fēng)格的 RNN
- 最大+平均池化
- 點(diǎn)積注意力
- 受限玻爾茲曼機(jī) (w. CD-n training)
- 2D 轉(zhuǎn)置卷積 (w. padding 和 stride)
- 2D 卷積 (w. padding、dilation 和 stride)
- 1D 卷積 (w. padding、dilation、stride 和 causality)
- 雙向 LSTM
- ResNet 風(fēng)格的殘差塊(恒等變換和卷積)
- WaveNet 風(fēng)格的殘差塊(帶有擴(kuò)張因果卷積)
- Transformer 風(fēng)格的多頭縮放點(diǎn)積注意力
- Dropout
- 歸一化
- 批歸一化(時間上和空間上)
- 層歸一化(時間上和空間上)
- SGD w/ 動量
- AdaGrad
- RMSProp
- Adam
- 常數(shù)
- 指數(shù)
- Noam/Transformer
- Dlib 調(diào)度器
- Glorot/Xavier uniform 和 normal
- He/Kaiming uniform 和 normal
- 標(biāo)準(zhǔn)和截斷正態(tài)分布初始化
- 交叉熵
- 平方差
- Bernoulli VAE 損失
- 帶有梯度懲罰的 Wasserstein 損失
- ReLU
- Tanh
- Affine
- Sigmoid
- Leaky ReLU
- Bernoulli 變分自編碼器
- 帶有梯度懲罰的 Wasserstein GAN
- 決策樹 (CART)
- [Bagging] 隨機(jī)森林
- [Boosting] 梯度提升決策樹
- 嶺回歸
- Logistic 回歸
- 最小二乘法
- 貝葉斯線性回歸 w/共軛先驗(yàn)
- 最大似然得分
- Additive/Lidstone 平滑
- 簡單 Good-Turing 平滑
- 使用交叉熵方法的智能體
- 首次訪問 on-policy 蒙特卡羅智能體
- 加權(quán)增量重要采樣蒙特卡羅智能體
- Expected SARSA 智能體
- TD-0 Q-learning 智能體
- Dyna-Q / Dyna-Q+ 優(yōu)先掃描
- Nadaraya-Watson 核回歸
- k 最近鄰分類與回歸
- 離散傅立葉變換 (1D 信號)
- 雙線性插值 (2D 信號)
- 最近鄰插值 (1D 和 2D 信號)
- 自相關(guān) (1D 信號)
- 信號窗口
- 文本分詞
- 特征哈希
- 特征標(biāo)準(zhǔn)化
- One-hot 編碼/解碼
- Huffman 編碼/解碼
- 詞頻逆文檔頻率編碼
- 相似度核
- 距離度量
- 優(yōu)先級隊列
- Ball tree 數(shù)據(jù)結(jié)構(gòu)
![1603bf84-66f7-11ed-8abf-dac502259ad0.png](https://file1.elecfans.com//web2/M00/97/C2/wKgZomTnQYqAboYMAAAr8x7qjR8494.png)
classDotProductAttention(LayerBase): def__init__(self,scale=True,dropout_p=0,init="glorot_uniform",optimizer=None): super().__init__(optimizer) self.init=init self.scale=scale self.dropout_p=dropout_p self.optimizer=self.optimizer self._init_params() def_fwd(self,Q,K,V): scale=1/np.sqrt(Q.shape[-1])ifself.scaleelse1 scores=Q@K.swapaxes(-2,-1)*scale#attentionscores weights=self.softmax.forward(scores)#attentionweights Y=weights@V returnY,weights def_bwd(self,dy,q,k,v,weights): d_k=k.shape[-1] scale=1/np.sqrt(d_k)ifself.scaleelse1 dV=weights.swapaxes(-2,-1)@dy dWeights=dy@v.swapaxes(-2,-1) dScores=self.softmax.backward(dWeights) dQ=dScores@k*scale dK=dScores.swapaxes(-2,-1)@q*scale returndQ,dK,dV 在以上代碼中,Q、K、V 三個向量輸入到「_fwd」函數(shù)中,用于計算每個向量的注意力分?jǐn)?shù),并通過 softmax 的方式得到權(quán)重。而「_bwd」函數(shù)則計算 V、注意力權(quán)重、注意力分?jǐn)?shù)、Q 和 K 的梯度,用于更新網(wǎng)絡(luò)權(quán)重。 在一些實(shí)現(xiàn)中,作者也進(jìn)行了測試,并給出了測試結(jié)果。如圖為隱狄利克雷(Latent Dirichlet allocation,LDA)實(shí)現(xiàn)進(jìn)行文本聚類的結(jié)果。左圖為詞語在特定主題中的分布熱力圖。右圖則為文檔在特定主題中的分布熱力圖。
![16214cd4-66f7-11ed-8abf-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/97/C2/wKgZomTnQYqAM-nZAAEeujY74fs711.jpg)
審核編輯 :李倩
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4344瀏覽量
62824 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8429瀏覽量
132854 -
python
+關(guān)注
關(guān)注
56文章
4802瀏覽量
84890
原文標(biāo)題:?Numpy手寫機(jī)器學(xué)習(xí)算法,3萬行代碼!
文章出處:【微信號:vision263com,微信公眾號:新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
LM98640是給一個過滿度的正弦波采集大量全碼數(shù)據(jù)進(jìn)行概率分布計算DNL還是給個斜坡波進(jìn)行靜態(tài)測試?
如何使用Python構(gòu)建LSTM神經(jīng)網(wǎng)絡(luò)模型
手搓黨分享:用Air700E開發(fā)板+毫米波雷達(dá),搓一個睡眠監(jiān)測儀!
![<b class='flag-5'>手</b>搓黨分享:<b class='flag-5'>用</b>Air700E開發(fā)板+毫米<b class='flag-5'>波</b>雷達(dá),搓<b class='flag-5'>一</b>個睡眠監(jiān)測儀!](https://file1.elecfans.com/web2/M00/08/84/wKgZomb4r6aAE9fIAAiRwJH2UHI165.png)
為AI、ML和數(shù)字孿生模型建立可信數(shù)據(jù)
用二只OPA548組成功率輸出電路,二只管子的電流工作時一大一小,為什么?
用TINA如何搭建仿真模型?
功率放大器在Lamb波信號波包模型驗(yàn)證研究中的應(yīng)用
![功率放大器在Lamb<b class='flag-5'>波</b>信號波包<b class='flag-5'>模型</b>驗(yàn)證研究中的應(yīng)用](https://file1.elecfans.com/web2/M00/02/26/wKgaoma0PL6ACjuiAAAkeGSybYo239.png)
OPA454沒有放大波形輸出是怎么回事?
如何訓(xùn)練一個有效的eIQ基本分類模型
![如何訓(xùn)練<b class='flag-5'>一</b>個有效的eIQ基本分類<b class='flag-5'>模型</b>](https://file1.elecfans.com/web2/M00/00/C5/wKgaomaq5iqAVex_AABUDsq2YBc408.png)
Achronix新推出一款用于AI/ML計算或者大模型的B200芯片
![Achronix新推出<b class='flag-5'>一</b>款用于AI/<b class='flag-5'>ML</b>計算或者大<b class='flag-5'>模型</b>的B200芯片](https://file1.elecfans.com/web2/M00/C6/FF/wKgaomYFIUmAQyGJAAAqCYyXY7E574.png)
谷歌模型怎么用PS打開文件和圖片
使用ml configurator進(jìn)行tflite網(wǎng)絡(luò)模型的轉(zhuǎn)換不成功怎么解決?
最佳開源模型刷新多項SOTA,首次超越Mixtral Instruct!「開源版GPT-4」家族迎來大爆發(fā)
![最佳開源<b class='flag-5'>模型</b>刷新多項SOTA,首次超越Mixtral Instruct!「開源版GPT-4」家族迎來大爆發(fā)](https://file1.elecfans.com/web2/M00/BF/DD/wKgaomW4pkGAFlnMAAAZllE6yBw526.png)
評論