机器学习之路
1.初始机器学习
1.1 机器学习
1.1.1 样例引入

训练集:包含一些列按照特征分类的数据样本
标签向量:训练集与其对应类别的集合
模型的训练:根据已知数据集特征总结相对应规律,模拟人的学习过程

测试集:使用已有模型检验的数据集
机器学习中模型组合特征方式有:
- 非参数化:例如KNN,通过计算距离(知识通过计算),找到相邻的K个来进行分类
- 参数化:每个标签输出都是根据复杂的计算得出的,学到的知识通过数值权重存储下来
对于整个机器学习的过程如下:

其实就是通过不断的 训练 -> 检测 ->再优化,从而实现最佳的模型
1.1.2三种机器学习问题
机器学习按照应用场景分为以下三类:
- 有监督机器学习:主要解决分类问题(是否)、回归问题(预测)
- 无监督机器学习:只是简单对训练集数据进行规律的寻找
- 强化学习:在特点训练集下使用策略达到”最佳“结果
1.2 KNN
KNN模型是一个非参数化模型,即KNN学到的知识不是通过存储数据权值,而是通过找距离最近的K个样本,通过这K个样本进行类型的判断,且常用于分类问题。
举例如下:

由此可得KNN算法过程:计算举例 -> 选择最佳K个 -> 进行分类判断
1.3 逻辑分类模型I
1.3.1 参数化的模型
参数化的模型: 用权值的数学表达式方式输入组合特征数值
例如:计算是否为毒蘑菇的分数,$ source = 3*x_1+x_2 - 0.4 $

1.3.2 逻辑分类: 预测
把每个特征对分类结果的“作用”加起来,这就是**线性模型**
逻辑分类模型就是一种线性模型,可以表示为 $ y = w * x + b $, 其中w是权值参数,x是样本特征数据,b是偏置
逻辑分类模型预测一个样本分为三步:
- 计算线性函数
- 从分数到概率的转换
- 从概率到标签的转换
1.计算线性函数
通过计算提前得知的 $ y = w * x + b $,计算出对应的分数

其中,线性函数是训练模型的目标,为了就是让预测值更加可靠。
2.从分数到概率
当只有一种类别需要进行分类时,使用Sigmoid函数,当有多种类别需要进行分类时,使用Softmax函数。
Sigmoid函数
使用Sigmoid函数时,首先需要设置一个函数阈值,当得到的结果大于该阈值时,就认为是这一类别
$ Sigmoid(x) = \frac{1}{1 + e^{-x}} $
通过这样可将分数转化为概率,其范围为(0, 1),以对数形式完成映射,凸显大的分数的作用
例如:
Softmax函数
当有多种类别标签时,概率值最高的那一项就是预测模型的标签
$ Softmax(s) = \frac{e{s{i}}}{\sum_{j}e{s{j}}} $
Softmax函数和Sigmoid函数类似,完成从分数到概率的转换
例如:
3.从概率到类别
从概率到类别,可以直接选择概率最高的类别作为预测的类别标签

总计一下逻辑分类的步骤:
1.通过线性函数,将x样本特征数据转化成预测的分数
2.通过Softmax函数将分数转化成概率向量P
3.将概率向量P转化成类别y,选择概率最高的那个类别作为最终类别
总体步骤为:线性函数 -> 概率 -> 类别
1.3.3 逻辑分类: 评估
当使用模型完成一次预测之后,想要评估模型的准确度,此时就需要将预测样本和真实样本进行对比
真实样本数据转化为以下的向量

此时就有$ y =\begin{bmatrix}
1\
0\
1
\end{bmatrix}
和
和
和 p=\begin{bmatrix}
0.7\
0.2\
0.1
\end{bmatrix}
$,通过对比两个概率向量的差异程度来评价模型的准确度
通过使用交叉熵来计算两个概率分布向量的差异程度
$ D(y,p) = yln§ + (1 - y)(1 - ln§) $
当交叉熵的值越高,代表两个概率分布向量越相似,模型预测越准确
而在评估模型准确度时,使用$ Error = -D(y,p)
$,这个值越小,模型对样本预测越准确
1.3.4 逻辑分类: 训练
此时,就知道衡量一个模型预测的指标了,就是Error,因此需要所有预测的样本Error值最小,以达到相对来说最准确的模型,即 $ find: w、b = min(\sum{Error}) $
这就是训练模型的核心,此时交叉熵就是模型的损失函数
$ loss(w,b) = -\frac{1}{M}\sum_{i}{D(y_{i},p_{i})} $
此时要做的就是想办法找到最小的loss(w,b)值
1.4 逻辑分类模型II
1.4.1 寻找模型的权重
训练模型的目的是为了寻找到最佳的w、b的权重值,以使loss(w,b) 达到最小,但是有不能盲目的搜索,需要有一个搜索的方法或者方向
1.求最小权重(偏导数)
当损失函数只有一个参数时,可以使用求偏导数来求得loss(w),最小点为导数为0,且左导数<0 and 右导数 >0,此时函数的图像类似下图:
图像程左减右增趋势
通过上面的思路可以设计一套流程,从而实现对最小函数值的寻找
(1)随机选择起始点($ x_0,y_0 $)
(2)计算当前点导数, 按照某个方向进行下一步,使得$ x_1 = x_0 - \alpha k_0 ,此处 ,此处 ,此处 k_0 = \frac {\partial y } {\partial x} $, $ \alpha $代表这一步的长度,叫学习速率
然后通过不断进行步骤(2),最终达到逐渐收敛,取得最小的函数值,如下:

2.寻找模型的参数组合
对于对参数的样例,同样的执行下面步骤
(1)随机选择点($ w_1, w_2 $)
(2)执行迭代
$ w_1 = w_1 - \alpha\frac {\partial} {\partial w_1}loss(w_1,w_2) $
$ w_2 = w_2 - \alpha\frac {\partial} {\partial w_2}loss(w_1,w_2) $
$ b = b - \alpha(y-y_p) $
不断重复(2),直到点的运动逐渐收敛,这套流程就叫做**梯度下降**

但是梯度下降的问题就是,当选择随机点从而得到的收敛点,这是一个"局部最优解",不能保证是最优解,如重新选择一个随机点进行梯度下降达到的收敛点可能和第一次选择达到的收敛点不同

3.设置学习速率
关于学习速率的问题:
(1)当学习速率过小时,梯度下降的速率将会很慢

(2)当学习速率过大时,梯度下降的最终结果可能达不到收敛

1.4.2 去均值和归一化
当数据采集的参数跨度比较大时,例如 x = [300 2 5 3],此时进行梯度下降时,可能回导致下降过程中走许多弯路,如下:

如果要解决这个问题,可以让数据集中数据均值为0,方差相似,也就是进行去均值化和归一化。
均值:$ \mu = \frac{\sum_{i=1}^{N} X_{i}}{N} $
方差:$ \sigma^2 = \frac{\sum_{i=1}^{n} (X_{i}-\mu)^2}{n} $
去均值化:只需要按照$ x_i = \frac{x_i - \text{mean}(X)}{\text{std}(X)} $ 预处理数据,将数据中心移动到0点就完成
归一化:将数据缩至指定范围
去均值化和归一化的优点:训练时收敛速度更快、收敛效果更平稳。归一化回将数据集的数据缩进一定范围,方便观察。
2.机器学习进阶
2.1 特征工程
主要介绍介绍数据、特征处理技巧
2.1.1 泰坦尼克号预测(例)
通过船上乘客的特征来预测乘客是否回死亡
1.任务描述

2.观察数据集
观察数据时,需要关注:
- 采集样本是否有缺失
- 不同类别的样本数量是否分布均匀
3.数据预处理

观察得,Survived为目标预测值,PassengerId(乘客号)、Ticket(机票号)、Name(姓名),这些特征应与模型预测无关
2.1.2 两类特征
剩下的特征可以分为两类:
- 数值意义的特征:年龄Age、票价Fare、兄弟姐妹/配偶数量SibSp、父母/孩子数量Parch
- 类别意义的特征:几等舱Pclass、性别Sex、登船港口Embarked、客舱Cabin,对于该特征中的数值只具有分类类别意义
1.处理数据缺失(数值特征)
处理数据缺失时,要求就是尽量保证原始数据状态,有以下集中处理方式:
- 扔掉缺失数据,不建议小数据集使用
- 按照某个统计量补全,统计量可以是均值、定值、中位数
- 那模型预测补充
对于泰坦尼克号数据集,其规模较小,不建议直接扔掉数据,因此可以采用模型预测补充或者统计量补充,这里采用均值(统计量)补充
2.归一化处理数据
观察数据可知,票价Fare、年龄Age这两个特征和其他特征不在同一比较尺度上,所以需要对其进行归一化

3.处理类别意义的特征
对于类别意义的特征,数值大小没有任何意义,只需要关注的就是 "是"这一类或者"不是"这一类,即 只需要0 和 1取值,因此对类别意义的特征按照特征标签进行展开,转化为只有0、1取值的特征。转化后如下:

2.1.3 构造非线性特征
对于我们使用的逻辑分类模型,其属于线性分类模型,对于线性特征可以进行类似$ y = x_1 + x_2 ,但是对于非线性特征就无法表示,例如 ,但是对于非线性特征就无法表示,例如 ,但是对于非线性特征就无法表示,例如 y = x_1 * x_2 $,因此需要通过构造新特征来弥补空缺
特征的非线性的表达式可以分为以下两种:
(1)用于表达“数值特征”本身的非线性因素,指的是特征的分类的总用不是线性关系,例如特征值为1、3,但是对分类的作用却是ln1、ln3,本质上是数字的线性数量描述不符合真实的关系描述。
(2)用于表达特征与特征之间的非线性关联,且这种关联关系对分类有帮助
对于第一种解决方法有两种:多项式化和离散化
- 多项式化:将原有数值的高次方作为特征,让数值内在表达边复杂,可描述能力增强
- 离散化:将连续的数值划分为一个个区间,以数值是否在区间内作为特征,离散化然后模型拟合逼近真实的关系描述
例如进行如下的多项式化:

1.评估特征作用
评估特征作用最常用方法:
- 加进去看模型成绩是否提升
- 观察模型给特征分配的权重,看特征发挥作用的大小

例如上表中,Child发挥了作用,而 AgeAge_scaled 和 AgeClass_scaled没用发挥什么总用
2.构造特征的数学意义
可以构造特征的原因:
:::success
低维的非线性关系可以在高维空间中进行线性展开
:::
2.2 调试模型
2.2.1 过拟合和欠拟合
1.过拟合
随着特征的数量的增加到达一定程度时,训练集的成绩回逐渐增加,但是测试集的成绩缺在下降。如下图:

黑色实线是期待的分类边界曲线,而虚线是实际的分类边界曲线。造成这一现象的原因是 由于训练集和测试集的差异,每个特征又都努力让模型的成绩达到最好,因此就会导致在训练集上得到好的成绩,而到了测试集上有差强人意了。
常用解决方法:在损失函数中添加一个正则化参数C,用于控制分类边界的样本的辨识度,用$ \frac{1}{C} 乘上权重矩阵的平方 乘上权重矩阵的平方 乘上权重矩阵的平方 {w^T w} $,使得新的损失函数变为
$ \text{loss}(w, b) = -\frac{1}{M} \sum_{i} D(y_i, p_i) + \frac{1}{M} \cdot \frac{w^T w}{C} $
这种正则化叫L2正则化,若使用$ \frac{|w|}{C} $正则,则叫L1正则化。
正则化参数C作用:用于控制正则化项的影响程度。C的值越大,正则化影响越小,模型可以更复杂;C的值越小,正则化影响越大,模型倾向更简单。
解决过拟合的方法:
- 减少特征,降低模型复杂度
- 减小正则化参数C
- 增加训练数据量
2.欠拟合
欠拟合是指模型能力不足,即模型过于简答,没有表达数据集的内在表达式。

解决方法:
- 增加特征,提升模型复杂度
- 增大调试参数C
2.2.2 调试模型参数


1.待调试的参数
对于KNN中待调试的参数是K值(近邻的数量),而在逻辑分类模型中,由于要解决过拟合和欠拟合增加了正则化参数C,因此调试参数变为C
2.交叉验证(Cross-vaildation)
:::success
调试思路:使用训练集数据训练模型,使用测试集数据测试成绩,选择成绩最好的那一组参数作为模型参数。
这种思路就叫做交叉验证。
:::
由于模型对数据有“记忆”,因此为了防止模型对数据“记忆过度”,采用 N-fold 交叉验证(N-fold Cross-validation)。其过程为,
- 数据划分
- 将数据集平局划分为N个子集
- 模型训练与验证
- 进行N次训练和验证,每次选择一个子集作为验证集,其他N-1个子集作为训练集
- 性能评估
- 记录每次循环的性能指标,最后取平均值作为最终结果
例如:

3.GridSearch
GridSearch可通过设置一个参数搜索空间,暴力搜索所有参数组合,可同时寻找到多个最优参数。
其算法步骤:
(1) 定义参数搜索范围
(2)再数据尝试所有参数组合
2.3 分类模型评估指标
只要介绍分类模型的评估指标(Metric)
2.3.1 混淆举证系指标
大多数指标都是基于二分类评估的指标,二分类就是指只针对一种类别的辨别能力,其中标签为1表示是这种类别,叫做“正样本”,相反标签为0表示不是这种类别,叫做“负样本”。
1.混淆矩阵
混淆矩阵将预标签数量和真实标签数量进行统计,放入矩阵中。其物理意义是观察模型对样本预测成绩的数量分布。例如预测值只分为0。
按混淆矩阵计算方法分为4类:
- TP(True Positives):模型预测为1,并且真实样本也为1。
- TN(True Negatives):模型预测为0,并且真实样本也为0。
- FP(False Positives):模型预测为1,但真实样本0。
- FN(False Negatives):模型预测为1,但真实样本1。
例如泰坦尼克号数据集生成的混淆矩阵如下:


通过混淆矩阵可以衍生出一些其他指标:
- 准确率(Accuracy)
- 精确率和召回率(Percision-Recall)
- F1分数(F1-Score)
2.准确率
用于描述模型正确分类标签的比例:
$ Accuracy = \frac{TP + TN}{TP + TN + FP + FN} $
可以对模型的分类能力进行评估
3.精确率和召回率
精确率和召回率是二分类指标,取值在0和1之间,其中精确率用于评估模型中预测数据中正样本的准确率:
$ Precision = \frac{TP}{TP + FP} $
召回率评估模型中预测数据中正样本的覆盖率:
$ Recall = \frac{TP}{TP + FN} $
:::success
对于精确率表示所有预测为True,其结果为True所占的比例
对于召回率表示所有结果为True,其预测为True所占的比例
:::
4.F1分数
通常情况下精确率和召回率之间是相互矛盾的,一般值选择其中一个使用,但是当两者几乎同等重要时,可以使用F1分数评估模型的表现
$ F1 = \frac{1}{\frac{1}{Precison} + \frac{1}{Recall}} = \frac{2 * Precision * Recall}{Precision + Recall} $
5.多分类的指标
二分类的评估指标也可以拓展到多分类问题中,解决思路就是将多分类问题看作多个二分类问题来解决,例如下图的混淆矩阵:

2.3.2 评估曲线
1.ROC曲线
ROC曲线用于评估模型分类能力,其横坐标表示为 $ FPR = \frac{FP}{FP + TN} $,其为负样本的召回率;纵坐标表示为 $ TPR = \frac{TP}{TP + FN} $,表示为正样本的召回率。
:::success
除此之外还需要设置一个阈值,当概率大于这个与阈值时,代表这个预测正确,小于这个阈值时表示预测错误,由此可以确定混淆矩阵,从而确定FPR和TPR,也就是确定每个阈值情况小ROC曲线上点的坐标,当阈值从0到最大概率的过程中,每个阈值确定一个点,从而连接成ROC曲线。
:::
例如:

如何通过ROC曲线判断分类模型的效果更好呢?

针对FPR和TPR的意义,希望正样本的召回率更大,负样本的召回率更小,也就是TPR越大越好,FPR越小越好,因此曲线越靠近左上角,分类器的效果更好,再上图中B的效果比A更好。
2.AUC指标
如果量化某个分类模型的效果呢?
可以是使用AUC,就是ROC曲线和坐标轴围成图形的面积,面积越大,分类模型的效果就越好。
2.4 回归模型
2.4.1 回归与分类
分类问题和回归问题的区别最明显就是设定的目标值类型不同,分类问题的目标值是离散的,意义是”分类“;回归问题的目标值是连续的,意义是某种“数值”。
例如花卉问题中,如果是分类问题就是“区分花卉的类别”,如果是回归问题就可以使“花朵的大小“。
分类问题和回归问题的主要区别在:
- 目标数值的类型不同(离散值 与 连续值)
- 损失函数设计不同
- 评估指标选择不同
2.4.2 线性回归
由于线性回归目标数值要为连续值,因此取出了“分数->概率”这一步,直接让输入数据经过线性函数,得到的输出数值就是模型对样本的预测值。


简洁明了的表达,线性回归模型就是将数据拟合成一条直线,即 $ y = w * x + b $,尽量将所有点拟合到这条直线上。

当然,对于某些非线性的特征可以通过构造新特征来增强拟合,从而弥补模型对非线性关系描述的缺陷。

1.损失函数
对于线性回归的损失函数用真实值和预测值距离的平方表示
$ \text{loss}(w, b) = -\frac{1}{M} \sum_{i} \quad (y - y_{\text{pred}})^2 $
为什么要使用距离的平方来作为损失函数,此处的平方可以放大那些预测偏差程度大的差错,以便更好的进行求出损失函数中w、b,同时计算损失函数中w、b还是使用梯度下降。
2.评估指标

评估指标用于评估预测值与真实值之间的误差。
- 平均绝对值误差MAE(Mean Absolute Error, MAE)
$ \text{mean_absolute_error} = \frac{1}{n} \sum_{i=1}^{n} |y_i - y_{\text{pred}_i}| $
-
中位数绝对误差(Median Absolute Error)
$ \text{median\_absolute\_error} = median(|y_i - y_{\text{pred}_i}|) $ -
均方误差MSE(Mean Squared Error)
$ \text{mean_squared_error} = \frac{1}{n} \sum_{i=1}^{n} (y_i - y_{\text{pred}_i})^2 $
- 确定系数$ r^2 $(Coefficient of Determination
$ r^2 $由SSE和SST决定
- SSE:预测值和真实值的误差的平方$ SSE = \sum_{i=1}^{n} (y_i - y_{\text{pred}_i})^2 $
- SST: 真实值和真实均值的平方和 $ SSE = \sum_{i=1}^{n} (y_i - y_{\text{mean}_i})^2 $ $ r^2 = 1 - \frac{\text{SSE}}{\text{SST}} $
$ r^2 $表示一个预测的好坏,取值范围为[0, 1], 越接近1代表模型对数据拟合越好,反之模型对数据拟合越差。
2.4.3 波士顿房价预测(例)
通过这个例子,将上面的知识进行串联。
1.任务描述
采用14个特征维度,最后一个MEDV房价是要预测的数值。目标就是建立线性回归模型,来预测波士顿房价MEDV。

输出的波士顿房价数据采样如下:

2.观察数据集
主要任务就是观察数据集是否有数据缺失和数据是否分布均匀。
3.训练模型
通过使用梯度下降法找到模型理想的参数,需要注意的是进行训练模型时,可能需要进行归一化,用来解决“**数据不在同一尺度上”**的问题。
4.预测并评估模型
这里使用$ r^2 作为模型评估指标, 作为模型评估指标, 作为模型评估指标, r^2 $越接近1,表示模型对数据拟合的效果就越好。
5.优化模型
用多项式展开的方式构造新的特征$ (x_1 + x_2 + \ldots)^n = x_1^n + n x_1^{n-1} x_2 + n x_1^{n-1} x_3 + \cdots $。我们只需设置展开的多项式维度n即可。
2.4.4 泰坦尼克号预测(残留问题)
在对泰坦尼克号生存预测模型中,观察数据集发现年龄Age数据有缺失,当时采用的方法是使用均值来代替,但是这种方法显然在这个小数据集中不合适,我们应该使用线性回归模型来预测缺失的Age年龄数据。
2.4.5 线性模型与非线性模型
小结一下,了解的非线性模型主要有KNN(K临近算法,非参数化),线性模型主要有线性回归模型(回归,参数化)、逻辑分类模型(分类,参数化)。
2.5 决策树模型
决策树模型 ——> 参数化的非线性模型。
:::success
非线性模型需要额外构造非线性特征,相比于线性模型训练速度会变慢,但是不同于多项式的线性模型,非线性模型将会从一个新的角度来描述事物内在的规律。
:::
2.5.1 信息与编码
信息量:一个可以度量的编码程度,以bit为单位。
在一个给定的数据集中,如何计算出数据集中信息量的大小呢?可以通过下面的公式:
$ H(X) = -\sum_{i} P(x_i) \log_2 P(x_i) \quad \text{( P ( x i ) P(x_i) P(xi): 事件 x i x_i xi出现的概率)} $
当传递答案A、B、C、D时,00-A,01-B,10-C,11-D,这样的代表时,每个选项的概率都相同为$ \frac{1}{4} ,此时的信息量为 ,此时的信息量为 ,此时的信息量为 H(X) = -\sum_{i=1}^{4} \frac{1}{4} \cdot \log_2\left(\frac{1}{4}\right) = 2 $。
可以得出:数据集中样本标签的信息量多少 = 编码数据集中所有样本标签所需要的最短字符的长度。
当奇数题目的答案不是A就是C,偶数题目的答案不是B就是D,0-A或者B,1-C或者D,此时对于每个编号概率都为$ \frac{1}{2} $,此时的信息量为
$ \begin{align*}
H’(X) &= \sum H_i(X) = \frac{1}{2} \cdot H(\text{奇数题集}) + \frac{1}{2} \cdot H(\text{偶数题集}) \
&= \frac{1}{2} \cdot \left(-\sum_{i=1}^{2} \frac{1}{2} \cdot \log_2\left(\frac{1}{2}\right)\right) + \frac{1}{2} \cdot \left(-\sum_{i=1}^{2} \frac{1}{2} \cdot \log_2\left(\frac{1}{2}\right)\right) = 1
\end{align*} $。

:::success
由此可以达到一个结论,按照有效的特征条件划分数据集时,数据集的标签信息量会减少。这个特征越有效,信息量减少的就越多。
:::
2.5.2 决策树
由上面的结论可得,减少样本集信息量的方法,而决策树就是按照这一思路来设计的,即寻找样本特征中使整体样本信息下降最快的特征作为树的节点,从而建立树模型。其具体算法执行过程如下:
(1)起始N=1个样本群集S(N=1)和一个特征集F$ x $。
(2)对于N个样本集,依次计算每个特征作为分割节点,得到整体样本下降的信息量。
(3)选择一个使决策树信息量下降最快的特征$ f_i $和样本集进行分割。
(4)从特征集中去掉$ f_i $,去掉旧样本集,新生成的两个子样本集加入S(N)-> S(N + 2 - 1 = N - 1)。
(5)递归执行(2)至(4)部,直至特征集为空或者达到指定的树深度。
2.5.3 对比线性模型和决策树模型的表现
通过对比可得,非线性模型相对于线性模型性能只有微弱的提升。在实际工程中,原始的数据总量、数据质量、特质质量很大程度上决定了模型的表现成绩,对于模型只是锦上添花。
2.6 模型融合
对于不同的模型都有其针对性解决的问题,例如KNN通过权衡相似的临近归纳;线性模型假设特征的作用是线性积累的;SVM(Support Vector Machine支持向量机)通过权衡样本分布的边界距离找到类别分界。那如果处理数据时,没有上述模型对应的特征呢?
此时,面对样本倾向并不明确的任务,需要消除模型的独特个性,让模型从多个角度观察样本集,即模型融合。
2.6.1 融合成群体(Ensamble)
使用模型群体可以使群体系统有更高的健壮性,更不容易发生过拟合,从而表现出更好的成绩。
模型的个性来源于个体模型之间处理数据集的方式和角度的差异,这种尤为适合非线性模型,因此其表达能力更强,更容易过度拟合数据集,具体表现为成绩在不同数据集中波动程度更大,适应力更低。
模型融合具体实现,按照思路不同可以分为三种:
- Bagging
- Boosting
- Stacking
其中Bagging和Boosting用在融合同类型的模型,Stacking用于融合不同类型的模型。但是三种方式都关注两点。
(1)如何保证个体差异
(2)以什么方式如何差异个体的投票,作为最终判断。
2.6.2 Bagging: 随机森林(Random Forest)
Bagging适用于同类型的模型,使其形成模型群体。每个模型不在训练全部的训练集样本,而是在训练集的有回放抽样的随机子集中训练样本;预测样本时等权重投票。Baggin通过构造数据集的随机子集保证模型个体差异,等权重融合模型个体的预测。
基于 Baggimg 思路改进实现的决策树群体模型就是随机森林(RandomForest)。随机森林在实现上不仅使用训练集的子集,同时在决策树建立树节点时只在特征集的子集中挑选。由于决策树特征层级(特征节点的选择顺序)的特性是对成绩影响很大,因此这种方式使构造出的个体内在的个性很鲜明,是理想的群体成员。
2.6.3 Boosting:GBDT
Bagging利用随机采样集合构造个体差异,盲目保证了“个性”。Boosting的思路是,依次生成一个模型个体序列$ M(M_1,M_2…,M_n) $,其中,后续的模型会尝试修正前面模型的错误。Boosting有多种版本实现,其中最常用Ada-Boosting和Gradient-Boosting。
以分类模型介绍上面两种版本。
Ada-Boosting 的核心思想是使序列的下一个模型更关注之前的错误样本。具体的执行步骤如下。
(1)为整个数据集的每个样本分配一个权重$ s_1,s_2…,s_n $,直观理解:权重代表模型在训练时对样本的“重视度”。
(2)在整个数据集上训练模型$ m_i ,并执行分类预测,对应的正确率为 ,并执行分类预测,对应的正确率为 ,并执行分类预测,对应的正确率为 acc_i $。
(3)评估模型$ M_i $;对每个样本j的分类正确与否,如果分错该样本,则增大样本对应的权重S,即让下一个模型更关注之前的错误样本。
(4)重复步骤2至3,直至构造出n个模型个体。
(5)归一化序列[$ acc_1 $$ acc_2 … , …, …, acc_n ] ,使其累加和等于 1 ,得到新的序列 [ W 1 , W 2. … , w n ] 最终模型对某个类别的预测概率值等于每个模型预测的加权和 : ],使其累加和等于 1,得到新的序列[W1,W2.…,wn]最终模型对某个类别的预测概率值等于每个模型预测的加权和: ],使其累加和等于1,得到新的序列[W1,W2.…,wn]最终模型对某个类别的预测概率值等于每个模型预测的加权和: M(M_1,M_2…,M_n)= \sum_{i} w_i \cdot M_i $。
注:对于回归问题,只需要替换(2)中的评估指标。
Gradien-Boosting的核心思想是:序列的后续模型不再直接预测数据集的预测值,而是预测之前模型的预测值和真实值的差值。
训练模型 $ M_{1} < f o n t s t y l e = " c o l o r : r g b a ( 0 , 0 , 0 , 0.9 ) ; " > ,得出预测值,这时模型的整体预测值为: < / f o n t > <font style="color:rgba(0, 0, 0, 0.9);">,得出预测值,这时模型的整体预测值为:</font> <fontstyle="color:rgba(0,0,0,0.9);">,得出预测值,这时模型的整体预测值为:</font> y_{\text{pred}} = y_{\text{pred}_1} $。
计算上一步预测值和真实值的差值: $ dy_1 = y_{\text{pred}1} - y < f o n t s t y l e = " c o l o r : r g b a ( 0 , 0 , 0 , 0.9 ) ; " > ,将这个值作为模型 < / f o n t > < f o n t s t y l e = " c o l o r : r g b a ( 0 , 0 , 0 , 0.9 ) ; " > M < / f o n t > < f o n t s t y l e = " c o l o r : r g b a ( 0 , 0 , 0 , 0.9 ) ; " > 2 待预测的目标值,模型转而开始预测之前模型的预测值和真实值的差值。这时,总模型的预测值为 < / f o n t > <font style="color:rgba(0, 0, 0, 0.9);">,将这个值作为模型 </font>_<font style="color:rgba(0, 0, 0, 0.9);">M</font>_<font style="color:rgba(0, 0, 0, 0.9);">2 待预测的目标值,模型转而开始预测之前模型的预测值和真实值的差值。这时,总模型的预测值为 </font> <fontstyle="color:rgba(0,0,0,0.9);">,将这个值作为模型</font><fontstyle="color:rgba(0,0,0,0.9);">M</font><fontstyle="color:rgba(0,0,0,0.9);">2待预测的目标值,模型转而开始预测之前模型的预测值和真实值的差值。这时,总模型的预测值为</font> y{\text{pred}} = y_{\text{pred}1} + dy{\text{pred}_2} $。
模型 $ M_{i+1} < f o n t s t y l e = " c o l o r : r g b a ( 0 , 0 , 0 , 0.9 ) ; " > 预测前 < / f o n t > < f o n t s t y l e = " c o l o r : r g b a ( 0 , 0 , 0 , 0.9 ) ; " > i < / f o n t > < f o n t s t y l e = " c o l o r : r g b a ( 0 , 0 , 0 , 0.9 ) ; " > 个模型预测值之和与真实值之间的差值,这一步用到了梯度下降和模型前 < / f o n t > < f o n t s t y l e = " c o l o r : r g b a ( 0 , 0 , 0 , 0.9 ) ; " > i < / f o n t > < f o n t s t y l e = " c o l o r : r g b a ( 0 , 0 , 0 , 0.9 ) ; " > 个模型中预测值和真实值的差值: < / f o n t > <font style="color:rgba(0, 0, 0, 0.9);"> 预测前 </font>_<font style="color:rgba(0, 0, 0, 0.9);">i</font>_<font style="color:rgba(0, 0, 0, 0.9);"> 个模型预测值之和与真实值之间的差值,这一步用到了梯度下降和模型前 </font>_<font style="color:rgba(0, 0, 0, 0.9);">i</font>_<font style="color:rgba(0, 0, 0, 0.9);"> 个模型中预测值和真实值的差值: </font> <fontstyle="color:rgba(0,0,0,0.9);">预测前</font><fontstyle="color:rgba(0,0,0,0.9);">i</font><fontstyle="color:rgba(0,0,0,0.9);">个模型预测值之和与真实值之间的差值,这一步用到了梯度下降和模型前</font><fontstyle="color:rgba(0,0,0,0.9);">i</font><fontstyle="color:rgba(0,0,0,0.9);">个模型中预测值和真实值的差值:</font> dy_1,…dy_i < f o n t s t y l e = " c o l o r : r g b a ( 0 , 0 , 0 , 0.9 ) ; " > ,获得预测值 < / f o n t > <font style="color:rgba(0, 0, 0, 0.9);">,获得预测值 </font> <fontstyle="color:rgba(0,0,0,0.9);">,获得预测值</font> dy_pred_{i+1} $。
重复第二步,得到多个预测数值序列 [$ dy_1,dy_2,…,dy_n < f o n t s t y l e = " c o l o r : r g b a ( 0 , 0 , 0 , 0.9 ) ; " > ] ,最终的融合预测为: < / f o n t > <font style="color:rgba(0, 0, 0, 0.9);">],最终的融合预测为: </font> <fontstyle="color:rgba(0,0,0,0.9);">],最终的融合预测为:</font> y_{\text{pred}} = y_{\text{pred}1} + \sum{i} dy_{\text{pred}_i} $。
2.6.4 Stacking
Stacking用于不同类型的模型个体之间的融合。常用的融合方式有两种:
(1)加权投票:将每个模型的成绩作为权重,最终预测值是每个模型乘以权重,然后相加。
(2)通过一个新的模型融合多个模型个体,新模型一般是线性模型。
2.6.5 小结
通过总结,工程实现基本分为五步:
(1)数据预处理
(2)选择模型
(3)GridSearch刷选模型预设参数
(4)训练模型
(5)调试,数据预处理优化、特征优化或者模型优化(更换模型或者模型融合)
给出 各个环节对最终任务的提升比例图:

4.深度学习:背景和工具
4.1 背景
4.1.1 强人工智能和弱人工智能
强人工智能:让机器真正的思考。
弱人工智能:让机器表现出智能的行为。弱人工智能是通过计算机的运算能力和海量的历史数据来伪装出来智能的行为。
4.1.2 机器学习和深度学习
深度学习是机器学习的一个分支,深度学习模型的学术别名是**人工神经网络。**深度学习同样是研究实现弱人工智能的科学。其主要借鉴了统计学和生物学的一些知识。
4.2 深度学习框架简介
4.2.1 评测方法
针对深度学习框架的评测方法:
- 支持的语言
- 封装等级
- 大体可分为实验级、工业级。
:::success
实验级:会牺牲部分性能,但是可以使用极少的代码看到模型效果,封装级别较高。
工业级:可以保证执行效率和定制自由度,但上手有一定难度。
:::
- 执行效率
- 可定制程序
- 文档友好度
- 人气
4.2.2 评测对象
测评深度学习模型按照封装等级由低到高主要有一下几种模型。

4.2.3 深度学习框架评测
1.Caffe
- 项目GitHub地址:https://github.com/BVLC/caffe
- 中文文档:有一份中文翻译的官方教程 http://caffecn.cn/?/page/tutoria
- 英文文档:http://caffe.berkeleyvision.org/
- 社区:http://www.caffecn.cn/
特点是支持Shell脚本+配置文件的使用方式。运行速度很快,特别适合深层CNN任务。
2.TensorFlow
- 项目GitHub 地址:https://github.com/tensorflow/tensorflow
- 中文文档:http://www.tensorfly.cn/tfdoc/how_tos/overview.html
- 社区:http://www.tensorfly.cn/
TensorFlow 是 Google 开源的其第二代深度学习技术,被使用在 Google 搜索、图像识别以及邮箱的深度学习框架。TensorFlow采用数据流图(dataflowgraphs),以 graph 为计算框架,以 session 为运行环境,以 operation 为运算单元。同时可以用 TensorBoard 来展现 TensorFlow的模型图像,绘制图像生成的定量指标图以及附加数据。支持分布式移动设备,支持C++、Python。
3.Keras
Keras 由纯 Python 编写而成,是基于 Theano 或 TensorFlow 之上的二次封装类库。也就是说,使用Keras需要先预装Theano或TensorFlow 两者之一(推荐 TensorFlow)。
4.TFLearn
- 项目 GitHub 地址:https://github.com/tflearn/tflearn
- 中文文档:暂无
- 英文文档:http://tflearn.org/getting_started/
基于TensorFlow,有Python编写,且封装等级为实验级。且支持强化学习。
4.2.4 小结推荐
- 极速主义推荐Caffe
- 极简主义推荐Keras
- 入门学习推荐Keras
- 高端玩家任意
4.3 深度学习框架快速上手
4.3.1 符号主义
大部分深度学习库都是以符号主义的方式使用。
符号主义:在建立模型任务时,首先定义各种变量,建立出一个整体的计算图。计算图规定各个变量之间的计算关系,建立好的计算图需要编译已经确定的内部细节,但是计算图也还是一个空壳,相等于先构建出一个代码逻辑,但是整套代码的参数是需要使用时进行传输。
其想要解决的问题是,尽量在定义全局通用的变量,而不是需要多次对变量进行传参操作。
基础数据结构:
对于不同模型的封装等级不同,例如实验级深度学习库,如Keras,会隐藏工序,而对于工业级深度学习库可能就会使数据结构暴露。
* 0阶,数值
* 1阶,向量
* 2阶,矩阵,二位数组(灰度图片)
* 3阶,矩阵序列,三维数组(RGB彩图,灰度图数组)
* 4阶,blob,四维数组(彩图数组,视频)
4.3.2 MNIST
通过MNIST数据集来认识深度学习库。将下列的图片进行逻辑分类任务执行。

1.描述任务
问题:
* 60000个训练样本,10000个测试样本,每个样本是一张28x28的灰度图片
* 0-9,共10个数字类别。
目标: 训练模型,识别图片中的数字。
2.构造样本向量
由于图片是28x28的灰度图片,可以使用二位数组来进行存储。针对数组每个位置都被是为一个特征位置,从而构成图片的像素位置特征向量。但是这种构造方式并不是最合适的方法,展开图片的数字数组会丢失一些图片的二位结构信息,会对分类模型辨别样本增加难度。

3.Keras完成逻辑分类
使用Keras完成训练目标,逻辑分类步骤为:线性函数 —>概率 —>分类。

Keras使用步骤:
(1)准备train-test数据
(2)定义模型
(3)complie模型
(4)给模型灌入数据流I/O
4.4 Caffe实现逻辑分类模型
4.4.1 Caffe训练MNIST概览
说明:
* /root/maxmor/lr是工程目录
* /root/caffe/是Caffe的安装目录
* MNIST数据解压在/root/maxmon/lr/data中
步骤:
(1)在终端运行crreat_mnist.sh脚本,生成数据原料train_lmdb和test_lmdb。
(2)将内容复制到模型文件/root/maxmon/lr/pb/train_val.prototxt中。
(3)将内容复制到/root//maxmon/lr/pb/solver.prototxt中
可能需要在服务器段进行。
4.4.2 Caffe简介
Caffe使用特色是使用Sell脚本+配置文件的风格。每个训练步骤都是一个prototxt配置文件,使用Shell命令运行配置文件,这使得模型灵活性比较强。
Caffe模型训练步骤分为三步:

4.4.3准备数据集(第一步)
使用Cafe 训练时,需要将数据集转换成Cafe支持的格式。Cafe支持以下三种数据库类型:
- hdf5:支持并行 I/O、线程和其他一些现代系统和应用要求,轻量级数据库。
- lmdb:轻量级 Key-Value 数据库,不支持 SQL 语句。(本书使用)
- leveldb:Google 实现的高性能Key-Value 数据库,单进程服务,不支持SOL 语句,对海量数据存储支持比前两者略好。
在准备数据集时,建议转换Caffe的数据类型使得同一数据格式。
4.4.4准备模型(第二步)
深度学习框架都是以层的方式布署模型结构,例如Caffe中分为数据层、全连接层、概率转换层。

1.数据层
Caffe配置以layer来定义层,例如下图:

而且Caffe可以边训练边测试,可以在划分训练—测试集之后,构建一个包含phase:TRAIN的layer告知Caffe这是训练用的数据层,在构建一个包含phase:TRAIN的layer,然后将其放到配置文件中。
还有一些其他数据层类型:
- type:MemoryData 内存数据。
- type:HDF5Data hdf 数据。
- type:ImagesData 图片数据
2.DNN全连接层
全连接层用于最重要的逻辑处理,逻辑分类可以视作一层全连接的DNN。
3.概率转换层
由于模型最后需要输出的某个类别的概率,因此需要概率转化层,其中二分类可以用Sigmoid层,多分类可以用Softmax层。
4.4.5 准备训练流程
solver.prototxt是Caffe中描述训练流程集调试参数的配置文件。
例如:

4.4.6 回顾
和实验级的 Keras 相比,Cafe 有更详细、可定制的模型参数选项以及更快的训练速度。Caffe 的使用整体可分为以下几步。
(1)准备数据(hdf5/lmdb/leveldb)。
(2)准备模型配置文件,如train val.prototxt。
(3)定义训练流程,如 solver.prototxt。
5.深度学习模型
传统的机器学习基于统计数据设计学习模型,通过分析特征数值规律完成任务目标。但是有时候使用传统的方法并不能适用于所有场景。
例如:
- 并不是所有样本都有显示的可描述特征
例如一张图片、一段语音或者其他特殊的事物。很难从中提取出这些样本的特征。

- 有些事物通过显式特征的方法不容易分辨
例如两个人A、B的录音信息,A说“狗狗”和“痘痘”,B说“宠物狗”。从传统的机器学习模型来说,A的“狗狗”和“痘痘”表现的更相似,但是在语义层面“A的狗狗”和 B的“宠物犬”才更加相似。

因此,需要深度学习模型:不去人工设计特征,而是通过模拟生物的学习方式,以“大数据+深度学习”的模式让模型自动解析出样本的隐含特征。
5.1 解密生物智能
5.1.1实验一:大脑的材料
大脑的核心功能组织是大脑皮层,大脑皮层分为左右两个半球,在显微镜下观察大脑皮层的基本建筑块料是神经元细胞,如图下图所示。它包括一个特殊的细胞体和一个能把神经信息从一个神经元传递给下一个神经元的独特结构:突触。

对神经元进行刺激的实验发现,神经元有两种状态,静默状态和激活状态。当从其他神经元传递的输入信号满足特定条件时,神经元会进入激活状态,改变对外输出的生物电压,释放频率信号(spike),并将这一信号传递给下游的神经元。
:::success
这个实验告诉我们:脑皮层是由神经元连接组成的,并且神经元携带着某些参数信具有“激活函数”的特性。
:::
5.1.2实验二:探索脑皮层的功能区域
这些实验都指向一个明显的结论:脑皮层按位置区域分别负责不同的功能。实验结构表明:在大多数人类中,语言、意念、逻辑、理性主要由左脑掌管,而右脑负责形象思维和情感等。整体的功能如下图所示。

:::success
这个实验给我们的启发:在脑皮层中,相同的神经元细胞按区域组成了不同的功能模块。
:::
5.1.3实验三:不同的皮层组织—区别在于函数算法
那是什么导致了脑皮层功能区域的划分?
通过实验可以观察到:
(1)去除一些噪音干扰,相同功能的神经元细胞对刺激表现出的响应函数几乎相同。
(2)不同皮层区域的神经元有着不用的响应函数
:::success
实验结论:对输入的生物刺激,大脑不同皮层模块的神经元细胞有着不同的响应处理函数。
:::
5.1.4实验四:可替换的皮层模型—神经元组成的学习模型
通过训练小白鼠的听觉皮层变成视觉皮层,可以得到启发,不同神经元细胞的响应处理函数的差异,是通过不同的数据训练而演变而成的,进而形成不同功能的皮层组织。
:::success
实验结论:脑皮层就是由神经元组成的学习模型,各个皮层功能区域只是经过不同的数据训练形成的不同功能的同一种模型。
:::
那么我们是不是也可以通过模拟这个过程进行模型的训练?
5.1.5 模拟神经元
实验发现神经元是可以训练的。通过改变与其他神经元连接的突出的生物特性,从而达到给不同连接分配“权重的效果”——其相当于模型的参数。如下图:

5.1.6 生物结构带来的启发
由上面一系列实验可以得到启发:
- 生物以一个简单的元细胞,重复相连的结构方式组成智能的“硬件”
- 智能的关键,藏在一个神经元细胞的激活函数中
:::success
借鉴生物的灵感,人工设计神经元算法,以简单重复的方式构造模型结构,这就是人工神经网络模型。
:::
5.2 DNN神经网络模型
DNN神经网络,又叫全连接神经网络,是模拟神经元网络的网络模型。
5.2.1 线性内核和非线性激活
对于生物结构的模拟最大的问题在于如何让适合生物结构的算法的计算机结构中高效执行。

首先,神经元算法一定是非线性的。但是计算机和科学家都跟喜欢线性运算。因为
- 线性运算非常高效,因为它就是大矩阵的乘法运算。
- 线性运算稳定,某个输入分量的波动对结果的影响不会太大。
- 导数形式非常理想,在梯度下降时这一点非常重要
:::success
因此,希望能够把大部分运算放在线性函数中执行,所以解决方法就是
把一个非线性运算拆分成线性内核和非线性激活的叠加。
:::

5.2.2 DNN、CNN、RNN
通过“线性内核+非线性激活”设计神经元是非常重要的思想。
其中DNN(Deep Neural Network,深度神经网络)本章、CNN(Convolutional Neural Network,卷积神经网络)第6章和RNN(Recurrent Neural Network,循环神经网络)第8章。

DNN模型的神经元:线性运算换成权重相乘
CNN模型的神经元:线性运算换成卷积运算
RNN模型的神经元:设计一些运算单元模拟“记忆”的特性
DNN神经元就是权重矩阵的乘法运算和激活运算的叠加。
5.2.3 逻辑分类:一层神经网络
逻辑分类可以被认为是一层DNN神经元组件的全连接神经网络,以X * W + b作为线性的运算内核,以Softmax函数为非线性函数的激活。如下图:

简化图形之后,将逻辑分类以神经元模型的链接表示出来,输入图片数据的神经层叫作“Input Layer(输入层)”,输出类别的神经层叫作“Output Layer(输出层)”,逻辑分类的输出是和每个输入分量相连的。

像逻辑分类这种,线性运算单元设计为权重相乘的,并且层与层之间的神经元全部相连的神经元网络叫作“全连接神经网络”,也就是DNN。
5.2.4 更多的神经元
在对神经元进行的生物研究中,科学家还发现了一些有意思的现象。在对脑皮层控制中枢研究时,科学家发现皮层区域的神经元越多,对应的肢体控制能力越丰富。对于生物而言,神经元数量越多,处理能力越强大。对于工程模型同样如此,神经元越多,模型能力越强大,那么训练时越容易发生过拟合。
5.2.5 增加Hidden Layer(隐层)
之前的例子中,逻辑分类只有一层输入层执行计算,我们可以增加一个中间层容纳更多的神经元,来增强模型的能力。例如下图:

5.2.6 ReLu激活函数
在隐层当中其激活函数为relu,代码如下:
def relu(x):
return x * (x > 0)
得到效果如下:

对于采用该函数原因,在求梯度导数时则涉及除法运算,神经元很多时计算量还是比较庞大的。而ReLu函数的计算很简单,而且导数是常量,机器算起来非常快。也有些论文指出,ReLu函数更接近生物的神经激活性质,以及工程上,Relu计算时的一些数学特性对解决神经网络的过拟合有好
处。
汇总一下可以得到DNN计算的全流程。
需要注意的是,如果选择ReLu函数作为激活函数,调试的时候需要小心设计学习速率,不要让过多的神经元处于ReLu函数左侧的死亡状态。
5.2.7 理解隐层
如何理解隐层,在输入层中可以知道是,学习到的权值矩阵从某种程序上客户了图片的特征。而隐层在此基础之后自动寻找了合理的解读特征。并不知道隐层内部挖掘的特征具体含义是什么,只是知道隐层在模型训练的过程重新构建了某些特征。如下图:
5.2.8 小结
- 人工神经元的算法:线下内核+非线性激活。
- DNN(全连接神经网络)使用权值乘法作为线下运算,ReLu函数激活。
- DNN包含三层:输入层、隐层、输出层。
- 理解DNN:隐层在模型的训练过程中自动发掘的解读样本的特征。
5.3 神经元的深度网络结构
5.3.1 问题 更宽or更深
人脑与计算机相比,人脑具有更强的并行能力,而计算机有更强的串行能力。那么一个模拟生物并行计算的模型,如何在串行机器上快速执行?
当需要有多个隐层神经元进行计算,有两种方法可以选择。
(1)在隐层中加入更多神经元,让模型变得更“宽”。
(2)加入更多隐层,让模型变得更“深”。

对于这两种选择,我们选择了让模型更“深”,这也是深度学习的由来。因为其:
(1)数学上证明,深层模型的训练速度更快。
(2)生物学上证明,深层模型的预测效果更好。
5.3.2 链式法则:深层模型训练更快
选择更深的模型结构,其模型的计算过程就可总结成表达式$ y = \text{softmax}\left(\cdots \text{fadd}\left(\text{fmulti}\left(\text{frelu}\left(\text{fadd}\left(\text{fmulti}\left(x\right)\right)\right)\right)\right)\right) $
回想一下在计算模型参数时,使用梯度下降算法时,每一次迭代不仅需要计算梯度下降的输出值y,还需要计算模型表达式的导数$ y^{'} $,因为在计算导数时,对于复合函数,可以采用链式法则,也就是表达式
$ [g(f(x))]' = g'(f(x)) \cdot f'(x) $
也就可以得到这张图:

当计算y时,需要正向计算,而计算导数$ y^{,} $时,由于使用链式法则从外向内求导,需要反向计算。
由此就可以解释为什么选择更深的模型,就是在计算梯度下降导数的时候可以进行并行的计算,由此可以提升模型的训练速度。
在单层模型中,以交叉熵作为损失函数时,计算公式为$ loss(w,b)=−
\frac{1}
{M}
∑_i
D(y_
i
,p_
i
)
,对权重参数的
,对权重参数的
,对权重参数的 w_j
损失函数的偏导数为:
损失函数的偏导数为:
损失函数的偏导数为: \frac{\partial}{\partial w_j} \text{loss}(w_1, w_2) = \frac{1}{M} \sum_i (p_i - y_i) x_i
,其中
i
是样本标号,
, 其中i是样本标号,
,其中i是样本标号, p_i = \text{softmax}(\text{score}(wx_i + b)) $。
其在计算损失函数和导函数的过程中都需要重用$ p_i $的计算值。
同样的在多层神经网络的组合中,每一次的预测值都会在计算导数的过程中复用。通过链式法则的符合运算,将整个计算流程设计出高效的正向/逆向数据流管道。如下图:

把向前计算神经元输出值的算法叫做FP算法(前向传播),将逆向更新参数的算法叫做BP算法(反向传播)。
FP算法:
- <font style="color:rgba(0, 0, 0, 0.9);">在每一层中,输入数据 </font>_<font style="color:rgba(0, 0, 0, 0.9);">x</font>_<font style="color:rgba(0, 0, 0, 0.9);"> 通过激活函数 </font>_<font style="color:rgba(0, 0, 0, 0.9);">f</font>_<font style="color:rgba(0, 0, 0, 0.9);">1</font><font style="color:rgba(0, 0, 0, 0.9);">,</font>_<font style="color:rgba(0, 0, 0, 0.9);">f</font>_<font style="color:rgba(0, 0, 0, 0.9);">2</font><font style="color:rgba(0, 0, 0, 0.9);">,</font><font style="color:rgba(0, 0, 0, 0.9);">…</font><font style="color:rgba(0, 0, 0, 0.9);"> 进行处理,生成输出 </font>_<font style="color:rgba(0, 0, 0, 0.9);">y</font>_<font style="color:rgba(0, 0, 0, 0.9);">。</font>
- <font style="color:rgba(0, 0, 0, 0.9);">每一层的输出作为下一层的输入,直到最后一层生成最终输出。</font>
- <font style="color:rgba(0, 0, 0, 0.9);">权重参数 </font>_<font style="color:rgba(0, 0, 0, 0.9);">w</font>_<font style="color:rgba(0, 0, 0, 0.9);">1,</font>_<font style="color:rgba(0, 0, 0, 0.9);">w</font>_<font style="color:rgba(0, 0, 0, 0.9);">2,… 在每一层中被重复使用。</font>
BP算法:
- <font style="color:rgba(0, 0, 0, 0.9);">计算损失函数相对于权重参数的偏导数 </font><font style="color:rgba(0, 0, 0, 0.9);">Δ</font>_<font style="color:rgba(0, 0, 0, 0.9);">w</font>_<font style="color:rgba(0, 0, 0, 0.9);">1</font><font style="color:rgba(0, 0, 0, 0.9);">,</font><font style="color:rgba(0, 0, 0, 0.9);">Δ</font>_<font style="color:rgba(0, 0, 0, 0.9);">w</font>_<font style="color:rgba(0, 0, 0, 0.9);">2</font><font style="color:rgba(0, 0, 0, 0.9);">,</font><font style="color:rgba(0, 0, 0, 0.9);">…</font><font style="color:rgba(0, 0, 0, 0.9);">。</font>
- <font style="color:rgba(0, 0, 0, 0.9);">使用这些偏导数更新权重参数:</font>_<font style="color:rgba(0, 0, 0, 0.9);">w</font>_<font style="color:rgba(0, 0, 0, 0.9);">1</font><font style="color:rgba(0, 0, 0, 0.9);">←</font>_<font style="color:rgba(0, 0, 0, 0.9);">w</font>_<font style="color:rgba(0, 0, 0, 0.9);">1</font><font style="color:rgba(0, 0, 0, 0.9);">−</font>_<font style="color:rgba(0, 0, 0, 0.9);">α</font>_<font style="color:rgba(0, 0, 0, 0.9);">Δ</font>_<font style="color:rgba(0, 0, 0, 0.9);">w</font>_<font style="color:rgba(0, 0, 0, 0.9);">1</font><font style="color:rgba(0, 0, 0, 0.9);">,</font>_<font style="color:rgba(0, 0, 0, 0.9);">w</font>_<font style="color:rgba(0, 0, 0, 0.9);">2</font><font style="color:rgba(0, 0, 0, 0.9);">←</font>_<font style="color:rgba(0, 0, 0, 0.9);">w</font>_<font style="color:rgba(0, 0, 0, 0.9);">2</font><font style="color:rgba(0, 0, 0, 0.9);">−</font>_<font style="color:rgba(0, 0, 0, 0.9);">α</font>_<font style="color:rgba(0, 0, 0, 0.9);">Δ</font>_<font style="color:rgba(0, 0, 0, 0.9);">w</font>_<font style="color:rgba(0, 0, 0, 0.9);">2</font><font style="color:rgba(0, 0, 0, 0.9);">,其中 </font>_<font style="color:rgba(0, 0, 0, 0.9);">α</font>_<font style="color:rgba(0, 0, 0, 0.9);"> 是学习率。</font>
- <font style="color:rgba(0, 0, 0, 0.9);">偏导数通过反向传播从输出层逐层向前计算。</font>
从生物的角度来看,可以将FP算法看作一层层向前传输的生物“信号”,而对于BP算法可以看作逆向提供的每层的“反馈”。
5.3.3 生物:深层模型匹配生物的层次识别模型
举例说明猫是如何进行视觉成像的,其步骤分为:
(1)采集视觉信息
(2)提取视觉信息形成图像

首先猫的LGN神经元将刺激解析成RGB数值矩阵,然后传递信号给视觉皮质。然后又视觉皮质v1识别初级的特征,再将特征传递给视觉皮质v4,由视觉皮质v4识别更加抽线的视觉特征,最终通过下一层比上一层学习更加抽象的特征以达到视觉成像的结果。
因此可以得到结果,生物神经系统以面向“层”的方式识别事物,每一层在上一层识别的基础上提取更加抽象的特征。也就是说,生物本身也是深层的结构模式。
5.3.4 深层网络结构
通过上面两小结可以证明5.3.1小结最后的结论
(1)在数学上深层模型的训练速度更快。
(2)在生物学上深层模型的预测效果更好。
一个通用的深层网络模型结构如图:
在某些深度学习框架中,层的定义并不局限,既可以是DNN模型层,也可以是其他神经元模型组成的神经网络层,如CNN、RNN,还可以是某种处理数据的手段,如Dropout层等。
由于使用FP-BP计算框架组成的神经网络模型,依然是使用梯度下降算法来进行模型的训练。即可得深度网络的层即可以神经元模型,也可以是数据处理手段。
神经元的深层连接模型是本书中深度学习的核心理念之一。
5.4 典型DNN深层网络模型:MLP
本小节主要实现MLP模型(Multilayer Perceptron,多层感知模型)。
首先先了解一些优化模型训练速度的技巧。
5.4.1 优化梯度下降
在梯度下降训练模型中,通常需要计算所有的样本值都计算一遍,那可不可选用部分样本值来减少计算时间,从而产生优化方法。因此可以抽取随机部分数据进行计算(数据量参数:batch_size),这样可以减少计算量,但是有可能走“弯路”,这里可以通过增加迭代次数来解决,而计算机硬件对于迭代次数的增加是可以接受的,这样的梯度下降算法叫做SGD算法(随机梯度下降算法)。

除了可以优化计算时间,还可以从下面两个角度来优化梯度下降算法:
(1)通过动量(参数:momentum),优化“弯路”轨迹。为了减少走弯路,引入“惯性”来保持一定正确方向的量,例如在每次计算$ w_j 是都加入一个之前的梯度的平均值,即 是都加入一个之前的梯度的平均值,即 是都加入一个之前的梯度的平均值,即 w_j = w_j + \alpha \left( 0.9 \cdot \frac{\sum_{1}^{j-1} \Delta w_{j-1}}{j-1} + 0.1 \cdot \Delta w_j \right) $,从而使得梯度继承历史梯度的关系具有一定的纠错能力。

(2)优化梯度下降的步长,也可以说是学习速率(leanring rate,参数:lr)。优化学习速率的思路是当参数越接近理想值时,学习速率要越小,因为此时需要更加谨慎的学习,才能更快的达到理想的参数点。
在此总结一下梯度下降算法的内容:
- 梯度下降需要在同一尺度上可比较。处理手段:对数据去均质化、归一化,使其满足0均值,等方差。
- 随机初始化参数权重,初始化的数值满足0均值,等发差。
- 批量训练数据,参数名batch。
- 动量,参数名momentum。
- 学习速率,参数lr。
注意点:在实际情况中,最需要关注的还是学习速率。
5.4.2 处理过拟合:Dropout
在浅层模型中,处理过拟合可以使用减少特征、增加数据量或者调试模型L2的正则化参数。
在深层模型中,处理过拟合只能用调试模型L2的正则化参数或者Dropout。
:::success
Dropout思路: 通过告诉模型,不能依赖任何神经元的激活值,因为其随时可能被丢弃,使得每个神经元被强制负责其他神经元的工作,学习了冗余的表达式。
:::
例如:当参数设置为Dropout(0.25),在激活层(包含激活函数,例如Sigmoid、Softmax、ReLu)之后,Dropout层会随机抽取四分之一的数据集的激活值将其改为0,也就是让剩余的神经元的输出值方法到$ * \frac{4}{3} $,使得曾输出整体维持量级横定。
5.4.3 MLP模型
一个多层全连接神经网络模型MLP(多层感知器神经网络),通过使用两次512的DNN层,让神经元数量略大于任务需求,激活后接入Dropout层,最后接入长度为10的输出层、Softmax概率转换到图片标签向量,最终完成数字识别任务。

6.学习空间特征
本章介绍能够有效学习空间特征的神经元网络模型:CNN(convolutional Neuron Network,卷积神经网络),其可以运用到多种空间意义的数据上。
6.1 预处理空间数据
6.1.1 像素排列展开的特征向量带来的问题
在MNIST手写识别数据任务中,直接将图片按照像素的行列展开的方式生成特征向量。

会存在一下问题:
(1)破坏了一部分图片的2D平面结信息,转化成二维矩阵之后值只记录了像素点的信息,而抛弃了像素点之间的信息。
(2)生成的特征向量对图形特征的描述不够。
通过这种方法生成的特征向量质量不佳,DNN模型需要更多的神经元和更深的模型层才能从特征向量中读出分类标签。在一些复杂的图像识别任务中,将会出现两种问题:(1)模型的训练非常缓慢;(2)梯度消失。

梯度消失是指,在模型训练中,使用BP算法对参数更新的增量层从后向前反馈时,由于路径过长,求导数的值不断减小,因此在前层的更新量已经无限接近为0,相当于模型没有训练任何东西。
梯度爆炸是指,在模型训练中,使用FP算法对参数更新从前向后反馈时,由于路径过长,参数权值$ w_i $值不断增大,因此在后层的更新量会无限增大,导致模型训练失败。
在梯度消失中由于反馈信号的消失,需要对DNN模型进行优化,可以从以下两个方面进行优化:
(1)预处理图片数据。
(2)生成更合理的图像特征向量。
下面将介绍图片数据的预处理手段,即就是图片样本的过滤及生成。
6.1.2 过滤冗余
过滤冗余就是过滤掉样本数据中对目标任务没有意义的信息。例如在MNIST任务中,颜色对目标任务没有帮助,因此可以过滤到这一部分信息,这样做的好处就是可以转型关注于数字的像素分布,而不是关注于颜色信息。
其实过滤冗余就是一个思路,在进行数据预处理时,剔除对目标任务无帮助的信息,从而简化任务。
6.1.3 生成数据
对于深度学习模型中自动学习识别事物特征的能力十分依赖海量的样本数据。而在实际实践过程中,某些样本的获取代价高昂。
实物特征的空间不变性。对于某些样本数据具有空间不变性,可以通过该性质来扩大样本集的数据。例如可以对一张狗狗图片可以进行平移、裁剪、翻转等操作。

虽然用肉眼观察还是那条狗,但是对于计算机来说已经是不同的数据样本了。
但是对于某些样本不可以进行相关变化来增加样本集的数据。例如,预测股票趋势任务中的股票价格表中的数据。
6.2 描述图片的空间特征:特征图
6.2.1 图片的卷积运算
卷积运算可以提取图片的空间特征,其也是一种被定义好的运算法则。
$ (f * g)[n] \stackrel{\text{def}}{=} \sum_{m=-\infty}^{\infty} f[m] g[n-m] $
卷积运算包括两部分:f 和 g。将 f 视为输入,g 作为卷积核, 卷积核 g 对输入的 f 进行卷积操作。
其具体效果如下,将原本的狗狗照片转换成其对应的特征图。


那么如何得到这个效果的呢?通过平移和叠加。
图片数据和卷积核的卷积计算可以拆分成两个物理概念理解:
(1)卷积中心的平移。
(2)卷积和的加权叠加。
卷积中心的平移是指卷积运算的像素中心从左向右,从上向下依次移动。卷积核的
加权叠加是指在每个卷积中心代表的像素位置上,以周围像素按卷积核参数为权值,叠加
在一起生成新的中心像素
比如在下图中,卷积核在计算中心(在像素值为252的地方),那么当前的计算输
出值为-1x93+0x139+1x101-2x26+0x252+2x196-1x135+0x230+1x18=231 ,即新生成的中心点输出值为 231,对应旧的中心点输入值 252。这样就完成了一个点值的卷积运算。然后卷积中心扫描过所有输入像素点,这样就生成了一张“特征图”。

6.2.2 卷积指令和特征图
在卷积运算中,实践上就是图片像素按照卷积核参数加权叠加,生成新的像素,从而生成新的特征图。即卷积核的参数表示的实际意义就是描述以什么样的方式生成新图的指令。
- 例如希望和原图一样,卷积核的数字化参数就为$ \begin{bmatrix}
0 & 0 & 0 \
0 & 1 & 0 \
0 & 0 & 0
\end{bmatrix} $,0表示像素不进行叠加,生成图片也和原图一样。 - 例如希望生成的特征图是对原图的均值模糊化处理,卷积核的数字化参数就为$ \begin{bmatrix}
1 & 1 & 1 \
1 & 1 & 1 \
1 & 1 & 1
\end{bmatrix} \div sum $,生成的图片就变成。

当像素叠加的范围越来越广时,生成的特征图将会越来越模糊。

需要注意的点是,卷积参数矩阵的维度必须要是奇数,因为其总是需要一个“卷积中心点”。
- 例如需要特征图为原图的轮廓图时,卷积核的数字化参数就为$ \begin{bmatrix}
-1 & -1 & -1 \
-1 & 8 & -1 \
-1 & -1 & -1
\end{bmatrix} $,生成的特征图就为

还有其他的特征图,比如边缘$ \begin{bmatrix}
1 & 1 & 1 \
1 & 7 & 1 \
1 & 1 & 1
\end{bmatrix}
、浮雕
、浮雕
、浮雕 \begin{bmatrix}
-1 & -1 & 0 \
-1 & 3 & 0 \
0 & 0 & 0
\end{bmatrix} $等。
总的来说,卷积运算就是对图片按照卷积核参数加权叠加,生成特征图。卷积核是提取特征的“指令”,而卷积运算生成“特征图”。这一过程在信号邻域称为“滤波”,卷积核相当于“滤波器”
6.3 CNN模型I:卷积神经网络原理
卷积运算可以提取出图片的一部分特征进行描述,将利用这一特征将卷积作为神经元的内核运算,设计出可以提取空间特征的模型:CNN模型。
6.3.1 卷积神经元
最终目的就是设计出能够将图片样本转化成合理特征向量的模型层。
神经元结构仍然是“线性内核+非线性激活”。如果将卷积匀速那作为内核,那么这个神经元就是卷积神经元。将DNN神经元和卷积神经元进行对可以观察,主要区别就是内核和输入的改变。
进行对比可得:
(1)输入样本方面:卷积神经元输入从DNN神经元的特征向量变成了二维图片数组。
(2)训练的参数方面:DNN神经元是举证系数相乘,训练权值为W;卷积神经元则是卷积运算,训练卷积核的参数(二维数组)。
(3)输出方面:DNN神经元输出某种特征下的数值,而卷积神经元输出某种特征图。
(4)模型层结构方面:都会接一个ReLu层对神经元进行激活。
(5)特征意义方面:在目标分类任务中,DNN神经元识别了某种“类别特征”,而卷积神经元识别了“空间特征”。
需要注意的是,在介绍特征图时,都是人工设计的卷积核参数已得到某种特定的特征图,但是在深度学习中,需要通过模型训练(梯度下降)来得到合适的卷积核参数。从模型训练的角度来看,卷积运算的加权叠加性质,就是以空间的方式关联待训练的参数W。如下图:

6.3.2 卷积层
卷积层的运算其实就是 卷积核在特征层上按照一定的步长进行矩阵运算最终得到卷积特征。
其目的是为了进行图像特征的提取。
卷积特征:
(1)具有局部感知机制,由于卷积核按照一定步长进行矩阵运算,相邻运算会有覆盖的特征层数据
(2)权值共享,在卷积层运算过程中卷积核始终是一个矩阵。

6.3.3 多层卷积
在进行多层卷积的过程中,需要对网络结构逐步压缩平面尺寸,并对应的拉长向量长度。最终要实现平面的缩小和特征向量维度的增长。如下图:
可以使用这个网站来进行可视化观察,上述图像识别CNN神经网络 https://adamharley.com/nn_vis/cnn/2d.html
有两种方式可以实现:
(1)让卷积运算的卷积核移动步长大于1,即跳跃式平移。这样可以让输出的尺寸等比例减小。
(2)池化,按照某种函数缩小特征矩阵。其目的是:对特征图进行稀疏处理,减少数据运算量。
例如:
最大池化,取2x2矩阵内最大的值作为结果。

平局池化,取取2x2矩阵内平均值的值作为结果。

6.4 CNN模型II:图片识别
6.4.3 反思CNN与DNN的结合:融合训练
对于图片识别模型中,如果按照功能去理解模型模块,CNN负责在特征空间描述样本,DNN负责识别出样本类别,两者是不同功能的模型,而在迭代过程中,对于每个样本,CNN模型层和DNN模型鞥确实一起更新梯度参数。这意味着CNN解读的信息可以通过FP传递给DNN,DNN计算的梯度更新也能通过BP的方式反馈给CNN。如下图:

:::success
这意味着:对于同一个任务目标,可以用“层”的方式将不同功能模块融合在一起训练,让他们可以通信,共享信息。而不是将CNN模型和DNN模型作为一个整体,必须分开使用。以此可以为解决复杂问题提供思路。
:::
6.4.4 深度学习与生物视觉
可以通过深度学习模型的角度可以很好解释一些生物视觉现象。
视幻觉补全:生物上,脑皮层视觉组织将图片用生物信号“成像”,让我们“看到”事物;而另一
部分,如语言皮层组织将样本识别成单词描述的事物,让我们“看懂”事物。类似CNN和 DNN 的情况,脑模型也是不同脑组织一起训练,识别事物。
例如:

中间的图其实缺失了部分 2D信息,而大脑在“看”的时候会自动尝试补全它,关键就在于如何补全。先看左图,当你沿着思维的惯性认为她是从左向右转的,视觉就会按从左向右的方式补全信息。反之先看右图,视觉会按从右向左的方式补全。这个实验在一定程度上说明大脑的意识可以影响视觉成像。
6.5 CNN实现的模型
本节主要介绍一些Image比赛中成绩优秀的CNN实现模型。
6.5.1 Googlenet模型与Inception结构
2014年的冠军使用的模型使用名为Inception的结构,叫Googlenet模型。
Inception结构的大致思路:在对于卷积深度模型的实验中,有很多可选的参数方案,比如5x5、3x3、1x1的卷积核、平均池化等,将这些组合起来发挥积极作用,这就是Inception结构。但是模型的具体构造实现还是需要大量实验不断调整才能完成。

6.5.2 VGG模型
VGG模型是2014ImageNet比赛的第二名,其是典型的卷积神经网络设计,理念就是卷积+深层模型,然后就是不断加深。
例如下图就是VGG-16模型

6.6 微训练模型(Fine-Tuning)
本小结介绍使用Keras介绍模型的微训练来解决以下问题:
调式几千数量级别的图片集的C
6.6.1 二次训练一个成熟的模型
使用微训练模型(Fine-Tuning)的原因,对于已经熟悉的模型,对其进行二次训练,在很少的样本和很短的时间情况下,就可以达到不错的成绩。
6.6.2 微训练在ImageNet训练好的模型
微训练一个成熟模型时,分为三步:
(1)查询标签类别,评估已训练的模型是否具备识别目标任务特征的能力。
(2)如果具备,更换模型的识别模块,对接模型,训练模型识别模块的参数。
(3)微调连接部分。
通过微训练ImageNet数据集上的VGG模型来达成猫狗识别任务。
(1)首先,了解ImageNet训练标签,如下图:

通过搜索dog、cat可以得知ImageNet数据集中包含了数个品种的猫狗类别,因此该模型具备识别猫狗的能力。
(2)更换DNN模型
ImageNet的任务目标是识别1000中事物类别,而现在只需要识别2中事物的差异。因此可以去掉ImageNet的DNN模型层,换成适合猫狗辨别任务的DNN模型结构,同时冻结VGG-16的卷积层参数,进行训练。

(3)微调连接部分
直接将ImageNet的CNN模块和猫狗辨别的DNN模块直接放在一起很明显不合适,因此需要对两者结合部分进行微调。
具体方法:将准备好的ImageNet训练好的CNN模块和上面训练好的DNN模块,连接起来组成VGG-16;接着冻结ImageNet部分的前几次CNN模块,让猫狗辨别任务的DNN模块和ImageNet的CNN模块的衔接部分一起在比较低的速率下在训练一段时间。

通过50轮训练之后,可以提升3%到4%的提升。其中包含一定的有意义的的思考。
(1)上面训练好的DNN层和VGG-16的CNN层对接微调,如果用的空白的DNN层机会在梯度下降时随机化的DNN层参数通过BP反馈将已训练好的VGG-16直接打乱到接近无序。
(2)最后选择微调最后的卷积块,而不是整个网络,并用很低的速率是为了防止过拟合。
如果还想要进一步提高模型的成绩,可以尝试以下几个方向:
- 更大的样本集,更大的图片尺寸。
- 扩大ImageDataGenerator变形的数量。
- 更大的Dropout。
- 扩大微调的层范围,往往需要同时增大Dropout。
8.漫谈时间序列模型
在前面的DNN、CNN深度学习分别对于向量和空间特征进行特征提取,而在本章将以空间的方式关联带训练参数,提取空间特征。将介绍从事件关联参数的模型,即RNN。
主要针对两个对象:
- Embedding:生成时间序列的特征向量。
- RNN:有效处理特征向量序列的神经元模型。
8.1Embedding
Embedding泛指一种转换方式,将数据编码的序列转换成更合理的特征向量或者特征向量序列。本节将介绍文本、单词的Embedding的实现。
8.1.1 简单的文字识别
如何帮助机器读懂文章?
一种思路,将文本转换成机器能够读懂的数值向量。如下图:

生成的向量描述了文本的内容,可以在模型后面接上分类层,这就是一个文本分类模型。接下来就可以尝试收集文本数据,按照上面的思路完成一个文本情况分类任务。
8.1.2 深度学习从读懂词义开始
若是需要机器真正读懂一个文章内在的含义,还需要对生成一个更适合描述单词特征的向量。
而word2vec正好可以解决这个问题,比如上文的“puppy”的One-Hot编码可以是$ \begin{bmatrix}
1 \
0 \
\vdots \
0
\end{bmatrix}
,但是
O
n
e
−
H
o
t
编码的向量显然无法描述词义,但是可以将训练好的
O
n
e
−
H
o
t
编码的向量输入到训练好的
w
o
r
d
2
v
e
c
模型中,这样就可以输出一个“
p
u
p
p
y
”的特征向量,如
,但是One-Hot编码的向量显然无法描述词义,但是可以将训练好的One-Hot编码的向量输入到训练好的word2vec模型中,这样就可以输出一个“puppy”的特征向量,如
,但是One−Hot编码的向量显然无法描述词义,但是可以将训练好的One−Hot编码的向量输入到训练好的word2vec模型中,这样就可以输出一个“puppy”的特征向量,如 \begin{bmatrix}
0.2 \
0.7 \
\vdots \
0.4
\end{bmatrix} $。
**word2vec的原理:**本质上编码单词的上下文描述单词的词义。
其具体就是做好两件事:
1. 表达单词的含义。
2. 表达单词与单词之间的含义。
例如对于单词“dog”,根据上下文单词的分配权重,得到狗的特征向量$ \begin{bmatrix}
0.2 \
0.1 \
0.2 \
0.1 \
0.4
\end{bmatrix} $,其中看见0.2,摇尾巴0.1,打滚0.2,撕咬0.1,汪汪0.4。如下图:

其描述单词与单词之间的含义,如下图表示,将猫与狗之间的特征相联系。

使用Google预训练好的word2vec模型,对于其word2vec工具本书可以使用gensim结构。
8.1.3 游戏:词义运算
在上面的模型中,把单词转化成了数值向量,那么是否可以其进行数值运算呢?
例如:puppy - dog + cat = kitty
taller - tall + short = shorter
queen - king = woman - man
那么为什么运算的结果为什么和词义结果如此的对应呢?
其原因就是无论是word还是vec都是不同语言空间下对同一单词事物的描述,一个代表我们眼中的世界,一个代表了计算机眼中的世界。
8.2 输出序列的模型
8.2.1 RNN
在上面已经将单词文本转化成为向量序列,但是需要的是一段文本而不是向量序列或者数值。
可以将多次预测值输出串起来,并上一次的的输出作为下一次的输入,生成一个包含记忆功能的预测模型。如下图:

将模型结构进行简化,就可以得到一个能够随着输入序列流改变自身状态的新神经元模型,这个就是RNN(Recurrent Neural Network)模型,如下图:

RNN的目的就是然模型随着输入流一起“边”。对于RNN就是在时间上关联参数,提取序列的时间特征。

从记忆的意义上思考或者从数据图模型图中推到可以得到,DNN神经网络就是0阶记忆的RNN神经网络表示。对DNN、CNN、RNNN神经元模型的对比如下图:

8.2.2 LSTM
对于RNN神经元的实现版本,包括LSTM和GRU,其结构基本一致,GRU其实是LSTM的简化版本。
对于记忆来说,其并不是随着时间线性变化的。如下图LSTM模块示意图。其中M是记忆单元,X、Y、F相当于三个DNN神经元,X控制写入记忆的比例,Y控制读取记忆的比例,F决定遗忘的比例。让X、Y、F的神经元参数和RNN一起训练变化,这就是LSTM。

在训练模式时,去过拟合的Dropput要放在输入输出通道中,而不是放在模型的循环记忆通道中,如下图:

8.2.3 并用人工特征和深度学习特征——一个NLP模型的优化历程
对于一个NLP(自然语言处理)任务,例如分类文本的类型,其类型有散文、诗歌、新闻。
最开始可以使用简单快捷的方式人工构造出文本向量,完成分类,如8.1提出的“词频统计特征”向量,如图:

接着就是特征工程,将一些明显的特征构造出来,如作者、出处等。在merge层中将文本特征向量与人工特征向量连接形成一个新向量,输入到分类模型中。如下图:

如果可以完成上述内容,便可以得到一个不错的分类模型,但是还有部分特征是人工不易找到的,可以使用深度学习模型自动学习,通过模型融合将深层模型与传统机器学习模型融合可以使用:
- Ensample
- 融合特征向量
其中Ensample方式实现思路类似于2.6小结中模型融合思路,进行模型比重分权占比。
在深度学习和传统机器学习的接轨处,深度学习的价值就是挖掘人工挖掘不倒的特征,提高模型成绩的最后1%。
将word2vec生成的词义向量序列输入到LSTM,生成描述整体文本序列的特征向量,并将其于之前的向量连接在一起。如下图:

需要注意的点是,为什么自然语言处理不直接完全采用深度学习模型呢?
因为虽然语言系统的语义具有通用性,但是word2vec本身还是从“别的数据”中学习到的语义模型,其是非监督,word2vec生成的描述词义的特征向量是由信息损失的。
8.2.4 反思:让模型拥有不同的能力
在计算机的世界观里,RNN模型分析了输入序列的特征描述,并将这些描述信息映射到输出序列中。
可以得到RNN只是在做样本的格式转换,输入输出都是向量序列,其映射能力可以描述为:
- 序列(or向量)——> 序列(or向量)
例如将输入换成中文,输出换成英文,只需要收集对照文字数据集,并设计训练好两国文字的word2vec举证,就可以得到一个翻译系统,如下图:

也可以将经过傅里叶变换采样的音频序列值作为输入,语言文字作为输出。如下图:

在CNN中,可以把计算机“看到”图片转化成一个包含图片内容的向量。如果把CNN输出的图片向量作为RNN层模型层的输入,输出则可以是一段由意义的文本序列。例如下图看图说话系统:

也可以将RNN处理问题文本的能力和CNN处理图片的能力,在利用DNN的能力,是识别视频然后在A、B、C、D四个选项中选择一个正确答案,如下图:

最终要清楚,模型只是一个空白的大脑,我们只负责训练的数据的灵魂。生物智能擅长主动的思考,而机械只会自动化的计算。
8.3 深度学习:原理篇总结
8.3.1 原理小结
我们希望计算机能够像婴儿一样,能自动从数据中学习特征的能力。比如神经元的刺激——响应函数特征、脑皮层的神经元网联模型等。这些发现帮助计算机构建生理结构的神经网络模型。如下图:

计算机与人类由完全不同的生理基础。在生物系统中,外界信号最终都转化为生物刺激信号,传递给大脑;在计算机眼中,一外界信息最终都将数值化,最终所有信息都可以通过一条向量描述。如下图:

在大脑皮层中通过后天训练可以得到不同的皮层组织,处理对于信号,其数据可以按照维度分类,也可以按照时空意义分类。在神经元的网络模型中,通过更换不同的神经元内核可以衍生不同功能的层,模拟不同的脑皮层功能。

深度学习的主题其实就是让计算机通过大数据自动学习理解事物,代替人工特征解析。
具体设计理念:通过线性内核+非线性激活,模拟适合计算机执行的人工神经元模型,再按照不同的功能需求设计不同功能的神经元内核,并以层的方式,将其融合起来训练,最终实现理想的任务。
8.3.2 使用建议
对于一个机器学习系统中,它只能看到两件事:输入输出的数据格式(I/O)、模型处理信息的方式(代码)。如下表:

除此之外,所有的深层模型不局限于某类特定任务,可以使用不同层来实现同一人物。此时我们就要使用这些模型层来时实现深度学习模型,从而完成对具体任务的实现。
更多推荐
所有评论(0)