目录
文章目录
机器学习
机器学习的定义
由Tom Mitchell提出,来自卡内基梅隆大学,Tom定义的机器学习是,一个好的学习问题定义如下,他说:一个程序被认为能从经验E中学习,解决任务T,达到性能度量值P,当且仅当有了经验E后,经过P评判,程序在处理T时的性能有所提升。我认为经验E 就是程序上万次的自我练习的经验而任务T 就是下棋。性能度量值P呢,就是它在与一些新的对手比赛时,赢得比赛的概率。
监督学习
监督学习 (supervised learning) 是指从标注数据中学习预测模型的机器学习问题。标注数据表示输入输出的对应关系,预测模型对给定的输入产生相应的输出。监督学习的本质是学习输入到输出的映射的统计规律。
例:一个学生收集了一些房价的数据。这些数据画出来:横轴表示房子的面积,单位是平方英尺,纵轴表示房价,单位是千美元。那基于这组数据,假如有一套750平方英尺房子,现在希望把房子卖掉,想知道这房子能卖多少钱。
应用学习算法,可以拟合一条直线,根据这条线可以推测出,这套房子可能卖150,000$。当然这不是唯一的算法,比如用二次方程去拟合可能效果会更好。根据二次方程的曲线,我们可以从这个点推测出,这套房子能卖接近200,000$。
可以看出,监督学习指的就是我们给学习算法一个数据集。这个数据集由“正确答案”(即带有标签的数据)组成。在房价的例子中,给定一系列房子的数据,然后运用学习算法,推测更多的正确答案。比如那个新房子的价格。
这种问题就叫做回归问题。我们需要推测出一个连续值的结果,即房子的价格。一般房子的价格会记到美分,所以房价实际上是一系列离散的值,但是我们通常又把房价看成实数,看成是标量,所以又把它看成一个连续的数值。
若欲预测的是连续值,则此类学习任务称为"回归" (regression)
另外一个监督学习(分类)的例子:假设你想通过查看病历来推测乳腺癌良性与否。
在这个数据集中,横轴表示肿瘤的大小,纵轴上,我标出1和0表示是或者不是恶性肿瘤。我们之前见过的肿瘤,如果是恶性则记为1,不是恶性,或者说良性记为0。
我有5个良性肿瘤样本,在1的位置有5个恶性肿瘤样本。现在有一个人查出乳腺肿瘤,已知她的肿瘤大小,那么机器学习的问题就在于能否根据这个大小估算出肿瘤是恶性或是良性的概率。用术语来讲这就是一个分类问题。
若我们欲预测的是离散值,则此类学习任务称为 “分类” (classification);
无监督学习
定义:无监督学习是从无标注的数据中学习数据的统计规律或者说内在结构的机器学习,主要包括聚类、降维、概率估计。无监督学习可以用于数据分析或者监督学习的前处理。无监督学习的基本想法是对给定数据(矩阵数据)进行某种"压缩",从而找到数据的潜在结构。
定义:聚类(clustering )是将样本集合中相似的样本(实例)分配到相同的类,不相似的样本分配到不同的类。聚类时,样本通常是欧氏空间中的向量,类别不是事先给定, 而是从数据中自动发现,但类别的个数通常是事先给定的。
在无监督学习中,我们已知的数据不同于监督学习的数据的样子,无监督学习中没有任何的标签或者是有相同的标签或者就是没标签。
针对数据集,无监督学习能判断出数据有几个不同的聚集簇。无监督学习算法可能会把这些数据分成几个不同的簇。所以叫做聚类算法。
单变量线性回归(Linear Regression with One Variable)
通用模型表示
给定由
d
d
d个属性描述的示例
x
=
(
x
1
;
x
2
;
.
.
.
;
x
d
)
x=(x_1;x_2;...;x_d)
x=(x1;x2;...;xd)其中其中均是在第
d
d
d个属性上的取值,线性模型(linear model)试图学得一个通过属性的线性组合来进行预测的函数,即
h
(
x
)
=
θ
1
x
1
+
θ
2
x
2
+
.
.
.
+
θ
d
x
d
+
θ
0
h(x)={\theta }_{1}{x}_{1}+{\theta }_{2}{x}_{2}+...+{\theta }_{d}{x}_{d}+\theta_0
h(x)=θ1x1+θ2x2+...+θdxd+θ0
“线性回归” (linear regression) 试图学得一个线性模型以尽可能准确地预测实值输出标记。
例:我们要使用一个数据集,数据集包含俄勒冈州波特兰市的住房价格。在这里,根据不同房屋尺寸所售出的价格,画出数据集。比方说,如果你朋友的房子是1250平方尺大小,你要告诉他们这房子能卖多少钱。那么,你可以做的一件事就是构建一个模型,也许是条直线,从这个数据模型上来看,也许你可以告诉你的朋友,他能以大约220,000(美元)左右的价格卖掉这个房子。这就是监督学习算法的一个例子。
它被称作监督学习是因为对于每个数据来说,我们给出了“正确的答案”,即告诉我们:根据我们的数据来说,房子实际的价格是多少,更具体来说,这是一个回归问题。回归一词指的是,我们根据之前的数据预测出一个准确的输出值,对于这个例子就是价格,同时,还有另一种最常见的监督学习方式,叫做分类问题,当我们想要预测离散的输出值,例如,我们正在寻找癌症肿瘤,并想要确定肿瘤是良性的还是恶性的,这就是0/1离散输出的问题。更进一步来说,在监督学习中我们有一个数据集,这个数据集被称训练集。
在整个课程中用小写的 m m m来表示训练样本的数目。
以之前的房屋交易问题为例,假使我们回归问题的训练集(Training Set)如下表所示:
Size in feet^2(x) | Price($) in 1000’s(y) |
---|---|
2104 | 460 |
1416 | 232 |
1534 | 315 |
852 | 178 |
… | … |
我们将要用来描述这个回归问题的标记如下:
m
m
m:代表训练集中实例的数量
x
x
x:代表训练集中实例的数量
y
y
y:代表目标变量(输出变量)
(
x
,
y
)
(x,y)
(x,y):代表训练集中的实例
(
x
(
i
)
,
y
(
i
)
)
(x^{(i)},y^{(i)})
(x(i),y(i)):代表第i个观察实例
h
h
h:代表学习算法的解决方案或函数也称为假设(hypothesis)
可以看到这里有训练集里房屋价格,把它喂给我们的学习算法,然后输出一个函数,通常用 h h h表示。 h h h意为hypothesis(假设),表示一个函数,输入 x x x是房屋尺寸大小, y y y值对应房子的价格 ,因此 h h h根据输入的 x x x值来得出 y y y值,即 h h h是一个从 x x x到 y y y的函数映射。
对于我们的房价预测问题,一种可能的表达方式为: h θ ( x ) = θ 0 + θ 1 x h_\theta(x)=\theta_0+\theta_1x hθ(x)=θ0+θ1x,因为只含有一个特征/输入变量,因此这样的问题叫作单变量线性回归问题。
代价函数
用来预测的函数为 h θ ( x ) = θ 0 + θ 1 x h_\theta(x)=\theta_0+\theta_1x hθ(x)=θ0+θ1x,现在要做的就是为模型选择合适的参数(parameters) θ 0 \theta_0 θ0和 θ 1 \theta_1 θ1。模型所预测的值与训练集中实际值之间的差距(下图中蓝线所指)就是建模误差(modeling error)。
我们的目标便是选择出可以使得建模误差的平方和能够最小的模型参数,即使得均方代价函数最小。基于均方误差最小化来进行模型求解模型的方法称为**“最小二乘法”**。(常数 1 2 \frac{1}{2} 21不会带来本质差别,但可使损失函数求导后常数系数为1。平方误差代价函数可能是回归问题中最常用的代价函数。)
J
(
θ
0
,
θ
1
)
=
1
2
m
∑
i
=
0
m
−
1
(
h
θ
0
,
θ
1
(
x
(
i
)
)
−
y
(
i
)
)
2
J(\theta_0,\theta_1) = \frac{1}{2m} \sum\limits_{i = 0}^{m-1} (h_{\theta_0,\theta_1}(x^{(i)}) - y^{(i)})^2
J(θ0,θ1)=2m1i=0∑m−1(hθ0,θ1(x(i))−y(i))2
接下来让我们通过一些例子来获取一些直观的感受,看看代价函数到底是在干什么。(注意:h是θ确定后关于x的函数,J是关于θ的函数)
我们绘制一个等高线图,三个坐标分别为 θ 0 \theta_0 θ0和 θ 1 \theta_1 θ1和 J ( θ 0 , θ 1 ) J(\theta_0,\theta_1) J(θ0,θ1),则可以看出在三维空间中存在一个使得 J ( θ 0 , θ 1 ) J(\theta_0,\theta_1) J(θ0,θ1)最小的点。线性回归的代价函数总是一个凸函数,无局部最优,只有一个全局最优解。
我们的最终目标是找到使得代价函数 J J J最小的参数 θ 0 \theta_0 θ0和 θ 1 \theta_1 θ1,我们需要的是一种有效的算法能够自动地找出能使代价函数 J J J最小化的参数 θ 0 \theta_0 θ0和 θ 1 \theta_1 θ1的值,即梯度下降法。
作业练习1-excise1
作业来自配套练习文件C1_W2_Linear_Regression.ipynb
Complete the compute_cost
below to:
-
Iterate over the training examples, and for each example, compute:
- The prediction of the model for that example
f w b ( x ( i ) ) = w x ( i ) + b f_{wb}(x^{(i)}) = wx^{(i)} + b fwb(x(i))=wx(i)+b
- The cost for that example c o s t ( i ) = ( f w b − y ( i ) ) 2 cost^{(i)} = (f_{wb} - y^{(i)})^2 cost(i)=(fwb−y(i))2
-
Return the total cost over all examples
J ( w , b ) = 1 2 m ∑ i = 0 m − 1 c o s t ( i ) J(\mathbf{w},b) = \frac{1}{2m} \sum\limits_{i = 0}^{m-1} cost^{(i)} J(w,b)=2m1i=0∑m−1cost(i)- Here, m m m is the number of training examples and ∑ \sum ∑ is the summation operator
If you get stuck, you can check out the hints presented after the cell below to help you with the implementation.
# UNQ_C1
# GRADED FUNCTION: compute_cost
def compute_cost(x, y, w, b):
"""
Computes the cost function for linear regression.
Args:
x (ndarray): Shape (m,) Input to the model (Population of cities)
y (ndarray): Shape (m,) Label (Actual profits for the cities)
w, b (scalar): Parameters of the model
Returns
total_cost (float): The cost of using w,b as the parameters for linear regression
to fit the data points in x and y
"""
# number of training examples
m = x.shape[0]
# You need to return this variable correctly
total_cost = 0
### START CODE HERE ###
h = w * x + b # 预测的值h
total_cost = sum((h - y)**2) / (2*m) # 使用最小二乘公式算出的代价J
### END CODE HERE ###
return total_cost # 正确答案为2.0
梯度下降
梯度下降是一个用来求函数最小值的算法,我们将使用梯度下降算法来求出代价函数 J J J的最小值。
梯度下降背后的思想是:开始时我们随机选择一个参数的组合 ( θ 0 ; θ 1 ; . . . ; θ n ) (\theta_0;\theta_1;...;\theta_n) (θ0;θ1;...;θn),计算代价函数,然后我们寻找下一个能让代价函数值下降最多的参数组合。我们持续这么做直到找到一个局部最小值(local minimum)。
注意因为我们并没有尝试完所有的参数组合,所以不能确定我们得到的局部最小值是否便是全局最小值(global minimum),选择不同的初始参数组合,可能会找到不同的局部最小值。
想象一下你正站立在山的这一点上,站立在你想象的公园这座红色山上,在梯度下降算法中,我们要做的环看周围,并问自己要在某个方向上,用小碎步尽快下山。这些小碎步需要朝什么方向?如果我们站在山坡上的这一点,你看一下周围,你会发现最佳的下山方向,你再看看周围,然后再一次想想,我应该从什么方向迈着小碎步下山?然后你按照自己的判断又迈出一步,重复上面的步骤,从这个新的点,你环顾四周,并决定从什么方向将会最快下山,然后又迈进了一小步,并依此类推,直到你接近局部最低点的位置。
梯度(gradient)向量定义:即⼀个多元函数对其所有变量的偏导数。表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
梯度下降(gradient descent)算法的公式为:
θ
j
:
=
θ
j
−
α
∂
J
(
θ
)
∂
θ
j
(
j
=
0
,
1
,
.
.
.
,
n
)
\theta_j:= \theta_j - \alpha \frac{\partial J(\theta)}{\partial \theta_j} (j = 0,1,...,n)
θj:=θj−α∂θj∂J(θ)(j=0,1,...,n)
:
=
:=
:=意为赋值
其中 α \alpha α是学习率(learning rate),它决定了我们沿着能让代价函数下降程度最大的方向向下的步长,在批量梯度下降中,我们每一次都同时让所有的参数减去学习速率乘以代价函数对相应参数的偏导数。
梯度下降的直观展示
根据公式
θ j : = θ j − α ∂ J ( θ ) ∂ θ j ( j = 0 , 1 , . . . , n ) \theta_j:= \theta_j - \alpha \frac{\partial J(\theta)}{\partial \theta_j} (j = 0,1,...,n) θj:=θj−α∂θj∂J(θ)(j=0,1,...,n)
在理想情况下,对参数 θ j \theta_j θj不断赋值,使得函数值按梯度下降最快方向进行,如此迭代直到得到局部最小值。
对于这个问题,求导的目的,基本上可以说取这个点的切线,这条红色直线的斜率正好是这个三角形的高度除以这个水平长度,现在这条线有一个正斜率,也就是说它有正导数,因此,我们得到新的
θ
\theta
θ:即
θ
\theta
θ减去
J
(
θ
)
J(\theta)
J(θ)对
θ
\theta
θ的偏导乘以
α
\alpha
α。
关于学习率的选取在本章的学习率中有展示
梯度下降的线性回归
本节,我们要将梯度下降和代价函数结合,将其应用于具体的拟合直线的线性回归算法里。
梯度下降算法和线性回归算法比较如图:
对我们之前的线性回归问题运用梯度下降法,关键在于求出代价函数的导数,即:
∂
J
(
θ
0
,
θ
1
)
∂
θ
0
=
1
m
∑
i
=
0
m
−
1
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
∂
J
(
θ
0
,
θ
1
)
∂
θ
1
=
1
m
∑
i
=
0
m
−
1
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
(
i
)
\begin{align}\frac{\partial J(\theta_0,\theta_1)}{\partial \theta_0} &= \frac{1}{m} \sum\limits_{i = 0}^{m-1} (h_{\theta}(x^{(i)}) - y^{(i)}) \\\frac{\partial J(\theta_0,\theta_1)}{\partial \theta_1} &= \frac{1}{m} \sum\limits_{i = 0}^{m-1} (h_{\theta}(x^{(i)}) - y^{(i)})x^{(i)} \\\end{align}
∂θ0∂J(θ0,θ1)∂θ1∂J(θ0,θ1)=m1i=0∑m−1(hθ(x(i))−y(i))=m1i=0∑m−1(hθ(x(i))−y(i))x(i)
带入梯度下降算法公式则得到:
θ
0
:
=
θ
0
−
α
1
m
∑
i
=
0
m
−
1
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
θ
1
:
=
θ
1
−
α
1
m
∑
i
=
0
m
−
1
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
(
i
)
\theta_0:= \theta_0 - \alpha \frac{1}{m} \sum\limits_{i = 0}^{m-1} (h_{\theta}(x^{(i)}) - y^{(i)})\\ \theta_1:= \theta_1 - \alpha \frac{1}{m} \sum\limits_{i = 0}^{m-1} (h_{\theta}(x^{(i)}) - y^{(i)})x^{(i)}
θ0:=θ0−αm1i=0∑m−1(hθ(x(i))−y(i))θ1:=θ1−αm1i=0∑m−1(hθ(x(i))−y(i))x(i)
上述有时也称为**“批量梯度下降(Batch Gradient Descent)”**。指的是在梯度下降的每一步中,我们都用到了所有的训练样本。事实上,有时也有其他类型的梯度下降法,不是这种"批量"型的,不考虑整个的训练集,而是每次只关注训练集中的一些小的子集。
有一种计算代价函数 J J J最小值的数值解法,不需要梯度下降这种迭代算法。在后面的课程中,我们也会谈到这个方法,它可以在不需要多步梯度下降的情况下,也能解出代价函数 J J J的最小值,这是另一种称为正规方程(normal equations)的方法。实际上在数据量较大的情况下,梯度下降法比正规方程要更适用一些。
多元梯度下降
与单变量线性回归类似,在多变量线性回归中,我们也构建预测函数,代价函数。我们的目标和单变量线性回归问题中一样,是要找出使得代价函数最小的一系列参数。
预测函数: h ( x ) = θ T X = X θ = θ 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n h(x)=\theta^TX=X\theta=\theta_0+{\theta }_{1}{x}_{1}+{\theta }_{2}{x}_{2}+...+{\theta }_{n}{x}_{n} h(x)=θTX=Xθ=θ0+θ1x1+θ2x2+...+θnxn
代价函数: J ( θ 0 , θ 1 , . . . , θ n ) = 1 2 m ∑ i = 0 m − 1 ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta_0,\theta_1,...,\theta_n) = \frac{1}{2m} \sum\limits_{i = 0}^{m-1} (h_{\theta}(x^{(i)}) - y^{(i)})^2 J(θ0,θ1,...,θn)=2m1i=0∑m−1(hθ(x(i))−y(i))2
目标: θ 0 , θ 1 , . . . , θ n \theta_0,\theta_1,...,\theta_n θ0,θ1,...,θn 使得 m i n i m i z e J ( θ 0 , θ 1 , . . . , θ n ) minimizeJ(\theta_0,\theta_1,...,\theta_n) minimizeJ(θ0,θ1,...,θn)
pytorch
Pytorch是torch的python版本,是由Facebook开源的神经网络框架。在2016年发布后,PyTorch很快就因其易用性、灵活性和强大的功能而在科研社区中广受欢迎。与Tensorflow的静态计算图不同,pytorch的计算图是动态的,可以根据计算需要实时改变计算图。
到了近两年,PyTorch已经成为全球最流行的深度学习框架之一。其在GitHub上的星标数量超过了50k,被用在了各种各样的项目中,从最新的研究论文到大规模的工业应用。
安装pytorch环境
进入pytorch官网,选择合适的操作系统,语言,cuda版本。官网会自动生成合适的安装命令,复制到python虚拟环境中去运行。
测试是否安装成功,CUDA是否可用
import torch
print(torch.__version__) # pytorch版本
print(torch.version.cuda) # cuda版本
print(torch.cuda.is_available()) # 查看cuda是否可用,返回True即为可用
关于返回False的情况的原因和解决方法:
由于官网给定的下载源在境外,所以下载速度缓慢,下载数据量又很大,容易超时。所以我将源替换成清华源,然而下载的其实是CPU版本,即不支持CUDA。此问题实际上来自清华源,其默认会下载CPU版本。目前比较好解决方法还是去官网上下载对应的torch和torchvision的whl文件,然后进行离线安装。具体参考:torch.cuda.is_available()返回false——解决办法_cuda available false-CSDN博客
dataset
torch.utils.data.dataset这样的抽象类可以用来创建数据集。学过面向对象的应该清楚,抽象类不能实例化,因此我们需要构造这个抽象类的子类来创建数据集,并且我们还可以定义自己的继承和重写方法。这其中最重要的就是len和getitem这两个函数,前者给出数据集的大小,后者是用于查找数据和标签。
总结
本周学习了机器学习课程的第一章线性回归,对一种算法的大致框架有了基本概念,例如预测函数,代价函数,学习率等。下周开始逻辑回归模型的学习。了解pytorch,安装pytorch环境,下周学习torch常用工具的学习。