keras学习笔记(一)

    小白第一次写博客,诸多稚嫩之处,还望各位读者海涵。

    keras是基于tensorflowTheano的一个深度学习链接库。我最近开始学习keras的几点感触就是,keras相对tensorflow来说封装性更好,理解成为keras是tensorflow的前端,像tensorflow的前向网络、反向网络之类在keras中用model.add()方法就可以轻松解决(后续会介绍到),学习这方面的小白可以像我一样,先入手keras,理解神经网络的构建原理之后,再回来学tensorflow,会轻松一些。

    笔者目前的学习资源主要为中国大学mooc上曹建老师的tensorflow学习笔记,以及林大贵的《tensorflow+keras深度学习人工智能实践应用》。

    首先说一下人工智能、机器学习和深度学习的关系,这三者是层层递进的关系。引用知乎上育心网友的回答,“机器学习是实现人工智能的一种方法,深度学习是实现机器学习的一种技术。”依鄙见,人工智能将是未来的技术,对技术疯狂的人都会最终痴迷于这个领域,但实现人工智能的方法不单单是机器学习,除了让机器模拟人的思维去思考,还可以用工程法来达到人工智能的效果,笔者能力有限不能做具体分析。至于深度学习,则是对机器学习的一种更深层面的开发,这项技术将会越来越成熟。

    直接说机器学习(machine learning,ML),ML分为三种,监督学习(supervised learning)非监督学习(unsupervised learning)强化学习(reinforcement learning,RL)

    这三种学习的概念,新手不是很能理解,但相信尝试过了解这三者的人都在网上查到过形象化的描述,监督学习就是告诉机器,逃课是错的,上课是对的,这是离散问题,或者告诉机器现在的气温是21℃,三小时前的气温是20℃,这是逻辑回归问题(logistic),总之,监督学习都要有标签(label),告诉机器what or which。

    非监督学习与监督学习恰恰相反,机器遇到的事物没有标签,这里再提一个名词,监督学习训练好的模型可以识别一些无标签事物,这也是我们希望机器做的,这个过程叫分类(classification),对应地非监督学习在训练的过程中遇到的事物无标签,这样就叫聚类(clustering)。很明显,聚类和分类相比,总体上说聚类的训练结果更差一些,然而我们仍然在很多情况下使用非监督学习训练聚类,因为对于监督学习所必需的海量数据库,库标签标注是需要劳动力的,如果我们用聚类算法对海量无标签数据训练,且可以保证一定准确率,我们一定优先选择非监督学习。

    强化学习就比较秀了,使用的算法更加深入,我在做大一项目的时候了解到一些RL的算法,像Q-learing算法,深度Q网络(deep Q network, DQN)算法等,仅仅是了解这些算法都花了我们小组不少功夫,笔者仅是大一萌新,不能在这里过多展开了。提一些RL的基本要素,假设机器可以像人一样学习,我们称这个学习者为agent,agent所处的环境称之为environment,agent的状态称之为state,agent有可能做出一些行为action,一段时间内的一系列行为成为policy,做出行为后环境会给学习者一个反馈reward,那么,这些事物有这样的关系。agent根据state做出一个action,action影响environment,改变state,并返回一个reward,agent不断地反复在environment中学习,那么,agent希望找到一个policy,使policy中所含所有的action的reward总和最大,即最优policy,这样我们便成功训练一个模型。举个栗子,NBA球员在球场上打比赛时,比赛过程是一段时间,场上局势是environment,每个球员在每一时刻都有一个state,球员要根据场上环境来做出选择,是投篮还是传球,是挡拆还是拉开,每一个动作都会对紧接着要发生的事情产生影响,对整局比赛也有影响,如果是机器在训练一个模型使球员做出的选择趋向于使比赛获胜,那么机器会反复地模拟这场比赛, 直到训练出一个policy使Σreward最大为止。

    再来说下深度学习。深度学习的重点在深度(depth),仅从一个层面是谈不上深度的,是很多层面才能说有深度,这很多层面就是常说的神经网络。机器学习中的人工神经网络是仿照人脑神经网络搭建的,当然了,就有神经元,突触这些东西。人脑神经结构交错复杂,把一个神经元A作为起始,到另一个神经元B结束,A,B之间有很多路径,有长路径有短路径,路径的长度就可以成为深度(depth)。

    所谓深度学习,就是有很多层结构的人工神经网络来仿真人脑神经网络,为了方便构型,人工神经网络会有一个输入层(input layer)和一个输出层(output layer),这两个层是我们所关心的,可以理解为人反射弧中的感受器和效应器,有输入(input)就有输出(output),其他层是我们所不关心的,即如何(how)根据输入来输出,我们称之为隐藏层。隐藏层可以有很多,隐藏层越多,深度越大,网络越庞大。

    接下来具体讲深度学习的原理。人工神经网络的信息传导是仿真人脑神经网络的,层间(输入层、隐藏层、输出层等网络层)信息传递也是仿真人脑神经元的工作原理的。举个栗子,说现在有四个神经元,三个输入神经元(x1,x2,x3)和一个接收神经元(y),神经元y负责接收x1,x2,x3传过来的信息,我们用数学运算来模拟人脑神经元的突触机制。定义这种数学运算为激活函数(activation function),就是x1,x2,x3传过来的信息,经过一系列操作给y接收,以达到仿真突触作用的效果。针对这个例子有公式如下

    y = activation function(x1*w1+x2*w2+x3*w3+b1)

  1. 称w1,w2,w3为权重(weight),模拟轴突,表示神经元之间传输信息的权重。
  2. 称b1为偏差值(bias),代表接收神经元容易被活化的程度,偏差值越高,越容易被活化并传递信息。因为不是只要有神经刺激就有反应的,可以理解为神经元的应激程度。即每个神经元都对应一个bias.
  3. 激活函数即模拟神经传导的工作方式,真正的突触工作太过复杂,激活函数通常为简单非线性函数。

    介绍两种激活函数:sigmoid, ReLU.(函数图像可自行百度)

    Sigmoid函数有三种情况,神经刺激较小时,忽略此刺激;神经刺激达到一定阈值后,反应开始随刺激呈正相关增长;神经刺激再增强达到一定阈值后,反应不再随刺激增强,忽略刺激的变化,神经元感觉钝化。

    ReLU函数只有两种情况,神经刺激小于阈值,忽略此刺激;神经刺激大于阈值,反应与刺激正比变化(y=x)。

    上述公式只针对三个输入神经元,一个输出神经元,那么如果有两个输出神经元呢?我们通常采用矩阵描述法。表示如下:

    y1 = activation function(x1*w11+x2*w21+x3*w31+b1)

    y2 = activation function(x1*w12+x2*w22+x3*w32+b2)

矩阵描述为:

    


    y = activation(x*w+b)

    输出 = 激活函数(输入x权重+偏差)

    与这种简单激活函数相对应的人工神经网络模型,有多层感知器(Multilayer Perceptron, MLP)模型,之所以叫多层感知器,就是因为它有多个隐藏层,当然也有输入层和输出层。一组输入信息,经过多个隐藏层之后再到达输出层,可以反复测试训练模型各层之间的参数是否正确,理论上用多层感知器模型训练一组数据,层数越多,训练越准,时间也越长。多层感知器模型的各层传导公式满足矩阵乘法规律,即若前层有5个神经元,后层有10个神经元,那么两层间公式中的权重矩阵为5*10矩阵,输入矩阵为1*5,系数矩阵为1*10,输出矩阵也是1*10.

    介绍了人工神经网络的模式,再来介绍如何利用人工神经网络搞事情。我们要引入新的概念方法,反向传播法(Back Progagation),与优化器(Optimizer)结合使用,这是一种监督学习中常用的方法,必须输入特征值(features)和真实值(label)。

    以多层感知器模型识别MNIST手写数字图像为例(后续会提到这个实例),训练前,必须将MNIST数据集经过数据预处理,才可以用于后续训练。预处理后,建立多层感知模型,并以随机数初始化模型参数。接下来就是反向传播啦。

    因为我们是随机数初始化模型参数,所以初始化的模型,一定是一个十分奇怪的模型!我们将预处理后的数据features传入该模型,经过多层感知,会得到一个预测的结果(predict),我们将这个predict和之前的真实值label,传入数学中的损失函数(loss function)计算误差,当然了,未调整的初始化模型的误差一定惊人的大。损失函数为我们算出了误差,把误差给优化器(optimizer),这个优化器的作用是根据误差,来更新模型的参数,使下一次的误差能够更小。反复训练,每次训练时将训练数据分为多个批次(batch size),每次读取一批数据给模型,让它训练,让优化器不断更新参数,直到误差(loss)收敛。注意,是误差收敛而不是误差为0,因为这种训练方法不一定可以使模型对特征的预测完全准确,误差收敛只能说明,这个模型已经训练完毕,这种算法已经尽力了。

    这种反向传播使loss不断减小收敛,更新参数的过程,可以理解为将loss值定义成一个函数loss,函数的自变量为权重参数和偏差值参数,但是,我们能想象出来的函数最多有三个自变量,多层感知器中的参数数量实在太大了,如果要画在一个空间的话,那也是非常多维的空间,loss是因变量,为了使loss不断下降,应用数学知识改变参数值,以求的loss的极小值(最小值)。常用的数学算法有SGD梯度下降法、RMSprop、adam等。

    更新完参数,就训练好了模型,之后就可以向模型中传入features,让模型预测结果啦!监督学习的过程基本就结束了。


参考文献

  1. https://www.zhihu.com/question/57770020
  2. 《机器学习》,周志华
  3. 《TensorFlow+Keras深度学习人工智能实践应用》,林大贵








    

猜你喜欢

转载自blog.csdn.net/qq_41662115/article/details/80038007
今日推荐