0
前言
机器学习的初学者很容易被各种模型搞得晕头转向。如果扎进各种模型的细节无法自拔的话,可能很难发现一般化的框架。
如果你觉得神经网络是非常不同的机器学习模型,如果你觉得神经网络的各种新名词让你觉得这完全就是一片新天地,那么可能你已经陷入到这些细节里啦。所以小夕希望通过本文将这些同学拔出来,重新审视一下学过的东西。
1
一般化机器学习
至此,小夕已经或多或少的讲解了逻辑回归模型、朴素贝叶斯模型、神经网络,虽然小夕通过一系列的文章将这三个模型之间互相关联,但是小夕一直没有将其纳入更上层的框架之下。
下面小夕将依次献上:
机器学习模型的组成
机器学习模型的训练
机器学习模型的测试/使用
组成
对于一个典型的机器学习模型M,其一般重点由以下三部分组成:
模型的输入的格式,即特征向量x。
已知模型参数的情况下,将特征向量x映射成其标签(类别)y的函数,即用来直接输出类别或者间接输出类别的假设函数(有时也叫打分函数(scoring)、模型函数、预测函数等)。这也是机器学习模型M的核心,有时甚至可以直接用假设函数代指一个模型。
衡量当前参数下的模型与大自然真实模型之间误差的函数,即损失函数(loss function, 也叫代价函数(cost function))。损失函数的计算以假设函数的计算为基础。一个模型的损失函数往往是固定的,但是也完全有可能一个模型对应着好几个损失函数,甚至模型太过灵活,直接兼容各种损失函数(此时损失函数的选择与数据集的结构和模型输入x的格式有关)。
训练
对于一个典型的机器学习模型M的训练过程,其一般由以下4步完成:
拿到原始数据,将原始数据集通过预处理来生成m个样本,n个维度的特征向量集X(端到端的模型中,特征向量恰好是“原始数据”)。
初始化模型M的参数(parameters)与超参数(hyperparameters),并确定一个用于寻找最优模型参数的最优化算法O。
基于全部X或部分X,利用优化算法O来最小化损失函数。这个过程要经历N次迭代,每次迭代都会更新模型参数并且计算此时损失函数的值。记录下每次迭代后的损失函数的值以及对应的模型参数。
从N次迭代中选出使得测试集准确率最高的那次迭代后的参数,作为模型M最终的参数,完成训练。
对于步骤1:
需要明确x的形式,比如x包含几部分,每一部分有多少维度;
对于步骤2:
模型的参数的初始化很可能会大大影响模型最终的精度。如果你刚开始将模型的参数扔到了坑坑洼洼的地方,那很可能迭代几次就陷入到一个很差劲的局部最优点,极大的降低一个优秀模型的最终准确率。但是如果你刚开始将模型的参数扔到了距离马里亚纳海沟不远的地方,那很可能收敛到全局最优点,极大的提高模型的最终准确率。
超参数包含但不限于batch的大小(batch的大小即每次求解损失函数时使用的样本数量)、优化算法的参数(如步长)等一系列需要在第3步进行前就要固定死的参数(即如果不事前给超参数赋值,那么无法进行第3步);
对于步骤3:
运行优化算法时,优化算法的内部会计算损失函数在当前输入(当前模型参数)处的梯度/导数,这个计算往往要用到全部的样本x,然而当样本集过大时,也可以只使用一部分x来近似计算梯度/导数,当然这是优化算法内部的工作啦。
另外,需要迭代的次数N取决于系统设计者,比如可以达到一个最大迭代步数后停止(因此最大迭代步数当然是个超参数),比如可以每次迭代后立刻用这次得到的参数在测试集上计算准确率,当测试集上的准确率不再提高时结束迭代;
对于步骤4:
其实测试集准确率最高的那次迭代,往往就是训练时损失函数值下降最快的那次迭代(训练曲线最弯的地方,如下图红色曲线的最高点,对应着绿色曲线最弯的地方)。
因此既可以直接计算出红色曲线来得到真正的测试集准确度最高的迭代,在测试代价太高时也可以用绿色曲线最弯的那次迭代来近似。
测试/使用
对于一个已经训练完成的典型的机器学习模型M的测试/使用步骤:
将需要测试/处理的数据处理成模型M的输入的格式,即特征向量x。
将特征向量x输入到(当然是已知参数的)假设函数中,直接或间接的得到该样本的标签/类别。
2
神经网络
好啦~大框架结束了。下面将神经网络往里面丢~
小夕温馨提示,紫色与绿色是成对出现的哦
1、整个神经网络描述的是什么呢?
比如下面这个最传统的前馈神经网络是什么呢?
不过就是假设函数的可视化图片而已啦╮(╯▽╰)╭,其中K(*)就是传说中的激活函数,如sigmoid函数、tanh函数、ReLu函数等,不就是隐含层每个隐单元的输出嘛~所以当然是以输入层x为输入啦。
只不过这个假设函数用数学表示起来比较麻烦,所以大家往往看到上面那个三层网络会立刻想到前馈神经网络,而看到这个假设函数就没有前馈神经网络的条件反射了。而大家将这个图片直接跟前馈神经网络挂钩,也就说明假设函数基本就可以代表一个机器学习模型的直观印象了。
2、而神经网络中所谓的前向算法是什么呢?
前向算法做了什么呢?不就是将一个特征向量丢进模型,然后一层层往前推,一直推到输出层出结果嘛~站在上层看这个过程的话是什么?不就是将x映射成了y嘛~是的,不过是计算了一下假设函数而已啦╮(╯▽╰)╭
3、而神经网络中所谓的反向传播算法(BP算法)是什么呢?
首先,还记不记得BP算法的最开头要在输出层计算一下误差,这一步在干嘛呢?当然就是在计算损失函数啦~这个误差就是损失函数的输出啦~
然后,还记不记得各种入门视频中千叮咛万嘱咐的:一定要先实现和调试前向算法,再完成BP算法呐~诶为什么?这就是前面小夕讲的“损失函数是基于假设函数的结果来计算的”啦~损失函数的值是BP算法的开始,那当然要在BP算法开始之前先保证可以计算前向算法(假设函数)啦。
再然后,那么BP算法将这个误差往前传播,边传播边根据某种规则更新各个边的权重,传到了输入层,就更新完了所有的边的权重。这是在干嘛呢?边的权重不就是神经网络这个模型M的参数嘛~我们前面说基于全部或部分x,利用“什么”可以更新模型参数来??这里的“什么”就是优化算法啦~所以说,BP算法只是一种优化算法而已~(提前告诉你,本质上是一种巧妙计算梯度的梯度下降法)
怎么样?看似自成一派的神经网络也是死死卡在一般化机器学习框架里的。像逻辑回归、SVM等就更不用说了,只不过神经网络这个机器学习模型同时还卡上了生物模型(生物中的神经网络),因此其有各种有趣的名字和演变,但是也不要忘记这依然是一种机器学习方法。
那么,其他的各种神经网络,比如CNN、RNN甚至LSTM呢?深度神经网络呢?难道100层的深度XXX网络也逃不出这个框架?你试试不就知道啦( ̄∇ ̄)