深度学习已经成为了当代人类生活中不可缺少的部分,自从2006年被正式提出以来,经过十几年的发展演变,深度学习的进展在人类生活中创造了巨大的价值财富。也有更多的人希望能够从深度学习中学习到更多的知识,今天开始我从基础开始进行深度学习的系统学习。
首先,需要大家有一定的基础知识的学习,其中包含线性代数、概率论与数理统计、简易数值计算等基础知识,这些知识在本科学习中都会有所学习,不清楚的可以简单回顾以下基本概念。更加熟练的基础功底,能够方便后续的知识学习。
深度学习是机器学习的一个分支,我们如果要彻底的学习好深度学习,就要对机器学习有一定神刻的理解。
学习算法
所谓算法,就是机器学习通过从大量数据中“学习”到程序员想要让机器明白的内容的指令过程。对于“学习”的定义有一个严谨而简介的说法:“对于某类额任务 T T T和性能度量 P P P,一个计算机程序背认为可以从经验 E E E中学习是指,通过经验 E E E改进后,它在任务 T T T上由性能度量 P P P衡量的性能有所提升。”
以上的内容可能有些绕口,但是也十分直观神刻的表述了机器学习中“学习”的重要性质。接下来我不会进行对这些指标的严格定义,而是简化表述这些不同的指标对于机器学习的意义,以及如何通过这些指标来确认机器学习的算法设计。
任务 T T T
所谓机器学习就是我们希望通过一些人为的方式,设计出一套规则能够让机器始终遵循这一规则,当然在日常生活中更多事情我们并不能实现设计好,所以很多的情况我们很难去提前预知并设计好让机器如何运作。所以我们希望通过机器自主的去学习探索的方式,让机器自己了解学会一种我们希望它能够掌握的规则模式。
从“任务”角度出发,我们希望机器“学习”的并不是某一段学习过程,而是我们希望它完成的某项任务。比如我们希望机器能够自动识别出每个人是谁,那么人脸识别,就是我们这项工程中的任务所在。我们需要设计一套符合逻辑的编码告诉设备,如何进行人脸的识别判断。
在机器学习任务中机器主要负责对样本的处理。所谓样本就是我们希望机器能够从中收集到可量化的特征的数据集合。我们常常会把样本表示成为一个向量 x ∈ R n x\in \mathbb{R}^n x∈Rn ,其中每一个 x i x_i xi都是某一个样本的特征值。例如照片就是每一个像素点的值。
说了这么多,机器学习能解决哪些任务,下面基本罗列一些当下能够解决的现实问题:
- 分类:在这类任务中,计算机程序需要用户指定某些输入属于分类 k k k中的哪一类。完成该任务前提,需要给定一个函数 f : R n → { 1 , . . . , k } f:\mathbb{R}^n→\{1,...,k\} f:Rn→{1,...,k}。当向量输入 x x x使得 y = f ( x ) y = f(x) y=f(x),用户将会把当前输入分类到 y y y所代表的分类中去。分类任务主要有对象识别,人脸识别等方向。
- 输入缺失分类:当然在日常生活中,并不能保证所有问题都能够有一个确定稳定的输入量,当这类任务的特征向量无法保证时,分类任务的难度就指数级的上升。为了解决这类问题,我们设计者需要设定好一个输入映射输入的指定函数,当输入的某部分缺失时,将有计算机对一组函数进行学习,而不只是单独学习一个分类,当有 n n n个变量输入时,就会存在 2 n 2^n 2n种的分类函数,计算机只需要学习一个满足联合概率分布的函数,就可以解决此类问题。这类问题广泛出现在医疗中,因为医疗实验往往是存在危险性与未知性,所以实操展现的数据并不能是完整的,所以需要这类问题予以解决。
- 回归:这类任务主要是为了预测输入值产生的结果。在这类任务中,计算机程序需要对输入值进行一个返回值,为了解决这类问题,就需要设计函数 f : R n → R f:\mathbb{R}^n→\mathbb{R} f:Rn→R。除了最后的返回值不同,这类任务与分类任务其实很相似,主要应用于股票市场预测或者保险预测中。
- 转录:在这类任务中,计算机需要将一些非结构化数据转化为离散的文本形式。例如一些电信号或者光学信号的转化为文本序列。现代主要在生活中的应用就是语音识别,这种在我们日常生活中是一款很常见深度学习应用。
- 机器翻译:这类任务顾名思义就是简化加快翻译任务,简单来说就是快捷翻译,大家经常用的有道词典或者百度翻译、谷歌翻译都是这类深度学习应用的展现。
- 结构化输出:结构化输出的任务是输出向量或者多个包含多值的数据结构。这个应用范围很大,包含上述的转录以及翻译任务在内的其他任务。例如语法分析,标记处语句中每个词的属性类别。另一个就是图像分割,将图像中的不同类别区分开来,
- 异常检测:这类任务中,计算机程序在一组事件或者对象中筛选,并标记不正常或非典型个体。异常检测任务的一个示例就是信用卡欺骗检测。通过对购买习惯的建模,信用卡公司可以检测你的卡是否被盗用,如果出现不正常购买行为,信用卡公司可以快捷冻结该卡,以防止更大的损失产生。
- 合成和采样:这类任务中,机器学习程序生成一些和训练数据相似的新样本。通过机器学习,合成和采样在媒体应用中十分有用,可避免艺术家大量昂贵的手工工作。例如,在视频游戏中可自动生成大型物体或物件纹理,而不是让手绘工作者完整的手绘所有图片。更例如在语音合成中,可以提供文字,并转化为正常自然的语音输出。
- 缺失值填补:这类任务中,机器学习算法给定新样本 x ∈ R n x \in\mathbb{R}^n x∈Rn, x x x中某些元素 x i x_i xi缺失,算法将其补充完整。
- 去噪:在这类任务中,机器学习输入是,干净样本 x ∈ R n x \in \mathbb{R}^n x∈Rn经过未知的损坏损失后会得到损失样本 x ^ ∈ R n \hat{x} \in \mathbb{R}^n x^∈Rn,算法通过损坏样本进行预测干净样本 x x x,或者更加一般预测条件概率分布 p ( x ∣ x ^ ) p(x|\hat{x}) p(x∣x^)。
- 密度估计或概率质量函数估计:在密度估计中,机器学习算法学习函数 p m o d e l : R n → R p_{model} : \mathbb{R}^n → \mathbb{R} pmodel:Rn→R,其中 p m o d e l ( x ) p_{model}(x) pmodel(x)可以解释成样本采样空间的概率密度函数(前提 x x x是连续的)或者概率质量函数(前提 x x x是离散的)。算法必须知道什么情况样本聚集,什么情况下不太可能出现。密度估计可以显式地获得概率分布结构。但是大多数情况下这一情况都是很艰难的,因为 p ( x ) p(x) p(x)十分难算。
当然还有很多的同类型任务或其他类型任务。需要了解详细的同学可以查阅相关资料进一步了解,这里知识初步一个认识。
性能度量 P P P
当然只有任务我们并不能只看他是否能解决问题,还要看他解决问题的能力,如果消耗的时间和资金过多,该算法也是不值得推荐的。所以对于每一个任务 T T T,都会特定的测算出一个性能度量 P P P。
针对上述机器学习所解决的任务,我们通常会把这种度量分为准确率和错误率。顾名思义,准确率是指输出正确情况的结果所占全部结果的比率,错误率类似。错误率通常称为0-1损失期望。在一个特定的样本中,若结果是对的则0-1损失为 0 0 0;否则是 1 1 1。但是这一标准并不能应用到所有任务中,比如密度估计,错误率就是一个没有意义的指标。最常用的就是输出模型中某些样本在概率对数的平均值。
当然,如果只让计算机学习测试这些已经训练好的数据也是不行的,在未知数据上的准确度也是我们必须要测试的。因此,我们要单独划分出测试集。这要与训练集相区分,以保证测试的准确性。
在实际应用中,性能度量的设计往往很难确定,是确定一个大范围的指标,还是确定十分精细的小标签,这都需要我们来去测试与调节,所以在设计中要选择好方向,不然结果往往会与预期效果偏差甚远。
经验 E E E
经验,这个词语我们在人类的日常生活中经常听到,一个人工作的经验,往往能够影响这个人在工作中的准确度和效率。那么机器学习中的经验,往往是区分两类机器学习的指标,其中分别为无监督算法和监督算法。
大部分的学习算法基本都是在一个给定的数据集上获取经验。数据集就是很多样本的集合,或者可以称它们为数据点。
Iris(鸢尾花卉)数据集是统计学家和机器学习研究者使用了很久的一个数据集,它是由150个鸢尾花卉植物的不同部分测量值的集合。每个单独的植物个体属于一个样本,每个样本包含了当前个体植物的属性特征的测量结果:萼片长度、萼片宽度、花瓣长度和花瓣宽度。以及包含了鸢尾花卉的分类统计,共有三个类别。
无监督学习算法训练包含多种特征的数据集,但是这个数据集并不会给明确的分类,而是由机器自己去判断这个数据集上有用的属性特征。在深度学习中,我们通常要这个模型的概率分布,显式地,比如密度估计,隐式地、比如合成和去噪。还有一些其他的无监督模型,例如聚类,将数据集分成相似的集合予以输出。
监督学习算法同样是训练含有多种特征的数据集,但是这些数据集都已经包含了人为给出的具体分类,这种分类我们称为是标签(label) 或者目标(target) 。例如,Iris数据集就表明了每种鸢尾花的种类,监督学习通过这种数据集的训练,学习到如何根据所给的特征值,进行区分。
简而言之,无监督学习就是观察随机的向量,将这些杂乱无章的数据,尽可能的计算出相互关联的关系;而监督学习就是把这些随机数据向量,向固定的值去引导,让随机的 x → y x → y x→y。
这两个算法并不是十分严格的区分,之间可以两者共用。例如,概率的链式法则表明对随机向量 x ∈ R n x \in R^n x∈Rn,联合分布可以分解为
p ( x ) = ∏ i = 1 n p ( x i ∣ x 1 , . . . , x i − 1 ) p(x) = \displaystyle\prod_{i = 1}^{n} p(x_i |x_1,...,x_{i-1}) p(x)=i=1∏np(xi∣x1,...,xi−1)
该分解意味着我们可以将它拆分成 n n n个监督学习的问题,来解决这个表面上的无监督学习 p ( x ) p(x) p(x)。另外,当我们求解监督学习问题 p ( y ∣ x ) p(y|x) p(y∣x)时,也可以用传统的无监督学习策略学习联合分布 p ( x , y ) p(x,y) p(x,y),然后再推断
p ( y ∣ x ) = p ( x , y ) ∑ y ′ p ( x , y ′ ) p(y|x) = \dfrac{p(x,y)}{\sum_{y'}p(x,{y'})} p(y∣x)=∑y′p(x,y′)p(x,y)
尽管这两个学习算法并没有严格的定义区分,但是它们有助于我们对机器学习的理解学习。
当然仍有一些学习算法并不是只训练与一个固定的数据集上。例如,强化学习算法会和环境变化交互,所以学习系统和它训练的过程会有反馈回路。这类算法有兴趣的同学可以查阅相关资料进一步学习,本文就不再详细描述。
示例:线性回归
之前我们有将机器学习算法定义为:通过经验以提高计算机程序在某些任务上性能的算法。为了方便大家的学习理解,在本文最后,将会展示一个基础例子:线性回归。
简而言之,线性回归就是解决回归问题,我们通过建立一个循环系统,将向量 x ∈ R n x \in \mathbb{R}^n x∈Rn作为输入,预测值 y ∈ R y\in \mathbb{R} y∈R作为输出。线性回归的输出,就是下一次的输入。而 y ^ \hat{y} y^作为预测模型预测出 y y y的值,我们定义以下输出
y ^ = ω T x \hat{y} = \omega^T x y^=ωTx
其中 ω ∈ R n \omega \in \mathbb{R}^n ω∈Rn是参数向量。
参数是控制系统行为的值。在这里, ω i \omega_i ωi是系数,要和特征值 x i x_i xi相乘后累计相加。我们可以把 ω \omega ω看作一组决定预测值的影响权重。如果权重为正数,那么在与特征值相乘后,最后的预测值会增加;如果权重为负数,那么在与特征值相乘后,最后的预测值会减少。当权重值很大,那么它会对最后的结果有很大的影响;当权重值很小,那么它会对最后的预测结果带来的影响也会很小。
因此,我们可以定义一个任务 T T T:通过输出 y ^ = ω T x \hat{y}=\omega^Tx y^=ωTx从 x x x预测 y y y。接下来根据上文,我们要定义性能度量———— P P P。
假设我们有 m m m个输入样本组成的输入矩阵,不用它进行训练模型,而是用于性能评估。我们也有每个样本输入的对应正确值 y y y组成的回归目标向量。这就是我们设计的测试集。输入矩阵我们定义为 X ( t e s t ) X^{(test)} X(test),目标向量我们定义为 y ( t e s t ) y^{(test)} y(test)。
度量模型性能的一种方法就是计算模型在测试集上的均方误差。如果 y ^ ( t e s t ) \hat{y}^{(test)} y^(test)表示模型在测试集上的预测值,那么均方误差公式为
M S E t e s t = 1 m ∑ i ( y ^ ( t e s t ) − y ( t e s t ) ) i 2 MSE_{test} = \dfrac{1}{m} \displaystyle\sum_i(\hat{y}^{(test)} - y^{(test)})^2_i MSEtest=m1i∑(y^(test)−y(test))i2
直观上来看,当 y ^ ( t e s t ) = y ( t e s t ) \hat{y}^{(test)} = y^{(test)} y^(test)=y(test)时,我们会发现误差为 0 0 0。我们可以发现
M S E t e s t = 1 m ∣ ∣ y ^ ( t e s t ) − y ( t e s t ) ∣ ∣ 2 2 MSE_{test} = \dfrac{1}{m} || \hat{y}^{(test)} - y^{(test)} ||_2^2 MSEtest=m1∣∣y^(test)−y(test)∣∣22
所以当预测值与真实值之间的欧几里得距离增加时,误差也会加大。
为了构建一个机器学习算法,我们需要设计一个算法,通过观察训练集( X ( t r a i n ) , y ( t r a i n ) X^{(train)} , y^{(train)} X(train),y(train))来获得经验值,减少 M S E t e s t MSE_{test} MSEtest 以改进权重 ω \omega ω。一种直观方式就是最小化训练集的均方误差,即 M S E t r a i n MSE_{train} MSEtrain。
最小化 M S E t r a i n MSE_{train} MSEtrain,我们可以简单的求解其导数为 0 0 0的情况:
∇ ω M S E t r a i n = 0 → ∇ ω 1 m ∣ ∣ y ^ ( t r a i n ) − y ( t r a i n ) ∣ ∣ 2 2 = 0 → 1 m ∇ ω ∣ ∣ X ( t r a i n ) ω − y ( t r a i n ) ∣ ∣ 2 2 = 0 → ∇ ( X ( t r a i n ) ω − y ( t r a i n ) ) T ( X ( t r a i n ) ω − y ( t r a i n ) ) = 0 → ∇ ω ( ω T X ( t r a i n ) T X ( t r a i n ) ω − 2 ω T X ( t r a i n ) T y ( t r a i n ) + y ( t r a i n ) T y ( t r a i n ) ) = 0 → 2 X ( t r a i n ) T X ( t r a i n ) ω − 2 X ( t r a i n ) T y ( t r a i n ) = 0 → ω = ( X ( t r a i n ) T X ( t r a i n ) ) − 1 X ( t r a i n ) T y ( t r a i n ) \nabla_{\omega} MSE_{train} = 0 \\ →\nabla_{\omega} \dfrac{1}{m} || \hat{y}^{(train)} - y^{(train)} ||_2^2 = 0 \\ →\dfrac{1}{m}\nabla_{\omega} ||X^{(train)}\omega - y^{(train)}||_2^2 = 0 \\ →\nabla(X^{(train)}\omega - y^{(train)})^T (X^{(train)}\omega - y^{(train)}) = 0 \\ →\nabla_{\omega}(\omega^T X^{(train)T} X^{(train)} \omega - 2\omega^T X^{(train)T}y^{(train)} + y^{(train)T} y^{(train)}) = 0 \\ →2X^{(train)T} X^{(train)}\omega - 2X^{(train)T} y^{(train)} = 0 \\ →\omega = (X^{(train)T}X^{(train)})^{-1} X^{(train)T} y^{(train)} ∇ωMSEtrain=0→∇ωm1∣∣y^(train)−y(train)∣∣22=0→m1∇ω∣∣X(train)ω−y(train)∣∣22=0→∇(X(train)ω−y(train))T(X(train)ω−y(train))=0→∇ω(ωTX(train)TX(train)ω−2ωTX(train)Ty(train)+y(train)Ty(train))=0→2X(train)TX(train)ω−2X(train)Ty(train)=0→ω=(X(train)TX(train))−1X(train)Ty(train)
通过通式计算给出解的系统方程称为正规方程。该式构成了一个简单的机器学习算法。下图展示了线性回归算法的一个简单用例。
这是一个简单的线性回归问题,其中训练集仅有5个数据点,每个数据点只有一个特征,所以我们只需要训练一个特征权重参数
ω
1
\omega_1
ω1。这里例子相对与前面有一点点变化就是增加了一个偏移量
b
b
b。在这个模型中
y ^ = ω T x + b \hat{y} = \omega^T x + b y^=ωTx+b
因此从参数到预测函数仍是一个线性函数,得到的预测是一个仿射函数,该去线仍然是直线,但是没有经过原点。
线性回归是一个十分简单的学习算法,能够帮助我们快速理解掌握基本的机器学习基础,让我们快速入门,之后会继续加深学习进度,有兴趣的可以关注我,我们一起学习!!!