码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • MindSpore尝鲜之爱因斯坦求和


    技术背景

    在前面的博客中,我们介绍过关于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,2)的矩阵,就可以用一只“三条腿的章鱼”来表示。而学习张量网络的时候经常可以看到的如下这张图,就分别用于表示一维、二维和三维的矩阵:

    这些是张量的基本概念,而如果我们把“章鱼腿”都连接起来,就表示规定了这个张量的运算方向,张量只能跟相互连接的张量进行缩并(矩阵运算)操作。比如上一个章节中的案例,就可以用这样的一个张量图来表示:

    可以看到,这两个矩阵运算之后得到的结果,是一个“单腿”的张量,对应于矩阵运算的维度变化就是:(2,2)×(2,)−>(2,)(2,2)×(2,)−>(2,)。如果我们把这个运算推广开来,建立一个带有复杂链接信息的张量拓扑图,那么就得到了一个张量网络。在一个大型的张量网络中,我们不仅可以通过高性能的GPU来加速张量缩并的运算,还有路径搜索和图分解等算法可以进一步加速张量网络缩并,得到我们想要的结果。

    我们可以再细化的讲解一下上一个章节中的案例,当我们使用ij,j->i这个路径时,得到的结果的第一个元素为a[0]⋅b=3a[0]⋅b=3,得到的第二个元素为a[1]⋅b=7a[1]⋅b=7。当我们使用ij,i->j这个路径时,得到的结果的第一个元素为a[:,0]⋅b=4a[:,0]⋅b=4,得到的第二个元素为:a[:,1]⋅b=4a[:,1]⋅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

    参考链接

    1. https://www.cnblogs.com/dechinphy/p/lincs.html
    2. https://www.mindspore.cn/docs/zh-CN/r1.7/api_python/ops/mindspore.ops.Einsum.html?highlight=einsum#mindspore.ops.Einsum
    3. https://www.cnblogs.com/dechinphy/p/tensor.html
    4. https://www.zhihu.com/question/54786880/answer/147099121
  • 相关阅读:
    JavaScript---常用JS方法(utils.js)额外篇
    如何建立风险、内控与合规三位一体的管控体系?
    微信小程序开发学习笔记
    Pytorch 多卡并行(1)—— 原理简介和 DDP 并行实践
    全网最牛自动化测试框架系列之pytest(3)-测试命名规则
    SystemServer进程
    前端面试题46(vue路由如何根据权限动态控制路由的显示?)
    WorkTool企微机器人APP分享自定义链接
    Verilog中的系统任务(显示/打印类)--$display, $write,$strobe,$monitor
    Selenium基础 — Selenium元素定位(一)
  • 原文地址:https://www.cnblogs.com/dechinphy/p/mseinsum.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号