深度学习-入门与实践

生物神经网络与深度学习对比

(1)生物神经网络:

一般指生物的大脑神经元,细胞,触点等组成的网络,用于产生生物的意识,帮助生物进行思考和行动。

(2)人工神经网络:

是一种应用类似于大脑神经突触联接的结构进行信息处理的数学模型。在工程与学术界也常直接简称为“神经网络”或类神经网络。

(3)深度学习:

是机器学习研究中的一个新的领域,其动机在于建立、模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,例如图像,声音和文本。

(4)大脑神经网络与深度学习神经网络图:

大脑神经网络

深度学习神经网络

大脑神经元的结构

深度学习神经元结构
深度学习方式

深度学习方式作用

(1)监督学习:

概念:监督学习是使用已知正确答案的示例来训练网络
案例:验证码识别,动物分类,数学规律归纳公式

(2)非监督学习:

概念: 无监督学习适用于具有数据集但无标签(无正确答案)的情况。无监督学习采用输入集,并尝试查找数据中的模式,比如,将其组织成群(聚类)或查找异常值(异常检测)
案例: youtube在未经过训练的情况下自动筛选出有猫的视频

(3)半监督学习:

概念: 半监督学习在训练阶段结合了大量未标记的数据和少量标签数据。
案例:

(4)[深度]强化学习:

概念:强化学习是一种通过主体(Agent)与环境(Environment)交互而进行学习的方法。它既不属于有监督学习,也不属于无监督学习。它的目标是要通过与环境(Environment)交互,根据环境的反馈(Reward),优化自己的策略(Policy),再根据策略行动(Action),以获得更多更好的反馈奖励(Reward)。
案例:alpha go,机器人玩游戏,机器人投篮

常用神经网络

(1)BP神经网络(BP)

(2)卷积神经网络(CNN)

(3)循环神经网络 (RNN)

(4)递归神经网络 (RNN)

(5)自编码神经网络 (Auto-Encoders)

(6)长短期记忆神经网络(LSTM)

(7)生成式对抗网络 (GAN)

(8)[深度]强化学习

详细可参考- 深度学习-常用神经网络

BP神经网络的详细介绍

前向传播与后向传播过程示意图

(1)前向传播

多层前馈神经网络由一个输入层、一个或者多个隐藏层、一个输出层组成,数据通过输入层流向隐藏层最后通过输出层输出结果,将这一过程称为前向传播。

(2)后向传播

训练模型时,根据前先传播输出的结果Oi与正确标签值的误差值E来调整神经元之间的权重和偏置值,这个过程称为后向传播(back propagation)。多层前馈神经网络与后向传播算法组成的神经网络叫BP神经网络。

(3)单个神经元的数学体现

神经网络单元j

如上图,给定隐藏层或输出层的单元j,则单元j的净输入为Ij:


单元j的净输入

公式中wij是由上一层的单元i到单元j的连接权重;
Oi是上一层的单元i的输出;
Θj是单元j的偏置,该偏置充当阀值,用来改变神经元的活性;
Oi与Oj的值是在经过激活函数计算后得出,若定义激励函数为sigmoid,单元j的净输入为Ij,输出为Oj,则Oj的输出值为:


单元j的输出

(4)后向传播权重与偏置值调整计算

由损失函数通过梯度下降法对权重、偏置求偏导,并根据偏导结果来更新权重值和偏置值。具体的计算过程可参考:搞懂深度学习到底需要哪些数学知识

(5)模型训练终止条件

如果满足条件之一,就可以停止训练,如下所示:

前一周期所有的△wij都太小,小于某个指定的阀值。
前一周期误分类的元组百分比小于某个阀值。
超过预先指定的周期数。

实践中,权重收敛可能需要数十万个周期。神经网络的训练有很多的经验和技巧,比如我们就可以使用一种称为模拟退火的技术,使神经网络确保收敛到全局最优。

(6)以上1-4训练步骤执行流程如下图(tensorflow运行动态图)所示

tensorflow 运行原理图

上图关键词解析:
input : 输入
Reshape:对输入值转换成张量(可以看成矩阵)
ReLu Layer/Logit Layer:总体可以看成隐藏层与输出层,里面包含神经元之间的权重和偏置
Rectified linear:激励函数 f(x)=max(0,x)
Class Labels:正确标签值
Cross Entropy:交叉熵,损失函数的一种
Softmax:用来分类的函数
Gradients:梯度下降
SGD Trainer:随机梯度下降训练器

从数据进入输入层开始(input),经过塑形将输入数据转换成张量(Reshape),进入隐藏层(ReLu Layer)与Wh1,bh1完成运算、再经过输出层(logit layer)完成与Wsm、bsm的运算,最后通过softmax函数输出各个分类的概率从而完成前向传播,若在训练过程中则用交叉熵函数(crossEntropy)计算正确标签(Class Labels)与输出结果分类概率的误差,再通过梯度下降法、后向传播的方式更新权重与偏置(update Wh1,updte bh1,update Wsm,update bsm)。

BP神经网络代码实践(tensorflow)

(1)代码案例

#coding:utf-8
import tensorflow as tf
import numpy as np

#输入数据
x_data = np.linspace(-1,1,300)[:, np.newaxis] #取-1到1的等差数列的1行300列的矩阵
noise = np.random.normal(0,0.05, x_data.shape) #产生正态分布的跟x_data一样维度数组的噪声
y_data = np.square(x_data)-0.5+noise #对x_data平方后减0.5加噪声(标签值)

#输入层
with tf.name_scope('input_layer'): #输入层。将这两个变量放到input_layer作用域下,tensorboard会把他们放在一个图形里面
    xs = tf.placeholder(tf.float32, [None, 1], name = 'x_input') # xs起名x_input,会在图形上显示 None:行不定,1列
    ys = tf.placeholder(tf.float32, [None, 1], name = 'y_input') # ys起名y_input,会在图形上显示

#隐层
with tf.name_scope('hidden_layer'): #隐层。将隐层权重、偏置、净输入放在一起
    with tf.name_scope('weight'): #权重
        W1 = tf.Variable(tf.random_normal([1,10])) #定1个输入,10个神经元(10个输出),权重初始化为正态分布
        tf.summary.histogram('hidden_layer/weight', W1) #画图
    with tf.name_scope('bias'): #偏置
        b1 = tf.Variable(tf.zeros([1,10])+0.1) #10个神经元的10个偏置值,初始值为0.1
        tf.summary.histogram('hidden_layer/bias', b1) #画图
    with tf.name_scope('Wx_plus_b'): #净输入
        Wx_plus_b1 = tf.matmul(xs,W1) + b1 #输入xs矩阵与W1矩阵乘积 ,左边矩阵列数等于右边行数
        tf.summary.histogram('hidden_layer/Wx_plus_b',Wx_plus_b1) #画图
output1 = tf.nn.relu(Wx_plus_b1) #通过relu激活函数后往下一层输出

#输出层
with tf.name_scope('output_layer'): #输出层。将输出层权重、偏置、净输入放在一起
    with tf.name_scope('weight'): #权重
        W2 = tf.Variable(tf.random_normal([10,1])) #输出层有10个输入值,1个输出值
        tf.summary.histogram('output_layer/weight', W2)
    with tf.name_scope('bias'): #偏置
        b2 = tf.Variable(tf.zeros([1,1])+0.1)
        tf.summary.histogram('output_layer/bias', b2)
    with tf.name_scope('Wx_plus_b'): #净输入
        Wx_plus_b2 = tf.matmul(output1,W2) + b2
        tf.summary.histogram('output_layer/Wx_plus_b',Wx_plus_b2)
output2 = Wx_plus_b2

#损失
with tf.name_scope('loss'): #损失
    loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys-output2),reduction_indices=[1])) #300个输出与标签值用二次损失函数(square)计算后求和(reduce_sum)再平均,得到loss损失值
    tf.summary.scalar('loss',loss)
with tf.name_scope('train'): #训练过程
    train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) #后向传播的过程,通过学习率为 0.1的梯度下降法(GradientDescentOptimizer),最小化损失(minimize)为目的,来更新权重和偏置值

#初始化
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
merged = tf.summary.merge_all() #将图形、训练过程等数据合并在一起
writer = tf.summary.FileWriter('logs',sess.graph) #将训练日志写入到logs文件夹下
saver = tf.train.Saver() #保存神经网络模型

#训练
for i in range(1000):
    sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
    if(i%50==0): #每50次写一次日志
        result = sess.run(merged,feed_dict={xs:x_data,ys:y_data}) #计算需要写入的日志数据
        writer.add_summary(result,i) #将日志数据写入文件

#保存训练后的模型
save_path = saver.save(sess, "logs/save_net.ckpt")
print("Save to path: ", save_path)

(2)代码参数在tensorboard中的表现

平方损失函数值趋向收敛
代码整体流程体现
隐藏层--权重值变化

隐藏层--偏置值变化

隐藏层-- Wx_plus_b1 = tf.matmul(xs,W1) + b1
输出层--权重值变化

输出层 --偏置值变化

输出层 --Wx_plus_b2 = tf.matmul(output1,W2) + b2

推荐阅读更多精彩内容

  • 第二个Topic讲深度学习,承接前面的《浅谈机器学习基础》。 深度学习简介 前面也提到过,机器学习的本质就是寻找最...
    我偏笑_NSNirvana阅读 12,898评论 7 45
  • 蓝幽幽的冷光闪烁在黑暗 行走在你的领地肆无忌惮 血腥能激发你无穷的欲望 用实力开拓...
    触摸那片曙光阅读 30评论 2 1
  • 惜以相惜 彼此感恩 惜以相惜,不过情意;彼此感恩,不过忘怀。亲情如此,友情如此,爱情亦如此。 (一)父母的爱 亲情...
    来了私人助理阅读 157评论 0 0
  • 眨眼间中旬要过去了。今天一早去查体了,结果。。。囊肿积液息肉包块,老毛病又犯了,医生建议手术。心情很沉重,有点透不...
    圈_圈_阅读 33评论 0 0
  • 投资有风险,入市需谨慎。这是投资界的警示。但是在互联网金融中,似乎没有人来警示,而且各种隐蔽的技巧,让投资人也摸不...
    爱大片部落阅读 280评论 5 2