AI基础第一篇——变化多端的张量

大家好,我是NV宝盒的作者,从今年开始就计划给大家写一些技术行的文章,但一直工作太忙,没时间来写。
并且前面咱们分享的也算不上是什么技术文章,那今天咱们来点不一样的东西,那么闲言少叙,我们开始吧。
近几年大家在网上见到的最多的东西是什么呢?是砍价拿5G手机?还是最近的俄乌大战?哎还是没进入正题。
AI这个词大家一定很熟悉,即使你不知道AI,你总听说过OCR,可以说从2015年之后,各个领域在AI上面都投入了很多精力,并且我们也能切身感受到咱们中国这几年的高速变化。
例如,首先就是网上购物、点外卖、看短视频,每次我搜索一个关键字之后他就一直给我推荐类似的东西;
然后就是OCR各种识别,没记错的话,在15年以前大家都很少知道有OCR这个东西,而且当时的OCR识别那是相当不理想;
语音合成,现在大家公认的微软小小的合成声音最好,还有众多朋友想要应用在读屏中呢,虽然以后有可能实现;
机器翻译,现在大家打开浏览器去英文网站,很少有人来抱怨看不懂英文了吧;
疫情大数据,大家每次出门要出事健康码,大家想过没有为什么要搞这种东西,就是为了建立大数据分析模型,对疫情扩散和防治提供便利条件,这个技术是中国非常特色的,也可以说是最先进的,为什么中国能把疫情管理的那么好?可以说我国已经把AI玩到了炉火纯青的地步;
航天领域,说了身边的AI,再来说说咱们的航天技术,我撰写文章的今天,也是非常有意义的一天,标题:“英雄归来!神十三航天员到达北京”,这个不用说大家都明白是什么,我不是研究航天的,但我一定相信这里面一定有AI的存在。
其实AI技术真的是给我们带来很多便利,或者说我们的无障碍更加需要AI。
那么我今天来干嘛了,我肯定不是为了给你们宣传这些的,今天是来讲AI背后的技术原理。
首先先声明一下,我不是顶尖的AI工程师,AI领域其实包含的内容非常多,内容也非常难,我不能保证我讲的一定是正确的,也不能保证你一定能学得会,但我会认真对待这篇文章,如果文中有哪些纰漏欢迎大家来指正。
今天是第一篇文章,咱们只能先给大家讲解一些初级的概念,我尽量用通俗的话讲明白。
AI的基础学科其实是数学,来自初中的一次函数和三角函数、高等数学的各种函数、向量和矩阵、物理学的标量和矢量,这些概念在AI中都有运用,特别是矩阵和偏导数在AI中是核心,相信你多多少少有听说过几个。
我曾经在上初中的时候数学在班里特别好,但遗憾的是从高中后数学就是学渣了,可见高等数学的门槛还是很高的,曾经我们几个同学在一起讨论说这数学这么难,学他干嘛,工作后我们又用不到,事实真是如此吗?大家自己判断。
咱们今天来讲第一个概念,也是这篇文章唯一一个讲述的概念,别觉得内容太少,你能理解80就算你很牛了。
俗话说心急吃不了热豆腐,或者说“欲速则不达”,希望大家学任何东西的时候都要踏实的学,要一个概念概念循序渐进的学,切勿跳跃的学。
今天要讲的是——张量(Tensor),对你没听错,不是标量不是向量,也不是矩阵,这张量是个什么量?大家一定要带着问题来学习。
张量是多维同类元素组成的空间形状对象,注意他是个对象,应当看作一个整体,但在分析时我们应该拆解。
例如一个标量就是0阶张量(及一个点),例如:1。
1阶张量是一个向量(排了一排元素),也可以称作线,例如:
[1,2,3,4,5]
2接张量就是一个矩阵,这边出现了新名词矩阵,不用怕,你就记住矩阵是一个特殊张量,例如:
[
[1,2,3,4,5],
[6,7,8,9,0],
[2,4,6,8,0]
]
这边一定要注意,1接、2接这边的数字我们称作接,是张量空间的向量空间的层数,怎么理解这句话,向量空间层数,那我们要先找到向量,
[1,2,3,4,5]
这是个向量,他自己具有空间,这个时候我们把他看作一个整体,因此他存在于
[
...
]
空间中,我们很清楚,空间层数是2,或者我们换个说法叫他空间深度。
那3接张量长得是什么样子呢,就像这样子
[
[
[1,2,3],
[4,5,6]
],
[
[1,3,5],
[2,4,6]
]
]
玩过JSON的同学应该熟悉,这明显就是个JSON格式呀。
但我要明确提醒大家的是,张量是很严谨的,这我们要从概念解读“张量是多维同类元素组成的空间形状对象”,我们来个例子
[
[
[1,2],
[4,5,6]
],
[
[1,3,5]
]
]
大家说这样可不可以?再例如
[1,2.5,-2,[1,2],"a"]
这些对象都不是张量,只能说是合法的JSON对象,第一个例子是因为他第二阶空间形状不一样,第二个例子是因为相同空间内的元素类型不同,要么是小数,要么是整数,哪里还弄出个list和str。
因此张量明确指出元素类型一定要相同,这样才能保证空间形状相同,那我们换一种思路,可以把这对象形成的空间看作是一个对象发散的分量,“分量”这个概念相信学过力学的都明白是怎么回事。
在一个三维空间,一个向量就有三个分量,我们不妨摸摸自己的键盘按键,把他抠下来就把他当做个向量,从左往右叫长度,从上往下叫厚度,从前往后叫宽度,【长度,厚度、宽度】就是一个三维空间中某个向量的三个分量,但我们如果把向量看作整体呢,他就是一个对象。
那如果我把按键再安装上去,他仍然还是三个分量,没有随着他所在的坐标系空间的改变而改变。
4接、5接、N接,其实就是不断的增加空间深度而已,因为咱们的现实空间可见的是三维度,那存在这个三维空间中的一切对象也只能有三个分量可见,不会违反元素类型不相同的概念。
说到这里大家就都明白了,概念我也就讲到这边,更多的详细信息有兴趣的可以自己查阅,但你们再往上可能会见到以下的几种张量定义:
1.张量是多维数组,这个定义常见于各种人工智能领域,也是我们最重要的概念,数组的定义就已经明确是相同类型,因此说张量是数组是一种简单表达,别回来骂我说的定义不对。
2.张量是某种几何对象,不会随着坐标系的改变而改变,这个我在上面的文章也已经详细解释了他的情形。
3.张量是向量和余向量(covector)通过张量积(tensor product)组合而成的,这个阐述的是向量本身和分量和他如何产生以及如何存在的。
4.张量是多重线性映射,张量本质是个量,但因为他有分量,所以在不同方向上都具有线性映射。
下面咱们来说说张量中一个比较特殊的东西——矩阵,矩阵其实是2接张量。
在AI中,矩阵被应用的比较多,那是因为他可以广泛被人接受,也可以很直观的画出框架图,另外对于矩阵有和线性代数一样的运算方法(加减乘除),这就给我们带来了便利。
例如我想识别一个人发来的语音消息,那语音数据本身是正弦函数的叠加,而正弦函数具有周期性,如果做一下fft(快速傅里叶变换),把叠加的信号转成分量形式的频域信息,然后直接看作张量,因为张量可以直接做加减乘除的线性映射,编写代码就特别方便,就和写kx+b一模一样,送入网络后识别效果非常好,原因就是我们还原了张量的形状,在网络迭代学习中具有很好的映射关系。
那下面我们来说说张量中矩阵的运算法则,多维度张量说起来很复杂,但可以通过矩阵类推:

  1. 加法
    矩阵加法很简单,两个相同类型的矩阵相加,就是把他们相同位置上的两个元素相加,例如
    [1,2]+[3,4]=[1+3,2+4]=4,6]
  2. 减法
    减法和加法法则相同,例如
    [1,2]-[3,4]=[1-3,2-4]=-2,-2]
  3. 数乘
    数乘就是一个矩阵和一个常数相乘,法则是让这个常数和矩阵中的每个元素都相乘,例如
    [1,2,3]3=[13,23,33]=[3,6,9]
  4. 乘法
    乘法就比较复杂了,前提条件,第一个矩阵的列数和第二个矩阵的行数相同才可以相乘,结果矩阵的行数是第一个矩阵的行数,结果矩阵的列数是第二个矩阵的列数。
    计算法则是:结果矩阵第m行与第n列交叉位置的那个值,等于第一个矩阵第m行与第二个矩阵第n列,对应位置的每个值的乘积之和。
    这个描述不知道大家能不能看懂,反正我自己都要快被绕进去了,下面我来重点说说怎么运算。
    假设有下列两个矩阵
    a=[
    [1,2,3],
    [4,5,6]
    ]
    b=[
    [7,8],
    [7,8],
    [7,8]
    ]
    我们先确定做乘法之后结果矩阵的形状,第一个矩阵是两行三列,第二个是两行两列,按要求第一个矩阵列数3等于第二个行数3条件满足,那结果矩阵的行数看第一个矩阵的行数是2,结果矩阵的列数看第二个矩阵的列数也是2,所以结果矩阵的形状是两行两列。
    接下来我们就按照计算法则来计算了,两行两列表示我们需要计算四个单元格的值,先计算左上角的单元格,等于第一个矩阵第m行与第二个矩阵第n列,对应位置的每个值的乘积之和,左上角单元格m和n的值都是1,翻译这句话就是让我看第一个矩阵第一行的三个数[1,2,3],分别和第二个矩阵的第一列的三个数[7,7,7]分别相乘,然后再相加,写成式子就是
    17+27+37=42
    因此第一个单元格的值是42,但这边大家一定要记住,这里面有隐藏的游标移动。
    1
    7,我们是按照要求第一个矩阵的第一行与第二个矩阵的第一列相乘,1属于第一个矩阵的第一行,7属于第二个矩阵的第一列,但相乘完毕后,我们隐藏的游标要+1,这个时候就是让第一个矩阵第一行的第2列与第二个矩阵的第2行相乘,因此27这边的7是第二行的7,而不是第一行的7,不需要重复交叉计算,也就是说这结果矩阵的第一个单元格的值只需要计算三个惩击,千万别排列组合计算9次了,那样结果是不对的。
    下面我们来计算右上角第二个单元格的值,按法则来,m还是1,n是2了,先找到第一个矩阵第一行三个数[1,2,3],分别乘以第二个矩阵的第二列的数字[8,8,8],写成式子就是
    1
    8+28+38=48
    因此第二个单元格的值是48,下面我们继续计算左下角的单元格的值,m是2[4,5,6],n是1[7,7,7],写出式子就是
    47+57+67=105
    下面计算最后一个单元格的值,m和n都是2[4,5,6],[8,8,8],写出式子
    4
    8+58+68=120
    最后我们的结果矩阵就是
    [
    [42,48],
    [105,120]
    ]
    倒腾了半天总算把结果计算出来了,那大家恐怕要被吓跑了,如此麻烦的计算可以看出大一的学生为什么那么讨厌矩阵了吧。
    但实际上我们记住几个要素就能玩的很溜,第一先定形状,第二一次给结果矩阵每个单元格编号,第一个单元格就是(1,1),前面的数字是行,第二个数字是列,不管是判断形状还是找行列,永远都记住第一个矩阵是行,第二个矩阵是列,你再记不住就记忆“两个矩阵行列行列”,在做某一行和某一列元素一一相乘的时候是同时移动。
    到了这边文章就算尾声了,那最后再来解答一个问题,矩阵到底能干嘛?
    我们可以看到,矩阵在运算的时候,都有运算规律,就像是数字和数字一起运算,在解决复杂的问题中,往往会包含多个未知变量,我们一个思想是列出线性方程组,然后使用带入的方法求解,其中每一个方程式实际上就是矩阵的某一个分量,当那既然如此为什么我们不干脆一气呵成,就把方程组写成矩阵做运算求解呢?
    其实矩阵设计支出就是为了解决线性方程组的,因为当方程组中的未知变量太多的时候,矩阵就可以发挥他的优势。
    另外就是矩阵乘法相乘之后,实际上是把分量给压缩了,这对高维度降维操作很有效。
    例如我给机器输入一段语音信号,让他输出识别到的文字信息,很显然语音数据的维度更大,而文本信息维度是非常小的。
    这篇文章只是介绍了一下和AI相关的一个基础概念,张量,在后面我会继续带领大家使用这种模型进行运用,例如咱们NV宝盒的验证码识别,就是利用了AI模型的技术,但这种技术又依赖于张量这种数学基础模型,我一篇文章怎么都不可能讲完的,因此大家要有耐心,可以持续关注我的文章。
    今天是绝对的干货,如果你喜欢可以加入收藏,或者在评论区留言,本人招收学徒,有想网这方面研究的可以加我QQ:1721503872。
    最后感谢大家的阅读,我们下次再会。

标签: none

已有 2 条评论

  1. 新气象

    点赞支持

  2. NVDA pornhub

    666

添加新评论