个人学习常识笔记

来源:互联网 发布:dive into python 2 编辑:程序博客网 时间:2024/06/06 01:32

1、百度大脑

  a、声纹识别。它跟语音识别不太一样。语音识别是要识别出说了什么,而声纹识别是要识别出谁在说话。说话的内容不同会对声纹识别准确性有非常大的干扰。因此声纹识别是很有挑战性的。

b、人脸识别。其准确度是在一个非常大的测试集上测试的,在2015年的时候错误率是8%,在2016年的时候错误率是2.3%,2017年是在1%一下。

c、图像识别。ImageNet是1000个分类150万张照片,而百度做过的是一个库是4万类7000万张照片,目前是11万类,真正做到极致。

2、深度学习训练与识别的流程图:


2、alexnet网络

  其网络结构为八层,五层输入层,三层为全连层。参考:http://blog.csdn.net/sunbaigui/article/details/39938097

 输入层:输入图像Size为32*32。这要比mnist数据库中最大的字母(28*28)还大。这样的目的是希望潜在的明显特征,如笔画断续、角点能够出现

在最高层特征监测子感受 野中心。

卷积运算特点就是:通过卷积运算,可以使源信号特征增强,并且降低噪音。不同的卷积核可以提取不同的特征,而深度学习里

的卷积核数值是未知的,其是通过训练得出来的。

pooling层是下采样层:是为了降低网络训练参数及模型的过拟合程度。把最明显的特征提取出来,弱化不明显的特征,主要是降维,其次是提高一点特征的鲁棒性。

输出层:由欧氏径向基函数单元组成,每类一个单元,每个有84个输入。换句话说,每个输出RBF单元计算输入向量和参数向量之间的欧式距离。

输入离参数向量越远,RBF输出的越大。给定一个输式,损失函数应能使得F6的配置与RBF参数向量(即模式的期望分类)足够接近。

3、迁移学习

迁移学习是经过一个预先训练的模型,并且用你自己的数据集进行“微调”的过程,这个理念就是预先训练的模型将作为一个特征提取器,将

最后一层删除并用自己的分类器替换它。因为网络的低层,我们知道他们会检测到边缘和曲线等特征。现在除非你有一个非常独特的问题空间和数据集,你才要考虑更低层级。

4、人工智能博文总结:http://www.15sky.com/article/JCyJnCr

a、人工智能里面发展出了两个分支:一个是早期的概率论模型,另一个是神经网络。

b、对于数据量不是很大的情况下,概率论会使一个特别好的选择。

c、另一个分支是神经网络,其有好几种,比如说卷积神经网络、递归神经网络等;如果计算机的计算能力没有发展,人工智能也还智能停留在实验室,而却没有大量数据的支撑,AI也谈不上。

d、本质上tensorflow就是一个python库,其核心core是由C++写的,它对外提供了很多API,早期只有python,1.0之后增加了Java API,还不是特别稳定,所以还是优先使用Python。其内部有一个数据交换,发生在内参中---就是将python需要的计算逻辑转成c++,由底层的计算后返回。


4、智能问答

可以理解我聊天机器人,在早期是通过关键字搜索,静态的给你返回,利用搜索引擎给你一个反馈。其实这个算不上智能问答,只能说是一个文献检索。关键是要能够明白这句话到底是什么意思,这里就设计了一个自然语言处理,其基本是使用tenserflow来做的,而一些云的相关的解决方案,其并不能解决很多问题。一般企业都会构造一个属于自己的垂直行业的智能问答。

5、神经里的超参数的意义:

a、学习率learn_rate:其实应用在SGD里的权重变化系数,其太大的话,网络无法到达全局最优;太小的话,网络收敛速度慢,可能掉入局部最优,其一般在0.1到0.01间调参数。形象例子:

可以形象地将learning_rate比喻成走路时步子的大小,想象一下要从一个U形的山谷的一边走到山谷最低点,如果步子特别大,像巨人那么大,那会直接从一边跨到另一边,然后又跨回这边,如此往复。如果太小了,可能你走着走着就掉入了某些小坑,因为山路总是凹凸不平的(局部最优),掉入这些小坑后,如果步子还是不变,就永远走不出那个坑。

b、batch_size:其就是我们用来计算损失函数时需要的样本数,其也特别重要。例如batch_size=1叫做Full Batch Learning;这是每计算一个样本就计算其其loss然后进行反向传播修改权值,此时每个n_epochs里需要进行反向传播的次数是sum_samples/batch_size次,因为每次epoch需要计算完所有的样本,反向传播耗时,所以计算慢。当batch_size=10时,则每个n_epochs里需要进行反向传播的次数是sum_samples/batch_size次,也是把总样本分成n批,每批里有batch_size个样本,当总样本数量不够被batch_size整除时,则剩下的样本为一批,接着把每批样本里的每个样本依次通过网络,最后计算他们的总loss接着把平均后的loss进行反馈。

选取规则:

参考博文:谈谈深度学习中的 Batch_Size

Batch 的选择,首先决定的是下降的方向。如果数据集比较小,完全可以采用全数据集 ( Full Batch Learning )的形式,这样做至少有 2 个好处:其一,由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。其二,由于不同权重的梯度值差别巨大,因此选取一个全局的学习率很困难。

对于更大的数据集,以上 2 个好处又变成了 2 个坏处:其一,随着数据集的海量增长和内存限制,一次性载入所有的数据进来变得越来越不可行。其二,以 Rprop 的方式迭代,会由于各个 Batch 之间的采样差异性,各次梯度修正值相互抵消,无法修正。这才有了后来 RMSProp 的妥协方案。

既然 Full Batch Learning 并不适用大数据集,那么走向另一个极端怎么样?

所谓另一个极端,就是每次只训练一个样本,即 Batch_Size = 1。这就是在线学习(Online Learning)。线性神经元在均方误差代价函数的错误面是一个抛物面,横截面是椭圆。对于多层神经元、非线性网络,在局部依然近似是抛物面。使用在线学习,每次修正方向以各自样本的梯度方向修正,横冲直撞各自为政,难以达到收敛如图所示

这里写图片描述 
                在合理范围内,增大 Batch_Size 有何好处?
内存利用率提高了,大矩阵乘法的并行化效率提高。
跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。
盲目增大 Batch_Size 有何坏处?
内存利用率提高了,但是内存容量可能撑不住了。
跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。
参考博文:http://blog.csdn.net/yangdashi888/article/details/60983550

batch_size=1、2、5、10、20时,validation-error一直是97.5%,没降下来。我觉得可能是样本类别覆盖率过小,因为我们的数据是按类别排的,每个类别10个样本是连续排在一起的,batch_size等于20时其实只包含了两个类别,这样优化会很慢。
因此最后我将batch_size设为40,也就是valid_dataset和test_dataset的大小了,没办法,原始数据集样本太少了。一般我们都不会让batch_size达到valid_dataset和test_dataset的大小的。

所以在训练时使用的 训练样本集要打乱,最好每个样本出现一次,例如cifar10数据集是打乱的,不过也有两类连续出现的。其如下:


c、n_epochs:n_epochs也就是最大的训练步数,比如设为200,那训练过程最多遍历你的数据集200遍,当遍历了200遍你的dataset时,程序会停止。n_epochs就相当于一个停止程序的控制参数,并不会影响CNN模型的优化程度和速度,只是一个控制程序结束的参数。

5、成功训练ldnn的13建议:

参考博文:成功训练ldnn的13点建议

谈及LDNN时,我通常指的是10-20层的神经网络(这是现有算法所能驾驭的)。以下列举了几点有关LDNN的强大之处。

对于某个问题,例如是视觉目标识别,我们所要做的是要对一个50层巨型卷积码神经网络进行训练。显然达到如此级别的神经网络足以与人类神经网络媲美,不是吗?所以找到这样的权值是成败的关键。

80年代以来的改变
过去,人们曾认为神经网络可以解决“一切问题”。但最后为什么没有成功呢?这里面有如下几个原因。
a、过去计算机速度很慢,因此过去的神经网络是微型的,这导致性能的先天不足。换句话说,小型神经网络功能不强。
b、数据集很小。即使能奇迹般地训练LDNN,也缺乏足够的大信息数据集来约束巨量的神经网络参数。所以失败是不可避免的。
c、没有人知道如何训练深度网络。深度网络很重要。当前20-25个连续圈层是最好的对象识别网络配置。一个两层的神经网络注定在对象识别上是低效的。在过去人们认为SGD不可能用来训练深度网络,因为当时认为这是难以置信的。
科学发展是多么的有趣,特别是回首以往,会发现现在进行深度神经网络训练是小事一桩了。
实践建议:
好吧,或许你已经跃跃欲试了。LDNN代表着现在也代表着未来,难道不想训练它?但传言说LDNN很高深,这是真的吗?过去或许是,但现在很多社区已经做出努力和尝试,只要把以下所述牢记于心,训练神经网络就不会太难。下面是有关社区的知识总结,这很重要请仔细阅读。
a、获取数据:确保要有高质量的输入/输出数据集,这个数据集要足够大、具有代表性以及拥有相对清楚的标签。缺乏数据集是很难成功的。
b、预处理:将数据进行集中是非常重要的,也就是要使数据均值为0,从而使每个维度的每次变动为1。有时,当输入的维度随量级排序变化时,最好使用那个维度的log(1+x)。基本上,重要的是要找到一个0值的可信编码以及自然分界的维度。这样做可使学习工作得更好。情况就是这样的,因为权值是通过公式来更新的:wij中的变化 \propto xidL/dyj(w表示从层x到层y的权值,L是损失函数)。如果x的均值很大(例如100),那么权值的更新将会非常大,并且是相互关联的,这使得学习变得低劣而缓慢。保持0均值和较小的方差是成功的关键因素。例如把输入数据归一化到-1到1之间。
c、批处理:在如今的计算机上每次只执行一个训练样本是很低效的。反之如果进行的是128个例子的批处理,效率将大幅提高,因为其输出量是非常可观的。事实上使用数量级为1的批处理效果不错,这不仅可获得性能的提升同时可降低过度拟合;不过这有可能会被大型批处理超越。但不要使用过大的批处理,因为有可能导致低效和过多过度拟合。所以我的建议是:根据硬件配置选取适合的批处理规模,量力而为会更加高效。
d、梯度归一化:根据批处理的大小来拆分梯度。这是一个好主意,因为如果对批处理进行倍增(或倍减),无需改变学习率(无论如何,不要太多)。
c、学习率计划:从一个正常大小的学习率(LR)开始,朝着终点不断缩小。
1LR的典型取值是**0.1**,令人惊讶的是,对于大量的神经网络问题来说,0.1是学习率的一个很好的值。通常学习率倾向于更小而非更大。
使用一个**验证集**——一个不进行训练的训练集子集,来决定何时降低学习率以及何时停止训练(例如当验证集的错误开始增多的时候)。
学习率计划的实践建议:若发现验证集遭遇瓶颈,不妨将LR除以2(或5),然后继续。最终,LR将会变得非常小,这也到了停止训练的时候了。这样做可以确保在验证性能受到损害的时候,你不会拟合(或过度拟合)训练数据。降低LR是很重要的,通过验证集来控制LR是个正确的做法。
但**最重要的是要关注学习率**。一些研究人员(比如Alex Krizhevsky)使用的方法是,监视更新范数和权值范数之间的比率。比率取值大约为10ˉ3。如果取值过小,那么学习会变得非常慢;如果取值过大,那么学习将会非常不稳定甚至失败。
d、权值初始化。关注权值在学习开始时的随机初始化。
如果想偷懒,不妨试试0.02*randn(num_params)。这个范围的值在许多不同的问题上工作得很好。当然,更小(或更大)的值也值得一试。
如果它工作得不好(例如是一个非常规的和/或非常深的神经网络架构),那么需要使用init_scale/sqrt(layer_width)*randn来初始化每个权值矩阵。在这种情况下,init_scale应该设置为0.1或者1,或者类似的值。
对于深度且循环的网络,随机初始化是极其重要的。如果没有处理好,那么它看起来就像没有学习到任何东西。我们知道,一旦条件都设置好了,神经网络就会学习。
一个有趣的故事:多年来,研究人员相信SGD不能训练来自随机初始化的深度神经网络。每次尝试都以失败告终。令人尴尬的是,他们没有成功是因为使用“小的随机权值”来进行初始化,虽然小数值的做法在浅度网络上工作得非常好,但在深度网络上的表现一点也不好。当网络很深时,许多权值矩阵之间会进行乘积,所以不好的结果会被放大。
但如果是浅度网络,SGD可以帮助我们解决该问题。
所以关注初始化是很有必要的。尝试多种不同的初始化,努力就会得到回报。如果网络完全不工作(即没法实施),继续改进随机初始化是正确的选择。
如果正在训练RNN或者LSTM,要对梯度(记得梯度已除以批量大小)范数使用一个硬约束。像15或者5这样的约束在我个人的实验中工作得很好。请将梯度除以批处理大小,再检查一下它的范数是否超过15(或5)。如果超过了,将它缩小到15(或5)。这个小窍门在RNN和LSTM的训练中发挥着巨大作用,不这样做的话,爆炸性的梯度将会导致学习失败,最后不得不使用像1e-6这样微小而无用的学习率。
E、数值梯度检查:如果没有使用过Theano或者Torch,梯度实现只能亲力亲为了。在实现梯度的时候很容易出错,所以使用数值梯度检查是至关重要的。这样做会让你对自己的代码充满信心。调整超级参数(比如学习率和初始化)是非常有价值的,因此好刀要用在刀刃上。

6、为什么现在的CNN模型都是在GoogleNet、VGGNet或者AlexNet上调整的?

参考文章:https://www.zhihu.com/question/43370067?sort=created


原因:

一是训练AlexNet等网络需要imagenet, places等million级别的数据,一般的CV任务都没有这么多数据。
二是因为pre-trained model本身的feature已经足够generalizable,可以立刻应用到另外一个CV任务。
三是如何开发出新的CNN分类模型,这就需要积累训练CNN的经验和直觉,以及大量的计算资源来尝试不同的网络结构。一般的研究者和实验室很难负担得起。但如果能搞出个如ResNet一样的牛逼网络,瞬间Best Paper ;), 这也是Kaiming师兄的厉害之处。
各个模型产生时间:
Lenet,1986年
Alexnet,2012年
GoogleNet,2014年
VGG,2014年
Deep Residual Learning,2015年

caffe现在也开始
Caffe 也伴随着 Nvidia GPU 硬件和软件升级不断调整,与时俱进,经典的 CNN 网络 AlexNet (Caffe 重新实现的版本称为 CaffeNet)计算速度也不断刷新。另外,Caffe 也在努力支持新模型(VGG,GoogleNet,ResNet……)。
7、深度学习力的end to end与fine-tuning
其中end to end意思是端到端的意思,就是原始数据输入,结果输出,其降低了很多人为因素的影响,通过深度网络自己去学习特征。
其中的fine-tuning意思是微调的,就是在少量数据的情况下,通过微调深度网络的参数,输出结果。
8、CVPR与PASCAL VOC
CVPRComputer Vision and Pattern Recognition(计算机视觉与模式识别),其是IEEE Conference on Computer Vision and Pattern Recognition,
即IEEE国际计算机视觉与模式识别会议。
PASCAL VOC(pattern analysis,statistical modelling and computational learning    visual object classes)模式分析,统计建模,计算学习  视觉物体分类。
起初Pascal 并不像现在这样完善和全面,刚开始委员会只提供了4个类别的图像,在2006年的时候增加到了10个类,2007年开始则增加到了20个类;图片集包括20个目录:人类;动物(鸟、猫、牛、狗、马、羊);交通工具(飞机、自行车、船、公共汽车、小轿车、摩托车、火车);室内(瓶子、椅子、餐桌、盆栽植物、沙发、电视)。都是一些日常中最常见的物体,位的就是能更好的体现算法的实用性。
9、其中的crop与warp的区别:

10、深度学习里的Map是什么意思:
其缩写是:【mean Average precision】平均精度均值,其意思是在多次的测试准确度的平均值。














0 0
原创粉丝点击