线性模型
机器学习很简单,第一步设未知函数,第二步定义损失函数,最后优化
由于线性模型比较简单,而且有很严重的限制,所以我们需要更复杂一点的模型
看到下面这个图,里面的红线是我们需要实现的
使用0、1、2、3条蓝线在不同的位置来拟合红线
虽然可以很容易的通过蓝线的结合来实现红线,但是如果出现更曲折的线段时,我们就需要更多的蓝色线去拟合
那么既然蓝色线很重要,接下来就先来学习一下:
给出一个函数式描述这条线:
当趋近于正无穷时,e的趋近于0,那么整个表达式趋近于1,那么y此时趋近于c
当趋近于负无穷时,e的趋近于0,那么整个表达式趋近于0,那么y此时趋近于0
称为Sigmoid函数
c,b,w这三个参数分别影响曲线的高度、左右平移的幅度和倾斜度
不同的蓝色折线,参数不同
可以用来表示
此外,我们可以不只用一个特征 x1,可以用多个特征代入不同的 c, b, w,组合出各种不同的函数,从而得到更有灵活性(flexibility)的函数。
比如,我们还使用观看youtub中李宏毅老师深度学习的课程人数,来解释
代表前一天的观看次数, 两天前观看次数, 3 天前的观看次数,每一个 i 就代表了一个蓝色的函数。每一个蓝色的函数都用一个 Sigmoid 函数来比近似它,1,2,3 代表有个 Sigmoid 函数。,代表在第 i 个 Sigmoid 里面,乘给第 j 个特征的权重,w 的第一个下标代表是现在在考虑的是第一个 Sigmoid 函数。
为了简化起见,括号里面的式子为
我们可以用矩阵跟向量相乘的方法,写一个比较简洁的写法。
将其改成线性代数比较常用的表示方式为r = b + W x
篮框里面可以使用来表示,就是Sigmoid函数
简单用代码实现sigmoid函数:
%matplotlib inline
import torch
from d2l import torch as d2l
#sigmoid函数
y=torch.sigmoid(x)
d2l.plot(x.detach(),y.detach(),'x','sigmoid(x)',figsize=(5,2.5))
得到之后分别乘c1,c2,c3加上b得到最后的y
构建出蓝色线的函数式之后,我们再来定义一下损失函数
这里我们先设未知参数,按行拼接后的一个长向量称为
接下来要定义损失。之前是 L(w, b),因为 w 跟 b 是未知的。现在未知的参数很多了,再把它一个一个列出来太累了,所以直接用 θ 来统设所有的参数,所以损失函数就变成 L(θ)。损失函数能够判断 θ 的好坏,其计算方法跟刚才只有两个参数的时候是一样的。先给定 θ 的值,即某一组 W, b, , b 的值,再把一种特征 x 代进去,得到估测出来的 y,再计算一下跟真实的标签之间的误差 e。把所有的误差通通加起来,就得到损失。接下来下一步就是优化
要找到 θ 让损失越小越好,可以让损失最小的一组 θ 称为 。一开始要随机选一个初始数值
然后计算每一个未知参数对L的微分,得到g
针对小批量优化,每一个batch优化一次参数,一个epoch之后就会将所有的batch遍历完,有多少个batch就更新多少次
模型变形
上图这个折线就是我们刚才讨论的sigmoid函数的hard sigmoid
那么我们怎么用更简单的折线去实现它呢?
使用ReLU函数就可以
ReLU函数在x的负半轴都是0,在x的正半轴是y=x这个函数
ReLU(x) = max(x, 0).
%matplotlib inline
import torch
from d2l import torch as d2l
x=torch.arange(-8.0,8.0,0.1,requires_grad=True)
y=torch.relu(x)
d2l.plot(x.detach(),y.detach(),'x','relu(x)',figsize=(5,2.5))
Sigmoid 或 ReLU 称为神经元(neuron),很多的神经元称为神经网络(neural network),每一排称为一层,称为隐藏层(hiddenlayer),很多的隐藏层就“深”,这套技术称为深度学习。
很多人都通过加深神经网络的层数减小了错误率,所以神经网络就越来越深了
2012 年的 AlexNet 有 8 层它的错误率是 16.4%,两年之后 VGG 有 19 层,错误率在图像识别上进步到 7.3 %。这都是在图像识别上一个基准的数据库(ImageNet)上面的结果,后来 GoogleNet 有 22 层,错误率降到 6.7%。而残差网络(Residual Network,ResNet)有 152 层,错误率降到 3.57%。
在训练数据和测试数据上的结果是不一致的,这种情况称为过拟合(overfitting)。
机器学习框架
我们会有一堆训练的数据以及测试数据如式所示,测试集就是只有 x 没有 y。
训练数据:
测试数据:
总结一下训练过程:
1. 先写出一个有未知数 θ 的函数,θ 代表一个模型里面所有的未知参数。fθfθ(x) 的意思就是函数叫 fθfθ(x),输入的特征为 x,;
2. 定义损失,损失是一个函数,其输入就是一组参数,去判断这一组参数的好坏;
3. 解一个优化的问题,找一个 θ,该 θ 可以让损失的值越小越好。让损失的值最小的 θ 为,即
有了 以后,就把它拿来用在测试集上,也就是把带入这些未知的参数,本来里面有一些未知的参数,现在 θ 用 来取代,输入是测试集,输出的结果存起来。