1、一元一次函数感知器
·预测函数模型——使用一个一元一次线性函数去模拟神经元的轴突、树突的行为
·前向传播——把统计观测而来的数据送入预测函数得到进行预测的过程
罗森布拉特感知器
调整w
人类提供w的初值,机器做w的修正
alpha 防止大幅度震荡的学习率
2、方差代价函数
·选择平方/均方误差作为误差的评估手段
误差e与w形成的代价函数是标准的一元二次函数,成为代价函数。
3、梯度下降和反向传播
根据斜率是否大于等于0来调整w的斜率。
随机梯度下降:在单个样本形成的代价函数上进行
加入b后,代价函数:
- 选择平方/均方误差作为误差的评估手段,而这个误差与预测函数中的参数(w、b)又会形成一种函数关系,把这个函数成为代价函数(或者方差代价函数),描述了预测函数的参数取不同值的时候,预测的不同的误差代价
- 反向传播——用这个代价函数去修正预测函数参数的过程 修正方法:梯度下降 (·前向传播——把统计观测而来的数据送入预测函数得到进行预测的过程)
- 训练(或学习)——反复利用前向传播与反向传播,最后到达代价函数最低点的过程
在w和b上分别求导,实现梯度下降
4、激活函数
对于两极分化的分类问题,神经元预测模型变的无效了
激活函数:
激活函数是非线性的,可以很好地用来分类,为机器学习注入灵魂
-
把sigmoid激活函数代入到预测模型中
-
代入激活函数的预测模型的代价函数是一个比较复杂的复合函数:
-
利用复合函数的链式求导法则,求出代价函数在w、b上的导数
-
然后再进行梯度下降进行参数调整
5、隐藏层
让预测函数产生山丘一样的曲线
让神经元形成一个网络
多添加了两个神经元,将数据分别送入这两个神经元进行计算,再把计算结果送入到第三个神经元进行计算,最后输出
通过增加对输入更多的抽象维度,产生更多的解读而实现更加复杂的分类效果。
隐藏层——中间这些新添加的神经元节点
正是隐藏层的存在,才让神经网络能在复杂情况下继续生效
隐藏层神经元的数量越多,皆可以产生越复杂的组合,解决越复杂的问题,计算量也随之越来越大
深度——一个神经网络中纵向的隐藏层比较多(很深)
深度神经网络——隐藏层超过三层
拉链式法则——通过反向传播把 误差 传播(或者说分配)到每个权重参数w和偏置项b上
把误差e传递到第二层的神经元两个权重参数上:
偏置项:
第一层第一个输入的权重w11_1
第一层第二个输入的权重w12_1
第一层第二个偏置项:
6、高维空间
接收两个参数的神经元(输入数据特征维度等于2)
7、初识Keras框架
发生在每一个元素上
- 自己实现一个神经元:
- 使用Keras框架实现一个神经元:
一层神经元都可以叫做Dense
8、深度学习
隐藏层需要多少神经元
简单的定性分析:
可以通过0.5等高线在俯视图上呈现一个闭合的圈圈,来划分所需要的隐藏层的神经元数量。
一个神经元就是一条直线,在这里如果两个神经元(两个直线)的话无法闭合,所以需要三个神经元。
二维是线,三维增加了厚度
异或:一样的1不一样的0
需要一层包含三个神经元的隐藏层
而这个网络很难训练:
当初选择sigmoid函数是因为:导数处处不为0,这样在反向传播的时候使用梯度下降算法来计算函数的导数,再用这个导数去修正参数
但是sigmoid函数有一个很严重的问题:
在函数远离中心点的位置,导数极其小,这样梯度下降就很难进行–>出现梯度消失的问题
所以现在人们普遍使用Relu函数作为激活函数
但是实际效果中发现直接使用Relu函数的效果比使用改进版Relu函数效果要好,所以还是普遍使用Relu函数(神经网络比较复杂,隐藏层神经元多)。
除Relu函数本身之外,还有更多会导致梯度消失的问题。
9、卷积神经网络
泛化能力:模型在测试集上的准确率
- 欠拟合:模型在训练集上准确率低,可能因为模型太过简单
- 过拟合(泛化能力不行):在训练集上准确率很高,在测试集上准确率出现明显下降(用过分复杂的模型去拟合一些实则比较简单的问题)
调整方法包括:
- 模型通过训练,有很好的泛化能力解决问题:在训练集、测试集上的准确率都很高,并且相差不大
- 几乎不存在:训练集准确率很低,但测试集准确率很高
卷积神经网络:
观察到一个图像数据在空间上,有不可分割的关联性,所以想到使用卷积神经网络。
卷积核的参数不是事先设置好的,是像普通神经元的权重一样通过训练学习得来的。
……
输出的是一个概率
归一化操作:把灰度值缩放到0~1之间
因为输入数据的灰度值在0-255之间,意味着某些黑暗部分的像素值很小,明亮部分的像素值很大。这样的数据会导致代价函数(碗状)很不友好(又宽又矮),使梯度下降变得困难。
变成0-1之间的值之后,代价函数会变得比较均匀,有利于梯度下降的进行
对于图像识别,一般采用卷积神经网络。
一个卷积核的训练效果是提取图像的一种特征,而我们需要提取图像更多 的特征,可以再搞一个卷积核提取第二种特征,再搞一个卷积核提取第三种特征……
池化层
最大池化层让大的值被筛选出来,能很好地提取主要特征。
池化层并不是必须的,但是加了之后往往效果不错。
池化操作因为是固定的套路,所以在反向传播中没有任何需要学习的参数。
- 输入是一个32*32的灰度图
- 通过第一层卷积层之后变成28286的
所以使用了一个55的卷积核(有公式)
如果把mnist图片用55的卷积核去卷,就得到了一个24*24的图片 - 用了6个卷积核,所以结果通道数为6
- 池化
- 全连接层
10、循环神经网络
观察到一个图像数据在空间上有不可分割的关联性 --> 使用卷积神经网络。
在时间上也可能是如此,如气温数据、股票数据等。最典型的是人类的语言:
- 声波随着时间通过耳朵传入大脑,一句话完整的音波说完才知道意思是什么。
- 字或者单词随着时间逐个通过眼睛进入大脑,读完之后才知道这句话表达什么。
神经网络该如何处理这种有关联性的数据呢?以文字举例:
- 一般把词作为自然语言处理的基本单位
- 英文:可通过空格进行分词。在字典中依次找出这些词出现的位置并依此标号,将句子转化为向量,送入神经网络。
- 中文:无法通过空格进行分词。先进行分词操作。往后的处理方式与英文相似。但是会出现一些问题:
所以需要对词汇的表示法方法做进一步处理。
但是特征提取不当的数据会使神经网络变得难以训练和泛化。 - 词向量
将特征组成向量
以包含了两个特征的二维向量为例:词义越相近的词的距离越近,反之越远。
一个词的词向量减去另一个词的词向量,距离小。警察与小偷的关系与猫和老鼠的关系十分相似。
NLP:词嵌入技术。 把词嵌入到一个特征向量空间 - 提取词向量
1、嵌入矩阵
2、给所有的词做onehot编码,将所有词的onehot编码做成一个矩阵
3、让嵌入矩阵点乘onehot矩阵
4、把这个句子变成词向量矩阵,每一列都是句子中对应的词向量
有了这个嵌入矩阵,可以把一句话中所有的词转换为词向量
5、如果后面接的是全连接神经网络,就把这些词向量铺开作为输入
经过前向传播,得到预测输出
在反向传播时,由于词向量矩阵的运算方法与一个普通全连接层的线性运算部分一样,所以把它称为嵌入层
误差通过反向传播可以继续传递到词嵌入层,并更新(词嵌入矩阵)
嵌入矩阵:词汇表的词向量集合
所以词向量就可以像卷积神经网络中的卷积核那样,在训练中不断学习,最后自己学习到合适的词向量表示
每个特征的含义到了训练最后都会变得很抽象了,但肯定是捕捉到了一定的特征
一般是去使用别人在海量数据上训练好的词向量数据,应用到我们自己的工程中
替换自己的词向量矩阵,并且叫它(自己的)不再更新
11、LSTM网络(长短时记忆网络)
适合序列处理 处理关联的能力
自然语言处理实践
循环神经网络:RNN:
此处的激活函数多采用双曲正切函数tanh,而不是relu(用relu也行)。
像Keras这种编程框架中循环神经网络,默认用tanh
循环神经网络中的第一步不像其他步那样有来自上一步输出的结果一起输入,为了保证每一步操作的统一性,一般会手动添加一个共同输入x0(比如一个为全0的向量) x0,x1 -> a1
经过多次重复,就有机会把这个“好看”的正面意思消解掉,让最后的预测值做出改变,从而产生负向的分类结果。
再加一层RNN
一般2~3层
LSTM:长短时记忆网络:应对更长的序列依赖
除了输入输出以外,还添加了细胞状态的概念(遗忘门、记忆门……)
GRU结构:简化LSTM的结构,很多时候结果相近,目前大家乐于使用GRU