模型是现实世界中一类具有泛化共性的真实系统的数字化映像,是客观事物的简化表示,是连接真实世界和数字化世界的桥梁,源于现实世界,生根于数字化世界。
特点:
(1)可执行性:一个模型可以将现实世界的目标系统通过公式化的表示转为数字化世界,每一步都有坚实的计算基础和状态转换,并且还能从数字化世界转回现实世界。从这个意义上说,模型就是计算机,模型思维就是计算思维。
(2)普适性:一个模型,是用同一个有共性的计算机制所刻画的一族“长得很像”的现实世界真实系统。模型越有普适性,就越成功、越深入人心、越有应用价值。模型越有普适性,就意味着只需在参数上做一定的调整,就可以使模型快速适配一个在其覆盖范围内未知的、具体的现实世界真实系统。从这个意义上来说,模型就是生产力,模型思维就是解放生产力。
(3)数据驱动:一个模型与现实世界中被它所刻画的目标系统之间,事先就达成完美对应是非常罕见的。在大多数情况下,必须通过目标系统的外在表现来确定模型中的待定参数。这就是学习。学习,是模型方法最核心的部分。在模型基本确定的情况下,这个模型在能力上的“天花板”也随之确定。好的学习算法可以更快地触达这个模型的“天花板”,但无法突破这个“天花板”。要想突破“天花板”,还需要有更好的模型。从这个意义上来说,模型就是数据驱动的、带参数的计算框架,模型思维就是把数据转换为知识的框架设计。
机器学习通过观察许多输入和目标的示例,来完成将输入(比如图像)映射到目标(比如标签“猫”)的过程)。大多数机器学习工作流程:
先来了解一下机器学习都有哪些方法。
朴素贝叶斯算法是最著名的概率建模算法之一。该算法是一种机器学习分类器,“朴素”的假设输入数据的特征都是独立的。
logistic回归(logistic regression, 简称logreg)也是一种分类算法。
核方法是一组分类算法,其中最有名的是支持向量机(support vector machine, SVM)。SVM的原理是找到划分两个类别的“决策边界”,通过以下两步:
(1)将数据映射到新的高维表示,以便将决策边界可以用超平面表示(若数据图像是二维的,那么超平面就是一条直线)。
(2)尽量让超平面与每个类别最近的数据点之间的距离最大化,从而计算出良好的决策边界,也就是分离超平面,也称之为间隔最大化,使得决策边界可以很好地推广到训练数据集之外的新样本。
核技巧的基本思想是:要在新的表示空间中找到良好的决策超平面,不需要直接计算点在新空间中的坐标,只需要计算在新空间中点与点之间的距离,而利用核函数可以高效地完成这种计算。核函数(kernel function)是一个在计算上容易实现的运算,它将初始空间中的任意两点映射为这两点在目标表示空间中的距离,从而完全避免了直接计算新的表示。核函数通常是人为选择的,而不是从数据中学到的——对于SVM来说,只有分离超平面是通过学习得到的。
但是,SVM很难扩展到大型数据集,并且在图像分类等感知问题上的效果也不好。SVM是一种浅层方法,因此要将其应用于感知问题,首先需要手动提取出有用的表示(这一步骤叫作特征工程)。这一步骤很难,而且不稳定。如果想用SVM来进行手写数字分类,那么你不能从原始像素开始,而应该首先手动找到有用的表示(比如前面提到的像素直方图),使问题变得更易于处理。
决策树(decision tree)是类似于流程图的结构,可以对输入数据进行分类或根据输入预测输出值,如图所示。决策树的可视化和解释都很简单。在21世纪前10年,从数据中进行学习的决策树开始引起研究人员的浓厚兴趣。到了2010年,决策树往往比核方法更受欢迎。
随机森林(random forest)算法引入了一种稳健且实用的决策树学习方法,即首先构建许多专门的决策树,然后将它们的输出集成在一起。随机森林适用于各种各样的问题——对于任何浅层的机器学习任务来说,它几乎总是第二好的算法。广受欢迎的机器学习竞赛网站Kaggle在2010年上线后,随机森林迅速成为该平台用户的最爱,直到2014年才被梯度提升机(gradient boosting machine)所取代。
与随机森林类似,梯度提升机也是将弱预测模型(通常是决策树)进行集成的机器学习技术。它使用了梯度提升(gradient boosting)方法,这种方法通过迭代地训练新模型来专门弥补原有模型的弱点,从而可以提升任何机器学习模型的效果。将梯度提升技术应用于决策树时,得到的模型与随机森林具有相似的性质,但在绝大多数情况下效果更好。它可能是目前处理非感知数据最好的算法之一(如果非要加“之一”的话)。和深度学习一样,它也是Kaggle竞赛中十分常用的技术。最常用的:scikit-learn、LightGBM库和XGBoost库。
深度学习是机器学习的一个分支领域,是一种从数据中学习表示的新方法,旨在同一时间从连续的层中共同学习越来越有意义的表示,可以处理各种非结构化数据,如文本、图像、音频、视频等。因此,深度学习的“深度”指的是一系列连续的表示层。理论上,深度学习是从数据中学习表示的一种数学框架。通过深度神经网络的模型学习得到深度学习的分层表示,整个过程可以看作多级信息蒸馏,即信息穿过连续的过滤器,其纯度越来越高,对于任务的帮助越来越大。学习的意思就是为神经网络的所有层找到一组权重值,使得该神经网络能够将每个示例的输入与其目标正确地一一对应。
深度神经网络通过一系列简单的数据变换(层)来实现这种输入到目标的映射,这些数据变换也都是通过观察示例学习得到的。为高维空间中复杂、高度折叠的数据流形找到简洁的表示。(这里的流形指的是一个连续的表面,例如将一个乱纸团恢复成平整的变换。)
权重(也称为参数):在神经网络中,用于存储每层对输入数据所做的具体操作,实质上是一串数字。也就是说,每层实现的变换是由其权重来参数化;
损失函数(也称为目标函数或者代价函数):用于衡量预测值与真实目标值之间的距离。损失值作为反馈信号,来对权重值进行微调,以降低当前示例对应的损失值;
优化器:用于调节权重值。实现了反向传播算法;
数据表示:张量;也就是存储在多维NumPy数组。
张量是一个数据容器。张量是矩阵向任意维度的推广,张量的维度通常叫作轴,轴的个数也称之为阶。
标量类型 | 形状 | 举例 |
---|---|---|
标量(0阶张量) | 一个float32或float类型的数字就是一个标量张量(或标量数组) | x=np.array(12) x.ndim //查看张量的维度 |
向量(1阶张量) | 数字组成的数组叫作向量 | 1维张量只有一个轴 |
矩阵(2阶张量) | 向量组成的数组叫作矩阵 | 有2个轴,行和列 |
3阶张量和更高阶张量 | 将多个矩阵打包成一个新的数组称为3阶张量 将多个3阶张量打包成一个数组称为4阶张量 | 处理视频数据时可以会遇到5阶张量 |
张量关键属性:轴的个数、形状、数据类型;
关键属性 | 定义 |
---|---|
轴的个数 | 即张量的阶数或者维度;如3阶张量有3个轴,矩阵有2个轴 |
形状 | 是一个整数元组,表示张量沿每个轴的维度大小或者元素个数,如标量:()、向量:(2)、矩阵:(3,5)、3阶张量:(1280,45,2) |
数据类型 | 可以是float16、float32/float、float64、int64/long、int32、int16、int8、uint8、string等 |
深度学习模型不会一次性处理整个数据集,而是将数据拆分为小批量。如批量大小为128
# 第1批
batch = train_images[:128]
# 第2批
batch = train_images[128:256]
# 第n批
n = 3
batch = train_images[128 * n : 128 * (n + 1)]
列举几个数据张量:
类别 | 形状 | 样本 |
---|---|---|
向量数据 | 2阶张量(samples, features) | 每个样本都是一个数值(‘特征’)向量 |
时间序列数据或序列数据 | 3阶张量(samples, timesteps, features) | 每个样本都是特征向量组成的序列,timesteps表序列长度 |
图像数据 | 4阶张量(samples, height,width,channels) | 每个样本都是一个二维像素网格,每个像素由一个通道向量表示 |
视频数据 | 5阶张量(samples, frames, height,width,channels) | 每个样本都是由图像组成的序列(序列长度为frames) |
深度神经网络学到的所有变换都可简化为对数值数据张量的一张张量运算或张量函数(如张量加法、张量乘法)。
张量运算的几何解释:
概念 | 几何解释 |
---|---|
张量的元素 | 可看作某个几何空间中的点的坐标 |
平移 | 二维平移相当于向量加法 |
旋转 | 二维向量旋转通过与矩阵做点积运算,如:R = [[cos(theta), -sin(theta)], [sin(theta), cos(theta)]] |
缩放 | 二维向量旋转通过与对角矩阵做点积运算,如:S=[[horizontal_factor,0], [0, vertical_factor]]。 |
线性变换 | 与任意矩阵做点积运算,都可以实现一次线性变换。如前面所说的缩放和旋转,都属于线性变换 |
仿射变换 | 仿射变换是一次线性变换(通过与某个矩阵做点积运算来实现)与一次平移(通过向量加法来实现)的组合。如 |
仿射变换样例: y = W ? x + b y = W\cdot x + b y=W?x+b
上式的运算样例就是Dense层所实现的,一个没有激活函数的Dense层就是一个仿射层,仿射变换是线性模型,那么俩个仿射变换:affine2(affine1(x)) = W2?(W1?x + b1) +b2 = (W2?W1)?x + (W2?b1 + b2),依然是线性的,因此,激活函数作用:一连串Dense层可以实现非常复杂的非线性几何变换,从而为深度神经网络提供非常丰富的假设空间。
训练具体流程:
几种梯度下降方法介绍:
1、小批量随机梯度下降(mini-batch stochastic gradient descent,简称小批量SGD):每次迭代都是随机抽取一批数据,在调节参数时,也是对当前在随机数据批量上的损失值一点一点进行参数调节;
2、真SGD(True SGD):SGD的一个变体,每次迭代只抽取一个样本和目标,而不是抽取一批数据。
3、批量梯度下降(batch gradient descent):每次迭代都是在所有数据上运行,每次更新权重都会更准确,但计算成本也更高。
4、带动量的SGD:计算下一次权重更新时还要考虑上一次权重更新,而不是仅考虑当前的梯度值。解决了收敛速度和局部极小值。与其类似的,还有Adagrad和RMSprop等SGD变体。这些变体也称为优化方法(optimization method)或者优化器(optimizer)。
past_velocity = 0.
momentum = 0.1 ←----不变的动量因子
while loss > 0.01: ←----优化循环
w, loss, gradient = get_current_parameters()
velocity = past_velocity * momentum - learning_rate * gradient
w = w + momentum * velocity - learning_rate * gradient
past_velocity = velocity
update_parameter(w)
5、链式法则:反向传播
神经网络由许多链接在一起的张量运算组成,每个张量运算的导数都是已知的,且都很简单。
例如,如复合函数fg(x)==f(g(x)); 令 x1 = g(x) , y = f(x1),链式法则规定:grad(y, x) == grad(y, x1) * grad(x1, x),因此只要f和g的导数,即可求出fg的导数,如果添加更多的中间函数,看起来就像一条链,这也是链式法则名字的由来。
再例如 fghj(x): x1 = j(x) x2 = h(x1) x3 = g(x2) y = f(x3) ;根据链式法则: grad(y, x) == (grad(y, x3) * grad(x3, x2) * grad(x2, x1) * grad(x1, x))。
反向传播算法是将链式法则应用于神经网络梯度值的计算,从最终损失值开始,自下而上反向运行,计算每个参数对损失值的贡献。反向传播算法的工作原理是用计算图进行自动微分。计算图是Pytorch和深度学习革命的核心数据结构,是一种由运算(如张量运算)构成的有向无环图。计算图可将计算看作数据,将可计算的表达式 编码为 机器可读的数据结构,然后用于另一个程序的输入或输出。打个比方,有这样一个程序:接收一个计算图作为输入,并返回一个新的计算图,新计算图可实现相同计算的大规模分布式版本。或者接收一个计算图作为输入,然后自动计算它所对应表达式的导数。下图是双层模型的计算图表示和反向传播简化样例:
1) 计算图表示:
2)反向传播简化样例
反向传播grad(loss_val, w)= grad(loss_val, x2) * grad(x2, x1) * grad(x1, w),得到的结果:
grad(loss_val, w) = 1 * 1 * 2 = 2
grad(loss_val, b) = 1 * 1 = 1
超参数: 在整个训练开始之前确定,因为在训练过程中无法通过学习来确定这个值。
更多有关“深度学习”的内容,后续将会发布,未完待续…