本文目录一览:
- 1、深度学习和有效学习的区别
- 2、机器学习——条件决策树
- 3、机器学习如何对财富和所在行业关系进行建模预测
- 4、CNN、RNN、DNN的一般解释
- 5、一文搞懂DNN反向传播!
- 6、机器学习的基本框架体系是什么?并分模块进行阐述。
深度学习和有效学习的区别
深度学习和有效学习的区别分别是:
1、深度学习是:Deep Learning,是一种机器学习的技术,由于深度学习在现代机器学习中的比重和价值非常巨大,因此常常将深度学习单独拿出来说。
最初的深度学习网络是利用神经网络来解决特征层分布的一种学习过程。通常我们了解的DNN(深度神经网络),CNN(卷积神经网络),RNN(循环神经网络),LSTM(长短期记忆网络)都是隶属于深度学习的范畴。
也是现代机器学习最常用的一些手段。通过这些手段,深度学习在视觉识别,语音识别,自然语言处理(NLP)等领域取得了使用传统机器学习算法所无法取得的成就。
2、有效学习是:所谓有效学习就是智能系统从环境到行为映射的学习,以使奖励信号(强化信号)函数值最大,由于外部给出的信息很少。
有效学习系统必须依靠自身的经历进行自我学习。通过这种学习获取知识,改进行动方案以适应环境。有效学习最关键的三个因素是状态,行为和环境奖励。
机器学习是:Maching Learning,是实现人工智能的一种手段,也是目前被认为比较有效的实现人工智能的手段。
目前在业界使用机器学习比较突出的领域很多,例如计算机视觉、自然语言处理、推荐系统、文本分类等,大家生活中经常用到的比如高速公路上的ETC的车牌识别,苹果手机的Siri,看今日头条时给你推荐的新闻,再比如大家用天猫买东西看评论的时候的评价描述。
机器学习——条件决策树
使用威斯康星州乳腺癌数据,划分训练集和测试集,比较经典决策树和条件决策树的效果。
算法如下:
(1) 对输出变量与每个预测变量间的关系计算p值。
(2) 选取p值最小的变量。
(3) 在因变量与被选中的变量间尝试所有可能的二元分割(通过排列检验),并选取最显著的分割。
(4) 将数据集分成两群,并对每个子群重复上述步骤。
(5) 重复直至所有分割都不显著或已到达最小节点为止。
条件推断树可由party包中的ctree()函数获得:
library(party)
fit.ctree - ctree(class~., data=df.train)
plot(fit.ctree, main="Conditional Inference Tree")
ctree.pred - predict(fit.ctree, df.validate, type="response")
ctree.perf - table(df.validate$class, ctree.pred,dnn=c("Actual", "Predicted"))
ctree.perf
注:
值得注意的是,对于条件推断树来说,剪枝不是必需的,其生成过程相对更自动化一些。另外,party包也提供了许多图像参数。
下图展示了一棵条件推断树,每个节点中的阴影区域代表这个节点对应的恶性肿瘤比例。
predict()函数 用来对验证集中的观测点分类。结果给出了实际类别与预测类别的交叉表。整体来看,条件决策树中验证集中的准确率是95.2381%,经典决策树的准确率是96%。
尽管在这个例子中,传统决策树和条件推断树的准确度比较相似,但有时它们可能会很不一样。
· rpart包的处理方式:
首先对所有自变量和所有分割点进行评估,最佳的选择是使分割后组内的数据更为"一致"(pure)。这里的"一致"是指组内数据的因变量取值变异较小。
rpart包对这种"一致"性的默认度量是Gini值("吉尼系数"也可以用来衡量样本数据集的纯度。
吉尼系数越小,则表示该节点可以有效的把同一类聚集在一起。反之,分割后的类别越杂乱,则吉尼系数会越大。
在决策树生成时,当用到吉尼系数这个方法时,通常会计算每一个特征的吉尼系数,接着比较各个特征下的吉尼系数,系数越小的特征越适合先作为内部节点。)。
确定停止划分的参数有很多(参见rpart.control),确定这些参数是非常重要而微妙的,因为划分越细,模型越复杂,越容易出现过度拟合的情况,而划分过粗,又会出现拟合不足。
处理这个问题通常是使用"剪枝"(prune)方法。即先建立一个划分较细较为复杂的树模型,再根据交叉检验(Cross-Validation)的方法来估计不同"剪枝"条件下,各模型的误差,选择误差最小的树模型。
· party包的处理方式:
它的背景理论是"条件推断决策树"(conditional inference trees):它根据统计检验来确定自变量和分割点的选择。
即先假设所有自变量与因变量均独立。再对它们进行卡方独立检验,检验P值小于阀值的自变量加入模型,相关性最强的自变量作为第一次分割的自变量。自变量选择好后,用置换检验来选择分割点。
用party包建立的决策树不需要剪枝,因为阀值就决定了模型的复杂程度。所以如何决定阀值参数是非常重要的(参见ctree_control)。较为流行的做法是取不同的参数值进行交叉检验,选择误差最小的模型参数。
机器学习如何对财富和所在行业关系进行建模预测
方法1
可能存在问题,样本太少,有可能过拟合。先看下效果在说吧。
首先建立了一个4层的dnn网络(详见test_dnn.py)
预测结果分析
对测试集进行测试
衡量标准为为均方根
计算方法:sqrt((预测值-原始值)**2/样本数)
Rms=1.84
下图为预测误差分布图
结果分析:效果不理想,预测值与真实值差距较大,有一个值偏离非常大
原因分析:
模型结构不够理想
超参数的设置
样本太少,有200w的参数但是样本只有4000+,过拟合问题严重(在20次迭代后,就发生过拟合了)
方法2
使用lightgbm
直接使用lightgbm库(能用,但是对调参还需要学习)
详见test_lightgbm.py
预测结果分析
对测试集进行测试
衡量标准为均方根
Rms=1.35
结果分析:效果依旧不理想,但是比dnn较好,而且没有偏移非常大的值
原因分析:
依旧存在过拟合
模型参数设置
方法3
使用xgboost
方法同上
预测结果
Rms=1.38
结果分析:效果依旧不理想
原因分析:
2000次迭代次数不够,模型还未收敛
模型参数设置
方法4
使用catboost
方法同上
预测结果
Rms=1.47
结果分析:效果依旧不理想
方法5
使用集成学习的思想,将上面的方法混合使用
将3个学习器的结果根据权重求和,得到最后结果
Rms=1.36

结果分析:
使用4种方法对预测目标进行建模,其中dnn由于数据太少,很早就发生了过拟合
Xgboost,lightgbm,catboost效果比dnn要好很多,但是对价值预测依然存在偏差。但是结合kaggle的论坛帖子,由于数据特点在不使用leak的情况下 这已经是不错的预测。由于调参修改的时间需求较大就不进行了,这里只是一个验证,验证结果为Xgboost,lightgbm,catboost在数据量较少的场景,效果是非常好的。
CNN、RNN、DNN的一般解释
CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?
转自知乎 科言君 的回答
神经网络技术起源于上世纪五、六十年代,当时叫 感知机 (perceptron),拥有输入层、输出层和一个隐含层。输入的特征向量通过隐含层变换达到输出层,在输出层得到分类结果。早期感知机的推动者是Rosenblatt。 (扯一个不相关的:由于计算技术的落后,当时感知器传输函数是用线拉动变阻器改变电阻的方法机械实现的,脑补一下科学家们扯着密密麻麻的导线的样子…)
但是,Rosenblatt的单层感知机有一个严重得不能再严重的问题,即它对稍复杂一些的函数都无能为力(比如最为典型的“异或”操作)。连异或都不能拟合,你还能指望这货有什么实际用途么o(╯□╰)o
随着数学的发展,这个缺点直到上世纪八十年代才被Rumelhart、Williams、Hinton、LeCun等人(反正就是一票大牛)发明的 多层感知机 (multilayerperceptron)克服。多层感知机,顾名思义,就是有多个隐含层的感知机(废话……)。好好,我们看一下多层感知机的结构:
图1 上下层神经元全部相连的神经网络——多层感知机
多层感知机可以摆脱早期离散传输函数的束缚,使用sigmoid或tanh等连续函数模拟神经元对激励的响应,在训练算法上则使用Werbos发明的反向传播BP算法。对,这货就是我们现在所说的 神经网络 NN ——神经网络听起来不知道比感知机高端到哪里去了!这再次告诉我们起一个好听的名字对于研(zhuang)究(bi)很重要!
多层感知机解决了之前无法模拟异或逻辑的缺陷,同时更多的层数也让网络更能够刻画现实世界中的复杂情形。相信年轻如Hinton当时一定是春风得意。
多层感知机给我们带来的启示是, 神经网络的层数直接决定了它对现实的刻画能力 ——利用每层更少的神经元拟合更加复杂的函数[1]。
(Bengio如是说:functions that can be compactly
represented by a depth k architecture might require an exponential number of
computational elements to be represented by a depth k − 1 architecture.)
即便大牛们早就预料到神经网络需要变得更深,但是有一个梦魇总是萦绕左右。随着神经网络层数的加深, 优化函数越来越容易陷入局部最优解 ,并且这个“陷阱”越来越偏离真正的全局最优。利用有限数据训练的深层网络,性能还不如较浅层网络。同时,另一个不可忽略的问题是随着网络层数增加, “梯度消失”现象更加严重 。具体来说,我们常常使用sigmoid作为神经元的输入输出函数。对于幅度为1的信号,在BP反向传播梯度时,每传递一层,梯度衰减为原来的0.25。层数一多,梯度指数衰减后低层基本上接受不到有效的训练信号。
2006年,Hinton利用预训练方法缓解了局部最优解问题,将隐含层推动到了7层[2],神经网络真正意义上有了“深度”,由此揭开了深度学习的热潮。这里的“深度”并没有固定的定义——在语音识别中4层网络就能够被认为是“较深的”,而在图像识别中20层以上的网络屡见不鲜。为了克服梯度消失,ReLU、maxout等传输函数代替了sigmoid,形成了如今DNN的基本形式。单从结构上来说, 全连接的 DNN 和图 1 的多层感知机是没有任何区别的 。
值得一提的是,今年出现的高速公路网络(highway network)和深度残差学习(deep residual learning)进一步避免了梯度消失,网络层数达到了前所未有的一百多层(深度残差学习:152层)[3,4]!具体结构题主可自行搜索了解。如果你之前在怀疑是不是有很多方法打上了“深度学习”的噱头,这个结果真是深得让人心服口服。
图2 缩减版的深度残差学习网络,仅有34 层,终极版有152 层,自行感受一下
如图1所示,我们看到 全连接 DNN 的结构里下层神经元和所有上层神经元都能够形成连接 ,带来的潜在问题是 参数数量的膨胀 。假设输入的是一幅像素为1K*1K的图像,隐含层有1M个节点,光这一层就有10^12个权重需要训练,这不仅容易过拟合,而且极容易陷入局部最优。另外,图像中有固有的局部模式(比如轮廓、边界,人的眼睛、鼻子、嘴等)可以利用,显然应该将图像处理中的概念和神经网络技术相结合。此时我们可以祭出题主所说的卷积神经网络CNN。对于CNN来说,并不是所有上下层神经元都能直接相连,而是 通过“卷积核”作为中介。同一个卷积核在所有图像内是共享的,图像通过卷积操作后仍然保留原先的位置关系。 两层之间的卷积传输的示意图如下:
图3 卷积神经网络隐含层(摘自Theano 教程)
通过一个例子简单说明卷积神经网络的结构。假设图3中m-1=1是输入层,我们需要识别一幅彩色图像,这幅图像具有四个通道ARGB(透明度和红绿蓝,对应了四幅相同大小的图像),假设卷积核大小为100*100,共使用100个卷积核w1到w100(从直觉来看,每个卷积核应该学习到不同的结构特征)。用w1在ARGB图像上进行卷积操作,可以得到隐含层的第一幅图像;这幅隐含层图像左上角第一个像素是四幅输入图像左上角100*100区域内像素的加权求和,以此类推。同理,算上其他卷积核,隐含层对应100幅“图像”。每幅图像对是对原始图像中不同特征的响应。按照这样的结构继续传递下去。CNN中还有max-pooling等操作进一步提高鲁棒性。
图4 一个典型的卷积神经网络结构,注意到最后一层实际上是一个全连接层(摘自Theano 教程)
在这个例子里,我们注意到 输入层到隐含层的参数瞬间降低到了 100*100*100=10^6 个 !这使得我们能够用已有的训练数据得到良好的模型。题主所说的适用于图像识别,正是由于 CNN 模型限制参数了个数并挖掘了局部结构的这个特点 。顺着同样的思路,利用语音语谱结构中的局部信息,CNN照样能应用在语音识别中。
全连接的DNN还存在着另一个问题——无法对时间序列上的变化进行建模。然而, 样本出现的时间顺序对于自然语言处理、语音识别、手写体识别等应用非常重要 。对了适应这种需求,就出现了题主所说的另一种神经网络结构——循环神经网络RNN。
在普通的全连接网络或CNN中,每层神经元的信号只能向上一层传播,样本的处理在各个时刻独立,因此又被成为前向神经网络(Feed-forward Neural Networks)。而在 RNN 中,神经元的输出可以在下一个时间戳直接作用到自身 ,即第i层神经元在m时刻的输入,除了(i-1)层神经元在该时刻的输出外,还包括其自身在(m-1)时刻的输出!表示成图就是这样的:
图5 RNN 网络结构
我们可以看到在隐含层节点之间增加了互连。为了分析方便,我们常将RNN在时间上进行展开,得到如图6所示的结构:
图6 RNN 在时间上进行展开
Cool, ( t+1 )时刻网络的最终结果O(t+1) 是该时刻输入和所有历史共同作用的结果 !这就达到了对时间序列建模的目的。
不知题主是否发现,RNN可以看成一个在时间上传递的神经网络,它的深度是时间的长度!正如我们上面所说, “梯度消失”现象又要出现了,只不过这次发生在时间轴上 。对于t时刻来说,它产生的梯度在时间轴上向历史传播几层之后就消失了,根本就无法影响太遥远的过去。因此,之前说“所有历史”共同作用只是理想的情况,在实际中,这种影响也就只能维持若干个时间戳。
为了解决时间上的梯度消失,机器学习领域发展出了 长短时记忆单元 LSTM ,通过门的开关实现时间上记忆功能,并防止梯度消失 ,一个LSTM单元长这个样子:
图7 LSTM 的模样
除了题主疑惑的三种网络,和我之前提到的深度残差学习、LSTM外,深度学习还有许多其他的结构。举个例子,RNN既然能继承历史信息,是不是也能吸收点未来的信息呢?因为在序列信号分析中,如果我能预知未来,对识别一定也是有所帮助的。因此就有了 双向 RNN 、双向 LSTM ,同时利用历史和未来的信息。
图8 双向RNN
事实上, 不论是那种网络,他们在实际应用中常常都混合着使用,比如 CNN 和RNN 在上层输出之前往往会接上全连接层,很难说某个网络到底属于哪个类别。 不难想象随着深度学习热度的延续,更灵活的组合方式、更多的网络结构将被发展出来。尽管看起来千变万化,但研究者们的出发点肯定都是为了解决特定的问题。题主如果想进行这方面的研究,不妨仔细分析一下这些结构各自的特点以及它们达成目标的手段。入门的话可以参考:
Ng写的Ufldl: UFLDL教程 - Ufldl
也可以看Theano内自带的教程,例子非常具体: Deep Learning Tutorials
欢迎大家继续推荐补充。
当然啦,如果题主只是想凑个热闹时髦一把,或者大概了解一下方便以后把妹使,这样看看也就罢了吧。
参考文献:
[1]
Bengio Y. Learning Deep
Architectures for AI[J]. Foundations Trends® in Machine Learning, 2009,
2(1):1-127.
[2]
Hinton G E, Salakhutdinov R R.
Reducing the Dimensionality of Data with Neural Networks[J]. Science, 2006,
313(5786):504-507.
[3]
He K, Zhang X, Ren S, Sun J. Deep
Residual Learning for Image Recognition. arXiv:1512.03385, 2015.
[4]
Srivastava R K, Greff K,
Schmidhuber J. Highway networks. arXiv:1505.00387, 2015.
一文搞懂DNN反向传播!
本文主要整理自下面的几篇博客:
1、深度神经网络(DNN)反向传播算法(BP):
2、机器学习中的矩阵、向量求导。
1、推导BPNN前需要了解的矩阵求导知识
1.1 矩阵/向量值函数对实数的导数
1.2 实值函数对矩阵/向量的导数
1.3 向量值函数对向量的求导(雅可比矩阵)
1.4 变量多次出现的求导法则
规则:若在函数表达式中,某个变量出现了多次,可以单独计算函数对自变量的每一次出现的导数,再把结果加起来。
1.5 向量求导的链式法则
1.6 一一对应关系下的矩阵求导
1.7 几个重要的结论
掌握了上面的一些基本知识之后,我们就可以顺利推导出神经网络的反向传播算法。
2、反向传播的推导
具体的推导过程可以参考文章开头给出的博客,下图是我手动推导的过程:
赞赏支持
链接:
来源:
机器学习的基本框架体系是什么?并分模块进行阐述。
Boehm:运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护这些程序所必需的相关文件资料。
IEEE在软件工程术语汇编中的定义:软件工程是:1.将系统化的、严格约束的、可量化的方法应用于软件的开发、运行和维护,即将工程化应用于软件;2.在1中所述方法的研究
Fritz Bauer在NATO会议上给出的定义:建立并使用完善的工程化原则,以较经济的手段获得能在实际机器上有效运行的可靠软件的一系列方法。
目前比较认可的一种定义认为:软件工程是研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来。
《计算机科学技术百科全书》中的定义:软件工程是应用计算机科学、数学及管理科学等原理,开发软件的工程。软件工程借鉴传统工程的原则、方法,以提高质量、降低成本。其中,计算机科学、数学用于构建模型与算法,工程科学用于制定规范、设计范型(paradigm)、评估成本及确定权衡,管理科学用于计划、资源、质量、成本等管理。
软件工程学的内容
软件工程学的主要内容是软件开发技术和软件工程管理.
软件开发技术包含软件工程方法学、软件工具和软件开发环境;软件工程管理学包含软件工程经济学和软件管理学。
软件工程基本原理
著名软件工程专家B.Boehm综合有关专家和学者的意见并总结了多年来开发软件的经验,于1983年在一篇论文中提出了软件工程的七条基本原理。
(1)用分阶段的生存周期计划进行严格的管理。
(2)坚持进行阶段评审。
(3)实行严格的产品控制。
(4)采用现代程序设计技术。
(5)软件工程结果应能清楚地审查。
(6)开发小组的人员应该少而精。
(7)承认不断改进软件工程实践的必要性。
B.Boehm指出,遵循前六条基本原理,能够实现软件的工程化生产;按照第七条原理,不仅要积极主动地采纳新的软件技术,而且要注意不断总结经验。
软件工程(SoftWare Engineering)的框架可概括为:目标、过程和原则。
(1)软件工程目标:生产具有正确性、可用性以及开销合宜的产品。正确性指软件产品达到预期功能的程度。可用性指软件基本结构、实现及文档为用户可用的程度。开销合宜是指软件开发、运行的整个开销满足用户要求的程度。这些目标的实现不论在理论上还是在实践中均存在很多待解决的问题,它们形成了对过程、过程模型及工程方法选取的约束。
(2)软件工程过程:生产一个最终能满足需求且达到工程目标的软件产品所需要的步骤。软件工程过程主要包括开发过程、运作过程、维护过程。它们覆盖了需求、设计、实现、确认以及维护等活动。需求活动包括问题分析和需求分析。问题分析获取需求定义,又称软件需求规约。需求分析生成功能规约。设计活动一般包括概要设计和详细设计。概要设计建立整个软件系统结构,包括子系统、模块以及相关层次的说明、每一模块的接口定义。详细设计产生程序员可用的模块说明,包括每一模块中数据结构说明及加工描述。实现活动把设计结果转换为可执行的程序代码。确认活动贯穿于整个开发过程,实现完成后的确认,保证最终产品满足用户的要求。维护活动包括使用过程中的扩充、修改与完善。伴随以上过程,还有管理过程、支持过程、培训过程等。
(3)软件工程的原则是指围绕工程设计、工程支持以及工程管理在软件开发过程中必须遵循的原则。
软件工程必须遵循什么原则
围绕工程设计、工程支持以及工程管理已提出了以下四条基本原则:
(1)选取适宜的开发模型
该原则与系统设计有关。在系统设计中,软件需求、硬件需求以及其它因素间是相互制约和影响的,经常需要权衡。因此,必需认识需求定义的易变性,采用适当的开发模型,保证软件产品满足用户的要求。
(2)采用合适的设计方法
在软件设计中,通常需要考虑软件的模块化、抽象与信息隐蔽、局部化、一致性以及适应性等特征。合适的设计方法有助于这些特征的实现,以达到软件工程的目标。
(3)提供高质量的工程支撑
工欲善其事,必先利其器。在软件工程中,软件工具与环境对软件过程的支持颇为重要。软件工程项目的质量与开销直接取决于对软件工程所提供的支撑质量和效用。
(4)重视软件工程的管理
软件工程的管理直接影响可用资源的有效利用,生产满足目标的软件产品以及提高软件组织的生产能力等问题。因此,仅当软件过程予以有效管理时,才能实现有效的软件工程。
软件工程是指导计算机软件开发和维护的工程学科。
采用工程的概念、原理、 技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够 得到的最好的技术方法结合起来,这就是软件工程。