2018-05-23 12:01:20 qq_25011449 阅读数 387

李宏毅深度学习_Backpropagation

本文是李宏毅深度学习 (2015)的学习笔记,主要介绍了神经网络Backpropagation算法的推导过程。本文所用到的图示均来自课堂ppt。

原视频地址:李宏毅深度学习 (2015)

Background

BP的背景

为了使用Gradient Descent对网络参数进行训练,我们就要求出Cost Function对每一层参数的梯度,由于本质上wijlbil差别不大(可将bil看作wijl中的一项),因此我们这里仅对Cr/wijl进行推导,Cr/bil推导类似。

链式法则

求导链式法则

这里使用求导链式法则先将这个问题拆解成两部分,然后分别对每一部分的求导进行计算。

计算链式法则中拆解的两部分

1. 计算zil/wijl

第一部分求导

第一部分的求导分为两种情况:

  • l>1。即当权值不是第一层时,导数为ajl1
  • l=1。即权值为第一层时,导数为xjr

2. 计算Cr/zil

第二部分求导1

为了描述方便将Cr/zil描述为δil。此时利用BP的思想,先求出最后一层的δL,再找出后一层δl+1与前一层δl的关系,以此求出所有的δl

第二部分求导2

同样根据链式求导法则可以得出

δnL=σ(znL)Crynr

其中Crynr与Cost Function的选取有关。

第二部分求导3
第二部分求导4

zil的变化Δzil会对ail造成影响进而影响到下一层的zl+1

第二部分求导6

向量化后得到

δl=σ(zl)(Wl+1)Tδl+1

总结

总结

至此,我们已经完成了对Cr/wijl的推导,并且实现了向量化。Cr/bil推导类似。

2018-05-25 10:20:46 qq_25011449 阅读数 497

李宏毅深度学习_Tips for Training Deep Neural Network

本文是李宏毅深度学习 (2015)的学习笔记,主要介绍了在训练DNN过程中的不同阶段用到的一些技巧。本文所用到的图示主要来自课堂ppt。

原视频地址:李宏毅深度学习 (2015)

概述

Outline

想要提高深度学习的效率和收获比较好的结果,可以从以上五部分(其实只有四部分,Data Preprocessing没讲,可能涉及到数据归一化,PCA数据压缩等)入手,下面分别从每个部分入手,介绍一些常用于深度学习中的技巧。

一、Activation Function

在浅层BP神经网络中经常使用Sigmoid函数作为激活函数,但是Sigmoid函数在DNN中会存在一些问题:一方面,对Sigmoid函数求导计算量较大;另一方面,隐含层较多的情况下,BP过程中会出现Vanishing Gradient Problem。

Vanishing Gradient Problem

sigmoid

vanishing

我们知道Sigmoid函数的导数最大值小于1(在0处,只有0.2左右),而在BP过程中,δl=σ(zl)(Wl+1)Tδl+1,使得前一层的误差项δl会越来越小,致使求解出的梯度也会也来越小,这样在DNN的训练中,靠前的隐含层参数收敛速度会很慢。

ReLU

ReLU

由上图可以看出,当z的值大于0时,激活函数ReLU的导数始终为1,这样BP过程就不会再出现Vanishing Gradient Problem,但ReLU很容易使一些神经元“dead”,可以使用ReLU的一些变体,如:Leaky-ReLU或者Parametric-ReLU解决,或者,在初始化参数时,将bias的值尽量调大,这样z的值就不容易小于0了。

ReLU-variant

Maxout

Maxout

激活函数Maxout是在确定网络结构后将每一层的权值分组,选取每一组中z的最大值传入下一层,而其他的z相当于置0了。类似于ReLU我们可以得到更瘦的网络结构。Maxout没有明确的表达式和导数,它与输入、权值和bias都有关,可以认为是Learnable的Activation Function。

这里写图片描述

Maxout虽然没有显式的导数,但在经过如上图的简化后,整个网络的结构就可变为一个更瘦的全连接网络,可用BP算法求解,且满足zl=al。虽然,这会使得网络只更新了一部分的参数,但对于不同的输入,使用Stochastic Gradient Descent时每次更新的参数也会不完全相同,最终所有的参数都会被更新。

二、Cost Function

这一部分从Cost Function的角度入手,改进DNN。

Softmax

softmax

输出层使用Softmax函数计算,这样使得各项输出统一起来(二分类问题中Softmax函数可看作退化为Sigmoid函数),具体地,使输出层满足:

  • 1>yi>0
  • Σiyi=1

Cross Entropy

cross entropy

为了配合Softmax我们使用Cross Entropy作为代价函数,此时只需考虑正确分类的那一维的交叉熵作为代价即可,因为其他维的z在Softmax中对正确分类的那一维也有影响,使用正确的这一维作为代价已经将其他维度也考虑进去了。

cost1

cost2

求输出层的误差值δL将分成两部分,第一部分是对于正确分类的那一维而言,另一部分是对于其他维度而言。将误差值花化简后可以看出,使用交叉熵和Softmax配合也可以使得输出层计算量减少。

三、Optimization

优化可从两点考虑:一是选择更合适的Learning Rate;二是对局部最优的处理。

1、Learning Rate

采取自适应的Learning Rate,可以使收敛速度加快。

Adagrad

Adagrad

Adagrad对Learning Rate的更新与过去每次迭代参数的梯度有关,可以看出Leaerning Rate是一直在减小的,这是符合直觉的。

Adagrad1

Adagrad2

事实上,Adagrad表现更优异的原因是Learning Rate不仅与一阶导数有关,还与二阶导数有关,Adagrad公式中用一阶导数平方和的平方根来近似二阶导数(这个值越大说明二阶导数也越大,应该适当减小Learning Rate),使得Learning Rate更为合理,适应性更强。

2、Momentum

Physical

如上图所示,在Gradient Descent中加入Momentum(动量、动力、冲力),有时可以使Cost Function冲出Local Minimum。

Momentum

加入Momentum后,当前步的移动方向会与当前负梯度和上一步的移动方向有关。因此,之前每一步的移动都会对当前步的移动方向造成影响,相当于有一个惯性。

四、Generalization

为了让一个深度学习的模型表现更好,一个通用的方法就是收集更多的训练数据,但这样做也面临一个问题就是过拟合,模型往往在训练集上效果很好在测试集表现没那么优异,这一部分介绍了三个常用的方法来解决这个问题。

1、Early Stopping

earlystopping

从图中可以看出,随着模型参数的增多,对训练集的拟合程度越来越高,然而对于测试集,拟合程度一般来说会先升后降,因此我们要把模型的参数控制在一个合适的范围,以避免过拟合现象,但没有确切的方法来确定这个范围。

2、Weight Decay

weightdecay1

weightdecay2

代价函数中加入正则项后,直观地理解为,要使新的Cost Function值越来越小,不仅要让老的Cost Function值减小,还要使正则项值减小,这要就会让权值尽量变小。这样做的思想也是尽量减少模型参数,权值变小,对网络影响就会小,一个特例,如果权值减小到0,那么相当于模型少了一个参数。

3、Dropout

dropout1

dropout2

Dropout有点类似于Boost方法的思想,就是利用相对简单的几个模型组合起来,构成一个复杂的效果更好的模型。在对测试集进行检验时,使用的是几个简单模型的线性组合。在应用Dropout时,有以下几点建议:

dropout3

总结

至此,在深度学习中几种常用的技巧已经介绍完了,大家在训练自己模型的时候要灵活运用,以提高训练速度和精度。

2019-08-19 17:09:39 xiao_lxl 阅读数 29


台湾李弘毅教授的Deep Learning教程,第一讲1Regression相关的,教程以Pokemon游戏的cp值为样本库进行训练,分析,一步步的改进模型,讲解的很细致,可以给初学者训练AI提供一个思路,且讲解的很清晰透彻,个人觉得他的台湾腔听起来有点像看偶像剧的感觉,不容易分神。

梯度下降法

梯度下降法 使损失函数最小化求解权重w
在这里插入图片描述
对于含有两个超参数w和b的,梯度下降法 的求解思路。
在这里插入图片描述
对于线性回归,损失函数是凸函数,所以不用担心梯度下降求解的过程中会出现局部最优的问题
在这里插入图片描述

梯度下降微积分计算步骤:
在这里插入图片描述

一次方模型

y = w * x + b, 一次方模型,针对训练集10个样本的表现结果如下:
训练集误差31.9
测试集误差35
在这里插入图片描述

二次方模型

选择二次方模型实验
y = w2 * x^2 + w1 * x + b,
针对训练集10个样本的表现结果如下:
训练集误差15.4
测试集误差18.4

在这里插入图片描述

三次方模型

选择三次方模型实验
y = w3 * x^3 + w2 * x^2 + w1 * x + b,
针对训练集10个样本的表现结果如下:
训练集误差15.3
测试集误差18.1

在这里插入图片描述

四次方模型

选择四次方模型实验
y = w4 * x^4 + w3 * x^3 + w2 * x^2 + w1 * x + b,
针对训练集10个样本的表现结果如下:
训练集误差14.9
测试集误差28.8
在这里插入图片描述

五次方模型

选择五次方模型实验
y = w5 * x^5 +w4 * x^4 + w3 * x^3 + w2 * x^2 + w1 * x + b,
针对训练集10个样本的表现结果如下:
训练集误差12.8
测试集误差232.1
在这里插入图片描述

过拟合

从下图五个模型的对比可以看出,并不是说模型越复杂,检测的效果越好,效果最好的是三次方的模型,复杂度超过三次方的模型在测试集的误差率反而会过高,这是由于造成了过拟合。
在这里插入图片描述

扩充训练集

扩充训练集,将训练集样本说扩充到60个,来看一下还有什么因素会影响进化后的CP值,根据下图可以分析出 不同的物种可能会导致不同的进化值。为了验证此猜想,我们可以将物种属性加入到模型选择中。
在这里插入图片描述

重新设计加入物种信息的模型

重新设计模型,新的模型加入了物种信息。
在这里插入图片描述
在这里插入图片描述

重新设计加入物种信息的复杂模型

重新设计加入物种信息的复杂模型,公式采用了二次方,且加入了物体的重量和高度信息。
在训练集的误差达到了3.8
测试集的误差为14.3
在这里插入图片描述

在这里插入图片描述

加入正则化

在这里插入图片描述

加入正则化后,在lambda =100时,效果最好
此时训练集误差为4.1,测试集误差为11.1
在这里插入图片描述

在这里插入图片描述

2019-09-18 18:48:31 fly975247003 阅读数 24

李弘毅机器学习笔记:第七章—深度学习的发展趋势

回顾一下deep learning的历史:

  • 1958: Perceptron (linear model)
  • 1969: Perceptron has limitation
  • 1980s: Multi-layer perceptron
    • Do not have significant difference from DNN today
  • 1986: Backpropagation
    • Usually more than 3 hidden layers is not helpful
  • 1989: 1 hidden layer is “good enough”, why deep?
  • 2006: RBM initialization (breakthrough)
  • 2009: GPU
  • 2011: Start to be popular in speech recognition
  • 2012: win ILSVRC image competition
    感知机(Perceptron)非常像我们的逻辑回归(Logistics Regression)只不过是没有sigmoid激活函数。09年的GPU的发展是很关键的,使用GPU矩阵运算节省了很多的时间。

深度学习的三个步骤

我们都知道机器学习有三个step,对于deep learning其实也是3个步骤:
在这里插入图片描述

  • Step1:神经网络(Neural network)
  • Step2:模型评估(Goodness of function)
  • Step3:选择最优函数(Pick best function)

那对于深度学习的Step1就是神经网络(Neural Network)

Step1:神经网络

神经网络(Neural network)里面的节点,类似我们的神经元。

在这里插入图片描述
神经网络也可以有很多不同的连接方式,这样就会产生不同的结构(structure)在这个神经网络里面,我们有很多逻辑回归函数,其中每个逻辑回归都有自己的权重和自己的偏差,这些权重和偏差就是参数。
那这些神经元都是通过什么方式连接的呢?其实连接方式都是你手动去设计的。

完全连接前馈神经网络

概念:前馈(feedforward)也可以称为前向,从信号流向来理解就是输入信号进入网络后,信号流动是单向的,即信号从前一层流向后一层,一直到输出层,其中任意两层之间的连接并没有反馈(feedback),亦即信号没有从后一层又返回到前一层。
在这里插入图片描述

  • 当已知权重和偏差时输入(1,1)(1,-1)​的结果
  • 当已知权重和偏差时输入(1,0)(-1,0)的结果
    在这里插入图片描述
    上图是输入为1和-1的时候经过一系列复杂的运算得到的结果
    在这里插入图片描述
    当输入0和0时,则得到0.51和0.85,所以一个神经网络如果权重和偏差都知道的话就可以看成一个函数,他的输入是一个向量,对应的输出也是一个向量。不论是做回归模型(linear model)还是逻辑回归(logistics regression)都是定义了一个函数集(function set)。我们可以给上面的结构的参数设置为不同的数,就是不同的函数(function)。这些可能的函数(function)结合起来就是一个函数集(function set)。这个时候你的函数集(function set)是比较大的,是以前的回归模型(linear model)等没有办法包含的函数(function),所以说深度学习(Deep Learning)能表达出以前所不能表达的情况。

我们通过另一种方式显示这个函数集:

全链接和前馈的理解
  • 输入层(Input Layer):1层
  • 隐藏层(Hidden Layer):N层
  • 输出层(Output Layer):1层
    在这里插入图片描述
  • 为什么叫全链接呢?
    • 因为layer1与layer2之间两两都有连接,所以叫做Fully Connect;
  • 为什么叫前馈呢?
    • 因为现在传递的方向是由后往前传,所以叫做Feedforward。
深度的理解

那什么叫做Deep呢?Deep = Many hidden layer。那到底可以有几层呢?这个就很难说了,以下是老师举出的一些比较深的神经网络的例子
在这里插入图片描述
在这里插入图片描述

  • 2012 AlexNet:8层
  • 2014 VGG:19层
  • 2014 GoogleNet:22层
  • 2015 Residual Net:152层
  • 101 Taipei:101层

随着层数变多,错误率降低,随之运算量增大,通常都是超过亿万级的计算。对于这样复杂的结构,我们一定不会一个一个的计算,对于亿万级的计算,使用loop循环效率很低。

这里我们就引入矩阵计算(Matrix Operation)能使得我们的运算的速度以及效率高很多:

矩阵计算

如下图所示,输入是 [1211]\begin{bmatrix}&1&-2\\ &-1&1\end{bmatrix},输出是[0.980.12]\begin{bmatrix}&0.98\\ &0.12\end{bmatrix}
计算方法就是:sigmoid(权重w【黄色】 * 输入【蓝色】+ 偏移量b【绿色】)= 输出
在这里插入图片描述

其中sigmoid更一般的来说是激活函数(activation function),现在已经很少用sigmoid来当做激活函数。

如果有很多层呢?
a1=σ(w1x+b1)a2=σ(w1a1+b2)y=σ(wLaL1+bL)a^1 = \sigma (w^1x+b^1) \\ a^2 = \sigma (w^1a^1+b^2) \\ ··· \\ y = \sigma (w^La^{L-1}+b^L) ​

在这里插入图片描述
计算方法就像是嵌套,这里就不列公式了,结合上一个图更好理解。所以整个神经网络运算就相当于一连串的矩阵运算。
在这里插入图片描述
从结构上看每一层的计算都是一样的,也就是用计算机进行并行矩阵运算。
这样写成矩阵运算的好处是,你可以使用GPU加速。
整个神经网络可以这样看:

本质:通过隐藏层进行特征转换

把隐藏层通过特征提取来替代原来的特征工程,这样在最后一个隐藏层输出的就是一组新的特征(相当于黑箱操作)而对于输出层,其实是把前面的隐藏层的输出当做输入(经过特征提取得到的一组最好的特征)然后通过一个多分类器(可以是softmax函数)得到最后的输出y。
在这里插入图片描述

示例:手写数字识别

举一个手写数字体识别的例子:
输入:一个16*16=256维的向量,每个pixel对应一个dimension,有颜色用(ink)用1表示,没有颜色(no ink)用0表示
输出:10个维度,每个维度代表一个数字的置信度。
在这里插入图片描述
从输出结果来看,每一个维度对应输出一个数字,是数字2的概率为0.7的概率最大。说明这张图片是2的可能性就是最大的
在这里插入图片描述
在这个问题中,唯一需要的就是一个函数,输入是256维的向量,输出是10维的向量,我们所需要求的函数就是神经网络这个函数
在这里插入图片描述
从上图看神经网络的结构决定了函数集(function set),所以说网络结构(network structured)很关键。

在这里插入图片描述
接下来有几个问题:

  • 多少层? 每层有多少神经元?
    这个问我们需要用尝试加上直觉的方法来进行调试。对于有些机器学习相关的问题,我们一般用特征工程来提取特征,但是对于深度学习,我们只需要设计神经网络模型来进行就可以了。对于语音识别和影像识别,深度学习是个好的方法,因为特征工程提取特征并不容易。
  • 结构可以自动确定吗?
    有很多设计方法可以让机器自动找到神经网络的结构的,比如进化人工神经网络(Evolutionary Artificial Neural Networks)但是这些方法并不是很普及 。
  • 我们可以设计网络结构吗?
    可以的,比如 CNN卷积神经网络(Convolutional Neural Network )

Step2: 模型评估

损失示例

在这里插入图片描述
对于模型的评估,我们一般采用损失函数来反应模型的好差,所以对于神经网络来说,我们采用交叉熵(cross entropy)函数来对yyy^\hat{y}​的损失进行计算,接下来我们就是调整参数,让交叉熵越小越好。

总体损失

在这里插入图片描述
对于损失,我们不单单要计算一笔数据的,而是要计算整体所有训练数据的损失,然后把所有的训练数据的损失都加起来,得到一个总体损失L。接下来就是在function set里面找到一组函数能最小化这个总体损失L,或者是找一组神经网络的参数θ\theta,来最小化总体损失L

Step3:选择最优函数

如何找到最优的函数和最好的一组参数呢,我们用的就是梯度下降,这个在之前的视频中已经仔细讲过了,需要复习的小伙伴可以看前面的笔记。

在这里插入图片描述
在这里插入图片描述
具体流程:θ\theta是一组包含权重和偏差的参数集合,随机找一个初试值,接下来计算一下每个参数对应偏微分,得到的一个偏微分的集合L\nabla{L}就是梯度,有了这些偏微分,我们就可以不断更新梯度得到新的参数,这样不断反复进行,就能得到一组最好的参数使得损失函数的值最小

反向传播

在这里插入图片描述
在神经网络中计算损失最好的方法就是反向传播,我们可以用很多框架来进行计算损失,比如说TensorFlow,theano,Pytorch等等

思考

为什么要用深度学习,深层架构带来哪些好处?那是不是隐藏层越多越好?

隐藏层越多越好?

在这里插入图片描述
从图中展示的结果看,毫无疑问,层次越深效果越好~~

普遍性定理

在这里插入图片描述
参数多的model拟合数据很好是很正常的。下面有一个通用的理论:
对于任何一个连续的函数,都可以用足够多的隐藏层来表示。那为什么我们还需要‘深度’学习呢,直接用一层网络表示不就可以了?在接下来的课程我们会仔细讲到

2019-09-24 13:13:23 fly975247003 阅读数 39

问题1:越深越好?

在这里插入图片描述

learning从一层到七层,error rate在不断的下降。能看出network越深,参数越多,performance较也越好。

问题2:矮胖结构 v.s. 高瘦结构

真正比较deep和shallow

在这里插入图片描述
比较shallow model较好还是deep model较好,在比较的时候一个前提就是调整shallow和Deep让他们的参数是一样多,这样就会得到一个矮胖的模型和高瘦的模型。

在这里插入图片描述

这个实验的后半段的实验结果是:我们用5层hidden layer,每层2000个neural,得到的error rate是17.2%(error rate是越小越好的)而用相对应的一层的模型,得到的错误率是22.5%,这两个都是对应的拥有相似参数个数的模型。继续看下面的4634个参数和16k个参数,如果你只是单纯的增加parameters,是让network变宽不是变高的话,其实对performance的帮助是比较小的。

所以如果把network变高对performance是很有帮助的,network变宽对performance帮助没有那么好的

引入模块化

问题1:为什么变高比变宽好呢?

在这里插入图片描述
我们在做deep learning的时候,其实我们是在模块化这件事。我们在main function时,我们会写一些sub function,一层一层结构化的架构。有一些function是可以共用的,就像一个模型,需要时候去用它减小复杂度(如图所示)

在这里插入图片描述
在 machine learning上,可以想象有这样的test。我们现在要做影像分类,我们把image分为四类(每个类别都有一些data),然后去train 四个classifier。但问题是boys with long hair的data较少(没有太多的training data),所以这个boys with long hair的classifier就比较weak(performance比较差)

解决方法:利用模组化的概念(modularization)的思想

在这里插入图片描述
假设我们先不去解那个问题,而是把原来的问题切成比较小的问题。比如说,我们先classifier,这些classifier的工作就是决定有没有一种特征出现。
现在就是不直接去分类长头发男生还是短头发男生,而是我们先输入一张图片,判断是男生还是女生和是长头发还是短头发,虽然说长头发的男生很少,但通过女生的数据和男生的数据都很多,虽然长头发的数据很少,但是短发的人和长发的人的数据都很多。所以,这样训练这些基分类器就不会训练的太差(有足够的数据去训练)

在这里插入图片描述
现在我们要解决真正问题的时候,你的每个分类器就可以去参考输出的基本特征,最后要下决定的分类器,它是把前面的基分类器当做模组,每一个分类器都共用同一组模型(只是用不同的方式来使用它而已)。对分类器来说,它看到前面的基分类器告诉它说是长头发是女生,这个分类器的输出就是yes,反之就是no。

所以他们可以对后面的classifier来说就可以利用前面的classifier(中间),所以它就可以用比较少的训练数据就可以把结果训练好。

深度学习

问题2:深度学习和模组化有什么关系?
在这里插入图片描述
每一层neural可以被看做是一个basic classifier,第一层的neural就是最基分类器,第二层的neural是比较复杂的classifier,把第一层basic classifier 的output当做第二层的input(把第一层的classifier当做module),第三层把第二层当做module,以此类推。

在做deep learning的时候,如何做模组化这件事,是机器自动学到的。

做modularization这件事,把我们的模型变简单了(把本来复杂的问题变得简单了),把问题变得简单了,就算训练数据没有那么多,我们也就可以把这个做好

使用语音识别举例

在语音上我们为什么会用到模组化的概念
在这里插入图片描述
当你说一句:what do you think,这句话其实就是由一组phoneme(音素)所组成的。同样的phoneme可能会有不太一样的发音。当你发d-uw的u时和发y-uw的u时,你心里想的是同一个phoneme,心里想要发的都是-uw。但是因为人类口腔器官的限制,所以你没办法每次发的-uw都是一样的。因为前面和后面都接了其他的phoneme,因为人类发音口腔器官的限制,你的phoneme发音会受到前后的影响。为了表达这件事情,我们会给同样的phoneme不同的model,这就是Tri-phone。

Tri-phone表达是这样的,你把这个-uw加上前面的phoneme和后面的phoneme,跟这个-uw加上前面phoneme和后面的phonemeth,就是Tri-phone(这不是考虑三个phone的意思)

这个意思是说,现在一个phone用不同的model来表示,一个phoneme它的constant phone不一样,我们就要不同model来模拟描述这个phoneme。

一个phoneme可以拆成几个state,state有几个通常自己定义,通常就定义为三个state

语音辨识:

在这里插入图片描述语音辨识特别的复杂,现在来讲第一步,第一步要做的事情就是把acoustic feature转成state。所谓的acoustic feature简单说起来就是声音讯号发生一段wave phone,这这个wave phone通常取一段window(这个window通常不是太大)。一个window里面就用一个feature来描述里面的特性,那这个就是一个acoustic feature。你会在这个声音讯号上每隔一段时间来取一个window,声音讯号就变成一串的vector sequence。在语音辨识的第一阶段,你需要做的就是决定了每一个acoustic feature属于哪一个state。把state转成phone,phoneme,在把phoneme转成文字,接下来考虑同音异字的问题,这不是我们今天讨论的问题。

传统的实现方法:HMM-GMM

在这里插入图片描述
在deep learning之前和之后,语音辨识有什么不同,这时候你就更能体会deep learning会在语音辨识有显著的成果。

我们要机器做的是,在第一阶段做的是分类这件事,就是决定一个acoustic feature属于哪一个state,传统方式是做GNN

我们假设每一个state就是一个stationary,属于每一个state的acoustic feature的分布是stationary,所以你可以用model来描述。

比如第一个state,可以用GNN来描述;另外一个state,可以用另外一个GNN来描述。这时候给你一个feature,你就可以说每一个acoustic feature从每一个state产生出来的几率,这个就叫做Gaussian Mixture Model

仔细一想,这一招根本不太work,因为这个Tri-phone的数目太多了。一般的语言(中文、英文)都有将近30、40phone。在Tri-phone里面,每一个phoneme随着它constant不同,你要用不同的model。到底有多少个Tri-phone,你有30的三次方的Tri-phone(27000),每个Tri-phone有三个state,所以,你有数万的state,而你每一个state都要用Gaussian Mixture Model来描述,参数太多了。

在这里插入图片描述
有一些state,他们会共用同一个model distribution,这件事叫做Tied-state。加入说,我们在写一些程式的时候,不同的state名称就好像是pointer,那不同的pointer他们可能会指向同样的distribution。所以有一些state,它的distribution是共用的,有些是不共用的。那到底哪些事共用的,哪些不是共用的,那么就变成你要凭着经验和一些语言学的知识来决定哪些state是要共用的

这些是不够用的,如果只分state distribution是共用的或不共用的,这样就太粗了。所以就有人开始提一些想法:如何让它部分共用等等。

在这里插入图片描述
仔细想想刚才讲的HMM-GMM的方式,所有困惑的是state是independently,这件事是不effection对model人类的声音来说。

想看人类的声音来说,不同的phoneme虽然归为不同的因素,分类归类为不同的class,但这些phoneme不是完全无关的。这些都是人类发音器官generate出来的,它们中间是有根据人类发音器官发音的方式,之间是有关系的

举例来说,在这张图上画出了人类语言所有的母音,那么这个母音的发音其实就只是受到三件事的影响。一个是你舌头前后的位置,一个是你舌头上下的位置,还有一个是你的嘴型。(母音就只受到这三件事的影响)在这张图你可以找到最常见的母音(i,e,a,u,o)i,e,a,u,0它们之间的差别就是当你从a发到e发到i的时候,你的舌头是由往上的。i跟u的差别是你的舌头在前后的区别。你可能感觉不要舌头的位置在哪里,你要知道的是舌头的位置是不是真的跟这个图上一样,你可以在对着镜子喊a,e,i,u,o,你就会发现你舌头的位置就跟这个图上的形状一模一样的。

这这个图上,同一个位置的母音代表说舌头的位置是一样的但是嘴型是不一样的。比如说,我们看最左上角的母音,一个是i一个是y,i跟y的差别就是嘴型不一样的。如果是i的话嘴型是扁的,如果是y的话嘴型是圆的,所以改变嘴型就可以从i到y。

所以这个不同的phoneme之间是有关系的,如果说每个phoneme都搞一个model,这件事是没有效率的。

深度学习的实现方法 DNN

在这里插入图片描述
如果是deep learning的话,那你就是去learn一个neural network,这个neural network的input就是一个acoustic feature,output就是这个feature属于每一个state的几率。就是一个很单纯classification probably跟作业上做的影像是没有差别的。learn一个DNN,input是一个acoustic feature,然后output就是告诉你说,acoustic feature属于每个state的几率,那最关键的一点是所有的state都共用同一个DNN,在这整个辨识里面就做一个DNN而已,你没有每一个state都有一个DNN。

所以就有人说,有些人是没有想清楚的这个deep learning到底是power在哪里,从GMM到deep learning厉害的地方就是本来GMM通常也就64Gauusian matrix,那DNN有10层,每层都有1000个neural,参数很多,参数变多performance就会变好,这是一种暴力碾压的方法。

其实DNN不是暴力碾压的方法,你仔细想想看,在做HMM-GMM的时候,你说GMM有64个matrix觉得很简单,那其实是每一个state都有一个Gauusian matrix,真正合起来那参数是多的不得了的。如果你仔细去算一下GMM用的参数和DNN用的参数,在不同的test去测这件事情,他们的参数你就会发现几乎是差不多多的。DNN几乎是一个很大的model,GMM是很多很小的model,但将这两个比较参数量是差不多多的。但是DNN是将所有的state通通用同一个model来做分类,会使有效率的方法。

两种方法的对比 GMM v.s. DNN

在这里插入图片描述举例来说,如果你今天把一个DNN它的某一个hidden layer拿出来,然后把那个hidden layer假设有1000个neural你没有办法分析它,但是你可以把那1000个layer的output降维降到二维。所以在这个图上面呢,一个点代表一个acoustic feature,然后它通过DNN以后,把这个output降到二维,可以发现它的分布是这样的。

在这个图上的颜色代表什么意思呢?这边颜色其实就是a,e,i,o,u这样,特别把这五个母音跟左边这个图用相同的颜色框起来。那你会神奇的发现,左边这五个母音的分布跟右边的图几乎是一样的。所以你可以发现DNN做的事情比较low layer的事情它其实是在它并不是真的要马上去侦测这个发音是属于哪个state。它的做事是它先观察说,当你听到这个发音的时候,人是用什么方式在发这个声音的,它的石头的位置在哪里(舌头的位置是高还是低呢,舌头位置是在前还是后呢等等)。然后lower layer比较靠近input layer先知道发音的方式以后,接下来的layer在根据这个结果去说现在的发音是属于哪个state/phone。所以所有的phone会用同一组detector。也就是这些lower layer是人类发音方式的detector,而所有phone的侦测都用是同一组detector完成的,所有phone的侦测都share(承担)同一组的参数,所以这边就做到模组化这件事情。当你做模组化的事情,你是要有效率的方式来使用你的参数。

普遍性定理

在这里插入图片描述

过去有一个理论告诉我们说,任何continuous function,它都可以用一层neural network来完成(只要那一层只要够宽的话)。这是90年代,很多人放弃做deep learning的原因,只要一层hidden layer就可以完成所有的function(一层hidden layer就可以做所有的function),那做deep learning的意义何在呢?,所以很多人说做deep是很没有必要的,我们只要一个hidden layer就好了。

但是这个理论没有告诉我们的是,它只告诉我们可能性,但是它没有告诉我们说要做到这件事情到底有多有效率。没错,你只要有够多的参数,hidden layer够宽,你就可以描述任何的function。但是这个理论没有告诉我们的是,当我们用这一件事(我们只用一个hidde layer来描述function的时候)它其实是没有效率的。当你有more layer(high structure)你用这种方式来描述你的function的时候,它是比较有效率的。

举例

使用逻辑电路举例

Analogy(当你刚才模组化的事情没有听明白的话,这时候举个例子)
在这里插入图片描述
逻辑电路(logistic circuits)跟neural network可以类比。在逻辑电路里面是有一堆逻辑闸所构成的在neural network里面,neural是有一堆神经元所构成的。若你有修过逻辑电路的话,你会说其实只要两层逻辑闸你就可以表示任何的Boolean function,那有一个hidden layer的neural network(一个neural network其实是两层,input,output)可以表示任何的continue function。

虽然我们用两层逻辑闸就描述任何的Boolean function,但实际上你在做电路设计的时候,你根本不可能会这样做。当你不是用两层逻辑闸而是用很多层的时候,你拿来设计的电路是比较有效率的(虽然两层逻辑闸可以做到同样的事情,但是这样是没有效率的)。若如果类比到neural network的话,其实是一样的,你用一个hidden layer可以做到任何事情,但是用多个hidden layer是比较有效率的。你用多层的neural network,你就可以用比较少的neural就完成同样的function,所以你就会需要比较少的参数,比较少的参数意味着不容易overfitting或者你其实是需要比较少的data,完成你现在要train的任务。(很多人的认知是deep learning就是很多data硬碾压过去,其实不是这样子的,当我们用deep learning的时候,其实我们可以用比较时少的data就可以达到同样的任务)
在这里插入图片描述
那我们再从逻辑闸举一个实际的例子,假设我们要做parity check(奇偶性校验检查)(你希望input一串数字,若如果里面出现1的数字是偶数的话,它的output就是1;如果是奇数的话,output就是0).假设你input sequence的长度总共有d个bits,用两层逻辑闸,理论可以保证你要O(2d)O(2^d)次方的gates才能描述这样的电路。但是你用多层次的架构的话,你就可以需要比较少的逻辑闸就可以做到parity check这件事情,

举例来说,你可以把好几个XNOR接在一起(input和output真值表在右上角)做parity check这件事。当你用多层次的架构时,你只需要O(d)O(d)gates你就可以完成你现在要做的这个任务,对neural network来说也是一样的,可以用比较的neural就能描述同样的function。

使用剪窗花举例

在这里插入图片描述
一个日常生活中的例子,这个例子是剪窗花(折起来才去剪,而不是真的去把这个形状的花样去剪出来,这样就太麻烦了),这个跟deep learning有什么关系呢?

在这里插入图片描述
这个跟deep learning 有什么关系呢,我们用之前讲的例子来做比喻,假设我们现在input的点有四个(红色的点是一类,蓝色的点是一类)。我们之前说,如果你没有hidden layer的话,如果你是linear model,你怎么做都没有办法把蓝色的点和红色的点分来开,当你加上hidden layer会发生怎样的事呢?当你加hidde layeer的时候,你就做了features transformation。你把原来的x1x_1,x2x_2转换到另外一个平面x1x_1plane,x2x_2plane(蓝色的两个点是重合在一起的,如右图所示),当你从左下角的图通过hidden layer变到右下角图的时候,其实你就好像把原来这个平面对折了一样,所以两个蓝色的点重合在了一起。这就好像是说剪窗花的时候对折一样,如果你在图上戳一个洞,那么当你展开的时候,它在这些地方都会有一些洞(看你对折几叠)。如果你把剪窗花的事情想成training。你把这件事想成是根据我们的training data,training data告诉我们说有画斜线的部分是positive,没画斜线的部分是negative。假设我们已经把这个已经折起来的时候,这时候training data只要告诉我们说,在这个范围之内(有斜线)是positive,在这个区间(无斜线)展开之后就是复杂的图样。training data告诉我们比较简单的东西,但是现在有因为对折的关系,展开以后你就可以有复杂的图案(或者说你在这上面戳个洞,在就等同于在其他地方戳了个洞)。

所以从这个例子来看,一笔data,就可以发挥五笔data效果。所以,你在做deep learning的时候,你其实是在用比较有效率的方式来使用你的data。你可能很想说真的是这样子吗?我在文件上没有太好的例子。所以我做了一个来展示这个例子。

使用二位坐标举例

在这里插入图片描述
我们有一个function,它的input是二维R2R^2(坐标),它的output是{0,1},这个function是一个地毯形式的function(红色菱形的output就要是1,蓝色菱形output就要是0)。那现在我们要考虑如果我们用了不同量的training example在1个hidden layer跟3个hidden layer的时候。我们看到了什么的情形,这边要注意的是,我们要特别调整一个hidden layer和3个hidden layer的参数,所以并不是说当我是3个hidden layer的时候,是一个hidden layer的network。(这1个neural network是一个很胖的neural network,3个hidden layer是一个很瘦的neural network,他们的参数是要调整到接近的)

那现在这边是要有10万笔data的时候,这两个neural都可以learn出这样的train data(从这个train data sample 10万笔data然后去给它学,它学出来就是右边这样的)

那现在我们减小参数的量,减少到只用2万笔来做train,这时候你会发现说,你用一个hidden lyaer的时候你的结果的就崩掉了,但如果是3个hidden layer的时候,你的结果变得只是比较差(比train data多的时候要差),但是你会发现说你用3个hidden layer的时候是有次序的崩坏。这个结果(最右下角)就像是你今天要剪窗花的时候,折起来最后剪坏了,展开以后成这个样子。你会发现说在使用比较少的train data的时候,你有比较多的hidden layer最后得到的结果其实是比较好的。

端到端的学习

在这里插入图片描述
当我们用deep learning的时候,另外的一个好处是我们可以做End-to-end learning。

所谓的End-to-end learning的意思是这样,有时候我们要处理的问题是非常的复杂,比如说语音辨识就是一个非常复杂的问题。那么说我们要解一个machine problem我们要做的事情就是,先把一个Hypothesis funuctions(也就是找一个model),当你要处理1的问题是很复杂的时候,你这个model里面它会是需要是一个生产线(由许多简单的function串接在一起)。比如说,你要做语音辨识,你要把语音送进来再到通过一层一层的转化,最后变成文字。当你多End-to-end learning的时候,意思就是说你只给你的model input跟output,你不告诉它说中间每一个function要咋样分工(只给input跟output,让它自己去学),让它自己去学中间每一个function(生产线的每一个点)应该要做什么事情。

那在deep learning里面要做这件事的时候,你就是叠一个很深的neural network,每一层就是生产线的每一个点(每一层就会学到说自己要做什么样的事情)

语音识别

在这里插入图片描述比如说,在语音辨识里面。还没有用deep learning的时候,我们怎么来做语音辨识呢,我们可能是这样做的。

先有一段声音讯号(要把声音对应成文字),你要先做DF,你不知道这是什么也没有关系,反正就是一个function,变成spectogram,这个spectogram通过filter bank(不知道filter bank是什么,没有关系,就是生产线的另外一个点),最后得到output,然后再去log(取log是非常有道理的),然后做DCT得到MFCC,把MFCC丢到GMM里面,最后你得到语音辨识的结果。

只有最后蓝色的这个bank是用训练数据学出来的,前面这些绿色的这些都是人手定(研究人的生理定出了这些function)。但是后来有了deep learning以后,这些东西可以用neural network把它取代掉。你就把你的deep network多加几层就可以把DCT拿掉。现在你可以从spectogram开始做,你这这些都拿掉,通通都拿deep neural network取代掉,也可以得到更好的结果。deep learning它要做的事情,你会发现他会自动学到要做filter bank(模拟人类听觉器官所制定的filter)这件事情
在这里插入图片描述
接下来就有人挑战说我们可不可以叠一个很深很深的neural network,直接input就是target main声音讯号,output直接就是文字,中间完全就不用做,那就不需要学信号与系统

Google 有一篇paper是这样子,它最后的结果是这样子的,它拼死去learn了一个很大neural network,input就是声音讯号,完全不做其它的任何事情,它最后可以做到跟有Fourier transform的事情打平,也仅次于打平而已。我目前还没看到input一个声音讯号,比Fourier transform结果比这要好的。

图像识别

在这里插入图片描述
刚刚都是讲语音的例子,影像也是差不多的。大家也都知道,我们就跳过去(过去影像也是叠很多很多的graph在最后一层用比较简单的classifier)
在这里插入图片描述
那现在用一个很深的neural,input直接是piexel,output里面是影像是什么

更复杂的任务

在这里插入图片描述
那deep learning还有什么好处呢。通常我们在意的task是非常复杂的,在这非常复杂的task里面,有非常像的input,会有很不同的output。举例来说,在做影视辨识的时候,白色的狗跟北极熊看起来很像,但是你的machine左边要outp dog,右边要output bear。有时候很不一样的东西,其实是一样的,横着看火车和侧面看火车,他们其实是不一样,但是output告诉我说一样的。

今天的neural只有一层的话(简单的transform),你没有办法把一样的东西变成很不一样,把不一样的东西变的很像,原来input很像的东西结果看起来很不像,你要做很多层次的转换。

在这里插入图片描述举例来说,看这个例子(这个是语言的例子)。在这个图上,把MFCC投影到二维上,不同颜色代表的是不同的人说的话。在语音上你会发现说,同样的句子,不同人的说,它的声音讯号,看起来是不一样的(这个红色看起来跟蓝色看起来没关系,蓝色跟绿色没有关系)。有人看这个图,语音辨识不能做呀。不同的人说话太不一样了。

如果你今天learn 一个neural network,如果你只要第一层的hidden layer的output,你会发现说,不同的人讲的同样的句子还是很不一样的。

但是你看第8个hidden layer output的时候, 你会发现说,不同的人说着同样的句子,它自动的被line在一起了,也就是说这个DNN在经过很多hidden layer转换的时候,它把本来看起来很不像的东西,它知道应该是一样的(map在一起了)。在右边的这个图上,你会看到一条一条的线,在这些线中你会看到不同颜色的声音讯号。也就是说不同的人说着同样的话经过8个hidden layer的转换以后,对neural network来说,它就变得很像。
在这里插入图片描述
手写数字辨识的例子,input feature是左上角这张图(28*28 pixel,把28 *28pixel project到二维平面的话就是左上角的图),在这张图上,4跟9几乎是叠在一起的(4跟9很像,几乎没有办法把它分开)。但是我们看hidden layer的output,这时候4跟9还是很像(离的很近),我们看第2个hidden layer的output(4,7,9)逐渐被分开了,到第三个hidden layer,他们会被分的更开。所以你今天要原来很像的input 最后要分的很开,那你就需要好多hidden layer才能办到这件事情

没有更多推荐了,返回首页