深度学习的主要分类是什么呀?这些网络cnn dbn dnm rnn是怎样的关系

浅析深度学习模型与应用
发表于 15:59|
来源新闻资讯|
作者新闻资讯
摘要:哈喽,亲爱的小伙伴们,很久之前极小验和大家分享了文章《深度学习发展史》,不知道大家还记不记得,不过记不得也没有关系呀,可以戳链接再看一遍。既然了解了深度学习发展史,那么今天极小验就带大家来看一看深度学习的应用现状。
哈喽,亲爱的小伙伴们,很久之前极小验和大家分享了文章《深度学习发展史》,不知道大家还记不记得,不过记不得也没有关系呀,可以戳链接再看一遍。既然了解了深度学习发展史,那么今天极小验就带大家来看一看深度学习的应用现状。
2006年Geoffery
Hinton提出了深度学习(多层神经网络),并在2012年的ImageNet竞赛中有非凡的表现,以15.3%的Top-5错误率夺魁,比利用传统方法的第二名低了10.9%
。一时之间,深度学习备受追捧。Google、Facebook、百度等等公司纷纷开始大量的投入深度学习的应用研究。
深度学习的优势
人工神经网络是从信息处理的角度,对人脑神经元网络进行抽象的计算模型,目的就是让计算机能够模拟人脑的思考方式来解决一些抽象的问题。相比较于传统的模式识别,特征的提取方式主要靠人工提取或设计,而深度学习模型是一种端到端模型,即让计算机自动学习有用的特征,从而减少了人为提取特征造成的繁杂和不完备性。正如Google
Brain项目负责人Jeff
Dean说:&我们在训练的时候从来不会告诉机器说:&这是一只猫。&系统其实是自己发明或者领悟了&猫&的概念。&在图像处理,语音识别这种人为特征提取难度很大的问题上面,深度学习有着其独有的优势,比如在语音识别方面,深度学习使得错误率下降了大约30%,取得了很大的进步。
深度学习的主要模型
目前深度学习有三种基本模型,分别是多层感知机(MLP,Multi-layer Perceptron),卷积神经网络(Convolutional
Neural Network)以及循环神经网络(Recurrent Neural Network)。
多层感知机(MLP)
MLP结构特点
& 输入与输出层之间存在一个或多个隐层
& 输入层没有计算节点,只用于获得外部输入信号,只有隐层和输出层的神经元为计算节点
& 每个输入节点将上一层输出进行加权,然后通过激活函数进行非线性变换
训练方法:反向传播算法(Back-Propagation)
MLP可用于解决简单的分类和预测问题。不过它的参数量随着层数的增加指数级增长,并且优化困难,限制了它的应用。
卷积神经网络(CNN)
CNN通过引入卷积自动分层提取特征,每一层由多个特征图组成,每一个特征图是由前一层输出与一个卷积核进行卷积运算和非线性变换得到,随后进行池化操作,用于降低输出维度,同时获得一定的特征不变性。
CNN中最主要的三种网络层:
& 全连接层
训练方法:反向传播算法(Back-Propagation)
CNN通过局部连接和权值共享大幅度降低了参数量。目前CNN在图像识别、目标检测、人脸识别等诸多计算机视觉任务上都取得了令人振奋的成果。
递归神经网络(RNN)
相比于MLP和CNN,RNN通过权值共享使其能够处理变长的序列问题(CNN由于全连接层需要固定维度的输入,限制了CNN只能接受固定维度的输入)。RNN引入了&环&的结构,某一时刻的输出不仅与当前时刻的输入有关,还与前一时刻的状态有关,通过共享权值,使得RNN能学习到鲁棒的特征。
RNN分类(按照cell):
RNN的训练算法:基于时间的反向传播算法(Back Propagation Through Time,BPTT)
RNN模型主要应用自然语言处理(NLP)上,比如语言翻译、文本信息挖掘、聊天机器人等。
深度学习的应用及发展
深度学习在计算机视觉和自然语言处理上有着广泛的应用。
在计算机视觉领域,2015年,微软何凯明团队利用152层网络在ImageNet比赛上将错误率降低到3.57%。Google 在 2015年的 I/O
大会推出的Google
photos,可以将相册中的同一个人整合在一起,通过长期的学习甚至可以自动判断照片是否是一个值得纪念的时刻的拍摄的。近年来深度学习在医学图像的分析、目标检测等任务上也取得了很大的进展。
在自然语言处理上的应用主要包括语言翻译、机器理解、机器翻译等。Google去年底在gmail上上线了邮件自动回复功能,该功能利用深度学习技术提取和分析邮件语义信息,再根据提取的语义生成候选答复。在语音识别领域,百度在全国人机语音通讯学术会议(NCMMSC2015)上介绍了最新研发出的语音识别技术,该技术引入LSTM模型和CTC训练到传统框架中,使得识别相对错误率比现有技术降低15%以上,使汉语安静环境普通话语音识别的识别率接近97%。这是语音识别领域又一个重要的里程碑。
除了以上两个领域,深度学习在网络安全领域也有广泛的应用,如木马病毒、恶意软件检测与分析以及恶意程序识别等。
极验验证就是将深度学习应用于网络安全防御,通过深度学习建模学习人类与机器的行为特征,来区别人与机器,防止恶意程序对网站进行垃圾注册,撞库登录等。
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章深度学习 - 福全家
标签:深度学习
我学习DBN是通过丕子博客中的demo及文献进行学习的。demo链接,丕子博客关于DBN demo的介绍。
该DBN包括3层RBM,一层Softmax,最后通过BP神经网络进行参数调优。
对最大似然函数利用梯度下降求解W,a,b三类参数,由于最大似然函数求导后有一项是不能计算的,所以通过通过Gibbs采样求得该项参数。Gibbs采样时通过条件概率来计算联合概率的一种方...
ė11,023 views
0, , , ,
深度学习概念的入门,看深度学习笔记的博客,理论入门UFLDL教程,代码实现Caffe框架,具体应用看deepid,deepid目前包括:deepid1,deepid2,deepid2+,deep3。Sensetime公司,听说是汤晓鸥教授开的。目前深度学习主要用来实现特征提取、分类这两项视觉工作。
DeepId1 :Deep Learning Face Representation from Predicting 10,000 Class...
ė15,472 views
Ɣ回顶部5658人阅读
深度学习(56)
原文地址:
作者:hjimce
一、相关理论
RNN(Recurrent Neural Networks)中文名又称之为:循环神经网络(原来还有一个递归神经网络,也叫RNN,搞得我有点混了,菜鸟刚入门,对不上号)。在计算机视觉里面用的比较少,我目前看过很多篇计算机视觉领域的相关深度学习的文章,除了OCR、图片标注、理解问答等这些会把CNN和RNN结合起来,其它的很少见到。RNN主要用于序列问题,如自然语言、语音音频等领域,相比于CNN来说,简单很多,CNN包含:卷积层、池化层、全连接层、特征图等概念,RNN基本上就仅仅只是三个公式就可以搞定了,因此对于RNN我们只需要知道三个公式就可以理解RNN了。说实话,一开是听到循环神经网络这个名子,感觉好难的样子,因为曾经刚开始学CNN的时候,也有很多不懂的地方。还是不啰嗦了,……开始前,我们先回顾一下,简单的MLP三层神经网络模型:
简单MLP模型
上面那个图是最简单的浅层网络模型了,x为输入,s为隐藏层神经元,o为输出层神经元。然后U、V就是我们要学习的参数了。上面的图很简单,每层神经元的个数就只有一个,我们可以得到如下公式:
(1)隐藏层神经元的激活值为:
s=f(u*x+b1)
(2)然后输出层的激活值为:
o=f(v*s+b2)
这就是最简单的三层神经网络模型的计算公式了,如果对上面的公式,还不熟悉,建议还是看看神经网络的书,打好基础先。而其实RNN网络结构图,仅仅是在上面的模型上,加了一条连接线而已,RNN结构图:
看到结构图,是不是觉得RNN网络好像很简单的样子,至少没有像CNN过程那么长。从上面的结构图看,RNN网络基础结构,就只有一个输入层、隐藏层、输出层,看起来好像跟传统浅层神经网络模型差不多(只包含输出层、隐藏层、输出层),唯一的区别是:上面隐藏层多了一天连接线,像圆圈一样的东东,而那条线就是所谓的循环递归,同时那个圈圈连接线也多了个一个参数W。还是先看一下RNN的展开图,比较容易理解:
我们直接看,上面展开图中,Ot的计算流程,看到隐藏层神经元st的输入包含了两个:来时xt的输入、来自st-1的输入。于是RNN,t时刻的计算公式如下:
(1)t时刻,隐藏层神经元的激活值为:
st=f(u*xt+w*st-1+b1)
(2)t时刻,输出层的激活值为:
ot=f(v*st+b2)
是不是感觉上面的公式,跟一开始给出的MLP,公式上就差那么一点点。仅仅只是上面的st计算的时候,在函数f变量计算的时候,多个一个w*st-1。
二、源码实现
下面结合代码,了解代码层面的RNN实现:
# -*- coding: utf-8 -*-
Created on Thu Oct 08 17:36:23 2015
@author: Administrator
import numpy as np
import codecs
data = open('text.txt', 'r').read() #读取txt一整个文件的内容为字符串str类型
chars = list(set(data))#去除重复的字符
print chars
#打印源文件中包含的字符个数、去重后字符个数
data_size, vocab_size = len(data), len(chars)
print 'data has %d characters, %d unique.' % (data_size, vocab_size)
#创建字符的索引表
char_to_ix = { ch:i for i,ch in enumerate(chars) }
ix_to_char = { i:ch for i,ch in enumerate(chars) }
print char_to_ix
hidden_size = 100 # 隐藏层神经元个数
seq_length = 20 #
learning_rate = 1e-1#学习率
Wxh = np.random.randn(hidden_size, vocab_size)*0.01 # 输入层到隐藏层
Whh = np.random.randn(hidden_size, hidden_size)*0.01 # 隐藏层与隐藏层
Why = np.random.randn(vocab_size, hidden_size)*0.01 # 隐藏层到输出层,输出层预测的是每个字符的概率
bh = np.zeros((hidden_size, 1)) #隐藏层偏置项
by = np.zeros((vocab_size, 1)) #输出层偏置项
t时刻序列,也就是相当于输入
#targets t+1时刻序列,也就是相当于输出
#hprev t-1时刻的隐藏层神经元激活值
def lossFun(inputs, targets, hprev):
xs, hs, ys, ps = {}, {}, {}, {}
hs[-1] = np.copy(hprev)
for t in xrange(len(inputs)):
xs[t] = np.zeros((vocab_size,1)) #把输入编码成0、1格式,在input中,为0代表此字符未激活
xs[t][inputs[t]] = 1
hs[t] = np.tanh(np.dot(Wxh, xs[t]) + np.dot(Whh, hs[t-1]) + bh) # RNN的隐藏层神经元激活值计算
ys[t] = np.dot(Why, hs[t]) + by # RNN的输出
ps[t] = np.exp(ys[t]) / np.sum(np.exp(ys[t])) # 概率归一化
loss += -np.log(ps[t][targets[t],0]) # softmax 损失函数
dWxh, dWhh, dWhy = np.zeros_like(Wxh), np.zeros_like(Whh), np.zeros_like(Why)
dbh, dby = np.zeros_like(bh), np.zeros_like(by)
dhnext = np.zeros_like(hs[0])
for t in reversed(xrange(len(inputs))):
dy = np.copy(ps[t])
dy[targets[t]] -= 1 # backprop into y
dWhy += np.dot(dy, hs[t].T)
dh = np.dot(Why.T, dy) + dhnext # backprop into h
dhraw = (1 - hs[t] * hs[t]) * dh # backprop through tanh nonlinearity
dbh += dhraw
dWxh += np.dot(dhraw, xs[t].T)
dWhh += np.dot(dhraw, hs[t-1].T)
dhnext = np.dot(Whh.T, dhraw)
for dparam in [dWxh, dWhh, dWhy, dbh, dby]:
np.clip(dparam, -5, 5, out=dparam) # clip to mitigate exploding gradients
return loss, dWxh, dWhh, dWhy, dbh, dby, hs[len(inputs)-1]
#预测函数,用于验证,给定seed_ix为t=0时刻的字符索引,生成预测后面的n个字符
def sample(h, seed_ix, n):
x = np.zeros((vocab_size, 1))
x[seed_ix] = 1
for t in xrange(n):
h = np.tanh(np.dot(Wxh, x) + np.dot(Whh, h) + bh)#h是递归更新的
y = np.dot(Why, h) + by
p = np.exp(y) / np.sum(np.exp(y))
ix = np.random.choice(range(vocab_size), p=p.ravel())#根据概率大小挑选
x = np.zeros((vocab_size, 1))#更新输入向量
ixes.append(ix)#保存序列索引
return ixes
n, p = 0, 0
mWxh, mWhh, mWhy = np.zeros_like(Wxh), np.zeros_like(Whh), np.zeros_like(Why)
mbh, mby = np.zeros_like(bh), np.zeros_like(by) # memory variables for Adagrad
smooth_loss = -np.log(1.0/vocab_size)*seq_length # loss at iteration 0
while n&20000:
#n表示迭代网络迭代训练次数。当输入是t=0时刻时,它前一时刻的隐藏层神经元的激活值我们设置为0
if p+seq_length+1 &= len(data) or n == 0:
hprev = np.zeros((hidden_size,1)) #
p = 0 # go from start of data
#输入与输出
inputs = [char_to_ix[ch] for ch in data[p:p+seq_length]]
targets = [char_to_ix[ch] for ch in data[p+1:p+seq_length+1]]
#当迭代了1000次,
if n % 1000 == 0:
sample_ix = sample(hprev, inputs[0], 200)
txt = ''.join(ix_to_char[ix] for ix in sample_ix)
print '----\n %s \n----' % (txt, )
# RNN前向传导与反向传播,获取梯度值
loss, dWxh, dWhh, dWhy, dbh, dby, hprev = lossFun(inputs, targets, hprev)
smooth_loss = smooth_loss * 0.999 + loss * 0.001
if n % 100 == 0: print 'iter %d, loss: %f' % (n, smooth_loss) # print progress
# 采用Adagrad自适应梯度下降法,可参看博文:http://blog.csdn.net/danieljianfeng/article/details/
for param, dparam, mem in zip([Wxh, Whh, Why, bh, by],
[dWxh, dWhh, dWhy, dbh, dby],
[mWxh, mWhh, mWhy, mbh, mby]):
mem += dparam * dparam
param += -learning_rate * dparam / np.sqrt(mem + 1e-8) #自适应梯度下降公式
p += seq_length #批量训练
n += 1 #记录迭代次数
参考文献:
**********************作者:hjimce & 时间: &联系QQ:
& 原创文章,转载请保留原文地址、作者等信息***************
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:362678次
积分:5225
积分:5225
排名:第4285名
原创:129篇
评论:223条
声明:博文的编写,主要参考网上资料,并结合个人见解,仅供学习、交流使用,如有侵权,请联系博主删除,原创文章转载请注明出处。来自福建厦门的一枚小菜鸟……博主qq:,微博://profile?profile_ftype=1&is_all=1#_0
文章:52篇
阅读:234977
(1)(6)(4)(1)(1)(1)(2)(6)(6)(5)(2)(12)(3)(5)(8)(3)(11)(3)(3)(4)(14)(21)(9)深度学习实战篇-基于RNN的中文分词探索 - 推酷
深度学习实战篇-基于RNN的中文分词探索
文 | haiping
近年来,深度学习在人工智能的多个领域取得了显著成绩。微软使用的152层深度神经网络在ImageNet的比赛上斩获多项第一,同时在图像识别中超过了人类的识别水平。百度在中文语音识别上取得了97%的准确率,已经超过了人类的识别能力。
随着深度学习在越来越多的领域中取得了突破性进展,自然语言处理这一人工智能的重要领域吸引了大批的研究者的注意力。最近谷歌发布了基于深度学习的机器翻译(GNMT),和基于短语的机器翻译相比,错误率降低了55%-85%以上,从而又引发了深度学习在自然语言处理上的热潮。
自然语言处理是人工智能和语言学的交叉学科,在搜索引擎,问答系统,机器翻译等人工智能领域发挥着重要作用。分词,词性标注,命名实体识别作为自然语言处理的基础领域,同样吸引着大批研究者的注意力,本篇就结合我们近期的一些探索从中文分词角度探索深度学习在自然语言处理中的应用。
中文分词是将自然语言文本划分成词语序列,目前主流方法为序列标注,即用BMES这个四个标签去标注句子中的每一个字(B是词首,M是词中,E是词尾,S是单字词)。
对于 { 京东 搜索 与 大数据 平台 数据挖掘 算法部 }
其标注为{ BE BE S BME BE BMME BME }
使用Keras实现了基于RNN的中文分词,接下来就分别介绍一下Keras和中文分词实战。
1. Keras介绍
Keras 是一个高度模块化的深度学习框架,使用python编写,封装了大量的函数接口,可支持CPU和GPU训练。Keras提供了一系列模块,这样我们在实验模型的时候只需要调用这些模块就可以完成模型搭建,不用自己在去实现各层网络。
主要模块有Optimizers(优化函数模块),常用的有SGD(随机梯度下降)、 AObjectives(目标函数模块),常用的有均方误差,交差熵;Activations(激活函数模块),sigmoid用来做二分类、relu可解决梯度消失问题、softmax常用来做多分类;Layers(网络层模块),提供了CNN(卷积层)、RNN(LSTM、GRU)、Initializations(初始化模块),主要用于模型参数的初始化,常用的有均匀分布初始化,高斯分布初始化。
使用Keras进行模型试验,可分为四个步骤(数据准备,模型构建, 模型训练, 模型测试),本文也将基于这四个步骤探索基于RNN的中文分词。
2. 中文分词实战
训练数据使用的是bakeoff2005中的北京大学的标注语料,train作为训练样本,test作为测试样本。
统计训练样本中出现的字符并生成字典,同时将训练样本中字符全部映射成对应的字典索引(为了处理未登录词,将出现次数低于2次的字符映射为未登录词)。在序列标注分词中,一个字的标签受到上下文的影响,因而取该字的前后3个字作为特征。
本文模型由一层Embedding层,2层LSTM,一个Dense输出层构成,目标函数为交叉熵,优化函数选择adam。为了验证方法的有效性,本文未采用外部语料预训练词向量,而是在训练数据上训练词向量。
Embedding层完成从词典索引到词向量的映射过程,即输入一个词典索引,输出该索引对应的词向量,第一层LSTM层输入为词向量序列,输出为隐层输出序列,第二层LSTM层输入为前一层输出序列,输出为隐层个数,Dense输出层输入为第二层LSTM输出,输出为类别数。
在这里embeddingDim设为128,RNN序列长度设为7,LSTM隐层个数设为100,outputDims设为4,batch_size设为128。
分别在CPU和GPU(使用单卡)上进行模型训练,使用单卡GPU的速度为CPU的4.7倍,未来还会测试单机多卡和多机多卡的性能。
使用北京大学test进行测试,并使用bakeoff2005的测试脚本进行测试,结果如下所示:
3.总结和展望
深度学习的优点是可以自动发现特征,大大减少了特征工程的工作量。目前深度学习已经在语音和图像等领域取得重大进展,自然语言与语音、图像不同,是抽象符号,因而如何将深度学习应用于自然语言处理需要进行更多的研究和探索:针对不同任务的不同字词表示、将先验知识和深度学习相结合、Attention机制的运用。同时相对于标注数据,未标注数据量更多,如何运用未标注数据也是目前自然语言处理探索的热点和难点。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信