wndDL课程学习笔记

wndDL课程学习笔记_第1张图片

·神经网络和深度学习
1.1 深度学习概论
修正线性单元 ReLU 线性回归取大于0的图线(rectified linear unit)
图像领域 常用卷积神经网络(CNN)
音频 基于时间变化的序列数据,常用RNN(循环神经网络)
语言 序列数据 更复杂的RNNs
自动驾驶 CNN、卷积等混合神经网络
当数据量非常大时,神经网络才发挥出很大的优势

1.2 神经网络基础
计算机保存图片时,是保存了RGB三个矩阵,最大值为255,64*64对应矩阵行列

x:样本的特征向量,y:相似度,0 or 1,wx+b:偏置
sigmoid(z)函数图像介于y(0,1)收敛,(0,0.5),y=δ(xw^T+b)
δ(z)=1/1+e^-z z越大,收敛与1,z越小,收敛于0 (δ=sigmoid)

loss函数:误差平方,用来预测y^和yi的差距,做优化,只适用于单个样本
loss(yi)=-(y*logy+(1-y)log(1-y)) y(0,1)==>收敛于y^(0,1)
cost函数(凸函数,可取全局极小值):(-1/m)*误差的sum,总成本

反向(向后)传播就是多重导数计算图的反向计算res导数,链式法则
梯度下降算法就是求dzi=ai-y^i和dw1、dw2、db(学习率)+= x1dzi、x2dzi、dz^i,然后更新w1、w2、b -= dw1、dw2、db
多样本学习率算法就是计算相加除以样本数,然后更新w1w2b(logistic回归)
(wn,n:特征数,事物有多少特征)

向量化在编程中是消除for循环遍历的一种艺术
在numpy,可以用z=np.dot(w,x)直接求一维向量w和x的乘法

经验法则就是,只要有其他可能,就不要使用显式for循环(效率很低)
向量化对于梯度下降算法:可以把dwn统一装到dw向量里(初始np.zero(n,0)),可以很大的提升效率

多样本的正向传播一步迭代的向量化算法:X=[x1,x2…],b=[b,b…],A=[a1,a2…],z=np.dot(w,T,x)+b (排除for的解决办法)

高向量化高效的logistic回归的一次梯度下降,使用正向传播的向量化转置,来计算反向传播的梯度下降,获得一些simple等式(无for):z=np.dot…,A=δ(z),dz=A-Y,dw=1/mXdz,db=1/mnp.sum(dz),w-=a(学习率)dw,b-=adb

1.3 浅层神经网络
如果有多维度特征a1,a2…则使用多重logistic回归计算,先计算出z2=w2*a1+b2(把x换成上一个学习率a?),再计算a1,再z1=w1x+b1
(x等同于a[0])

从左往右神经网络层数为上标[1][2]…下标为一层里面的n个特征,如a[1]=∑(1到n的a[1]1…n)的(n,1)矩阵

计算神经网络的输出,其实就等于计算多维多样本堆叠的w,b,x矩阵的a,z值,四个式子:
z[1]=w[1]x+b[1],a[1]=sigmoid(z[1]),z[2]=w[2]a[1]+b[2],a[2]=sigmoid(z[2])
即便网络深度增加,在本质上还是计算这几个式子
(用矩阵的好处:可复用(只需局部改变一些样本值),能一次性计算出整个训练集而不是单样本的神经网络输出)

多个例子的向量化就是将z,a最后横向堆叠为一个Z,A矩阵,横向为样本指标的排序,整个数据集,纵向对应为神经网络里的不同节点,隐藏单元

激活函数除了sigmoid函数还有一个更好的tanh函数:
a=ez-e-z/ez+e-z(实际上是sigmoid平移后的版本,平均值趋向0,数据中心化效应,一般在隐层里使用,而在输出层还是使用δ函数)
(两个函数都有一个缺点就是,当z很大很小时,函数斜率几乎为0,会拖慢梯度下降算法)
修正线性单元(ReLU):a=max(0,z)(z正,斜率1,z负,斜率0,激活函数的默认选择,因为用他的学习速度会快很多,由于它的斜率远远大于0,不会拖慢梯度下降算法)
(除非用在二元分类的输出层,不然绝对不要用δ函数,或者基本不用,因为至少tanh函数在任何场景下都优于δ)
(带泄露ReLU函数的好处在于,它的斜率不会为0),a=max(0.01z,z)

激活函数要用非线性的,才能计算出隐层的影响,如果用线性的,迭代出来也还是线性的,不管网络层数有多少,没有实际意义,线性函数一般只用来输出函数上,对实数的预测

反向传播算法中各种式子需要想想,他们在矩阵运算的维度是否互相匹配,这样就可以减少大量即将的bug,对待矩阵维度的问题,一定要细心
矩阵的维度控制.计算:
(3,1)=(3,2)(2,1),(5,1)=(5,3)(3,1),(3,1)=(3,1)+(3,1)…
深度算法中,z的维度一般是(n1,m) (特征数,样本数)

一般在初始化权重时,都会令其等于很小的随机值而不是0

1.4 深层神经网络
计算深度网络(前向传播):
while 两个式子
z=wx+b 这一层的参数*上一层的激活函数,加上偏置向量b,深层网络就是这样叠加计算的,(x=a0)算到最后一层时,y=g(zn)=a^n
a[l]=gl g是激活函数
其中,每次还要堆叠各个样本计算的值或变为矩阵,求大a大z(A,Z)

深度神经网络的应用:特征趋复杂查找
人脸识别:边缘像素=>器官=>人脸
声音识别:波形音调=>音位=>单词=>词组=>句子

深度神经网络的理论源于电路理论,根据不同的逻辑门判断走什么样的行为,神经网络结构就是电路结构

深度神经网络一次梯度下降算法是先用a[0]经过正向传播算出z值,然后反向传播求导更新w和b值,最后在dw1.db1停下(需要缓存z.w.b)

超参数的定义:对最终得到的w和b有影响的函数或数值的选择,比如sigmoid或ReLU或tanh的选择、n2
在构建一个深度学习项目时,只能try to try,通过给入不同的学习率和特征数神经网络层数,观察costJ的变化,如果这个函数收敛于一个很小的值时,效果就很好了…勤试各种超参数,改变,检验,优化,找到问题最好的解决方案

1.5 谈

·改善深层神经网络
2.1 深度学习的实用
训练集(执行训练算法)、验证集(选择最好的模型)、测试集(评估)
数据量越大,验证集和测试集的占比越低,没有测试集也行,不做评估

训练集和验证集如果偏差率差别过大,就叫高偏差(方差高),如果差别小但错误率高,也叫高偏差(偏差高),因为它甚至不能拟合训练集,若只有1%,0.8%错误率则代表方差偏差都很低

最优误差也称为基本误差,当图片很模糊时,基本误差就大

当开始构建一个机器学习模型时,最终得到的偏差和方差是判断此框架是否成功的标准,直到扎到双低的框架,就成功了

一般用正则化来减少过拟合问题(同时减少了方差)

L2正则化也称为权重衰减,实际上就是把反向传播的dw乘以了(1-aλ/m)倍的权重,会平衡过拟合欠拟合问题

dropout正则化(随机失活),用a除以keepprob,可以是0.8、0.9,可以去除一些隐藏单元,又不能改变z的期望值,则在z式中再乘一个keepprob
因为会随机消除节点,也消除了对特定节点.单个样本的依赖,弱耦合性,也可以预防一些单个样本的过拟合问题
如果担心某一层会更容易发生或拟合问题,可以把keepprob设置的更低一点,有些层也可以不用dropout
缺点是为是用交叉验证需要寻找更多的超级参数,还有模糊了costJ的定义,无法调试

数据扩增(图片水平反转.裁剪等)可作为正则化的方法使用来减少过拟合问题
earlystopping正则化,绘制误差函数,然后选择w范数小的网络
一般都用L2正则化,它的缺点在于要多试,寻找大量λ值的计算代价挺高,earlystopping的优点在于只运行一次梯度下降,然后找出w的中值极值

如果输入特征处于不同范围内,则需要归一化输入,使其趋向归于相似范围,可以加速训练
归一化的操作:第一步零均值化(移动数据集趋向于(0,0),use - μ),第二步归一化方差(上下方差平均,use / σ^2)
导致costJ会更圆一些,更易优化,更易梯度下降找到最低点

激活函数w值远离1会产生梯度消失或梯度爆炸,需要慎重权重问题,可在初始化时对w做归1处理(Var(Wi)=1/n)

执行梯度检验,用双边误差,单点求导的定义(土ε)

2.2 优化算法
在梯度下降中,我们希望纵向b减缓摆动,加快横向w的学习速度

优化算法:mini-batch梯度下降法:把样本x和y打包成很多小包,同时处理小量样本,用各个子训练集进行梯度下降算法,在巨大数据集面前,它可以更持久,不会因为一部分崩掉而整个崩掉
计算每个batch的梯度下降得到x{1},y{1}约等于整个训练集的x,y
实践中应该选择不大不小的minibatch,这样效果最好

优化算法:指数加权平均,比如取0.9(指数加权平均数)的上个结果+0.1的今天的结果所得到的非线性图像
可以引入一个参数做偏差修正,Vt/(1-β^t),β=0.98,对初始时期的误差做处理,偏差修正能帮助在早起获得更好的估测

优化算法:momentum动量梯度下降法,类似于加权算法,对dw和db重新赋值,Vdw=β的Vdw+(1-β)的dw,β=0.9,一般省掉(1-β),所以实质就是把dw.db的答案乘以了1/(1-β)倍,使梯度下降就像碗中球一样越滚越快(我们希望学习时横向速度变快)

优化算法:RMSprop算法(root mean square prop),Sdw=β的Sdw+(1-β)的dw^2,β=0.9,再在反向求导更新w.b时减去a*dw/S的平方根
(为了防止S在某时值很小,对w.b的更新影响太大,我们会在分母上加一个挺小的数ε来适当防止数值不稳定,ε常常为10^-8)
原理是纵轴上b的斜率大,求得的S就大,致使b更新的摆动变小,而w则相反,更新速度变快

优化算法:Adam算法(adaptive moment estimation)(momentum+RMSprop)
初始化Vdw.Vdb和Sdw.Sdb,指定两个超参数β1.β2,之后的计算中,w.b的更新式子中加入V和S来优化,β1.β2常常为0.9和0.999

学习率衰减的好处是在结果时可以收敛到距最优解相对较小的区域波动
令a乘上一个衰减率,使学习率a离散下降,或者使用指数下降学习率的方法也是一个不错的选择,但都需要你不断的调试参数。并且这个方法不是必须的

2.3 超参数调试、正则化、框架
在参数中,最重要的有三个,指数加权平均、隐藏单元数、minibatch的大小,其他的参数还有β1、β2、ε、层数、学习率衰减率等
选择参数调试时,先选几个重要的,在一个随机域中随机选择,如果效果好的话然后就在那周围小范围更密集的取值(由粗糙到精确的策略)
(如在以0.001-1内取值,可以用10的梯度来规划取值域)

通常,在神经网络batch归一化的过程,经常是类似于一行代码的东西,所以,懂得推导过程、实现原理和作用更重要
BN(batch归一化):μ为zi的平均(1/m倍),σ为z的方差(z-μ方再除m),代入计算Znorm=(zi-μ)/根号(方差方+ε),得z~=α*Znorm+β
前向后向传播就使用z~而不是z^i了
(加ε是为了数值稳定性,m是样本数)

BN的作用是保证方差和均值不会有大变化,减少了每层神经网络输入值改变的问题,等同于减弱了各层之间的影响,每层可以自己学习

batch归一化在神经网络的拟合,实际是z和a优化的问题
batch归一化常常和mini-batch一起使用,一次只能处理一个minibatch
BN有轻微正则化的作用

二分分类,y非0即1,是或者不是
softmax回归就是logistic回归的一种,它实现了多个输出类别(常用C来表示类别数)(单个样本,单个输出)
它的实现就是在计算z和a的中间插入一个式子作为下一个a的值:
矩阵z,用底数为e来转正一下,再除以一个总和,得到每个输出的概率作为下一个a

选择框架:建立程序的简单性、运行的高效性、框架的开放性(能否相信这个框架能长时间保持开源)
深度学习框架:caffe、CNTK、DL4J、Keras、Lasagne、mxnet、PaddlePaddle、TensorFlow、Theano、Torch

2.4 谈 Gans 生成式对抗网络

·结构化机器学习项目
3.1 机器学习ML策略
构建一个机器学习项目,有太多超参数可以调整,正交化就类似于分工明确的遥控器或车上的方向盘油门刹车等,通过改变变量定向的改变单个度量

查准率(precision)和查全率(recall):
前者是是否为猫的概率,后者是判断正确的比率,这两个评估指标需要折中考虑
可以通过一个单一数字评估指标F1分数(P和R的调和平均数,各分之1相加再分之2),可以快速判断哪种分类更有效(优化指标)
还需要加上一个评估参数分类运行时间,或给运行时间设限(满足指标)
例如触发词唤醒问题,对满足指标设限

开发测试集(dev/test)的划分:必须来自同一分布,把所有的数据随机打乱分配,才能保证它不会具有单一性

有些指标无法用算法来判断,需要加入一个分类错误率指标,给不想出现的错误更大的错误权重惩罚

贝叶斯最优错误率是AI准确率的上限,但机器学习还是能比人更厉害,比如算法方面
在训练错误率即将达到贝叶斯错误率时,称其为可避免误差,很难优化,可以跳过然后去优化更有优化空间的偏差了,来更有效率的决定工作着力点

如果机器学习训练集错误率远低于人类识别率时,只能说是拟合的不好,这时或需要用正则化减少偏差或方差,可以用更多的数据训练或者是执行更多次的梯度下降

机器学习在结构化数据预测比人类强,但在自然感知上很难超越人类。在现在,已经有语音识别和图像识别、一些医疗领域的行为已经超越了人类水平
但只要有足够的数据,在单一监督学习上是迟早能超越人类水平的

3.2 机器学习ML策略
在错误分析时,需要分析一下各种错误类型和所占比例,判断哪些更应该优化
关于错误标注数据的清理,手动修正,并要保证训练集和测试集数据属同一分布(相对不重要)

在选择训练测试集数据时,有少量的目标数据和大量爬取的参考数据,开发和测试集必须要用目标数据,才能精准

人类水平错误1、训练集错误2、训练开发错误3、开发集错误4、测试集错误5
可避免误差就是12之差,23之差表明了方差,34之差表明了数据的匹配度,45之差表明拟合问题

分析并不一定会给你指明一条前进的道路,但有时候你可能洞察到一些特征。

迁移学习:
把x和y替换为新目标的样本和目标,初始化最后一层的权重
在做同一种类的网络时,可以用一种样本进行预训练(网络的权重),然后在目标上训练(微调)
当需要构建的目标系统数据量很少时,可以用同类型其他目标预训练,从中学到很多低层次特征,再用目标去“微调”。这可以显著提高目标网络系统的性能

多任务学习(单个样本,多个输出)(应用要比迁移学习少一些):
一个网络识别n个物品,或n个网络各识别一个,但网络的早期浅层特征都要用到,还是前者效率高
多任务一般用于:训练的任务可以共用低层次特征,每个数据量很接近,需要训练一个足够大的神经网络

端到端系统就是减去了网络中间层,之间从x到y的映射
端到端可以简化系统架构,但需要更多的数据来训练,至少在机器翻译上,它do well,因为有很多现成的翻译数据

3.3 谈
Alpha-Beta剪枝 受限玻尔兹曼机 非监督学习的预训练 MINST数字
PCA拉伸
要求写出卷积神经网络的反向传播算法,做过一次后就真正了解了这些系统背后的运作原理(入一行最重要的就是要深入了解实际再做的事的原理)

·卷积神经网络
4.1 卷积神经网络
边缘检测:

垂直边缘检测:(卷积,实际上叫做互相关)
实际上是用一个纵向的小矩阵filter对原图像矩阵过滤(滤波器)
filter矩阵中值的选择一般会在中间进行一些权重的变化,最后的一般性是把这些数值都当作参数,通过数据反馈,让网络自己去学习
(他有两个缺点,一个是每次迭代都会缩小矩阵,二是矩阵边缘的数使用率只有一次而中间的频繁被计算,意味着丢掉了边缘的像素,解决方法是在周围再添加一圈像素点,这样这个缺点就被削弱了)
padding填充方式两种:valid和same
前者是正常过滤,后者使过滤和填充的数值产生关联,使最后的结果还是n*n矩阵

python:conv-forward tensor:tf.nn.conv2d Keras:Conv2d 实现卷积

三维卷积就比如一个有RGB的图像,filter也是一个图像像素RGB三通道的三维矩阵,最后得到一个图像像素的矩阵,你可以单独把filter的R或G、B的数值变为0或255,于是就会得到特有的检测效果(比如CG里的红蓝通道,绿通道查看等)
(可以执行多个过滤,得到的结果再叠加,等同于图像通道叠加)

卷积在网络中:输入nH、nW、nC(l-1),输出nH、nW、nC(l)(n-f),三个n代表数据的三维度
隐藏单元就是三维度相乘的参数数量

卷积网络一般有三层:卷积层、池化层(pooling)、全连接层(fully connected,FC)
池化就是用一个定大的filter来划分区域(最大池化是类似与卷积计算的过滤,最常用,最大池化只是网络某一层的静态属性,没什么需要学习的),选取最大的特征值(平均池化就是取平均值),保留在最大池化的输出里,池化的效率高在于它没有参数需要学习,只是提取特征值
全连接层就是把卷积的输出变成单元格网络形式(也就是正常神经网络的某层)

卷积网络的两个好处:参数共享和稀疏连接
前者是适用于整个样本输入的计算,还能转置(垂直检测变水平),后者是从输出来看,各个像素间不影响(他们只依赖与filter对应的输入单元)

4.2 深度卷积网络:实例
经典的网络:LeNet-5、AlexNet、VGG、ResNet(残差网络.152层)、Inception
AlexNet和LeNet-5类似,只是它的特征量更大
规律化网络VGG-16(16个卷积层),它的优点是规范,缺点是需要训练的特征数量非常巨大
残差网络就是一个个残差块连接的网络,残差快就是两层的网络远程跳接
Inception模块可以把输入用1*1的filter先过滤一遍来节省计算成本(瓶颈层)
(新版的inception网络还加入了远程跳接)

在github上下载开源代码 CMD下:git clone URL
快速开展新项目的方法就是去github上找关于计算机视觉的开源代码实现

ImageNet、MScoco、Pascal开源数据集,可以下载来初始权重,再用迁移学习把网络的问题迁移到你自己的问题上

在图像训练时,一个大的问题就是数据量很少,于是就需要我们做一下数据扩充
镜像、随机修剪、旋转或RGB单方面加减失真值(PCA颜色增强)
在程序中可以用多线程并行实现数据扩充和训练

4.3 目标检测
在图像目标定位时,常用的方法是利用网络输出批量物理实数来识别图像中的对象
通过特征点检测来进行人脸识别或高兴伤心、正在运动等特征
可以用滑动窗口目标检测来做卷积,在网络中的实现就是把全连接层变成卷积层,它存在的一个缺点是,边界框的位置可能不够准确

还一个算法是YOLO算法,定框检测,划分区域依次遍历求输出结果
有一个参数是交并比loU,用来做阈值控制
有一个算法是非极大值抑制,就是一个对象被多次检测,只取其中最大loU值的那个输出

有一个问题是一个框只能检测一个对象,可以使用anchor boxex算法来解决(更有针对性,合理的考虑到所有对象的形状):
画两个或更多的anchor boxex,输出y重复n次(n个anchorbox检测n个对象)
如果有更多对象,y的维度会更高

YOLO对象检测算法(最有效的对象检测算法):
目标向量:
3*3(网格)*2(anchorbox对象检测数)*8(向量维度=目标对象数+对象id+边界框参数)
检测出来对象了使用非极大值抑制确定目标作为最终输出

有一种算法是候选区域.色块分割算法(R-CNN)(不常用),求出候选区域,在区域里跑一下卷积分类器
还有更快的RCNN其实是用了滑动窗口策略,能显著提升效率
还有更快的就是用了卷积网络,其实都不如YOLO啦

4.4 应用:人脸识别
人脸识别+活体检测=刷脸系统
人脸识别的一个问题就是一次学习(one shot)的问题
解决方法:similarity函数d=两张图片的差值,如果差异值大于某个阈值,就预测不是同一个人
当发现是新人的话,加入数据库,也不会对原来的数据.操作产生影响

siamese网络(实现了similarity)
||两个输出之差||^2作为d函数,比较

为了得到一个好的人脸识别编码,一个方法是定义三元组损失函数然后应用梯度下降
三元组:APN(anchor本身、positive相同、negative不同),用AP的间隔和AN的间隔作比较(需要比较大的间隔,利用间隔参数α)
损失函数L=max(||AP||2-||AN||2+α,0)

在网络中的实现,从训练集随机选择APN组(这些数据集并不容易获得),大部分会间隔正常远,这样网络很轻松,梯度下降不会有什么效果
所以需要使用那一部分难训练的三元组的去训练,才会变得更好,离的尽可能远

可以把人脸识别siamese网络做为一个二分类网络,0和1的输出更容易看出效果

深度卷积网络每层都会检测更复杂的(边缘)特征
浅层为边缘、像素块,深层为对象边缘以至于整个对象,通过可视化查看

神经风格迁移,例子:毕加索画Style+实景Content=毕加索风格实景图Generated-img
如何实现:定义一个代价函数J(G)=aJ(C,G)+bJ(S,G)(内容和风格代价函数),使用梯度下降使它最小化,就能得到最终成品
内容代价:通过aC和aG的激活值求差平方(归一正则化不必要,可以直接通过总代价函数超参数a来控制)后得到,表明两个图片的相似度
风格代价:
相关系数:当纹理为垂直时卷积另一层是黄色的可能性
通过检测相关性,可以判断S和G的相似程度
通过一层隐藏层l来判断风格,一个风格S矩阵一个G矩阵求差平方归一后得到风格代价函数,单矩阵通过不同layer的相关性求和得到
(还需要对每个层定义权重,在每层损失之上乘上一个权重超参数,能使我们考虑到深层和浅层特征的相关系数)

还有1D网络比如心电图、3D网络比如CT,本质上只是矩阵维度变了而已.照样过滤求解,2D的是nnlayer,1D的是n(layer),3D的是nnnlayer

·序列模型
5.1 循环序列模型(RNN)
RNN在语音识别、自然语言处理(NLP)上发挥很好

序列模型即(x,y)组,频率-音乐,图片-行为,DNA序列.词语检测,语言翻译等

在NLP中,会创建一个词典(市面上常常为三五万的大小),然后序列x就是一个个one-hot矩阵向量,长度为词典长度,是为1,不是为0,不存在这个词一般设为UNK

用普通网络构建NLP预测的缺点就是输入输出的长度可能不一样,但它只能产生一样的,第二个是不能共享特征,一个完整的句子单词的词义是互相连接的
用一般的循环网络还有缺点,就是不能使用在预测单词之后单词的特征,还有就是输出数和输入数相同

循环网络的激活函数一般用tanh
预测函数y^,如果是二分问题,用sigmoid,如果是k类别分类,可以用softmax

forward:
at=g(Wa[a(t-1),x^t]+ba)
y^t=g(Wy*at+by)

编程框架大多都会自动处理反向传播
L使用交叉熵损失函数Lt(yt,yt)=-ytlogyt-(1-yt)log(1-yt)
L(y,y)=∑Lt

RNN的类型有一对一、一对多(比如通过音符生成音乐)、多对一(情感分析、电影评价)、多对多(一对一的迭代。有种特殊的多对多,前面层只有输入后面只有输出,应用于机器翻译,法语-英语,编码解码神经元、可以构建不同输入输出的网络),

在语言模型中用EOS标记标记句子的结尾,在有些场景下会用到
语言模型架构:a(0)和x(1)为0向量作为初始激活,得到y(1)(第一个词是词库中每个单词的概率,softmax输出)作为x(2)输入下一层,得到y(2)(前两个词的概率)…
(y实际上等于(本单词|之前单词)的概率)
每一步都会考虑前面所有的单词

字符模型和词语模型
前者效率低,如果硬件条件特别饿好的话也会用,因为他准确(不会出现未知),但较于后者来说他很难看出不同词语之间的关联关系

RNN的一个大问题就是梯度消失的问题
(比如英语中是单数还是复数导致后面是用is还是are的例子,这个问题关联性很大,后面的却很难再对前面权重的有影响)
梯度爆炸可以用梯度修剪来解决,但梯度消失难搞,我们用门控循环单元网格(Gated Recurrent Unit,GRU)来解决

GRU里有一个参数C代表记忆细胞,Ct=at
通过一个更新门函数将上个ct-1和xt代入sigmoid中计算,再合并c~t、ct-1、更新门做一个函数得出ct
优点是:通过门实现,代表后面的更不更新,通过sigmoid计算使其趋近与0或1,避免了梯度消失,是个二分问题:更新或不更新
(可以再做一个相关性函数作为计算下一个ct的ct-1的权重,和更新式一样,只是下标u编程了r,多了两个参数而已)

GRU和LSTM长短期记忆是RNN常用的两个具体实例

LSTM相较于GRU不同的地方在于:
计算门时使用sigmoid( W(at-1,xt)+b )
计算下一个ct时,他使用了独立的更新门和遗忘门作为c~t、ct-1的乘子
然后at=输出门*ct
共三个门

门的使用使记忆得以持久
可以加个窥视孔连接,他可以在计算门时加上ct-1,考虑周全

BRNN双向循环网络
就是在LSTM的急促上,同时计算一个反向a值,反向计算,保证句子的连贯性,前后都考虑周全

深层RNN网络,不需要每次得出y值,而是把输出当作下一层的输入继续计算了,最后一层得出y

5.2 自然语言处理与词嵌入
one-hot词典的问题在于,词的关联性弱,泛化能力不强
使用特征表征的词典,词语的泛化能力会更强
可以用t-SNE算法做词语特征可视化(词嵌入)(用一种非线性方式映射到2维平面上)

用词嵌入做迁移学习,未标注的词可以直接在网上
余弦相似度(cosine similarity)很好的拟合了词向量的互相类比

在keras中,可以使用嵌入矩阵的计算方法来实现对one-hot矩阵的高效运算(由于one-hot矩阵做乘法效率很低,需要和太多的0相乘)
嵌入向量e=E*o(onehot)

词嵌入skip-gram模型就是利用了嵌入向量,预测一个输入的左右词的概率
缺点在于softmax计算成本非常大

分级softmax分类器是用分类树构架,加速softmax分类,解决词嵌入词典数量太大的缺点

Word2Vec模型有skip-gram和CBOW连续词袋(获得左右两边的词来预测中间的词)
还一个是GloVe词向量算法

做情感分类,普通的方法是用所有计算出来的嵌入向量做一个softmax预测
还一种方法是用RNN多对一的方法做,他有很好的泛化能力

5.3 序列模型和注意力机制
seq2seq模型,imagetoswq,实际上就是RNN-RNN、CNN-RNN的结合

机器翻译模型实际上就是条件语言模型,编码-解码模型

贪心搜索:穷举法,效率高但正确率不能保证

集束搜索beam search
集束宽n,取n个最可能的词语,第一个单词=>第二个,每一步总是取最可能的3组结果,分支不断排除,可以大大提高效率
如果集束宽为1的话,实际上就变成了贪心搜索方法

可以做一些改进
由于p总小于1,会造成数值下溢,浮点数不能好好保存,然后算概率时包一层log函数,严格单调递增,更稳定的算法
如果句子长的话,概率相乘会越来越低,答案倾向于短句,然后我们使用归一化,优化目标函数==∑P除上一个句子长度^a,(a超参数,控制归一化阈值)

集束宽越大正确率越精准,但效率越低,反之亦然,所以需要好好选择集束宽,一般至少用10(保证正确率),特定应用用100或1000

集束算法的错误分析就是用B的P和RNN的P相比较,得到一个反馈At-fault,从而判断是什么地方出了问题,然后改进

双语评估替补 bilingual evaluation understudy Bleu得分
是用来判断翻译质量的好坏
还可以用一个BP算法,对MT得到的句子长度太长或太短做惩罚

MT翻译的一个缺点就是短句不好评估,长句更难决策
所以我们有了注意力模型
这个模型实际上就是在正常RNN模型准备输出每个y时加入了一个注意力单元处理机制(注意周围的词)(注意参数s)

用CTC模型做语音辨识,一个简单的RNN网络,每次输出一个字母,可能重复可能空格,然后拼接,去掉重复,就是一个语音识别系统

触发字系统就像小度、天猫精灵,以触发字来操作

————————————————————————END
我们一起经历了一段很长的旅程,如果你已经学完了整个专业的课程,那么现在你已经学会了神经网络和深度学习,如何改进深度神经网络,如何结构化机器学习项目,卷积神经网络,序列模型,我知道你为此非常努力,也希望你能对自己感到自豪,为你的努力,为你所做的这一切。

我想向你传达一个对你来说可能很重要的想法。
就是我觉得深度学习是一种超能力,通过深度学习算法,你可以让计算机拥有"视觉"(make a computer see),可以让计算机自己合成小说(synthesize novel art),或者合成音乐(synthesized music),可以让计算机将一种语言翻译成另一种(translate from one language to another),或者对放射影像进行定位然后进行医疗诊断(Maybe have it located radiology image and render a medical diagnosis),或者构建自动驾驶系统(build pieces of a car that can drive itself)。
如果说这还不是超能力的话,那还能是什么呢?当我们结束这一系列课程的时候,结束整个专业的时候,我希望你能够使用这些思想来发展你的事业,追逐你的梦想,但最重要的是,去做你认为最合适的能对人类有贡献的事。
这个世界现在面临着诸多挑战,但是在这种力量下,在人工智能和深度学习的力量下,我觉得我们可以让世界变得更美好。
现在这种超能力就掌握在你的手中,去突破障碍,让生活变得更好,这不单单是为自己,也是为了其他人。
当然我也希望你能够对自己取得的成就以及你学到的一切感到自豪。

————————————————————————————English
训练 fit 评估 score 预测 predict
反向传播 Back prop 正向传播 Fore prop

CNN.LeNet——RBF 径向基函数
RBM 玻尔兹曼机——应用于推荐系统
RNN——BP算法 误差反向传播backpropagation
(扩展,BPTT算法 随时间反向传播 backpropagation through time)
MT 机器翻译 ML 机器学习 DL 深度学习 RL 强化学习

label 标记 bias 偏置
extract 取出.提取
optimizer 优化器
accuracy 精确度
regression 回归
compile 编译
kernel 内核,核心
validation 确认(确定的测试集test)
normal 正态分布
cross_entropy 交叉熵
interactive 交互式
stddev 标准差
autoencoder 自编码器
ensemble 集成

无监督学习是未来的主流,自己对世界的物理特征进行观察分析,监督学习就是已经给定了重要特征和标注,这个神经网络的ai只能认识表象的世界
无监督学习或者说未来的ai需要自己进行时序分析和因果分析

αβγεδζηθικμλξστφχψω∏∑


  1. i ↩︎

  2. i ↩︎

你可能感兴趣的:(DL,DL)