基于张量网络的机器学习(九)

一.理论学习

1.机器学习

    机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如何在经验学习中改善具体算法的性能,它根据数据或者以往的经验来优化计算机程序。机器学习可以分为以下类别:

  1. 监督学习:通过训练资料(已标注输入数据和对应标签输出)建立一个模型或函数,然后通过这个模型或函数去预测未标注数据输入的预测结果,它有一个内在的特点就是需要正确的输入和输出来建立模型或函数;
  2. 无监督学习:本质上是一个统计手段,因为无法提前得出结果,也无需给数据打标签,一个例子就是使用非负矩阵分解来实现推荐系统,这样一个统计手段实际上是一种聚类,将相似的聚集到某一块去;
  3. 半监督学习:既利用到了已标注数据,也用到了未标注数据,先利用已标注数据和对应标签建立模型或函数,然后不断使用未标注数据来优化这个模型或函数。怎么优化?毕竟没有标签啊,一种算法是先用已标注数据和对应标签训练一个分类器,然后输入未标注数据获得预测标签,利用这些预测标签改善模型,但也会存在一些问题,因为预测标签可能是伪标签(不精确的预测结果);
  4. 增强学习:有机体在环境给予的奖励或惩罚的刺激下,逐步形成对刺激的预期,产生能获得最大利益的习惯性行为,按我的理解就是把有机体换成模型,环境换成学习算法,刺激换成输入,习惯性行为换成预测结果,有点像监督学习,但它无需出现正确输入和输出,它是一种在线规划;
  5. 主动学习:学习算法主动向使用者或老师询问标签

2.神经网络

2.1 人工神经网络(ANN)

    一种模仿生物神经网络特别是大脑的结构和功能的数学模型或者说计算模型,用于对函数进行估计或近似。
    人工神经网络局具备学习能力,常用来解决机器视觉和语音识别。

2.1.1 构成

  1. 结构:指定神经网络中变量和它们的拓扑关系;
  2. 激励函数:依赖于网络中某些参数(比如权重),也就是下面将要提到的函数f,f是一个神经元的激励函数;
  3. 学习规则:一种更新权重的规则,规定网络中的权重应当如何更新。

2.1.2 神经元

    神经网络中一个神经元的工作是将输入向量和权向量作内积然后经过一个非线性函数传递得到一个标量结果,以下图为例,输入层的xi是输入向量的分量,bi则是偏置,是指向某一个神经元的偏置,它是一个与激励函数有关的重要东西,wi是权重向量的各个分量。
在这里插入图片描述


一个神经元的数学表示如下:
t = f ( W ′ → X ⃗ + b ) t=f\left(\overrightarrow{W^{\prime}} \vec{X }+b\right) t=f(W X +b)
W ⃗ \vec{W} W 为权向量, W ′ → \overrightarrow{W^{\prime}} W W ⃗ \vec{W} W 的转置 X ⃗ \vec{X} X 为输入向量;
b为偏置,也有叫截距的;
f f f 为传递函数或激活函数,通常为非线性函数,比如hardlim()函数,它的作用是将输出限制在两类;
t则是输出,它是目标神经元的值。


继续以该图为例: h 1是从输入层到隐藏层的其中一个神经元,可以叫做从输入层到隐藏层的目标神经元,x 1指向h 1且对应权重为w 1,x 2指向h 1且对应权重为w 3,h 1的偏置为b 1,显然,权重向量有两个分量,输入向量也是两个分量,偏置只有一个,是符合上述数学表达式的(偏置b 1可以表达为输入为1,对应权重为b 1,这样的话相当于输入向量的分量多了一个1,权重向量多了一个b 1),h 1就是从输入层到隐藏层当前目标神经元的输出值了,依次类推可以得出隐藏层每一个神经元的值,这些值会成为下一层输出层输入向量的分量。

在这里插入图片描述
    用比较数学的方式解释一个神经元的作用就是:它可以把一个n维向量空间用一个超平面分隔成两部分,就像是一个边界,只要输入,它就可以把输入归类放到某一边去,这就很容易让人联想到二分类问题了。这个超平面方程为:

W ′ → X ⃗ + b = 0 \overrightarrow{W^{\prime}} \vec{X}+b=0 W X +b=0

2.1.3 多层神经元网络

    单层神经网络是最基本的神经元网络形式,每一个神经元的输入都是同一个向量,而一个多层的神经元网络自然会更好,就比如一个具有输入层、隐藏层和输入层的多层结构的前馈网络(参数从输入层到输出层单向传递),隐藏层起到了丰富这个神经网络的作用,隐藏层是输入向量表达特征的抽象,其作用是为了划分不同类型的数据。
    此外,具有单个隐藏层的多层神经元网络一般称为感知器,而多隐藏层的则称为多层感知器。

2.1.4 学习方法

    常用的学习方法是反向传播算法,其实就是如何更新权重,为什么要更新权重?很直接的原因就是原有权重下得到的神经元的输出值不符合预期,所以得通过某些方式更新原有权重重新得出神经元的输出值。

2.1.5 种类

    依据学习策略分类只要有监督式学习网络、无监督式学习网络、混合式学习网络、联想式学习网络等,最最主要的是前两种:有监督式学习网络和无监督式学习网络。

2.1.6 容量

    即记住输入数据的能力,与网络的参数和结构有关。

2.2 卷积神经网络(CNN)

    之所以叫做卷积神经网络是因为用到了卷积这一运算,卷积是一种特殊的线性操作。
    下图中从左往右依次操作未:卷积、池化、卷积、池化、全连接,通过这些操作,一张小狗的彩图将被归为dog类(如果精确的话),显然,卷积神经网络是可以处理图像分类问题的,而且可以看到,中间进行了多次卷积和池化操作。
在这里插入图片描述

2.2.1 全连接神经网络

    对于前一层和后一层的神经元来说,前一层的每个神经元都与后一层的单个神经元有连接,这样的神经网络就是全连接神经网络。这一节讲的是卷积神经网络,那为什么要提到全连接神经网络?因为如果每一层都用全连接,将会导致非常大的时间消耗,一个彩图算是挺大的了,用全连接耗不起。这也是卷积神经网络的优点之一了,就是可以降低参数数量而不至于丢失太多的空间信息。

2.2.2 构建

  1. 输入层:卷积神经网络的输入层可以输入多维数据,就比如前面输入一个彩图,一个彩图可以用一个3维数组表示;
  2. 卷积层:这个层涉及到感受野、滤波器以及卷积核这三个概念,其实讲的是一个东西;
  3. 线性整流层(RELU层):实际情况下,线性整流层和卷积层共同称为卷积层,线性整流层给我的感觉就像是一个活化层,作用就是活化卷积层,甚至不妨说它就是一个激活函数,可以激活卷积层的神经元;
  4. 池化层:起数据降维的作用,用到的最大池化最为常见;
  5. 完全连接层:要从卷积层转换为完全连接层涉及到将卷积层的所有权重变成一个巨大的矩阵;
  6. 输出层
        以下是对上面某些层的详细解答。
2.2.2.1 卷积层
  1. 感受野(滤波器):实际上只是输入数据的一个局部区域,每个神经元只与输入数据的这么一个局部区域相连接,其尺寸大小也是滤波器的尺寸大小,深度与输入数据的深度一致。
  2. 卷积过程:
        首先看下面这张图,左半部分左边输入一个尺寸为32×32×3的数据,实际上是输入数据,中间的一小块粉色区域的尺寸大小等于感受野的尺寸大小,这一块通过卷积运算得到所指神经元的输出值,具体过程就在下图右半部分,符合前面所讲神经元的数学表达。还可以注意到,一块小的粉色区域会指向右边多个神经元(图中是5个,也代表着有5个滤波器,同时输出数据体的深度也将是5)
    在这里插入图片描述
    再看下面这张图,左边的输入数据做了补零操作,这个操作其实有助于控制输出数据的尺寸,蓝色方块那列是输入,红色方块那一列是第一层的滤波器,粉色方块那列是第二层滤波器,绿色方块那列是输出,这意味着输出数据的深度为3,某一块区域的卷积运算是怎么进行的?其实就是通过那一块区域对应x和滤波器对应权重相乘再求和得到。
    在这里插入图片描述
    比如从上到下第一个绿色方块中左上角的4=3-2+2+b,得出偏置b为1,那么可以验证一下,绿色方块右上角的1=1-1-2+1+1-2+1+1+b=b=1,所以每次扫描的一块区域的卷积结果就是这么算的了。
    在这里插入图片描述
    还要注意的是滤波器是怎么扫描的:感受野的尺寸大小为3×3×3,左右或上下每次滑动两格,所以滑动步长为2;
    除此之外,每一次卷积运算后,还需要激活函数去激活或者说传递,这里的激活函数和线性整流函数是一个东西,所以常有线性整流层和卷积层合称为卷积层,一个神经元的数学表达中也默认包含了激活函数,但它就没把激活函数这一块分出来,这里单独说出线性整流层或许还有其他特殊的意义吧。
2.2.2.2 池化层

    池化层用于数据降维,对于连续的卷积层,通常会周期性插入一个池化层来逐渐减小数据尺寸,和卷积层的操作类似,选择一个滤波器进行采样,比如尺寸大小为2×2的滤波器扫描4×4的数据,如果是最大池化层,那么该滤波器每一次扫描会得到那4个数据中的最大值,除了最大池化,还有其他类型的池化方式,比如平均池化,l2正则池化等等,且最大池化的效果比平均池化的效果好。

2.2.3 特性

  1. 平移不变性
    图像中的目标不管别移动到图像的哪一个位置,得到的结果都应该是相同的。
  2. 参数共享
    参数共享基于一个假设,如果一个特征在计算某个空间位置时有用,那么它在计算另一个不同空间位置的时候也有用,这句话看上去挺迷糊的,用下图举例:输入数据大小为7×7×3,深度为3,可以分割成3片7×7的数据片,对于其中一个片,某一个特征对这一片所得结果就一个,单个滤波器不论怎么扫描,结果都这一个,那么有多少个滤波器就有多少个权重集合,图中滤波器数量应该是3×3×2=18个,而滤波器大小为3×3,每个滤波器都有一个偏置,所以参数数量为:18×3×3+18=180个,如果没有这个特性,那么总的参数量将会是当前数量的9倍。
    在这里插入图片描述
  3. 稀疏连接
    稀疏连接是由于滤波器的尺寸小于输入数据的尺寸导致的,个人认为,不是全连接就是稀疏连接。

2.3 深度神经网络(DNN)

    深度神经网络是深度学习的基础,又叫多层感知器,相关的内容在前面的人工神经网络那已经提到过。

3.深度学习

    深度学习是机器学习的分支,是一种以人工神经网络为架构,对资料进行表征学习的算法。表征学习就是特征学习,意思就是从数据中提取某些特征(如果是一个高阶张量,提取高阶张量中的某些特征就是抽取子张量除此之外,特征学习分为监督特征学习和非监督特征学习)。深度学习更加注重特征。


对于监督特征学习,经标注过的数据会作为特征来进行学习,而无监督特征学习则是未被标记的数据作为特征来学习。

4.神经网络的优化算法

    一个神经元是如何被激活的呢,前面已经提到过了,首先是会有一些神经元将它所代表的值作为输入向量的分量输入这个神经元,那些连接这个神经元的神经元都会在连接的同时附带一个权重,这些权重会作为权重向量的分量,输入向量和权重向量做内积后再将结果输入一个激活函数里去得到一个结果,这一个过程实际就是传播了。
    在一个有着多层的神经网络中,向前传播意味着前一层的所有神经元到后一层的所有神经元都完成了上面这样的运算,那么反向传播呢?
    如果权重集一直不变,那在当前权重集下最后得到了不符合预期的结果,比如说我们期望最后结果是[0.01,0.99],但是结果却是[0.7,0.8],那怎么办?只有想办法更新权重,重新算一次得出结果,当实际结果与预期结果之间的误差没达到一个阈值,就要重新更新权重新算,我所理解的优化神经网络的算法实际是一些更新权重的算法(选择一个合适的偏置b也是有用的),说的稍微严谨一点是一些更新网络参数的算法,用来做限制的叫做损失函数,优化的结果是损失足够小。
    一个我经常碰到的算法是利用链式法则的反向传播算法,接下来详细说说反向传播算法。

4.1 反向传播算法

    该博客我并不会对反向传播做详细的推导,一个原因是反向传播涉及的是链式求导法则,认真做一下字母标记然后求导得出误差就行了,另一个原因则是我即便写推导也不会有下面这条链接中的推导那么详细。
反向传播算法,还有代码,我还没尝试过
    反向传播算法其实分为两个部分:

  1. 向前传播得到输出;
  2. 从输出向后传递误差,并利用梯度下降法更新权重,更新权重的普通形式如下:
    w ′ = w − η ∗ ( 计 算 出 来 的 误 差 ) w^{'}=w-\eta * (计算出来的误差) w=wη(),其中 η \eta η为学习率,将影响收敛的速度和效果。

    上面的形式和梯度下降法是类似的,而且我说的比较抽象,但还有一个关键点,就是第二步那个所谓的计算误差是什么鬼?还有前面提到的链式法则又用在了哪?其实,这个计算误差实际上是某一个输出对某一个权重求偏导,为了方便说明问题,我就借用上面那条链接里面的图了。
在这里插入图片描述
    仔细观察上面这张图,当我们向前传播得出了o1和o2的输出值,但得到的输出值并不符合预期,怎么衡量呢?就是单独去求o1和o2的误差,然后加起来,习惯计算误差的方式都是求欧式距离,误差函数e的通用形式: e = ∑ 1 2 ( o i ′ − o i ) 2 e=\sum \frac{1}{2}(o_{i}^{'}-o_{i})^{2} e=21(oioi)2,于是前面的式子可以换为: w ′ = w − η ∗ ( ∂ e ∂ w i ) w^{'}=w-\eta * (\frac{\partial e}{\partial w_{i}}) w=wη(wie),弄个1/2其实目的是稍微简化一点,这样可以在后面求导时可以与平方相抵消,不弄个根号当然也是为了简单点,由于后面要乘个 η \eta η,所以这是没有影响的。
    然后就是根据这个形式去对任何一个 w i w_{i} wi求偏导,不要忘记了,一个神经元中包含了激活函数的,这个激活函数可微是能够求偏导的关键,选择的激活函数是sigmoid函数(其他的也行,但最好是非线性可微函数),也就是: φ ( z ) = 1 1 + e − z \varphi(z)=\frac{1}{1+e^{-z}} φ(z)=1+ez1
    还有一个小问题,就是为什么更新权重时乘了一个-1,这是因为我们期待误差函数e找到极小值(局部最优的情况,这也是梯度下降的缺点)甚至最小值。
    反向传播大概就这样了,想要详细的推导依旧是看上面那条链接。

二.代码学习

代码来源:

  1. Tensor Networks for Medical Image Classification
  2. 基于深度学习的甲状腺超声图像良恶性诊断算法研究

    相应的东西我将会写在论文研读的专栏里去,我期待我能够通过那个博客把与创建神经网络相关的内容比较详细且简洁的讲出来。

三.一些疑问

  1. 从前面的张量网络到现在机器学习,个人感觉已经有了一定的断层,那么,有什么能够将两者联系在一起?

    本次博客中其实最基本的就是神经元的数学表达了,有些内容写的比较简单,如果写的不好还请见谅,哪些地方有问题可以直接指出或者私信。

猜你喜欢

转载自blog.csdn.net/l_l_c_q/article/details/114241689