AI系统-5深度学习的基础:矩阵运算

120 阅读10分钟

image.png

之前讲了神经网络的基础理论:神经网络的每层之间是函数关系,整体就是一个大的复合函数,这样就能表示y=f(x)了。讲完了函数,那么就需要看看要运算的数据是什么样子了,例如一张图片就是很多的像素点,需要用矩阵表示,这些像素点作为参数都要参与运算就又是更大的矩阵运算了。

本文就先从矩阵运算入手,简短的篇幅就讲完整个深度学习内容,并且直达科技前沿的TensorFlow。内容还是参考《飞天闪客:白话DeepSeek》,上链接:

space.bilibili.com/325864133/l…

1. 矩阵运算

image.png 换成矩阵如下:

image.png 化简后为:

image.png

对于多层神经元,第L层的运算表示如下:

image.png

当层数变多,且参数矩阵变多的时候,就可以使用并行计算了,这在计算机技术里面很常见。而且这种固定的矩阵运算可以软件硬化就是NPU了。

2. CNN卷积神经网络

对于图像处理而言,每个像素点要占一个数值,如果把这些数值直接作为输入,后续的训练效果会很差,

image.png

因为作为最基础的输入要携带的信息量越多越好。特别是在图片识别领域,人眼去看图片的时候一次能看到整个轮廓,从而迅速的判断,所以盯着图片的某个像素看识别不了图片内容。例如一个像素的值,它周围像素的值信息如果也能携带进去,就是把局部的信息都带进去,这样就具有了空间的信息,怎么办呢?答案就是小范围的扫描一遍:

image.png

扫描的方法就是去3x3的9个像素点跟一个固定矩阵相乘得到的值,替换3x3矩阵中间的值。这样扫描处理完一遍,整个图片的像素值就都有了周围的空间信息。这就是卷积运算,固定矩阵就是卷积核。

image.png

在图像处理领域,卷积运算很常用,例如PS里面的模糊效、浮雕、锐化等效果,甚至马赛克。我们这里要用于图像识别,那卷积核的参数就要训练的跟我们要识别的物体相近,这样经过卷积运算,数值比较大一些就说明这个像素附近更想我们要识别的物体,就是有用信息多。

image.png

卷积层解决了图像局部信息差的问题,那么参数太多怎么解决,就需要池化层,例如30x30的图片经过池化层就剩5x5,这样作为输入给神经网络,神经网络里面以全部信息作为输入就是全链接层。最后神经网络运行的结果给输出层做出识别结果的判断。

image.png

池化(Pooling)用于降低特征图(feature map)的空间尺寸,从而减少参数的数量和计算量,同时提高模型的不变性和泛化能力。可以理解为对上述计算的特征进行再次提取。一个最简单的池化方法就是例如2x2的像素里面取一个最大值,这样参数尺寸就缩小了4倍,这就是最大池化。其他常见的一些池化算法:

  • 平均池化:在池化窗口内计算平均值作为池化后的值,这是用来平滑特征,减少噪声影响。
  • 求和池化:在池化窗口内计算所有值的总和作为池化后的值。能够保留更多的信息,但对噪声也更敏感。
  • L2 池化:在池化窗口内计算所有值的 L2 范数(即欧几里得距离)作为池化后的值。在某些情况下能够更好地保留特征的结构信息。

输出层就是图片的识别结果,例如张三或者李四。整个过程也是完成了函数的运算,到最后给出函数的Y值结果。

卷积神经网络CNN一般会有多个这些层的组合,例如手写数字的识别如下:

image.png

可视化如下:

image.png

CNN主要用于静态图片的识别。是神经网络的一种。其实这些知识就讲到深度学习了。

3. 循环神经网络RNN

图片适合扫描就是卷积,那么文字的信息形式本来就是一行一行的,并且不是一页文字,而是像整个图书馆的文字信息一样多,面对这么多的信息CNN就不适合了,这里要用到循环神经网络RNN,一个典型应用就是文字对话,根据提问的文字信息找出关联最大的文字进行回答。

image.png

首先要解决文字的问题就是编码,因为计算机只认识01组成的数字,那么把每个汉字编码成一个数组,这样汉字间的关联关系就丢失了,这种关联关系对AI非常的重要,因为决定了一个文字的信息量大小,而对于神经网络的输入数据要求信息量越大越好,然后向前传播的时候就能更准确的预测。这一点也是汉语比英语有优势的地方,因为英文单词太多,新词太多,关联度低,信息密度太低。

给每个文字一个编码不行,从向量角度看就是一维的,那在向量中占一位来编码,就是多维的。如下:

image.png 这样向量维度太高,长度太大,而且只有一个1那么信息密度不行,运行起来数据太多。所以从向量维度分析这两个极端都不行,那就找一个合适的向量长度就可以,这种对文字使用一个合适维度向量表示的方法就是词嵌入。

image.png 词嵌入得到的向量维度合适,且包含了更多的信息。词嵌入的方法怎么得到词向量呢?是通过数据训练出来的,就是还没对神经网络进行训练,先对输入对象的数据进行了训练得到了数据的特征信息作为向量,经典的词嵌入算法就是word2vec。

image.png 经过词嵌入以后,两个词的相关性就可以使用点积的大小来表示了。这样就把自然语言词之间的联系转换为计算机可以理解的数字算法了。

image.png 词的维度一般比较高,我们可以很容易理解二维、三维空间,那这种高纬度的空间就叫潜空间,如果要可视化的话就需要降维投影到三维空间中,这样一个一个球的直线距离就是两个高纬向量的距离。

image.png

image.png 这看着是不是有点像宇宙中的星球,那么是高纬时间在三维空间的投影?那么是否有方法在三维世界进入到更高维度的世界,见识高维度的文明?这有点科幻了。

经过词嵌入处理后,词就变成了向量,但是需要输入的数据的一句话给到输入层,那么单个词直接进入输入层就不合适,一是数据太多太大,二是词之间不能表达一句话之间的关联性特征。

image.png 要表示关联性,就需要一个词带上它周围词的信息,且携带的越多越好,回到函数的概念,就是表达式里面要带上其他词的值,例如可以直接相加。这样一句话的词越往后词的信息量越大。那么就有一个疑问,中文的重要的词在后面,英文是重要的词在前面,是否有影响?其实通过技术手段,没多大影响:

image.png

对词的处理就是循环神经网络RNN:

image.png

上面运算的矩阵表示如下: image.png 公式如下:

image.png 但是RNN这种循环,对于长句,可能丢失之前词的信息,另外后面的运算依赖前面的结果就不利于并行计算。解决方法如下(但是只能缓解,无法根治):

image.png

这些自然语言处理,可以识别舆论倾向,情感,翻译,对话等功能。

4. Transformer

RNN是一句话,从前到后一个词一个词计算,如果一眼就能找到关键的词,然后盯着关键词去计算不就效率高了。怎么一眼找到关键词呢?

image.png 上面是RNN的串行计算,后面的词才有前面词的信息。那么是否可以每个词都有所有词的信息,那么就需要加上一个位置,self-Attention就是每个词为中心把其他词的信息都加进去,一听就感觉好是好,但是计算量大大增加了,这也是理论先提出来,但是没有计算机能验证的原因,直到英伟达更先进的GPU出现。

怎么样加入位置信息,也是简单粗暴,把词向量和位置向量直接相加:

image.png

这里要理解为啥要这么做,因为最后的相关性就是一个值,而得到相关性就需要矩阵乘法,在关键位置上有值就可以更加的相关,这样相乘值更大,否则很多的数乘以0还是0。

加入位置信息后,一个词怎么能建立对其他词的注意力呢?就是要计算其他值在自己这里的权重w。

为了计算权重每个词需要三个信息:q(query询问别人是否相关用)、k(key回答跟别人是否相关用)、v(value就是自己的信息),本来只有一个词向量怎么生成这三个信息?答案还是矩阵乘法,找个合适的矩阵相乘就可以。

image.png

一个词要计算跟其他词的相关性,那就拿自己的q跟其他所有词的k相乘,就得到了其他词在自己这里的相似度(权重):

image.png

然后和其他词的v相乘累加就得到了第一个词的最终向量表示,还是那个一维向量,但是其已经包含了其他词的信息,特别是相似度。

image.png

经过上面处理的词向量(即self-Attention机制),就可以按照普通神级网络的算法进行全链接的计算了。最核心的创新已经讲完了。

然后就是多头注意力,就是计算q、k、v的时候使用不同的参数矩阵多算出来几组,就给了每个词多次的学习机会,拿到不同视角下的另一组词向量,如下是两组:

image.png

那么两次学习的结果怎么样一块使用呢?答案也很粗暴就是计算出来的两个相加或者拼接。

image.png

总结如下:

image.png

q和k相乘得到相似度scale,最后再跟v相乘得到最后的值。右边是多个头,多次重复左边的过程,最好再汇总。

image.png 整体结构训练的算法如上,在对话场景就是预测下一个词,能从所有词中找到概率最大的进行输出。既然是预测下一个词,那么已经有的对话词是作为了output,但是是一半的语句,这就要用到mask把后面的词遮挡住进行训练。训练的时候根据最后概率的结果跟我们的期望差别来调整参数,直到较好的效果。

image.png

推理的时候就是只使用解码器,拿概率最大的值进行输出就可以了。

最后回忆下这两节讲解的概念:www.bilibili.com/video/BV1xH…