Datawhale X 李宏毅苹果书 AI夏令营(深度学习入门)taks2

线性模型

机器学习很简单,第一步设未知函数,第二步定义损失函数,最后优化

由于线性模型比较简单,而且有很严重的限制,所以我们需要更复杂一点的模型

看到下面这个图,里面的红线是我们需要实现的

使用0、1、2、3条蓝线在不同的位置来拟合红线

虽然可以很容易的通过蓝线的结合来实现红线,但是如果出现更曲折的线段时,我们就需要更多的蓝色线去拟合

那么既然蓝色线很重要,接下来就先来学习一下:

给出一个函数式描述这条线:

                                             y=c\frac{1}{1+e^{-(b+wx_{1})}}

x_{1}趋近于正无穷时,e的-(b+wx_{1})趋近于0,那么整个表达式\frac{1}{1+e^{-(b+wx_{1})}}趋近于1,那么y此时趋近于c

x_{1}趋近于负无穷时,e的-(b+wx_{1})趋近于0,那么整个表达式\frac{1}{1+e^{-(b+wx_{1})}}趋近于0,那么y此时趋近于0

\frac{1}{1+e^{-(b+wx_{1})}}称为Sigmoid函数

c,b,w这三个参数分别影响曲线的高度、左右平移的幅度和倾斜度

不同的蓝色折线,参数不同

可以用y=b+wx_{1}来表示

此外,我们可以不只用一个特征 x1,可以用多个特征代入不同的 c, b, w,组合出各种不同的函数,从而得到更有灵活性(flexibility)的函数。

比如,我们还使用观看youtub中李宏毅老师深度学习的课程人数,来解释

x_{1}代表前一天的观看次数,x_{2} 两天前观看次数,x3 3 天前的观看次数,每一个 i 就代表了一个蓝色的函数。每一个蓝色的函数都用一个 Sigmoid 函数来比近似它,1,2,3 代表有个 Sigmoid 函数。b_{1}+w_{11}x_{1}+w_{12}x_{2}+w_{13}x_{3},w_{ij}代表在第 i 个 Sigmoid 里面,乘给第 j 个特征的权重,w 的第一个下标代表是现在在考虑的是第一个 Sigmoid 函数。

为了简化起见,括号里面的式子为

r_{1}=b_{1}+w_{11}x_{1}+w_{12}x_{2}+w_{13}x_{3}

r_{2}=b_{2}+w_{21}x_{1}+w_{22}x_{2}+w_{23}x_{3}

r_{3}=b_{3}+w_{31}x_{1}+w_{32}x_{2}+w_{33}x_{3}

我们可以用矩阵跟向量相乘的方法,写一个比较简洁的写法。
\begin{bmatrix} r_{1}\\ r_{2}\\ r_{3} \end{bmatrix}=\begin{bmatrix} b_{1}\\ b_{2}\\ b_{3} \end{bmatrix}+\begin{bmatrix} w_{11} & w_{12} & w_{13}\\ w_{21}&w_{22} &w_{23} \\ w_{31} &w_{32} &w_{33} \end{bmatrix}\begin{bmatrix} x_{1}\\ x_{2}\\ x_{3} \end{bmatrix}

将其改成线性代数比较常用的表示方式为r = b + W x

篮框里面可以使用\delta (r)来表示,\delta就是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))

得到a_{1} a_{2} a_{3}之后分别乘c1,c2,c3加上b得到最后的y

构建出蓝色线的函数式之后,我们再来定义一下损失函数

这里我们先设未知参数,按行拼接后的一个长向量称为\Theta

接下来要定义损失。之前是 L(w, b),因为 w 跟 b 是未知的。现在未知的参数很多了,再把它一个一个列出来太累了,所以直接用 θ 来统设所有的参数,所以损失函数就变成 L(θ)。损失函数能够判断 θ 的好坏,其计算方法跟刚才只有两个参数的时候是一样的。先给定 θ 的值,即某一组 W, b, c^{T}, b 的值,再把一种特征 x 代进去,得到估测出来的 y,再计算一下跟真实的标签之间的误差 e。把所有的误差通通加起来,就得到损失。接下来下一步就是优化

                                        \Theta =\begin{bmatrix} \Theta _{1}\\ \Theta _{2}\\ \Theta _{3}\\ ... \end{bmatrix}

要找到 θ 让损失越小越好,可以让损失最小的一组 θ 称为 \Theta ^{*}。一开始要随机选一个初始数值\Theta _{0}

然后计算每一个未知参数对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。

训练数据:\begin{Bmatrix} (x^{1},y^{1}) ,& (x^{2},y^{2}) ,&... &, (x^{n},y^{n}) \end{Bmatrix}

 测试数据:\begin{Bmatrix} x^{n+1}, & x^{n+2} ,&... ,& x^{n+m} \end{Bmatrix}

总结一下训练过程:

1. 先写出一个有未知数 θ 的函数,θ 代表一个模型里面所有的未知参数。fθfθ(x) 的意思就是函数叫 fθfθ(x),输入的特征为 x,;

2. 定义损失,损失是一个函数,其输入就是一组参数,去判断这一组参数的好坏;

3. 解一个优化的问题,找一个 θ,该 θ 可以让损失的值越小越好。让损失的值最小的 θ 为\Theta ^{*},即 \Theta =argminL

有了 \Theta ^{*}以后,就把它拿来用在测试集上,也就是把\Theta ^{*}带入这些未知的参数,本来f_{\Theta }(x)里面有一些未知的参数,现在 θ 用 \Theta ^{*}来取代,输入是测试集,输出的结果存起来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值