技術背景
在前面的博客中,我們介紹過關于numpy中的張量網路的一些應用,同時利用相關的張量網路操作,我們可以實作一些分子動力學模擬中的約束演算法,如LINCS等,在最新的nightly版本的MindSpore中也支持了愛因斯坦求和的算子,這是在張量網路中非常核心的一個操作,本文就簡單介紹一下MindSpore中使用愛因斯坦求和的方法,
安裝最新版的MindSpore
Einsum是在1.6之后的版本才支持的,MindSpore的Master分支就是官網上面的Nightly版本,我們可以安裝這個已經實作了愛因斯坦求和算子的版本,
安裝指令如下:
python3 -m pip install mindspore-cuda11-dev -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade
簡單示例
我們可以先將張量縮并,理解成是一個普通的矩陣乘積即可,只是相乘的矩陣維度大小略有區別,可以先看一個簡單的案例,再決議其中的原理:
Python 3.9.0 (default, Nov 15 2020, 14:28:56)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.environ['GLOG_v'] = '4' # 設定日志等級,防止螢屏上出現大量的MindSpore告警資訊
>>> from mindspore import Tensor, ops
>>> a = Tensor([[1.,2.],[3.,4.]])
>>> b = Tensor([1.,1.])
>>> ein_0 = ops.Einsum('ij,j->i') # 對第二個維度進行縮并
>>> print (ein_0((a,b)))
[3. 7.]
>>> ein_1 = ops.Einsum('ij,i->j') # 對第一個維度進行縮并
>>> print (ein_1((a,b)))
[4. 6.]
原理決議
我們日常所見的矩陣,可以采用張量這樣的“章魚圖”表示方法來標記,每一個張量都是一個“章魚”的頭,而矩陣的每一個維度代表一條“章魚腿”,比如一個維度為\((2,2,2)\)的矩陣,就可以用一只“三條腿的章魚”來表示,而學習張量網路的時候經常可以看到的如下這張圖,就分別用于表示一維、二維和三維的矩陣:
這些是張量的基本概念,而如果我們把“章魚腿”都連接起來,就表示規定了這個張量的運算方向,張量只能跟相互連接的張量進行縮并(矩陣運算)操作,比如上一個章節中的案例,就可以用這樣的一個張量圖來表示:
可以看到,這兩個矩陣運算之后得到的結果,是一個“單腿”的張量,對應于矩陣運算的維度變化就是:\((2,2)\times(2,)->(2,)\),如果我們把這個運算推廣開來,建立一個帶有復雜鏈接資訊的張量拓撲圖,那么就得到了一個張量網路,在一個大型的張量網路中,我們不僅可以通過高性能的GPU來加速張量縮并的運算,還有路徑搜索和圖分解等演算法可以進一步加速張量網路縮并,得到我們想要的結果,
我們可以再細化的講解一下上一個章節中的案例,當我們使用ij,j->i這個路徑時,得到的結果的第一個元素為\(a[0]\cdot b=3\),得到的第二個元素為\(a[1]\cdot b=7\),當我們使用ij,i->j這個路徑時,得到的結果的第一個元素為\(a[:,0]\cdot b=4\),得到的第二個元素為:\(a[:,1]\cdot b=4\),從這個程序可以發現,對于二維的張量,其實取不同的“腿”,就是取行和取列運算的區別而已,對于更加高維的張量,我們很難用行、列這樣的指標來衡量和理解,但是我們還是可以通過python的這種矩陣運算來理解,更多的參考示例,可以閱讀MindSpore的官方檔案(參考鏈接2),
總結概要
張量網路計算,已經在眾多的領域中得到了應用,不僅僅是傳統的計算化學,當下醫藥研發領域的分子動力學模擬、計算化學和材料模擬,甚至是未來的量子計算,張量網路技術都在當中發揮重要作用,本文介紹的是MindSpore最新對張量網路計算的支持的第一步:用愛因斯坦求和計算張量網路縮并,
著作權宣告
本文首發鏈接為:https://www.cnblogs.com/dechinphy/p/mseinsum.html
作者ID:DechinPhy
更多原著文章請參考:https://www.cnblogs.com/dechinphy/
打賞專用鏈接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html
騰訊云專欄同步:https://cloud.tencent.com/developer/column/91958
CSDN同步鏈接:https://blog.csdn.net/baidu_37157624?spm=1008.2028.3001.5343
51CTO同步鏈接:https://blog.51cto.com/u_15561675
參考鏈接
- https://www.cnblogs.com/dechinphy/p/lincs.html
- https://www.mindspore.cn/docs/zh-CN/r1.7/api_python/ops/mindspore.ops.Einsum.html?highlight=einsum#mindspore.ops.Einsum
- https://www.cnblogs.com/dechinphy/p/tensor.html
- https://www.zhihu.com/question/54786880/answer/147099121
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/469719.html
標籤:其他
